Conflicts: net/bridge/br_mdb.c br_mdb.c conflict was a function call being removed to fix a bug in 'net' but whose signature was changed in 'net-next'.
Unified · Split
| @@ -116,6 +116,7 @@ Shiraz Hashim <shiraz.linux.kernel@gmail.com> <shiraz.hashim@st.com> · 115 unmodified lines | ||
| 116 | 116 | Simon Kelley <simon@thekelleys.org.uk> |
| 117 | 117 | Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> |
| 118 | 118 | Stephen Hemminger <shemminger@osdl.org> |
| 119 | +Sudeep Holla <sudeep.holla@arm.com> Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com> | |
| 119 | 120 | Sumit Semwal <sumit.semwal@ti.com> |
| 120 | 121 | Tejun Heo <htejun@gmail.com> |
| 121 | 122 | Thomas Graf <tgraf@suug.ch> |
| @@ -125,7 +126,9 @@ Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de> · 3 unmodified lines | ||
| 125 | 126 | Uwe Kleine-König <ukl@pengutronix.de> |
| 126 | 127 | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> |
| 127 | 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 | 132 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> |
| 130 | 133 | Yusuke Goda <goda.yusuke@renesas.com> |
| 131 | 134 | Gustavo Padovan <gustavo@las.ic.unicamp.br> |
| @@ -1234,10 +1234,8 @@ Description: · 1233 unmodified lines | ||
| 1234 | 1234 | object is near the sensor, usually be observing |
| 1235 | 1235 | reflectivity of infrared or ultrasound emitted. |
| 1236 | 1236 | Often these sensors are unit less and as such conversion |
| 1237 | − to SI units is not possible. Where it is, the units should | |
| 1238 | − be meters. If such a conversion is not possible, the reported | |
| 1239 | − values should behave in the same way as a distance, i.e. lower | |
| 1240 | − values indicate something is closer to the sensor. | |
| 1237 | + to SI units is not possible. Higher proximity measurements | |
| 1238 | + indicate closer objects, and vice versa. | |
| 1241 | 1239 | |
| 1242 | 1240 | What: /sys/.../iio:deviceX/in_illuminance_input |
| 1243 | 1241 | What: /sys/.../iio:deviceX/in_illuminance_raw |
| @@ -3383,7 +3383,7 @@ void intel_crt_init(struct drm_device *dev) · 3382 unmodified lines | ||
| 3383 | 3383 | <td valign="top" >TBD</td> |
| 3384 | 3384 | </tr> |
| 3385 | 3385 | <tr> |
| 3386 | − <td rowspan="2" valign="top" >omap</td> | |
| 3386 | + <td valign="top" >omap</td> | |
| 3387 | 3387 | <td valign="top" >Generic</td> |
| 3388 | 3388 | <td valign="top" >“zorder”</td> |
| 3389 | 3389 | <td valign="top" >RANGE</td> |
| @@ -60,4 +60,4 @@ Introduction · 59 unmodified lines | ||
| 60 | 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 | |
| @@ -258,6 +258,12 @@ cache metadata mode : ro if read-only, rw if read-write · 257 unmodified lines | ||
| 258 | 258 | no further I/O will be permitted and the status will just |
| 259 | 259 | contain the string 'Fail'. The userspace recovery tools |
| 260 | 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 | 268 | Messages |
| 263 | 269 | -------- |
| @@ -296,7 +296,7 @@ ii) Status · 295 unmodified lines | ||
| 296 | 296 | underlying device. When this is enabled when loading the table, |
| 297 | 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 | 300 | If the pool encounters certain types of device failures it will |
| 301 | 301 | drop into a read-only metadata mode in which no changes to |
| 302 | 302 | the pool metadata (like allocating new blocks) are permitted. |
| @@ -314,6 +314,13 @@ ii) Status · 11 unmodified lines | ||
| 314 | 314 | module parameter can be used to change this timeout -- it |
| 315 | 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 | 324 | iii) Messages |
| 318 | 325 | |
| 319 | 326 | create_thin <dev id> |
| @@ -65,8 +65,10 @@ Optional properties: · 64 unmodified lines | ||
| 65 | 65 | - edid: verbatim EDID data block describing attached display. |
| 66 | 66 | - ddc: phandle describing the i2c bus handling the display data |
| 67 | 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 | 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 | 73 | example: |
| 72 | 74 | |
| @@ -75,9 +77,29 @@ display@di0 { · 2 unmodified lines | ||
| 75 | 77 | edid = [edid-data]; |
| 76 | 78 | interface-pix-fmt = "rgb24"; |
| 77 | 79 | |
| 78 | − port { | |
| 80 | + port@0 { | |
| 81 | + reg = <0>; | |
| 82 | + | |
| 79 | 83 | display_in: endpoint { |
| 80 | 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 | }; |
| @@ -952,6 +952,14 @@ When kbuild executes, the following steps are followed (roughly): · 951 unmodified lines | ||
| 952 | 952 | $(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic |
| 953 | 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 | 963 | --- 6.2 Add prerequisites to archheaders: |
| 956 | 964 | |
| 957 | 965 | The archheaders: rule is used to generate header files that |
| @@ -361,11 +361,11 @@ S: Supported · 360 unmodified lines | ||
| 361 | 361 | F: drivers/input/touchscreen/ad7879.c |
| 362 | 362 | |
| 363 | 363 | ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) |
| 364 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 364 | +M: Jiri Kosina <jkosina@suse.com> | |
| 365 | 365 | S: Maintained |
| 366 | 366 | |
| 367 | 367 | ADM1025 HARDWARE MONITOR DRIVER |
| 368 | −M: Jean Delvare <jdelvare@suse.de> | |
| 368 | +M: Jean Delvare <jdelvare@suse.com> | |
| 369 | 369 | L: lm-sensors@lm-sensors.org |
| 370 | 370 | S: Maintained |
| 371 | 371 | F: Documentation/hwmon/adm1025 |
| @@ -430,7 +430,7 @@ S: Maintained · 58 unmodified lines | ||
| 430 | 430 | F: drivers/macintosh/therm_adt746x.c |
| 431 | 431 | |
| 432 | 432 | ADT7475 HARDWARE MONITOR DRIVER |
| 433 | −M: Jean Delvare <jdelvare@suse.de> | |
| 433 | +M: Jean Delvare <jdelvare@suse.com> | |
| 434 | 434 | L: lm-sensors@lm-sensors.org |
| 435 | 435 | S: Maintained |
| 436 | 436 | F: Documentation/hwmon/adt7475 |
| @@ -445,7 +445,7 @@ F: drivers/input/misc/adxl34x.c · 8 unmodified lines | ||
| 445 | 445 | |
| 446 | 446 | ADVANSYS SCSI DRIVER |
| 447 | 447 | M: Matthew Wilcox <matthew@wil.cx> |
| 448 | −M: Hannes Reinecke <hare@suse.de> | |
| 448 | +M: Hannes Reinecke <hare@suse.com> | |
| 449 | 449 | L: linux-scsi@vger.kernel.org |
| 450 | 450 | S: Maintained |
| 451 | 451 | F: Documentation/scsi/advansys.txt |
| @@ -506,7 +506,7 @@ F: drivers/scsi/aha152x* · 54 unmodified lines | ||
| 506 | 506 | F: drivers/scsi/pcmcia/aha152x* |
| 507 | 507 | |
| 508 | 508 | AIC7XXX / AIC79XX SCSI DRIVER |
| 509 | −M: Hannes Reinecke <hare@suse.de> | |
| 509 | +M: Hannes Reinecke <hare@suse.com> | |
| 510 | 510 | L: linux-scsi@vger.kernel.org |
| 511 | 511 | S: Maintained |
| 512 | 512 | F: drivers/scsi/aic7xxx/ |
| @@ -746,7 +746,7 @@ S: Maintained · 233 unmodified lines | ||
| 746 | 746 | F: sound/aoa/ |
| 747 | 747 | |
| 748 | 748 | APM DRIVER |
| 749 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 749 | +M: Jiri Kosina <jkosina@suse.com> | |
| 750 | 750 | S: Odd fixes |
| 751 | 751 | F: arch/x86/kernel/apm_32.c |
| 752 | 752 | F: include/linux/apm_bios.h |
| @@ -1001,6 +1001,7 @@ ARM/CONEXANT DIGICOLOR MACHINE SUPPORT · 248 unmodified lines | ||
| 1001 | 1001 | M: Baruch Siach <baruch@tkos.co.il> |
| 1002 | 1002 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1003 | 1003 | S: Maintained |
| 1004 | +F: arch/arm/boot/dts/cx92755* | |
| 1004 | 1005 | N: digicolor |
| 1005 | 1006 | |
| 1006 | 1007 | ARM/EBSA110 MACHINE SUPPORT |
| @@ -1324,7 +1325,7 @@ F: arch/arm/mach-pxa/include/mach/palmtc.h · 317 unmodified lines | ||
| 1324 | 1325 | F: arch/arm/mach-pxa/palmtc.c |
| 1325 | 1326 | |
| 1326 | 1327 | ARM/PALM TREO SUPPORT |
| 1327 | −M: Tomas Cech <sleep_walker@suse.cz> | |
| 1328 | +M: Tomas Cech <sleep_walker@suse.com> | |
| 1328 | 1329 | L: linux-arm-kernel@lists.infradead.org |
| 1329 | 1330 | W: http://hackndev.com |
| 1330 | 1331 | S: Maintained |
| @@ -2405,7 +2406,7 @@ F: drivers/gpio/gpio-bt8xx.c · 1074 unmodified lines | ||
| 2405 | 2406 | BTRFS FILE SYSTEM |
| 2406 | 2407 | M: Chris Mason <clm@fb.com> |
| 2407 | 2408 | M: Josef Bacik <jbacik@fb.com> |
| 2408 | −M: David Sterba <dsterba@suse.cz> | |
| 2409 | +M: David Sterba <dsterba@suse.com> | |
| 2409 | 2410 | L: linux-btrfs@vger.kernel.org |
| 2410 | 2411 | W: http://btrfs.wiki.kernel.org/ |
| 2411 | 2412 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ |
| @@ -2748,7 +2749,7 @@ COCCINELLE/Semantic Patches (SmPL) · 336 unmodified lines | ||
| 2748 | 2749 | M: Julia Lawall <Julia.Lawall@lip6.fr> |
| 2749 | 2750 | M: Gilles Muller <Gilles.Muller@lip6.fr> |
| 2750 | 2751 | M: Nicolas Palix <nicolas.palix@imag.fr> |
| 2751 | −M: Michal Marek <mmarek@suse.cz> | |
| 2752 | +M: Michal Marek <mmarek@suse.com> | |
| 2752 | 2753 | L: cocci@systeme.lip6.fr (moderated for non-subscribers) |
| 2753 | 2754 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git misc |
| 2754 | 2755 | W: http://coccinelle.lip6.fr/ |
| @@ -2864,7 +2865,7 @@ F: kernel/cpuset.c · 109 unmodified lines | ||
| 2864 | 2865 | |
| 2865 | 2866 | CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) |
| 2866 | 2867 | M: Johannes Weiner <hannes@cmpxchg.org> |
| 2867 | −M: Michal Hocko <mhocko@suse.cz> | |
| 2868 | +M: Michal Hocko <mhocko@kernel.org> | |
| 2868 | 2869 | L: cgroups@vger.kernel.org |
| 2869 | 2870 | L: linux-mm@kvack.org |
| 2870 | 2871 | S: Maintained |
| @@ -2945,7 +2946,7 @@ F: arch/x86/kernel/cpuid.c · 74 unmodified lines | ||
| 2945 | 2946 | F: arch/x86/kernel/msr.c |
| 2946 | 2947 | |
| 2947 | 2948 | CPU POWER MONITORING SUBSYSTEM |
| 2948 | −M: Thomas Renninger <trenn@suse.de> | |
| 2949 | +M: Thomas Renninger <trenn@suse.com> | |
| 2949 | 2950 | L: linux-pm@vger.kernel.org |
| 2950 | 2951 | S: Maintained |
| 2951 | 2952 | F: tools/power/cpupower/ |
| @@ -3175,7 +3176,7 @@ F: Documentation/networking/dmfe.txt · 223 unmodified lines | ||
| 3175 | 3176 | F: drivers/net/ethernet/dec/tulip/dmfe.c |
| 3176 | 3177 | |
| 3177 | 3178 | DC390/AM53C974 SCSI driver |
| 3178 | −M: Hannes Reinecke <hare@suse.de> | |
| 3179 | +M: Hannes Reinecke <hare@suse.com> | |
| 3179 | 3180 | L: linux-scsi@vger.kernel.org |
| 3180 | 3181 | S: Maintained |
| 3181 | 3182 | F: drivers/scsi/am53c974.c |
| @@ -3379,7 +3380,7 @@ W: http://www.win.tue.nl/~aeb/partitions/partition_types-1.html · 197 unmodified lines | ||
| 3379 | 3380 | S: Maintained |
| 3380 | 3381 | |
| 3381 | 3382 | DISKQUOTA |
| 3382 | −M: Jan Kara <jack@suse.cz> | |
| 3383 | +M: Jan Kara <jack@suse.com> | |
| 3383 | 3384 | S: Maintained |
| 3384 | 3385 | F: Documentation/filesystems/quota.txt |
| 3385 | 3386 | F: fs/quota/ |
| @@ -3435,7 +3436,7 @@ F: Documentation/hwmon/dme1737 · 49 unmodified lines | ||
| 3435 | 3436 | F: drivers/hwmon/dme1737.c |
| 3436 | 3437 | |
| 3437 | 3438 | DMI/SMBIOS SUPPORT |
| 3438 | −M: Jean Delvare <jdelvare@suse.de> | |
| 3439 | +M: Jean Delvare <jdelvare@suse.com> | |
| 3439 | 3440 | S: Maintained |
| 3440 | 3441 | T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-dmi/ |
| 3441 | 3442 | F: Documentation/ABI/testing/sysfs-firmware-dmi-tables |
| @@ -4051,7 +4052,7 @@ F: drivers/of/of_mdio.c · 609 unmodified lines | ||
| 4051 | 4052 | F: drivers/of/of_net.c |
| 4052 | 4053 | |
| 4053 | 4054 | EXT2 FILE SYSTEM |
| 4054 | −M: Jan Kara <jack@suse.cz> | |
| 4055 | +M: Jan Kara <jack@suse.com> | |
| 4055 | 4056 | L: linux-ext4@vger.kernel.org |
| 4056 | 4057 | S: Maintained |
| 4057 | 4058 | F: Documentation/filesystems/ext2.txt |
| @@ -4059,7 +4060,7 @@ F: fs/ext2/ · 1 unmodified line | ||
| 4059 | 4060 | F: include/linux/ext2* |
| 4060 | 4061 | |
| 4061 | 4062 | EXT3 FILE SYSTEM |
| 4062 | −M: Jan Kara <jack@suse.cz> | |
| 4063 | +M: Jan Kara <jack@suse.com> | |
| 4063 | 4064 | M: Andrew Morton <akpm@linux-foundation.org> |
| 4064 | 4065 | M: Andreas Dilger <adilger.kernel@dilger.ca> |
| 4065 | 4066 | L: linux-ext4@vger.kernel.org |
| @@ -4109,7 +4110,7 @@ F: drivers/video/fbdev/exynos/exynos_mipi* · 43 unmodified lines | ||
| 4109 | 4110 | F: include/video/exynos_mipi* |
| 4110 | 4111 | |
| 4111 | 4112 | F71805F HARDWARE MONITORING DRIVER |
| 4112 | −M: Jean Delvare <jdelvare@suse.de> | |
| 4113 | +M: Jean Delvare <jdelvare@suse.com> | |
| 4113 | 4114 | L: lm-sensors@lm-sensors.org |
| 4114 | 4115 | S: Maintained |
| 4115 | 4116 | F: Documentation/hwmon/f71805f |
| @@ -4244,7 +4245,7 @@ S: Maintained · 128 unmodified lines | ||
| 4244 | 4245 | F: drivers/block/rsxx/ |
| 4245 | 4246 | |
| 4246 | 4247 | FLOPPY DRIVER |
| 4247 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 4248 | +M: Jiri Kosina <jkosina@suse.com> | |
| 4248 | 4249 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git |
| 4249 | 4250 | S: Odd fixes |
| 4250 | 4251 | F: drivers/block/floppy.c |
| @@ -4665,7 +4666,7 @@ F: drivers/media/usb/stk1160/ · 414 unmodified lines | ||
| 4665 | 4666 | |
| 4666 | 4667 | H8/300 ARCHITECTURE |
| 4667 | 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 | 4670 | W: http://uclinux-h8.sourceforge.jp |
| 4670 | 4671 | T: git git://git.sourceforge.jp/gitroot/uclinux-h8/linux.git |
| 4671 | 4672 | S: Maintained |
| @@ -4712,7 +4713,7 @@ S: Maintained · 40 unmodified lines | ||
| 4712 | 4713 | F: drivers/media/usb/hackrf/ |
| 4713 | 4714 | |
| 4714 | 4715 | HARDWARE MONITORING |
| 4715 | −M: Jean Delvare <jdelvare@suse.de> | |
| 4716 | +M: Jean Delvare <jdelvare@suse.com> | |
| 4716 | 4717 | M: Guenter Roeck <linux@roeck-us.net> |
| 4717 | 4718 | L: lm-sensors@lm-sensors.org |
| 4718 | 4719 | W: http://www.lm-sensors.org/ |
| @@ -4815,7 +4816,7 @@ F: include/linux/pm.h · 96 unmodified lines | ||
| 4815 | 4816 | F: arch/*/include/asm/suspend*.h |
| 4816 | 4817 | |
| 4817 | 4818 | HID CORE LAYER |
| 4818 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 4819 | +M: Jiri Kosina <jkosina@suse.com> | |
| 4819 | 4820 | L: linux-input@vger.kernel.org |
| 4820 | 4821 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
| 4821 | 4822 | S: Maintained |
| @@ -4824,7 +4825,7 @@ F: include/linux/hid* · 2 unmodified lines | ||
| 4824 | 4825 | F: include/uapi/linux/hid* |
| 4825 | 4826 | |
| 4826 | 4827 | HID SENSOR HUB DRIVERS |
| 4827 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 4828 | +M: Jiri Kosina <jkosina@suse.com> | |
| 4828 | 4829 | M: Jonathan Cameron <jic23@kernel.org> |
| 4829 | 4830 | M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| 4830 | 4831 | L: linux-input@vger.kernel.org |
| @@ -4958,7 +4959,7 @@ F: include/linux/hyperv.h · 127 unmodified lines | ||
| 4958 | 4959 | F: tools/hv/ |
| 4959 | 4960 | |
| 4960 | 4961 | I2C OVER PARALLEL PORT |
| 4961 | −M: Jean Delvare <jdelvare@suse.de> | |
| 4962 | +M: Jean Delvare <jdelvare@suse.com> | |
| 4962 | 4963 | L: linux-i2c@vger.kernel.org |
| 4963 | 4964 | S: Maintained |
| 4964 | 4965 | F: Documentation/i2c/busses/i2c-parport |
| @@ -4967,7 +4968,7 @@ F: drivers/i2c/busses/i2c-parport.c · 2 unmodified lines | ||
| 4967 | 4968 | F: drivers/i2c/busses/i2c-parport-light.c |
| 4968 | 4969 | |
| 4969 | 4970 | I2C/SMBUS CONTROLLER DRIVERS FOR PC |
| 4970 | −M: Jean Delvare <jdelvare@suse.de> | |
| 4971 | +M: Jean Delvare <jdelvare@suse.com> | |
| 4971 | 4972 | L: linux-i2c@vger.kernel.org |
| 4972 | 4973 | S: Maintained |
| 4973 | 4974 | F: Documentation/i2c/busses/i2c-ali1535 |
| @@ -5008,7 +5009,7 @@ F: drivers/i2c/busses/i2c-ismt.c · 34 unmodified lines | ||
| 5008 | 5009 | F: Documentation/i2c/busses/i2c-ismt |
| 5009 | 5010 | |
| 5010 | 5011 | I2C/SMBUS STUB DRIVER |
| 5011 | −M: Jean Delvare <jdelvare@suse.de> | |
| 5012 | +M: Jean Delvare <jdelvare@suse.com> | |
| 5012 | 5013 | L: linux-i2c@vger.kernel.org |
| 5013 | 5014 | S: Maintained |
| 5014 | 5015 | F: drivers/i2c/i2c-stub.c |
| @@ -5035,7 +5036,7 @@ L: linux-acpi@vger.kernel.org · 20 unmodified lines | ||
| 5035 | 5036 | S: Maintained |
| 5036 | 5037 | |
| 5037 | 5038 | I2C-TAOS-EVM DRIVER |
| 5038 | −M: Jean Delvare <jdelvare@suse.de> | |
| 5039 | +M: Jean Delvare <jdelvare@suse.com> | |
| 5039 | 5040 | L: linux-i2c@vger.kernel.org |
| 5040 | 5041 | S: Maintained |
| 5041 | 5042 | F: Documentation/i2c/busses/i2c-taos-evm |
| @@ -5564,8 +5565,8 @@ F: include/uapi/linux/ip_vs.h · 522 unmodified lines | ||
| 5564 | 5565 | F: net/netfilter/ipvs/ |
| 5565 | 5566 | |
| 5566 | 5567 | IPWIRELESS DRIVER |
| 5567 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 5568 | −M: David Sterba <dsterba@suse.cz> | |
| 5568 | +M: Jiri Kosina <jkosina@suse.com> | |
| 5569 | +M: David Sterba <dsterba@suse.com> | |
| 5569 | 5570 | S: Odd Fixes |
| 5570 | 5571 | F: drivers/tty/ipwireless/ |
| 5571 | 5572 | |
| @@ -5685,7 +5686,7 @@ S: Maintained · 113 unmodified lines | ||
| 5685 | 5686 | F: drivers/isdn/hardware/eicon/ |
| 5686 | 5687 | |
| 5687 | 5688 | IT87 HARDWARE MONITORING DRIVER |
| 5688 | −M: Jean Delvare <jdelvare@suse.de> | |
| 5689 | +M: Jean Delvare <jdelvare@suse.com> | |
| 5689 | 5690 | L: lm-sensors@lm-sensors.org |
| 5690 | 5691 | S: Maintained |
| 5691 | 5692 | F: Documentation/hwmon/it87 |
| @@ -5752,7 +5753,7 @@ F: include/uapi/linux/jffs2.h · 60 unmodified lines | ||
| 5752 | 5753 | |
| 5753 | 5754 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) |
| 5754 | 5755 | M: Andrew Morton <akpm@linux-foundation.org> |
| 5755 | −M: Jan Kara <jack@suse.cz> | |
| 5756 | +M: Jan Kara <jack@suse.com> | |
| 5756 | 5757 | L: linux-ext4@vger.kernel.org |
| 5757 | 5758 | S: Maintained |
| 5758 | 5759 | F: fs/jbd/ |
| @@ -5816,7 +5817,7 @@ S: Maintained · 57 unmodified lines | ||
| 5816 | 5817 | F: fs/autofs4/ |
| 5817 | 5818 | |
| 5818 | 5819 | KERNEL BUILD + files below scripts/ (unless maintained elsewhere) |
| 5819 | −M: Michal Marek <mmarek@suse.cz> | |
| 5820 | +M: Michal Marek <mmarek@suse.com> | |
| 5820 | 5821 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git for-next |
| 5821 | 5822 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git rc-fixes |
| 5822 | 5823 | L: linux-kbuild@vger.kernel.org |
| @@ -5880,7 +5881,7 @@ F: arch/x86/include/asm/svm.h · 57 unmodified lines | ||
| 5880 | 5881 | F: arch/x86/kvm/svm.c |
| 5881 | 5882 | |
| 5882 | 5883 | KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC |
| 5883 | −M: Alexander Graf <agraf@suse.de> | |
| 5884 | +M: Alexander Graf <agraf@suse.com> | |
| 5884 | 5885 | L: kvm-ppc@vger.kernel.org |
| 5885 | 5886 | W: http://kvm.qumranet.com |
| 5886 | 5887 | T: git git://github.com/agraf/linux-2.6.git |
| @@ -6037,7 +6038,7 @@ F: drivers/leds/ · 150 unmodified lines | ||
| 6037 | 6038 | F: include/linux/leds.h |
| 6038 | 6039 | |
| 6039 | 6040 | LEGACY EEPROM DRIVER |
| 6040 | −M: Jean Delvare <jdelvare@suse.de> | |
| 6041 | +M: Jean Delvare <jdelvare@suse.com> | |
| 6041 | 6042 | S: Maintained |
| 6042 | 6043 | F: Documentation/misc-devices/eeprom |
| 6043 | 6044 | F: drivers/misc/eeprom/eeprom.c |
| @@ -6090,7 +6091,7 @@ F: include/linux/ata.h · 46 unmodified lines | ||
| 6090 | 6091 | F: include/linux/libata.h |
| 6091 | 6092 | |
| 6092 | 6093 | LIBATA PATA ARASAN COMPACT FLASH CONTROLLER |
| 6093 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 6094 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 6094 | 6095 | L: linux-ide@vger.kernel.org |
| 6095 | 6096 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git |
| 6096 | 6097 | S: Maintained |
| @@ -6251,8 +6252,8 @@ F: drivers/platform/x86/hp_accel.c · 154 unmodified lines | ||
| 6251 | 6252 | LIVE PATCHING |
| 6252 | 6253 | M: Josh Poimboeuf <jpoimboe@redhat.com> |
| 6253 | 6254 | M: Seth Jennings <sjenning@redhat.com> |
| 6254 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 6255 | −M: Vojtech Pavlik <vojtech@suse.cz> | |
| 6255 | +M: Jiri Kosina <jkosina@suse.com> | |
| 6256 | +M: Vojtech Pavlik <vojtech@suse.com> | |
| 6256 | 6257 | S: Maintained |
| 6257 | 6258 | F: kernel/livepatch/ |
| 6258 | 6259 | F: include/linux/livepatch.h |
| @@ -6278,21 +6279,21 @@ S: Maintained · 19 unmodified lines | ||
| 6278 | 6279 | F: drivers/hwmon/lm73.c |
| 6279 | 6280 | |
| 6280 | 6281 | LM78 HARDWARE MONITOR DRIVER |
| 6281 | −M: Jean Delvare <jdelvare@suse.de> | |
| 6282 | +M: Jean Delvare <jdelvare@suse.com> | |
| 6282 | 6283 | L: lm-sensors@lm-sensors.org |
| 6283 | 6284 | S: Maintained |
| 6284 | 6285 | F: Documentation/hwmon/lm78 |
| 6285 | 6286 | F: drivers/hwmon/lm78.c |
| 6286 | 6287 | |
| 6287 | 6288 | LM83 HARDWARE MONITOR DRIVER |
| 6288 | −M: Jean Delvare <jdelvare@suse.de> | |
| 6289 | +M: Jean Delvare <jdelvare@suse.com> | |
| 6289 | 6290 | L: lm-sensors@lm-sensors.org |
| 6290 | 6291 | S: Maintained |
| 6291 | 6292 | F: Documentation/hwmon/lm83 |
| 6292 | 6293 | F: drivers/hwmon/lm83.c |
| 6293 | 6294 | |
| 6294 | 6295 | LM90 HARDWARE MONITOR DRIVER |
| 6295 | −M: Jean Delvare <jdelvare@suse.de> | |
| 6296 | +M: Jean Delvare <jdelvare@suse.com> | |
| 6296 | 6297 | L: lm-sensors@lm-sensors.org |
| 6297 | 6298 | S: Maintained |
| 6298 | 6299 | F: Documentation/hwmon/lm90 |
| @@ -7719,7 +7720,7 @@ S: Maintained · 1420 unmodified lines | ||
| 7719 | 7720 | F: drivers/char/pc8736x_gpio.c |
| 7720 | 7721 | |
| 7721 | 7722 | PC87427 HARDWARE MONITORING DRIVER |
| 7722 | −M: Jean Delvare <jdelvare@suse.de> | |
| 7723 | +M: Jean Delvare <jdelvare@suse.com> | |
| 7723 | 7724 | L: lm-sensors@lm-sensors.org |
| 7724 | 7725 | S: Maintained |
| 7725 | 7726 | F: Documentation/hwmon/pc87427 |
| @@ -7996,7 +7997,7 @@ S: Maintained · 270 unmodified lines | ||
| 7996 | 7997 | F: drivers/pinctrl/samsung/ |
| 7997 | 7998 | |
| 7998 | 7999 | PIN CONTROLLER - ST SPEAR |
| 7999 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 8000 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 8000 | 8001 | L: spear-devel@list.st.com |
| 8001 | 8002 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 8002 | 8003 | W: http://www.st.com/spear |
| @@ -8004,7 +8005,7 @@ S: Maintained · 1 unmodified line | ||
| 8004 | 8005 | F: drivers/pinctrl/spear/ |
| 8005 | 8006 | |
| 8006 | 8007 | PKTCDVD DRIVER |
| 8007 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 8008 | +M: Jiri Kosina <jkosina@suse.com> | |
| 8008 | 8009 | S: Maintained |
| 8009 | 8010 | F: drivers/block/pktcdvd.c |
| 8010 | 8011 | F: include/linux/pktcdvd.h |
| @@ -8895,7 +8896,7 @@ S: Maintained · 884 unmodified lines | ||
| 8895 | 8896 | F: drivers/tty/serial/ |
| 8896 | 8897 | |
| 8897 | 8898 | SYNOPSYS DESIGNWARE DMAC DRIVER |
| 8898 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 8899 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 8899 | 8900 | M: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| 8900 | 8901 | S: Maintained |
| 8901 | 8902 | F: include/linux/dma/dw.h |
| @@ -9062,7 +9063,7 @@ S: Maintained · 160 unmodified lines | ||
| 9062 | 9063 | F: drivers/mmc/host/sdhci-s3c* |
| 9063 | 9064 | |
| 9064 | 9065 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER |
| 9065 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 9066 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 9066 | 9067 | L: spear-devel@list.st.com |
| 9067 | 9068 | L: linux-mmc@vger.kernel.org |
| 9068 | 9069 | S: Maintained |
| @@ -9424,7 +9425,7 @@ F: Documentation/hwmon/sch5627 · 355 unmodified lines | ||
| 9424 | 9425 | F: drivers/hwmon/sch5627.c |
| 9425 | 9426 | |
| 9426 | 9427 | SMSC47B397 HARDWARE MONITOR DRIVER |
| 9427 | −M: Jean Delvare <jdelvare@suse.de> | |
| 9428 | +M: Jean Delvare <jdelvare@suse.com> | |
| 9428 | 9429 | L: lm-sensors@lm-sensors.org |
| 9429 | 9430 | S: Maintained |
| 9430 | 9431 | F: Documentation/hwmon/smsc47b397 |
| @@ -9473,7 +9474,7 @@ S: Supported · 42 unmodified lines | ||
| 9473 | 9474 | F: drivers/media/pci/solo6x10/ |
| 9474 | 9475 | |
| 9475 | 9476 | SOFTWARE RAID (Multiple Disks) SUPPORT |
| 9476 | −M: Neil Brown <neilb@suse.de> | |
| 9477 | +M: Neil Brown <neilb@suse.com> | |
| 9477 | 9478 | L: linux-raid@vger.kernel.org |
| 9478 | 9479 | S: Supported |
| 9479 | 9480 | F: drivers/md/ |
| @@ -9516,7 +9517,7 @@ F: drivers/memstick/core/ms_block.* · 36 unmodified lines | ||
| 9516 | 9517 | |
| 9517 | 9518 | SOUND |
| 9518 | 9519 | M: Jaroslav Kysela <perex@perex.cz> |
| 9519 | −M: Takashi Iwai <tiwai@suse.de> | |
| 9520 | +M: Takashi Iwai <tiwai@suse.com> | |
| 9520 | 9521 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
| 9521 | 9522 | W: http://www.alsa-project.org/ |
| 9522 | 9523 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git |
| @@ -9600,7 +9601,7 @@ S: Maintained · 77 unmodified lines | ||
| 9600 | 9601 | F: include/linux/compiler.h |
| 9601 | 9602 | |
| 9602 | 9603 | SPEAR PLATFORM SUPPORT |
| 9603 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 9604 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 9604 | 9605 | M: Shiraz Hashim <shiraz.linux.kernel@gmail.com> |
| 9605 | 9606 | L: spear-devel@list.st.com |
| 9606 | 9607 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| @@ -9609,7 +9610,7 @@ S: Maintained · 2 unmodified lines | ||
| 9609 | 9610 | F: arch/arm/mach-spear/ |
| 9610 | 9611 | |
| 9611 | 9612 | SPEAR CLOCK FRAMEWORK SUPPORT |
| 9612 | −M: Viresh Kumar <viresh.linux@gmail.com> | |
| 9613 | +M: Viresh Kumar <vireshk@kernel.org> | |
| 9613 | 9614 | L: spear-devel@list.st.com |
| 9614 | 9615 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 9615 | 9616 | W: http://www.st.com/spear |
| @@ -10399,7 +10400,7 @@ K: ^Subject:.*(?i)trivial · 783 unmodified lines | ||
| 10399 | 10400 | |
| 10400 | 10401 | TTY LAYER |
| 10401 | 10402 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| 10402 | −M: Jiri Slaby <jslaby@suse.cz> | |
| 10403 | +M: Jiri Slaby <jslaby@suse.com> | |
| 10403 | 10404 | S: Supported |
| 10404 | 10405 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git |
| 10405 | 10406 | F: Documentation/serial/ |
| @@ -10473,7 +10474,7 @@ F: arch/m68k/*/*_no.* · 67 unmodified lines | ||
| 10473 | 10474 | F: arch/m68k/include/asm/*_no.* |
| 10474 | 10475 | |
| 10475 | 10476 | UDF FILESYSTEM |
| 10476 | −M: Jan Kara <jack@suse.cz> | |
| 10477 | +M: Jan Kara <jack@suse.com> | |
| 10477 | 10478 | S: Maintained |
| 10478 | 10479 | F: Documentation/filesystems/udf.txt |
| 10479 | 10480 | F: fs/udf/ |
| @@ -10616,7 +10617,7 @@ F: drivers/usb/gadget/ · 136 unmodified lines | ||
| 10616 | 10617 | F: include/linux/usb/gadget* |
| 10617 | 10618 | |
| 10618 | 10619 | USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) |
| 10619 | −M: Jiri Kosina <jkosina@suse.cz> | |
| 10620 | +M: Jiri Kosina <jkosina@suse.com> | |
| 10620 | 10621 | L: linux-usb@vger.kernel.org |
| 10621 | 10622 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
| 10622 | 10623 | S: Maintained |
| @@ -10741,7 +10742,7 @@ S: Maintained · 118 unmodified lines | ||
| 10741 | 10742 | F: drivers/usb/host/uhci* |
| 10742 | 10743 | |
| 10743 | 10744 | USB "USBNET" DRIVER FRAMEWORK |
| 10744 | −M: Oliver Neukum <oneukum@suse.de> | |
| 10745 | +M: Oliver Neukum <oneukum@suse.com> | |
| 10745 | 10746 | L: netdev@vger.kernel.org |
| 10746 | 10747 | W: http://www.linux-usb.org/usbnet |
| 10747 | 10748 | S: Maintained |
| @@ -11068,7 +11069,7 @@ F: Documentation/hwmon/w83793 · 320 unmodified lines | ||
| 11068 | 11069 | F: drivers/hwmon/w83793.c |
| 11069 | 11070 | |
| 11070 | 11071 | W83795 HARDWARE MONITORING DRIVER |
| 11071 | −M: Jean Delvare <jdelvare@suse.de> | |
| 11072 | +M: Jean Delvare <jdelvare@suse.com> | |
| 11072 | 11073 | L: lm-sensors@lm-sensors.org |
| 11073 | 11074 | S: Maintained |
| 11074 | 11075 | F: drivers/hwmon/w83795.c |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | VERSION = 4 |
| 2 | 2 | PATCHLEVEL = 2 |
| 3 | 3 | SUBLEVEL = 0 |
| 4 | −EXTRAVERSION = -rc2 | |
| 4 | +EXTRAVERSION = -rc3 | |
| 5 | 5 | NAME = Hurr durr I'ma sheep |
| 6 | 6 | |
| 7 | 7 | # *DOCUMENTATION* |
| @@ -780,10 +780,11 @@ endif · 772 unmodified lines | ||
| 780 | 780 | include scripts/Makefile.kasan |
| 781 | 781 | include scripts/Makefile.extrawarn |
| 782 | 782 | |
| 783 | −# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments | |
| 784 | −KBUILD_CPPFLAGS += $(KCPPFLAGS) | |
| 785 | −KBUILD_AFLAGS += $(KAFLAGS) | |
| 786 | −KBUILD_CFLAGS += $(KCFLAGS) | |
| 783 | +# Add any arch overrides and user supplied CPPFLAGS, AFLAGS and CFLAGS as the | |
| 784 | +# last assignments | |
| 785 | +KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS) | |
| 786 | +KBUILD_AFLAGS += $(ARCH_AFLAGS) $(KAFLAGS) | |
| 787 | +KBUILD_CFLAGS += $(ARCH_CFLAGS) $(KCFLAGS) | |
| 787 | 788 | |
| 788 | 789 | # Use --build-id when available. |
| 789 | 790 | LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ |
| @@ -221,6 +221,10 @@ config ARCH_TASK_STRUCT_ALLOCATOR · 220 unmodified lines | ||
| 221 | 221 | config ARCH_THREAD_INFO_ALLOCATOR |
| 222 | 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 | 228 | config HAVE_REGS_AND_STACK_ACCESS_API |
| 225 | 229 | bool |
| 226 | 230 | help |
| @@ -5,6 +5,7 @@ generic-y += cputime.h · 4 unmodified lines | ||
| 5 | 5 | generic-y += exec.h |
| 6 | 6 | generic-y += irq_work.h |
| 7 | 7 | generic-y += mcs_spinlock.h |
| 8 | +generic-y += mm-arch-hooks.h | |
| 8 | 9 | generic-y += preempt.h |
| 9 | 10 | generic-y += sections.h |
| 10 | 11 | generic-y += trace_clock.h |
| @@ -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 */ | |
| @@ -115,6 +115,7 @@ if ISA_ARCOMPACT · 114 unmodified lines | ||
| 115 | 115 | |
| 116 | 116 | config ARC_CPU_750D |
| 117 | 117 | bool "ARC750D" |
| 118 | + select ARC_CANT_LLSC | |
| 118 | 119 | help |
| 119 | 120 | Support for ARC750 core |
| 120 | 121 | |
| @@ -362,7 +363,7 @@ config ARC_CANT_LLSC · 241 unmodified lines | ||
| 362 | 363 | config ARC_HAS_LLSC |
| 363 | 364 | bool "Insn: LLOCK/SCOND (efficient atomic ops)" |
| 364 | 365 | default y |
| 365 | − depends on !ARC_CPU_750D && !ARC_CANT_LLSC | |
| 366 | + depends on !ARC_CANT_LLSC | |
| 366 | 367 | |
| 367 | 368 | config ARC_HAS_SWAPE |
| 368 | 369 | bool "Insn: SWAPE (endian-swap)" |
| @@ -49,7 +49,8 @@ endif · 48 unmodified lines | ||
| 49 | 49 | |
| 50 | 50 | ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE |
| 51 | 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 | 54 | endif |
| 54 | 55 | |
| 55 | 56 | # small data is default for elf32 tool-chain. If not usable, disable it |
| @@ -12,7 +12,7 @@ · 11 unmodified lines | ||
| 12 | 12 | |
| 13 | 13 | / { |
| 14 | 14 | compatible = "snps,arc"; |
| 15 | − clock-frequency = <75000000>; | |
| 15 | + clock-frequency = <90000000>; | |
| 16 | 16 | #address-cells = <1>; |
| 17 | 17 | #size-cells = <1>; |
| 18 | 18 | |
| @@ -12,7 +12,7 @@ · 11 unmodified lines | ||
| 12 | 12 | |
| 13 | 13 | / { |
| 14 | 14 | compatible = "snps,arc"; |
| 15 | − clock-frequency = <75000000>; | |
| 15 | + clock-frequency = <90000000>; | |
| 16 | 16 | #address-cells = <1>; |
| 17 | 17 | #size-cells = <1>; |
| 18 | 18 | |
| @@ -22,6 +22,7 @@ generic-y += kvm_para.h · 21 unmodified lines | ||
| 22 | 22 | generic-y += local.h |
| 23 | 23 | generic-y += local64.h |
| 24 | 24 | generic-y += mcs_spinlock.h |
| 25 | +generic-y += mm-arch-hooks.h | |
| 25 | 26 | generic-y += mman.h |
| 26 | 27 | generic-y += msgbuf.h |
| 27 | 28 | generic-y += param.h |
| @@ -50,8 +50,7 @@ static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ · 49 unmodified lines | ||
| 50 | 50 | * done for const @nr, but no code is generated due to gcc \ |
| 51 | 51 | * const prop. \ |
| 52 | 52 | */ \ |
| 53 | − if (__builtin_constant_p(nr)) \ | |
| 54 | − nr &= 0x1f; \ | |
| 53 | + nr &= 0x1f; \ | |
| 55 | 54 | \ |
| 56 | 55 | __asm__ __volatile__( \ |
| 57 | 56 | "1: llock %0, [%1] \n" \ |
| @@ -82,8 +81,7 @@ static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long * · 24 unmodified lines | ||
| 82 | 81 | \ |
| 83 | 82 | m += nr >> 5; \ |
| 84 | 83 | \ |
| 85 | − if (__builtin_constant_p(nr)) \ | |
| 86 | − nr &= 0x1f; \ | |
| 84 | + nr &= 0x1f; \ | |
| 87 | 85 | \ |
| 88 | 86 | /* \ |
| 89 | 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)\ · 39 unmodified lines | ||
| 129 | 127 | unsigned long temp, flags; \ |
| 130 | 128 | m += nr >> 5; \ |
| 131 | 129 | \ |
| 132 | − if (__builtin_constant_p(nr)) \ | |
| 133 | − nr &= 0x1f; \ | |
| 134 | − \ | |
| 135 | 130 | /* \ |
| 136 | 131 | * spin lock/unlock provide the needed smp_mb() before/after \ |
| 137 | 132 | */ \ |
| 138 | 133 | bitops_lock(flags); \ |
| 139 | 134 | \ |
| 140 | 135 | temp = *m; \ |
| 141 | − *m = temp c_op (1UL << nr); \ | |
| 136 | + *m = temp c_op (1UL << (nr & 0x1f)); \ | |
| 142 | 137 | \ |
| 143 | 138 | bitops_unlock(flags); \ |
| 144 | 139 | } |
| @@ -149,17 +144,14 @@ static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long * · 4 unmodified lines | ||
| 149 | 144 | unsigned long old, flags; \ |
| 150 | 145 | m += nr >> 5; \ |
| 151 | 146 | \ |
| 152 | − if (__builtin_constant_p(nr)) \ | |
| 153 | − nr &= 0x1f; \ | |
| 154 | − \ | |
| 155 | 147 | bitops_lock(flags); \ |
| 156 | 148 | \ |
| 157 | 149 | old = *m; \ |
| 158 | − *m = old c_op (1 << nr); \ | |
| 150 | + *m = old c_op (1UL << (nr & 0x1f)); \ | |
| 159 | 151 | \ |
| 160 | 152 | bitops_unlock(flags); \ |
| 161 | 153 | \ |
| 162 | − return (old & (1 << nr)) != 0; \ | |
| 154 | + return (old & (1UL << (nr & 0x1f))) != 0; \ | |
| 163 | 155 | } |
| 164 | 156 | |
| 165 | 157 | #endif /* CONFIG_ARC_HAS_LLSC */ |
| @@ -174,11 +166,8 @@ static inline void __##op##_bit(unsigned long nr, volatile unsigned long *m) \ · 8 unmodified lines | ||
| 174 | 166 | unsigned long temp; \ |
| 175 | 167 | m += nr >> 5; \ |
| 176 | 168 | \ |
| 177 | − if (__builtin_constant_p(nr)) \ | |
| 178 | − nr &= 0x1f; \ | |
| 179 | − \ | |
| 180 | 169 | temp = *m; \ |
| 181 | − *m = temp c_op (1UL << nr); \ | |
| 170 | + *m = temp c_op (1UL << (nr & 0x1f)); \ | |
| 182 | 171 | } |
| 183 | 172 | |
| 184 | 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 · 2 unmodified lines | ||
| 187 | 176 | unsigned long old; \ |
| 188 | 177 | m += nr >> 5; \ |
| 189 | 178 | \ |
| 190 | − if (__builtin_constant_p(nr)) \ | |
| 191 | − nr &= 0x1f; \ | |
| 192 | − \ | |
| 193 | 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 | 185 | #define BIT_OPS(op, c_op, asm_op) \ |
| @@ -224,10 +210,7 @@ test_bit(unsigned int nr, const volatile unsigned long *addr) · 24 unmodified lines | ||
| 224 | 210 | |
| 225 | 211 | addr += nr >> 5; |
| 226 | 212 | |
| 227 | − if (__builtin_constant_p(nr)) | |
| 228 | − nr &= 0x1f; | |
| 229 | − | |
| 230 | − mask = 1 << nr; | |
| 213 | + mask = 1UL << (nr & 0x1f); | |
| 231 | 214 | |
| 232 | 215 | return ((mask & *addr) != 0); |
| 233 | 216 | } |
| @@ -16,12 +16,40 @@ · 15 unmodified lines | ||
| 16 | 16 | #include <linux/uaccess.h> |
| 17 | 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 | 47 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)\ |
| 20 | 48 | \ |
| 21 | 49 | __asm__ __volatile__( \ |
| 22 | − "1: ld %1, [%2] \n" \ | |
| 50 | + "1: ld %1, [%2] \n" \ | |
| 23 | 51 | insn "\n" \ |
| 24 | − "2: st %0, [%2] \n" \ | |
| 52 | + "2: st %0, [%2] \n" \ | |
| 25 | 53 | " mov %0, 0 \n" \ |
| 26 | 54 | "3: \n" \ |
| 27 | 55 | " .section .fixup,\"ax\" \n" \ |
| @@ -39,6 +67,8 @@ · 11 unmodified lines | ||
| 39 | 67 | : "r" (uaddr), "r" (oparg), "ir" (-EFAULT) \ |
| 40 | 68 | : "cc", "memory") |
| 41 | 69 | |
| 70 | +#endif | |
| 71 | + | |
| 42 | 72 | static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) |
| 43 | 73 | { |
| 44 | 74 | int op = (encoded_op >> 28) & 7; |
| @@ -123,11 +153,17 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, · 78 unmodified lines | ||
| 123 | 153 | |
| 124 | 154 | pagefault_disable(); |
| 125 | 155 | |
| 126 | − /* TBD : can use llock/scond */ | |
| 127 | 156 | __asm__ __volatile__( |
| 128 | − "1: ld %0, [%3] \n" | |
| 129 | − " brne %0, %1, 3f \n" | |
| 130 | − "2: st %2, [%3] \n" | |
| 157 | +#ifdef CONFIG_ARC_HAS_LLSC | |
| 158 | + "1: llock %0, [%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 | 167 | "3: \n" |
| 132 | 168 | " .section .fixup,\"ax\" \n" |
| 133 | 169 | "4: mov %0, %4 \n" |
| @@ -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 */ | |
| @@ -106,7 +106,7 @@ struct callee_regs { · 105 unmodified lines | ||
| 106 | 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 | 110 | #define profile_pc(regs) instruction_pointer(regs) |
| 111 | 111 | |
| 112 | 112 | /* return 1 if user mode or 0 if kernel mode */ |
| @@ -12,7 +12,6 @@ · 11 unmodified lines | ||
| 12 | 12 | #include <linux/of.h> |
| 13 | 13 | #include <linux/irqdomain.h> |
| 14 | 14 | #include <linux/irqchip.h> |
| 15 | −#include "../../drivers/irqchip/irqchip.h" | |
| 16 | 15 | #include <asm/irq.h> |
| 17 | 16 | |
| 18 | 17 | /* |
| @@ -12,7 +12,6 @@ · 11 unmodified lines | ||
| 12 | 12 | #include <linux/of.h> |
| 13 | 13 | #include <linux/irqdomain.h> |
| 14 | 14 | #include <linux/irqchip.h> |
| 15 | −#include "../../drivers/irqchip/irqchip.h" | |
| 16 | 15 | #include <asm/irq.h> |
| 17 | 16 | |
| 18 | 17 | /* |
| @@ -175,7 +175,6 @@ void mcip_init_early_smp(void) · 174 unmodified lines | ||
| 175 | 175 | #include <linux/irqchip.h> |
| 176 | 176 | #include <linux/of.h> |
| 177 | 177 | #include <linux/of_irq.h> |
| 178 | −#include "../../drivers/irqchip/irqchip.h" | |
| 179 | 178 | |
| 180 | 179 | /* |
| 181 | 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) · 36 unmodified lines | ||
| 218 | 217 | raw_spin_unlock_irqrestore(&mcip_lock, flags); |
| 219 | 218 | } |
| 220 | 219 | |
| 220 | +#ifdef CONFIG_SMP | |
| 221 | 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 | 239 | return IRQ_SET_MASK_OK; |
| 225 | 240 | } |
| 241 | +#endif | |
| 226 | 242 | |
| 227 | 243 | static struct irq_chip idu_irq_chip = { |
| 228 | 244 | .name = "MCIP IDU Intc", |
| @@ -330,8 +346,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent) · 101 unmodified lines | ||
| 330 | 346 | if (!i) |
| 331 | 347 | idu_first_irq = irq; |
| 332 | 348 | |
| 333 | − irq_set_handler_data(irq, domain); | |
| 334 | − irq_set_chained_handler(irq, idu_cascade_isr); | |
| 349 | + irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain); | |
| 335 | 350 | } |
| 336 | 351 | |
| 337 | 352 | __mcip_cmd(CMD_IDU_ENABLE, 0); |
| @@ -142,17 +142,22 @@ static void read_arc_build_cfg_regs(void) · 141 unmodified lines | ||
| 142 | 142 | } |
| 143 | 143 | |
| 144 | 144 | static const struct cpuinfo_data arc_cpu_tbl[] = { |
| 145 | +#ifdef CONFIG_ISA_ARCOMPACT | |
| 145 | 146 | { {0x20, "ARC 600" }, 0x2F}, |
| 146 | 147 | { {0x30, "ARC 700" }, 0x33}, |
| 147 | 148 | { {0x34, "ARC 700 R4.10"}, 0x34}, |
| 148 | 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 | 154 | { {0x00, NULL } } |
| 151 | 155 | }; |
| 152 | 156 | |
| 153 | −#define IS_AVAIL1(v, str) ((v) ? str : "") | |
| 154 | −#define IS_USED(cfg) (IS_ENABLED(cfg) ? "" : "(not used) ") | |
| 155 | −#define IS_AVAIL2(v, str, cfg) IS_AVAIL1(v, str), IS_AVAIL1(v, IS_USED(cfg)) | |
| 157 | +#define IS_AVAIL1(v, s) ((v) ? s : "") | |
| 158 | +#define IS_USED_RUN(v) ((v) ? "" : "(not used) ") | |
| 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 | 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) · 67 unmodified lines | ||
| 226 | 231 | n += scnprintf(buf + n, len - n, "mpy[opt %d] ", opt); |
| 227 | 232 | } |
| 228 | 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 | 237 | n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n", |
| @@ -58,7 +58,6 @@ static void show_callee_regs(struct callee_regs *cregs) · 57 unmodified lines | ||
| 58 | 58 | |
| 59 | 59 | static void print_task_path_n_nm(struct task_struct *tsk, char *buf) |
| 60 | 60 | { |
| 61 | − struct path path; | |
| 62 | 61 | char *path_nm = NULL; |
| 63 | 62 | struct mm_struct *mm; |
| 64 | 63 | struct file *exe_file; |
| @@ -468,10 +468,18 @@ static void __ic_line_inv_vaddr(unsigned long paddr, unsigned long vaddr, · 467 unmodified lines | ||
| 468 | 468 | noinline void slc_op(unsigned long paddr, unsigned long sz, const int op) |
| 469 | 469 | { |
| 470 | 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 | 479 | unsigned long flags; |
| 472 | 480 | unsigned int ctrl; |
| 473 | 481 | |
| 474 | − local_irq_save(flags); | |
| 482 | + spin_lock_irqsave(&lock, flags); | |
| 475 | 483 | |
| 476 | 484 | /* |
| 477 | 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) · 26 unmodified lines | ||
| 504 | 512 | |
| 505 | 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 | 516 | #endif |
| 509 | 517 | } |
| 510 | 518 | |
| @@ -60,8 +60,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size, · 59 unmodified lines | ||
| 60 | 60 | |
| 61 | 61 | /* This is kernel Virtual address (0x7000_0000 based) */ |
| 62 | 62 | kvaddr = ioremap_nocache((unsigned long)paddr, size); |
| 63 | − if (kvaddr != NULL) | |
| 64 | − memset(kvaddr, 0, size); | |
| 63 | + if (kvaddr == NULL) | |
| 64 | + return NULL; | |
| 65 | 65 | |
| 66 | 66 | /* This is bus address, platform dependent */ |
| 67 | 67 | *dma_handle = (dma_addr_t)paddr; |
| @@ -74,6 +74,7 @@ · 73 unmodified lines | ||
| 74 | 74 | audio_codec: tlv320aic3106@1b { |
| 75 | 75 | compatible = "ti,tlv320aic3106"; |
| 76 | 76 | reg = <0x1b>; |
| 77 | + ai3x-micbias-vg = <0x2>; | |
| 77 | 78 | }; |
| 78 | 79 | |
| 79 | 80 | accel: lis331dlh@1d { |
| @@ -153,7 +154,7 @@ · 73 unmodified lines | ||
| 153 | 154 | ti,audio-routing = |
| 154 | 155 | "Headphone Jack", "HPLOUT", |
| 155 | 156 | "Headphone Jack", "HPROUT", |
| 156 | − "LINE1L", "Line In"; | |
| 157 | + "MIC3L", "Mic3L Switch"; | |
| 157 | 158 | }; |
| 158 | 159 | |
| 159 | 160 | &mcasp0 { |
| @@ -438,41 +439,50 @@ · 278 unmodified lines | ||
| 438 | 439 | regulators { |
| 439 | 440 | dcdc1_reg: regulator@0 { |
| 440 | 441 | /* VDD_1V8 system supply */ |
| 442 | + regulator-always-on; | |
| 441 | 443 | }; |
| 442 | 444 | |
| 443 | 445 | dcdc2_reg: regulator@1 { |
| 444 | 446 | /* VDD_CORE voltage limits 0.95V - 1.26V with +/-4% tolerance */ |
| 445 | 447 | regulator-name = "vdd_core"; |
| 446 | 448 | regulator-min-microvolt = <925000>; |
| 447 | − regulator-max-microvolt = <1325000>; | |
| 449 | + regulator-max-microvolt = <1150000>; | |
| 448 | 450 | regulator-boot-on; |
| 451 | + regulator-always-on; | |
| 449 | 452 | }; |
| 450 | 453 | |
| 451 | 454 | dcdc3_reg: regulator@2 { |
| 452 | 455 | /* VDD_MPU voltage limits 0.95V - 1.1V with +/-4% tolerance */ |
| 453 | 456 | regulator-name = "vdd_mpu"; |
| 454 | 457 | regulator-min-microvolt = <925000>; |
| 455 | − regulator-max-microvolt = <1150000>; | |
| 458 | + regulator-max-microvolt = <1325000>; | |
| 456 | 459 | regulator-boot-on; |
| 460 | + regulator-always-on; | |
| 457 | 461 | }; |
| 458 | 462 | |
| 459 | 463 | ldo1_reg: regulator@3 { |
| 460 | 464 | /* VRTC 1.8V always-on supply */ |
| 465 | + regulator-name = "vrtc,vdds"; | |
| 461 | 466 | regulator-always-on; |
| 462 | 467 | }; |
| 463 | 468 | |
| 464 | 469 | ldo2_reg: regulator@4 { |
| 465 | 470 | /* 3.3V rail */ |
| 471 | + regulator-name = "vdd_3v3aux"; | |
| 472 | + regulator-always-on; | |
| 466 | 473 | }; |
| 467 | 474 | |
| 468 | 475 | ldo3_reg: regulator@5 { |
| 469 | 476 | /* VDD_3V3A 3.3V rail */ |
| 477 | + regulator-name = "vdd_3v3a"; | |
| 470 | 478 | regulator-min-microvolt = <3300000>; |
| 471 | 479 | regulator-max-microvolt = <3300000>; |
| 472 | 480 | }; |
| 473 | 481 | |
| 474 | 482 | ldo4_reg: regulator@6 { |
| 475 | 483 | /* VDD_3V3B 3.3V rail */ |
| 484 | + regulator-name = "vdd_3v3b"; | |
| 485 | + regulator-always-on; | |
| 476 | 486 | }; |
| 477 | 487 | }; |
| 478 | 488 | }; |
| @@ -22,6 +22,7 @@ · 21 unmodified lines | ||
| 22 | 22 | MATRIX_KEY(0x00, 0x02, KEY_F1) |
| 23 | 23 | MATRIX_KEY(0x00, 0x03, KEY_B) |
| 24 | 24 | MATRIX_KEY(0x00, 0x04, KEY_F10) |
| 25 | + MATRIX_KEY(0x00, 0x05, KEY_RO) | |
| 25 | 26 | MATRIX_KEY(0x00, 0x06, KEY_N) |
| 26 | 27 | MATRIX_KEY(0x00, 0x08, KEY_EQUAL) |
| 27 | 28 | MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT) |
| @@ -34,6 +35,7 @@ · 6 unmodified lines | ||
| 34 | 35 | MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE) |
| 35 | 36 | MATRIX_KEY(0x01, 0x09, KEY_F9) |
| 36 | 37 | MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE) |
| 38 | + MATRIX_KEY(0x01, 0x0c, KEY_HENKAN) | |
| 37 | 39 | |
| 38 | 40 | MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL) |
| 39 | 41 | MATRIX_KEY(0x02, 0x01, KEY_TAB) |
| @@ -45,6 +47,7 @@ · 5 unmodified lines | ||
| 45 | 47 | MATRIX_KEY(0x02, 0x07, KEY_102ND) |
| 46 | 48 | MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE) |
| 47 | 49 | MATRIX_KEY(0x02, 0x09, KEY_F8) |
| 50 | + MATRIX_KEY(0x02, 0x0a, KEY_YEN) | |
| 48 | 51 | |
| 49 | 52 | MATRIX_KEY(0x03, 0x01, KEY_GRAVE) |
| 50 | 53 | MATRIX_KEY(0x03, 0x02, KEY_F2) |
| @@ -53,6 +56,7 @@ · 2 unmodified lines | ||
| 53 | 56 | MATRIX_KEY(0x03, 0x06, KEY_6) |
| 54 | 57 | MATRIX_KEY(0x03, 0x08, KEY_MINUS) |
| 55 | 58 | MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH) |
| 59 | + MATRIX_KEY(0x03, 0x0c, KEY_MUHENKAN) | |
| 56 | 60 | |
| 57 | 61 | MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL) |
| 58 | 62 | MATRIX_KEY(0x04, 0x01, KEY_A) |
| @@ -468,6 +468,7 @@ · 467 unmodified lines | ||
| 468 | 468 | interrupts = <36 37 38 39 40 41 42 43 44>; |
| 469 | 469 | status = "disabled"; |
| 470 | 470 | clocks = <&clks 26>; |
| 471 | + #io-channel-cells = <1>; | |
| 471 | 472 | }; |
| 472 | 473 | |
| 473 | 474 | spdif@80054000 { |
| @@ -108,7 +108,7 @@ · 107 unmodified lines | ||
| 108 | 108 | }; |
| 109 | 109 | |
| 110 | 110 | gpt1: timer@10003000 { |
| 111 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 111 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 112 | 112 | reg = <0x10003000 0x1000>; |
| 113 | 113 | interrupts = <26>; |
| 114 | 114 | clocks = <&clks IMX27_CLK_GPT1_IPG_GATE>, |
| @@ -117,7 +117,7 @@ · 2 unmodified lines | ||
| 117 | 117 | }; |
| 118 | 118 | |
| 119 | 119 | gpt2: timer@10004000 { |
| 120 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 120 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 121 | 121 | reg = <0x10004000 0x1000>; |
| 122 | 122 | interrupts = <25>; |
| 123 | 123 | clocks = <&clks IMX27_CLK_GPT2_IPG_GATE>, |
| @@ -126,7 +126,7 @@ · 2 unmodified lines | ||
| 126 | 126 | }; |
| 127 | 127 | |
| 128 | 128 | gpt3: timer@10005000 { |
| 129 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 129 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 130 | 130 | reg = <0x10005000 0x1000>; |
| 131 | 131 | interrupts = <24>; |
| 132 | 132 | clocks = <&clks IMX27_CLK_GPT3_IPG_GATE>, |
| @@ -376,7 +376,7 @@ · 243 unmodified lines | ||
| 376 | 376 | }; |
| 377 | 377 | |
| 378 | 378 | gpt4: timer@10019000 { |
| 379 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 379 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 380 | 380 | reg = <0x10019000 0x1000>; |
| 381 | 381 | interrupts = <4>; |
| 382 | 382 | clocks = <&clks IMX27_CLK_GPT4_IPG_GATE>, |
| @@ -385,7 +385,7 @@ · 2 unmodified lines | ||
| 385 | 385 | }; |
| 386 | 386 | |
| 387 | 387 | gpt5: timer@1001a000 { |
| 388 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 388 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 389 | 389 | reg = <0x1001a000 0x1000>; |
| 390 | 390 | interrupts = <3>; |
| 391 | 391 | clocks = <&clks IMX27_CLK_GPT5_IPG_GATE>, |
| @@ -436,7 +436,7 @@ · 44 unmodified lines | ||
| 436 | 436 | }; |
| 437 | 437 | |
| 438 | 438 | gpt6: timer@1001f000 { |
| 439 | − compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | |
| 439 | + compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; | |
| 440 | 440 | reg = <0x1001f000 0x1000>; |
| 441 | 441 | interrupts = <2>; |
| 442 | 442 | clocks = <&clks IMX27_CLK_GPT6_IPG_GATE>, |
| @@ -295,9 +295,10 @@ · 294 unmodified lines | ||
| 295 | 295 | &tve { |
| 296 | 296 | pinctrl-names = "default"; |
| 297 | 297 | pinctrl-0 = <&pinctrl_vga_sync>; |
| 298 | + ddc-i2c-bus = <&i2c2>; | |
| 298 | 299 | fsl,tve-mode = "vga"; |
| 299 | − fsl,hsync-pin = <4>; | |
| 300 | − fsl,vsync-pin = <6>; | |
| 300 | + fsl,hsync-pin = <7>; /* IPU DI1 PIN7 via EIM_OE */ | |
| 301 | + fsl,vsync-pin = <8>; /* IPU DI1 PIN8 via EIM_RW */ | |
| 301 | 302 | status = "okay"; |
| 302 | 303 | }; |
| 303 | 304 | |
| @@ -86,7 +86,7 @@ · 85 unmodified lines | ||
| 86 | 86 | gpio,syscon-dev = <&devctrl 0x240>; |
| 87 | 87 | }; |
| 88 | 88 | |
| 89 | − pcie@21020000 { | |
| 89 | + pcie1: pcie@21020000 { | |
| 90 | 90 | compatible = "ti,keystone-pcie","snps,dw-pcie"; |
| 91 | 91 | clocks = <&clkpcie1>; |
| 92 | 92 | clock-names = "pcie"; |
| @@ -96,6 +96,7 @@ · 3 unmodified lines | ||
| 96 | 96 | ranges = <0x81000000 0 0 0x23260000 0x4000 0x4000 |
| 97 | 97 | 0x82000000 0 0x60000000 0x60000000 0 0x10000000>; |
| 98 | 98 | |
| 99 | + status = "disabled"; | |
| 99 | 100 | device_type = "pci"; |
| 100 | 101 | num-lanes = <2>; |
| 101 | 102 | |
| @@ -286,7 +286,7 @@ · 285 unmodified lines | ||
| 286 | 286 | ti,syscon-dev = <&devctrl 0x2a0>; |
| 287 | 287 | }; |
| 288 | 288 | |
| 289 | − pcie@21800000 { | |
| 289 | + pcie0: pcie@21800000 { | |
| 290 | 290 | compatible = "ti,keystone-pcie", "snps,dw-pcie"; |
| 291 | 291 | clocks = <&clkpcie>; |
| 292 | 292 | clock-names = "pcie"; |
| @@ -296,6 +296,7 @@ · 3 unmodified lines | ||
| 296 | 296 | ranges = <0x81000000 0 0 0x23250000 0 0x4000 |
| 297 | 297 | 0x82000000 0 0x50000000 0x50000000 0 0x10000000>; |
| 298 | 298 | |
| 299 | + status = "disabled"; | |
| 299 | 300 | device_type = "pci"; |
| 300 | 301 | num-lanes = <2>; |
| 301 | 302 | |
| @@ -120,7 +120,7 @@ · 119 unmodified lines | ||
| 120 | 120 | |
| 121 | 121 | lcd0: display@0 { |
| 122 | 122 | compatible = "lgphilips,lb035q02"; |
| 123 | − label = "lcd"; | |
| 123 | + label = "lcd35"; | |
| 124 | 124 | |
| 125 | 125 | reg = <1>; /* CS1 */ |
| 126 | 126 | spi-max-frequency = <10000000>; |
| @@ -98,7 +98,7 @@ · 97 unmodified lines | ||
| 98 | 98 | |
| 99 | 99 | lcd0: display@0 { |
| 100 | 100 | compatible = "samsung,lte430wq-f0c", "panel-dpi"; |
| 101 | − label = "lcd"; | |
| 101 | + label = "lcd43"; | |
| 102 | 102 | |
| 103 | 103 | pinctrl-names = "default"; |
| 104 | 104 | pinctrl-0 = <<e430_pins>; |
| @@ -551,6 +551,7 @@ · 550 unmodified lines | ||
| 551 | 551 | reg = <0x4a066000 0x100>; |
| 552 | 552 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
| 553 | 553 | ti,hwmods = "mmu_dsp"; |
| 554 | + #iommu-cells = <0>; | |
| 554 | 555 | }; |
| 555 | 556 | |
| 556 | 557 | mmu_ipu: mmu@55082000 { |
| @@ -558,6 +559,7 @@ · 1 unmodified line | ||
| 558 | 559 | reg = <0x55082000 0x100>; |
| 559 | 560 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; |
| 560 | 561 | ti,hwmods = "mmu_ipu"; |
| 562 | + #iommu-cells = <0>; | |
| 561 | 563 | ti,iommu-bus-err-back; |
| 562 | 564 | }; |
| 563 | 565 | |
| @@ -612,6 +612,7 @@ · 611 unmodified lines | ||
| 612 | 612 | reg = <0x4a066000 0x100>; |
| 613 | 613 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
| 614 | 614 | ti,hwmods = "mmu_dsp"; |
| 615 | + #iommu-cells = <0>; | |
| 615 | 616 | }; |
| 616 | 617 | |
| 617 | 618 | mmu_ipu: mmu@55082000 { |
| @@ -619,6 +620,7 @@ · 1 unmodified line | ||
| 619 | 620 | reg = <0x55082000 0x100>; |
| 620 | 621 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; |
| 621 | 622 | ti,hwmods = "mmu_ipu"; |
| 623 | + #iommu-cells = <0>; | |
| 622 | 624 | ti,iommu-bus-err-back; |
| 623 | 625 | }; |
| 624 | 626 | |
| @@ -60,27 +60,27 @@ · 59 unmodified lines | ||
| 60 | 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 | 63 | &gpio2 { |
| 73 | 64 | status = "okay"; |
| 74 | 65 | }; |
| 75 | 66 | |
| 76 | −&i2c1{ | |
| 67 | +&i2c1 { | |
| 77 | 68 | status = "okay"; |
| 78 | 69 | |
| 79 | − accel1: accel1@53{ | |
| 80 | − compatible = "adxl34x"; | |
| 70 | + accel1: accelerometer@53 { | |
| 71 | + compatible = "adi,adxl345"; | |
| 81 | 72 | reg = <0x53>; |
| 82 | 73 | |
| 83 | − interrupt-parent = < &portc >; | |
| 74 | + interrupt-parent = <&portc>; | |
| 84 | 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 | +}; | |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /* |
| 2 | 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 | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | 7 | * License. You may obtain a copy of the GNU General Public License |
| @@ -17,6 +17,13 @@ · 16 unmodified lines | ||
| 17 | 17 | model = "ST-Ericsson U8540 platform with Device Tree"; |
| 18 | 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 | 27 | memory@0 { |
| 21 | 28 | device_type = "memory"; |
| 22 | 29 | reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>; |
| @@ -16,6 +16,13 @@ · 15 unmodified lines | ||
| 16 | 16 | model = "ST-Ericsson CCU9540 platform with Device Tree"; |
| 17 | 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 | 26 | memory { |
| 20 | 27 | reg = <0x00000000 0x20000000>; |
| 21 | 28 | }; |
| @@ -971,7 +971,7 @@ · 970 unmodified lines | ||
| 971 | 971 | power-domains = <&pm_domains DOMAIN_VAPE>; |
| 972 | 972 | }; |
| 973 | 973 | |
| 974 | − uart@80120000 { | |
| 974 | + ux500_serial0: uart@80120000 { | |
| 975 | 975 | compatible = "arm,pl011", "arm,primecell"; |
| 976 | 976 | reg = <0x80120000 0x1000>; |
| 977 | 977 | interrupts = <0 11 IRQ_TYPE_LEVEL_HIGH>; |
| @@ -986,7 +986,7 @@ · 8 unmodified lines | ||
| 986 | 986 | status = "disabled"; |
| 987 | 987 | }; |
| 988 | 988 | |
| 989 | − uart@80121000 { | |
| 989 | + ux500_serial1: uart@80121000 { | |
| 990 | 990 | compatible = "arm,pl011", "arm,primecell"; |
| 991 | 991 | reg = <0x80121000 0x1000>; |
| 992 | 992 | interrupts = <0 19 IRQ_TYPE_LEVEL_HIGH>; |
| @@ -1001,7 +1001,7 @@ · 8 unmodified lines | ||
| 1001 | 1001 | status = "disabled"; |
| 1002 | 1002 | }; |
| 1003 | 1003 | |
| 1004 | − uart@80007000 { | |
| 1004 | + ux500_serial2: uart@80007000 { | |
| 1005 | 1005 | compatible = "arm,pl011", "arm,primecell"; |
| 1006 | 1006 | reg = <0x80007000 0x1000>; |
| 1007 | 1007 | interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>; |
| @@ -32,11 +32,11 @@ · 31 unmodified lines | ||
| 32 | 32 | status = "okay"; |
| 33 | 33 | }; |
| 34 | 34 | |
| 35 | + /* This UART is unused and thus left disabled */ | |
| 35 | 36 | uart@80121000 { |
| 36 | 37 | pinctrl-names = "default", "sleep"; |
| 37 | 38 | pinctrl-0 = <&uart1_default_mode>; |
| 38 | 39 | pinctrl-1 = <&uart1_sleep_mode>; |
| 39 | − status = "okay"; | |
| 40 | 40 | }; |
| 41 | 41 | |
| 42 | 42 | uart@80007000 { |
| @@ -17,6 +17,13 @@ · 16 unmodified lines | ||
| 17 | 17 | model = "ST-Ericsson HREF (pre-v60) and ST UIB"; |
| 18 | 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 | 27 | soc { |
| 21 | 28 | /* Reset line for the BU21013 touchscreen */ |
| 22 | 29 | i2c@80110000 { |
| @@ -16,4 +16,11 @@ · 15 unmodified lines | ||
| 16 | 16 | / { |
| 17 | 17 | model = "ST-Ericsson HREF (pre-v60) and TVK1281618 UIB"; |
| 18 | 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 | }; |
| @@ -23,6 +23,11 @@ · 22 unmodified lines | ||
| 23 | 23 | }; |
| 24 | 24 | |
| 25 | 25 | soc { |
| 26 | + /* Enable UART1 on this board */ | |
| 27 | + uart@80121000 { | |
| 28 | + status = "okay"; | |
| 29 | + }; | |
| 30 | + | |
| 26 | 31 | i2c@80004000 { |
| 27 | 32 | tps61052@33 { |
| 28 | 33 | compatible = "tps61052"; |
| @@ -19,6 +19,13 @@ · 18 unmodified lines | ||
| 19 | 19 | model = "ST-Ericsson HREF (v60+) and ST UIB"; |
| 20 | 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 | 29 | soc { |
| 23 | 30 | /* Reset line for the BU21013 touchscreen */ |
| 24 | 31 | i2c@80110000 { |
| @@ -18,4 +18,11 @@ · 17 unmodified lines | ||
| 18 | 18 | / { |
| 19 | 19 | model = "ST-Ericsson HREF (v60+) and TVK1281618 UIB"; |
| 20 | 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 | }; |
| @@ -43,15 +43,26 @@ · 42 unmodified lines | ||
| 43 | 43 | <&vaudio_hf_hrefv60_mode>, |
| 44 | 44 | <&gbf_hrefv60_mode>, |
| 45 | 45 | <&hdtv_hrefv60_mode>, |
| 46 | − <&touch_hrefv60_mode>; | |
| 46 | + <&touch_hrefv60_mode>, | |
| 47 | + <&gpios_hrefv60_mode>; | |
| 47 | 48 | |
| 48 | 49 | sdi0 { |
| 49 | − /* SD card detect GPIO pin, extend default state */ | |
| 50 | 50 | sdi0_default_mode: sdi0_default { |
| 51 | + /* SD card detect GPIO pin, extend default state */ | |
| 51 | 52 | default_hrefv60_cfg1 { |
| 52 | 53 | pins = "GPIO95_E8"; |
| 53 | 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 | 68 | ipgpio { |
| @@ -213,6 +224,16 @@ · 155 unmodified lines | ||
| 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 | }; |
| @@ -18,6 +18,13 @@ · 17 unmodified lines | ||
| 18 | 18 | model = "Calao Systems Snowball platform with device tree"; |
| 19 | 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 | 28 | memory { |
| 22 | 29 | reg = <0x00000000 0x20000000>; |
| 23 | 30 | }; |
| @@ -223,11 +230,11 @@ · 199 unmodified lines | ||
| 223 | 230 | status = "okay"; |
| 224 | 231 | }; |
| 225 | 232 | |
| 233 | + /* This UART is unused and thus left disabled */ | |
| 226 | 234 | uart@80121000 { |
| 227 | 235 | pinctrl-names = "default", "sleep"; |
| 228 | 236 | pinctrl-0 = <&uart1_default_mode>; |
| 229 | 237 | pinctrl-1 = <&uart1_sleep_mode>; |
| 230 | − status = "okay"; | |
| 231 | 238 | }; |
| 232 | 239 | |
| 233 | 240 | uart@80007000 { |
| @@ -452,7 +459,21 @@ · 218 unmodified lines | ||
| 452 | 459 | pins = "GPIO21_AB3"; /* DAT31DIR */ |
| 453 | 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 | 479 | ssp0 { |
| @@ -13,6 +13,7 @@ generic-y += kdebug.h · 12 unmodified lines | ||
| 13 | 13 | generic-y += local.h |
| 14 | 14 | generic-y += local64.h |
| 15 | 15 | generic-y += mcs_spinlock.h |
| 16 | +generic-y += mm-arch-hooks.h | |
| 16 | 17 | generic-y += msgbuf.h |
| 17 | 18 | generic-y += param.h |
| 18 | 19 | generic-y += parport.h |
| @@ -286,7 +286,7 @@ extern phys_addr_t (*arch_virt_to_idmap)(unsigned long x); · 285 unmodified lines | ||
| 286 | 286 | */ |
| 287 | 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 | 290 | return arch_virt_to_idmap(x); |
| 291 | 291 | else |
| 292 | 292 | return __virt_to_phys(x); |
| @@ -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 */ | |
| @@ -818,12 +818,13 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) · 817 unmodified lines | ||
| 818 | 818 | if (arch_find_n_match_cpu_physical_id(dn, cpu, NULL)) |
| 819 | 819 | break; |
| 820 | 820 | |
| 821 | − of_node_put(dn); | |
| 822 | 821 | if (cpu >= nr_cpu_ids) { |
| 823 | 822 | pr_warn("Failed to find logical CPU for %s\n", |
| 824 | 823 | dn->name); |
| 824 | + of_node_put(dn); | |
| 825 | 825 | break; |
| 826 | 826 | } |
| 827 | + of_node_put(dn); | |
| 827 | 828 | |
| 828 | 829 | irqs[i] = cpu; |
| 829 | 830 | cpumask_set_cpu(cpu, &pmu->supported_cpus); |
| @@ -50,7 +50,7 @@ static void __soft_restart(void *addr) · 49 unmodified lines | ||
| 50 | 50 | flush_cache_all(); |
| 51 | 51 | |
| 52 | 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 | 54 | phys_reset((unsigned long)addr); |
| 55 | 55 | |
| 56 | 56 | /* Should never get here. */ |
| @@ -291,8 +291,6 @@ void __init imx_gpc_check_dt(void) · 290 unmodified lines | ||
| 291 | 291 | } |
| 292 | 292 | } |
| 293 | 293 | |
| 294 | −#ifdef CONFIG_PM_GENERIC_DOMAINS | |
| 295 | − | |
| 296 | 294 | static void _imx6q_pm_pu_power_off(struct generic_pm_domain *genpd) |
| 297 | 295 | { |
| 298 | 296 | int iso, iso2sw; |
| @@ -399,7 +397,6 @@ static struct genpd_onecell_data imx_gpc_onecell_data = { · 100 unmodified lines | ||
| 399 | 397 | static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) |
| 400 | 398 | { |
| 401 | 399 | struct clk *clk; |
| 402 | − bool is_off; | |
| 403 | 400 | int i; |
| 404 | 401 | |
| 405 | 402 | imx6q_pu_domain.reg = pu_reg; |
| @@ -416,18 +413,13 @@ static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) · 10 unmodified lines | ||
| 416 | 413 | } |
| 417 | 414 | imx6q_pu_domain.num_clks = i; |
| 418 | 415 | |
| 419 | − is_off = IS_ENABLED(CONFIG_PM); | |
| 420 | − if (is_off) { | |
| 421 | − _imx6q_pm_pu_power_off(&imx6q_pu_domain.base); | |
| 422 | − } else { | |
| 423 | − /* | |
| 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 | − } | |
| 416 | + /* Enable power always in case bootloader disabled it. */ | |
| 417 | + imx6q_pm_pu_power_on(&imx6q_pu_domain.base); | |
| 418 | + | |
| 419 | + if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) | |
| 420 | + return 0; | |
| 429 | 421 | |
| 430 | − pm_genpd_init(&imx6q_pu_domain.base, NULL, is_off); | |
| 422 | + pm_genpd_init(&imx6q_pu_domain.base, NULL, false); | |
| 431 | 423 | return of_genpd_add_provider_onecell(dev->of_node, |
| 432 | 424 | &imx_gpc_onecell_data); |
| 433 | 425 | |
| @@ -437,13 +429,6 @@ clk_err: · 3 unmodified lines | ||
| 437 | 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 | 432 | static int imx_gpc_probe(struct platform_device *pdev) |
| 448 | 433 | { |
| 449 | 434 | struct regulator *pu_reg; |
| @@ -60,6 +60,7 @@ config SOC_AM43XX · 59 unmodified lines | ||
| 60 | 60 | select ARM_GIC |
| 61 | 61 | select MACH_OMAP_GENERIC |
| 62 | 62 | select MIGHT_HAVE_CACHE_L2X0 |
| 63 | + select HAVE_ARM_SCU | |
| 63 | 64 | |
| 64 | 65 | config SOC_DRA7XX |
| 65 | 66 | bool "TI DRA7XX" |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | #include <linux/ata_platform.h> |
| 25 | 25 | #include <linux/serial_8250.h> |
| 26 | 26 | #include <linux/gpio.h> |
| 27 | +#include <linux/regulator/machine.h> | |
| 27 | 28 | |
| 28 | 29 | #include <asm/mach-types.h> |
| 29 | 30 | #include <asm/mach/arch.h> |
| @@ -144,6 +145,8 @@ static void __init capc7117_init(void) · 114 unmodified lines | ||
| 144 | 145 | |
| 145 | 146 | capc7117_uarts_init(); |
| 146 | 147 | capc7117_ide_init(); |
| 148 | + | |
| 149 | + regulator_has_full_constraints(); | |
| 147 | 150 | } |
| 148 | 151 | |
| 149 | 152 | MACHINE_START(CAPC7117, |
| @@ -13,6 +13,7 @@ · 12 unmodified lines | ||
| 13 | 13 | #include <linux/syscore_ops.h> |
| 14 | 14 | #include <linux/irq.h> |
| 15 | 15 | #include <linux/gpio.h> |
| 16 | +#include <linux/regulator/machine.h> | |
| 16 | 17 | |
| 17 | 18 | #include <linux/dm9000.h> |
| 18 | 19 | #include <linux/leds.h> |
| @@ -466,6 +467,8 @@ static void __init cmx2xx_init(void) · 447 unmodified lines | ||
| 466 | 467 | cmx2xx_init_ac97(); |
| 467 | 468 | cmx2xx_init_touchscreen(); |
| 468 | 469 | cmx2xx_init_leds(); |
| 470 | + | |
| 471 | + regulator_has_full_constraints(); | |
| 469 | 472 | } |
| 470 | 473 | |
| 471 | 474 | static void __init cmx2xx_init_irq(void) |
| @@ -835,6 +835,8 @@ static void __init cm_x300_init(void) · 834 unmodified lines | ||
| 835 | 835 | cm_x300_init_ac97(); |
| 836 | 836 | cm_x300_init_wi2wi(); |
| 837 | 837 | cm_x300_init_bl(); |
| 838 | + | |
| 839 | + regulator_has_full_constraints(); | |
| 838 | 840 | } |
| 839 | 841 | |
| 840 | 842 | static void __init cm_x300_fixup(struct tag *tags, char **cmdline) |
| @@ -18,6 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | #include <linux/mtd/partitions.h> |
| 19 | 19 | #include <linux/mtd/physmap.h> |
| 20 | 20 | #include <linux/platform_device.h> |
| 21 | +#include <linux/regulator/machine.h> | |
| 21 | 22 | #include <linux/ucb1400.h> |
| 22 | 23 | |
| 23 | 24 | #include <asm/mach/arch.h> |
| @@ -294,6 +295,8 @@ static void __init colibri_pxa270_init(void) · 270 unmodified lines | ||
| 294 | 295 | printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n", |
| 295 | 296 | colibri_pxa270_baseboard); |
| 296 | 297 | } |
| 298 | + | |
| 299 | + regulator_has_full_constraints(); | |
| 297 | 300 | } |
| 298 | 301 | |
| 299 | 302 | /* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either |
| @@ -1306,6 +1306,8 @@ static void __init em_x270_init(void) · 1305 unmodified lines | ||
| 1306 | 1306 | em_x270_init_i2c(); |
| 1307 | 1307 | em_x270_init_camera(); |
| 1308 | 1308 | em_x270_userspace_consumers_init(); |
| 1309 | + | |
| 1310 | + regulator_has_full_constraints(); | |
| 1309 | 1311 | } |
| 1310 | 1312 | |
| 1311 | 1313 | MACHINE_START(EM_X270, "Compulab EM-X270") |
| @@ -26,6 +26,7 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <linux/spi/spi.h> |
| 27 | 27 | #include <linux/spi/pxa2xx_spi.h> |
| 28 | 28 | #include <linux/can/platform/mcp251x.h> |
| 29 | +#include <linux/regulator/machine.h> | |
| 29 | 30 | |
| 30 | 31 | #include "generic.h" |
| 31 | 32 | |
| @@ -185,6 +186,8 @@ static void __init icontrol_init(void) · 153 unmodified lines | ||
| 185 | 186 | mxm_8x10_mmc_init(); |
| 186 | 187 | |
| 187 | 188 | icontrol_can_init(); |
| 189 | + | |
| 190 | + regulator_has_full_constraints(); | |
| 188 | 191 | } |
| 189 | 192 | |
| 190 | 193 | MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM") |
| @@ -26,6 +26,7 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <linux/dm9000.h> |
| 27 | 27 | #include <linux/mtd/physmap.h> |
| 28 | 28 | #include <linux/mtd/partitions.h> |
| 29 | +#include <linux/regulator/machine.h> | |
| 29 | 30 | #include <linux/i2c/pxa-i2c.h> |
| 30 | 31 | |
| 31 | 32 | #include <asm/types.h> |
| @@ -534,6 +535,8 @@ static void __init trizeps4_init(void) · 502 unmodified lines | ||
| 534 | 535 | |
| 535 | 536 | BCR_writew(trizeps_conxs_bcr); |
| 536 | 537 | board_backlight_power(1); |
| 538 | + | |
| 539 | + regulator_has_full_constraints(); | |
| 537 | 540 | } |
| 538 | 541 | |
| 539 | 542 | static void __init trizeps4_map_io(void) |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | #include <linux/dm9000.h> |
| 25 | 25 | #include <linux/ucb1400.h> |
| 26 | 26 | #include <linux/ata_platform.h> |
| 27 | +#include <linux/regulator/machine.h> | |
| 27 | 28 | #include <linux/regulator/max1586.h> |
| 28 | 29 | #include <linux/i2c/pxa-i2c.h> |
| 29 | 30 | |
| @@ -711,6 +712,8 @@ static void __init vpac270_init(void) · 681 unmodified lines | ||
| 711 | 712 | vpac270_ts_init(); |
| 712 | 713 | vpac270_rtc_init(); |
| 713 | 714 | vpac270_ide_init(); |
| 715 | + | |
| 716 | + regulator_has_full_constraints(); | |
| 714 | 717 | } |
| 715 | 718 | |
| 716 | 719 | MACHINE_START(VPAC270, "Voipac PXA270") |
| @@ -868,6 +868,8 @@ static void __init zeus_init(void) · 867 unmodified lines | ||
| 868 | 868 | i2c_register_board_info(0, ARRAY_AND_SIZE(zeus_i2c_devices)); |
| 869 | 869 | pxa2xx_set_spi_info(3, &pxa2xx_spi_ssp3_master_info); |
| 870 | 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 | 875 | static struct map_desc zeus_io_desc[] __initdata = { |
| @@ -3,7 +3,7 @@ · 2 unmodified lines | ||
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> |
| 6 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 6 | + * Viresh Kumar <vireshk@kernel.org> | |
| 7 | 7 | * |
| 8 | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | 9 | * License version 2. This program is licensed "as is" without any |
| @@ -3,7 +3,7 @@ · 2 unmodified lines | ||
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> |
| 6 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 6 | + * Viresh Kumar <vireshk@kernel.org> | |
| 7 | 7 | * |
| 8 | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | 9 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Miscellaneous registers definitions for SPEAr3xx machine family |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -3,7 +3,7 @@ · 2 unmodified lines | ||
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2009,2012 ST Microelectronics |
| 5 | 5 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> |
| 6 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 6 | + * Viresh Kumar <vireshk@kernel.org> | |
| 7 | 7 | * |
| 8 | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | 9 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Serial port stubs for kernel decompress status messages |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * DMAC pl080 definitions for SPEAr platform |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * DMAC pl080 definitions for SPEAr platform |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr platform specific restart functions |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr1310 machine source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr1340 machine source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr13XX machines common source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr300 machine source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr310 machine source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr320 machine source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr3XX machines common source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -1971,7 +1971,7 @@ static int extend_iommu_mapping(struct dma_iommu_mapping *mapping) · 1970 unmodified lines | ||
| 1971 | 1971 | { |
| 1972 | 1972 | int next_bitmap; |
| 1973 | 1973 | |
| 1974 | − if (mapping->nr_bitmaps > mapping->extensions) | |
| 1974 | + if (mapping->nr_bitmaps >= mapping->extensions) | |
| 1975 | 1975 | return -EINVAL; |
| 1976 | 1976 | |
| 1977 | 1977 | next_bitmap = mapping->nr_bitmaps; |
| @@ -274,7 +274,10 @@ __v7_ca15mp_setup: · 273 unmodified lines | ||
| 274 | 274 | __v7_b15mp_setup: |
| 275 | 275 | __v7_ca17mp_setup: |
| 276 | 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 | 281 | #ifdef CONFIG_SMP |
| 279 | 282 | ALT_SMP(mrc p15, 0, r0, c1, c0, 1) |
| 280 | 283 | ALT_UP(mov r0, #(1 << 6)) @ fake it for UP |
| @@ -283,7 +286,7 @@ __v7_ca17mp_setup: · 2 unmodified lines | ||
| 283 | 286 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits |
| 284 | 287 | mcreq p15, 0, r0, c1, c0, 1 |
| 285 | 288 | #endif |
| 286 | − b __v7_setup | |
| 289 | + b __v7_setup_cont | |
| 287 | 290 | |
| 288 | 291 | /* |
| 289 | 292 | * Errata: |
| @@ -413,10 +416,11 @@ __v7_pj4b_setup: · 123 unmodified lines | ||
| 413 | 416 | |
| 414 | 417 | __v7_setup: |
| 415 | 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 | 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 | 424 | and r0, r9, #0xff000000 @ ARM? |
| 421 | 425 | teq r0, #0x41000000 |
| 422 | 426 | bne __errata_finish |
| @@ -480,7 +484,7 @@ ENDPROC(__v7_setup) · 57 unmodified lines | ||
| 480 | 484 | |
| 481 | 485 | .align 2 |
| 482 | 486 | __v7_setup_stack: |
| 483 | − .space 4 * 11 @ 11 registers | |
| 487 | + .space 4 * 7 @ 12 registers | |
| 484 | 488 | |
| 485 | 489 | __INITDATA |
| 486 | 490 | |
| @@ -74,32 +74,52 @@ struct jit_ctx { · 73 unmodified lines | ||
| 74 | 74 | |
| 75 | 75 | int bpf_jit_enable __read_mostly; |
| 76 | 76 | |
| 77 | −static u64 jit_get_skb_b(struct sk_buff *skb, unsigned offset) | |
| 77 | +static inline int call_neg_helper(struct sk_buff *skb, int offset, void *ret, | |
| 78 | + unsigned int size) | |
| 79 | +{ | |
| 80 | + void *ptr = bpf_internal_load_pointer_neg_helper(skb, offset, size); | |
| 81 | + | |
| 82 | + if (!ptr) | |
| 83 | + return -EFAULT; | |
| 84 | + memcpy(ret, ptr, size); | |
| 85 | + return 0; | |
| 86 | +} | |
| 87 | + | |
| 88 | +static u64 jit_get_skb_b(struct sk_buff *skb, int offset) | |
| 78 | 89 | { |
| 79 | 90 | u8 ret; |
| 80 | 91 | int err; |
| 81 | 92 | |
| 82 | − err = skb_copy_bits(skb, offset, &ret, 1); | |
| 93 | + if (offset < 0) | |
| 94 | + err = call_neg_helper(skb, offset, &ret, 1); | |
| 95 | + else | |
| 96 | + err = skb_copy_bits(skb, offset, &ret, 1); | |
| 83 | 97 | |
| 84 | 98 | return (u64)err << 32 | ret; |
| 85 | 99 | } |
| 86 | 100 | |
| 87 | −static u64 jit_get_skb_h(struct sk_buff *skb, unsigned offset) | |
| 101 | +static u64 jit_get_skb_h(struct sk_buff *skb, int offset) | |
| 88 | 102 | { |
| 89 | 103 | u16 ret; |
| 90 | 104 | int err; |
| 91 | 105 | |
| 92 | − err = skb_copy_bits(skb, offset, &ret, 2); | |
| 106 | + if (offset < 0) | |
| 107 | + err = call_neg_helper(skb, offset, &ret, 2); | |
| 108 | + else | |
| 109 | + err = skb_copy_bits(skb, offset, &ret, 2); | |
| 93 | 110 | |
| 94 | 111 | return (u64)err << 32 | ntohs(ret); |
| 95 | 112 | } |
| 96 | 113 | |
| 97 | −static u64 jit_get_skb_w(struct sk_buff *skb, unsigned offset) | |
| 114 | +static u64 jit_get_skb_w(struct sk_buff *skb, int offset) | |
| 98 | 115 | { |
| 99 | 116 | u32 ret; |
| 100 | 117 | int err; |
| 101 | 118 | |
| 102 | − err = skb_copy_bits(skb, offset, &ret, 4); | |
| 119 | + if (offset < 0) | |
| 120 | + err = call_neg_helper(skb, offset, &ret, 4); | |
| 121 | + else | |
| 122 | + err = skb_copy_bits(skb, offset, &ret, 4); | |
| 103 | 123 | |
| 104 | 124 | return (u64)err << 32 | ntohl(ret); |
| 105 | 125 | } |
| @@ -536,9 +556,6 @@ static int build_body(struct jit_ctx *ctx) · 430 unmodified lines | ||
| 536 | 556 | case BPF_LD | BPF_B | BPF_ABS: |
| 537 | 557 | load_order = 0; |
| 538 | 558 | load: |
| 539 | − /* the interpreter will deal with the negative K */ | |
| 540 | − if ((int)k < 0) | |
| 541 | − return -ENOTSUPP; | |
| 542 | 559 | emit_mov_i(r_off, k, ctx); |
| 543 | 560 | load_common: |
| 544 | 561 | ctx->seen |= SEEN_DATA | SEEN_CALL; |
| @@ -547,12 +564,24 @@ load_common: · 2 unmodified lines | ||
| 547 | 564 | emit(ARM_SUB_I(r_scratch, r_skb_hl, |
| 548 | 565 | 1 << load_order), ctx); |
| 549 | 566 | emit(ARM_CMP_R(r_scratch, r_off), ctx); |
| 550 | − condt = ARM_COND_HS; | |
| 567 | + condt = ARM_COND_GE; | |
| 551 | 568 | } else { |
| 552 | 569 | emit(ARM_CMP_R(r_skb_hl, r_off), ctx); |
| 553 | 570 | condt = ARM_COND_HI; |
| 554 | 571 | } |
| 555 | 572 | |
| 573 | + /* | |
| 574 | + * test for negative offset, only if we are | |
| 575 | + * currently scheduled to take the fast | |
| 576 | + * path. this will update the flags so that | |
| 577 | + * the slowpath instruction are ignored if the | |
| 578 | + * offset is negative. | |
| 579 | + * | |
| 580 | + * for loard_order == 0 the HI condition will | |
| 581 | + * make loads at offset 0 take the slow path too. | |
| 582 | + */ | |
| 583 | + _emit(condt, ARM_CMP_I(r_off, 0), ctx); | |
| 584 | + | |
| 556 | 585 | _emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data), |
| 557 | 586 | ctx); |
| 558 | 587 | |
| @@ -860,9 +889,11 @@ b_epilogue: · 301 unmodified lines | ||
| 860 | 889 | off = offsetof(struct sk_buff, vlan_tci); |
| 861 | 890 | emit(ARM_LDRH_I(r_A, r_skb, off), ctx); |
| 862 | 891 | if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) |
| 863 | − OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); | |
| 864 | − else | |
| 865 | − OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); | |
| 892 | + OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx); | |
| 893 | + else { | |
| 894 | + OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx); | |
| 895 | + OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx); | |
| 896 | + } | |
| 866 | 897 | break; |
| 867 | 898 | case BPF_ANC | SKF_AD_QUEUE: |
| 868 | 899 | ctx->seen |= SEEN_SKB; |
| @@ -25,6 +25,7 @@ generic-y += kvm_para.h · 24 unmodified lines | ||
| 25 | 25 | generic-y += local.h |
| 26 | 26 | generic-y += local64.h |
| 27 | 27 | generic-y += mcs_spinlock.h |
| 28 | +generic-y += mm-arch-hooks.h | |
| 28 | 29 | generic-y += mman.h |
| 29 | 30 | generic-y += msgbuf.h |
| 30 | 31 | generic-y += msi.h |
| @@ -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 */ | |
| @@ -585,7 +585,8 @@ ENDPROC(el0_irq) · 584 unmodified lines | ||
| 585 | 585 | * |
| 586 | 586 | */ |
| 587 | 587 | ENTRY(cpu_switch_to) |
| 588 | − add x8, x0, #THREAD_CPU_CONTEXT | |
| 588 | + mov x10, #THREAD_CPU_CONTEXT | |
| 589 | + add x8, x0, x10 | |
| 589 | 590 | mov x9, sp |
| 590 | 591 | stp x19, x20, [x8], #16 // store callee-saved registers |
| 591 | 592 | stp x21, x22, [x8], #16 |
| @@ -594,7 +595,7 @@ ENTRY(cpu_switch_to) · 2 unmodified lines | ||
| 594 | 595 | stp x27, x28, [x8], #16 |
| 595 | 596 | stp x29, x9, [x8], #16 |
| 596 | 597 | str lr, [x8] |
| 597 | − add x8, x1, #THREAD_CPU_CONTEXT | |
| 598 | + add x8, x1, x10 | |
| 598 | 599 | ldp x19, x20, [x8], #16 // restore callee-saved registers |
| 599 | 600 | ldp x21, x22, [x8], #16 |
| 600 | 601 | ldp x23, x24, [x8], #16 |
| @@ -61,7 +61,7 @@ void __init init_IRQ(void) · 60 unmodified lines | ||
| 61 | 61 | static bool migrate_one_irq(struct irq_desc *desc) |
| 62 | 62 | { |
| 63 | 63 | struct irq_data *d = irq_desc_get_irq_data(desc); |
| 64 | − const struct cpumask *affinity = d->affinity; | |
| 64 | + const struct cpumask *affinity = irq_data_get_affinity_mask(d); | |
| 65 | 65 | struct irq_chip *c; |
| 66 | 66 | bool ret = false; |
| 67 | 67 | |
| @@ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc) · 13 unmodified lines | ||
| 81 | 81 | if (!c->irq_set_affinity) |
| 82 | 82 | pr_debug("IRQ%u: unable to set affinity\n", d->irq); |
| 83 | 83 | else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) |
| 84 | − cpumask_copy(d->affinity, affinity); | |
| 84 | + cpumask_copy(irq_data_get_affinity_mask(d), affinity); | |
| 85 | 85 | |
| 86 | 86 | return ret; |
| 87 | 87 | } |
| @@ -12,6 +12,7 @@ generic-y += irq_work.h · 11 unmodified lines | ||
| 12 | 12 | generic-y += local.h |
| 13 | 13 | generic-y += local64.h |
| 14 | 14 | generic-y += mcs_spinlock.h |
| 15 | +generic-y += mm-arch-hooks.h | |
| 15 | 16 | generic-y += param.h |
| 16 | 17 | generic-y += percpu.h |
| 17 | 18 | generic-y += preempt.h |
| @@ -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 */ | |
| @@ -18,6 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | |
| 19 | 19 | #include <mach/pm.h> |
| 20 | 20 | |
| 21 | +static bool disable_cpu_idle_poll; | |
| 21 | 22 | |
| 22 | 23 | static cycle_t read_cycle_count(struct clocksource *cs) |
| 23 | 24 | { |
| @@ -80,45 +81,45 @@ static int comparator_next_event(unsigned long delta, · 56 unmodified lines | ||
| 80 | 81 | return 0; |
| 81 | 82 | } |
| 82 | 83 | |
| 83 | −static void comparator_mode(enum clock_event_mode mode, | |
| 84 | − struct clock_event_device *evdev) | |
| 84 | +static int comparator_shutdown(struct clock_event_device *evdev) | |
| 85 | 85 | { |
| 86 | − switch (mode) { | |
| 87 | − case CLOCK_EVT_MODE_ONESHOT: | |
| 88 | − pr_debug("%s: start\n", evdev->name); | |
| 89 | − /* FALLTHROUGH */ | |
| 90 | − case CLOCK_EVT_MODE_RESUME: | |
| 86 | + pr_debug("%s: %s\n", __func__, evdev->name); | |
| 87 | + sysreg_write(COMPARE, 0); | |
| 88 | + | |
| 89 | + if (disable_cpu_idle_poll) { | |
| 90 | + disable_cpu_idle_poll = false; | |
| 91 | 91 | /* |
| 92 | − * If we're using the COUNT and COMPARE registers we | |
| 93 | − * need to force idle poll. | |
| 92 | + * Only disable idle poll if we have forced that | |
| 93 | + * in a previous call. | |
| 94 | 94 | */ |
| 95 | − cpu_idle_poll_ctrl(true); | |
| 96 | − break; | |
| 97 | − case CLOCK_EVT_MODE_UNUSED: | |
| 98 | − case CLOCK_EVT_MODE_SHUTDOWN: | |
| 99 | − sysreg_write(COMPARE, 0); | |
| 100 | − pr_debug("%s: stop\n", evdev->name); | |
| 101 | − if (evdev->mode == CLOCK_EVT_MODE_ONESHOT || | |
| 102 | − evdev->mode == CLOCK_EVT_MODE_RESUME) { | |
| 103 | − /* | |
| 104 | − * Only disable idle poll if we have forced that | |
| 105 | − * in a previous call. | |
| 106 | − */ | |
| 107 | − cpu_idle_poll_ctrl(false); | |
| 108 | − } | |
| 109 | − break; | |
| 110 | − default: | |
| 111 | − BUG(); | |
| 95 | + cpu_idle_poll_ctrl(false); | |
| 112 | 96 | } |
| 97 | + return 0; | |
| 98 | +} | |
| 99 | + | |
| 100 | +static int comparator_set_oneshot(struct clock_event_device *evdev) | |
| 101 | +{ | |
| 102 | + pr_debug("%s: %s\n", __func__, evdev->name); | |
| 103 | + | |
| 104 | + disable_cpu_idle_poll = true; | |
| 105 | + /* | |
| 106 | + * If we're using the COUNT and COMPARE registers we | |
| 107 | + * need to force idle poll. | |
| 108 | + */ | |
| 109 | + cpu_idle_poll_ctrl(true); | |
| 110 | + | |
| 111 | + return 0; | |
| 113 | 112 | } |
| 114 | 113 | |
| 115 | 114 | static struct clock_event_device comparator = { |
| 116 | − .name = "avr32_comparator", | |
| 117 | − .features = CLOCK_EVT_FEAT_ONESHOT, | |
| 118 | − .shift = 16, | |
| 119 | − .rating = 50, | |
| 120 | − .set_next_event = comparator_next_event, | |
| 121 | − .set_mode = comparator_mode, | |
| 115 | + .name = "avr32_comparator", | |
| 116 | + .features = CLOCK_EVT_FEAT_ONESHOT, | |
| 117 | + .shift = 16, | |
| 118 | + .rating = 50, | |
| 119 | + .set_next_event = comparator_next_event, | |
| 120 | + .set_state_shutdown = comparator_shutdown, | |
| 121 | + .set_state_oneshot = comparator_set_oneshot, | |
| 122 | + .tick_resume = comparator_set_oneshot, | |
| 122 | 123 | }; |
| 123 | 124 | |
| 124 | 125 | void read_persistent_clock(struct timespec *ts) |
| @@ -21,6 +21,7 @@ generic-y += kvm_para.h · 20 unmodified lines | ||
| 21 | 21 | generic-y += local.h |
| 22 | 22 | generic-y += local64.h |
| 23 | 23 | generic-y += mcs_spinlock.h |
| 24 | +generic-y += mm-arch-hooks.h | |
| 24 | 25 | generic-y += mman.h |
| 25 | 26 | generic-y += msgbuf.h |
| 26 | 27 | generic-y += mutex.h |
| @@ -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 */ | |
| @@ -26,6 +26,7 @@ generic-y += kdebug.h · 25 unmodified lines | ||
| 26 | 26 | generic-y += kmap_types.h |
| 27 | 27 | generic-y += local.h |
| 28 | 28 | generic-y += mcs_spinlock.h |
| 29 | +generic-y += mm-arch-hooks.h | |
| 29 | 30 | generic-y += mman.h |
| 30 | 31 | generic-y += mmu.h |
| 31 | 32 | generic-y += mmu_context.h |
| @@ -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 */ | |
| @@ -18,6 +18,7 @@ generic-y += linkage.h · 17 unmodified lines | ||
| 18 | 18 | generic-y += local.h |
| 19 | 19 | generic-y += local64.h |
| 20 | 20 | generic-y += mcs_spinlock.h |
| 21 | +generic-y += mm-arch-hooks.h | |
| 21 | 22 | generic-y += module.h |
| 22 | 23 | generic-y += percpu.h |
| 23 | 24 | generic-y += preempt.h |
| @@ -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 */ | |
| @@ -4,5 +4,6 @@ generic-y += cputime.h · 3 unmodified lines | ||
| 4 | 4 | generic-y += exec.h |
| 5 | 5 | generic-y += irq_work.h |
| 6 | 6 | generic-y += mcs_spinlock.h |
| 7 | +generic-y += mm-arch-hooks.h | |
| 7 | 8 | generic-y += preempt.h |
| 8 | 9 | generic-y += trace_clock.h |
| @@ -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 */ | |
| @@ -33,6 +33,7 @@ generic-y += linkage.h · 32 unmodified lines | ||
| 33 | 33 | generic-y += local.h |
| 34 | 34 | generic-y += local64.h |
| 35 | 35 | generic-y += mcs_spinlock.h |
| 36 | +generic-y += mm-arch-hooks.h | |
| 36 | 37 | generic-y += mman.h |
| 37 | 38 | generic-y += mmu.h |
| 38 | 39 | generic-y += mmu_context.h |
| @@ -28,6 +28,7 @@ generic-y += kmap_types.h · 27 unmodified lines | ||
| 28 | 28 | generic-y += local.h |
| 29 | 29 | generic-y += local64.h |
| 30 | 30 | generic-y += mcs_spinlock.h |
| 31 | +generic-y += mm-arch-hooks.h | |
| 31 | 32 | generic-y += mman.h |
| 32 | 33 | generic-y += msgbuf.h |
| 33 | 34 | generic-y += pci.h |
| @@ -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 */ | |
| @@ -4,6 +4,7 @@ generic-y += exec.h · 3 unmodified lines | ||
| 4 | 4 | generic-y += irq_work.h |
| 5 | 5 | generic-y += kvm_para.h |
| 6 | 6 | generic-y += mcs_spinlock.h |
| 7 | +generic-y += mm-arch-hooks.h | |
| 7 | 8 | generic-y += preempt.h |
| 8 | 9 | generic-y += trace_clock.h |
| 9 | 10 | generic-y += vtime.h |
| @@ -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 */ | |
| @@ -4,6 +4,7 @@ generic-y += cputime.h · 3 unmodified lines | ||
| 4 | 4 | generic-y += exec.h |
| 5 | 5 | generic-y += irq_work.h |
| 6 | 6 | generic-y += mcs_spinlock.h |
| 7 | +generic-y += mm-arch-hooks.h | |
| 7 | 8 | generic-y += module.h |
| 8 | 9 | generic-y += preempt.h |
| 9 | 10 | generic-y += sections.h |
| @@ -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 */ | |
| @@ -125,6 +125,13 @@ endif # M68KCLASSIC · 124 unmodified lines | ||
| 125 | 125 | |
| 126 | 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 | 135 | config M5206 |
| 129 | 136 | bool "MCF5206" |
| 130 | 137 | depends on !MMU |
| @@ -174,9 +181,6 @@ config M525x · 43 unmodified lines | ||
| 174 | 181 | help |
| 175 | 182 | Freescale (Motorola) Coldfire 5251/5253 processor support. |
| 176 | 183 | |
| 177 | −config M527x | |
| 178 | − bool | |
| 179 | − | |
| 180 | 184 | config M5271 |
| 181 | 185 | bool "MCF5271" |
| 182 | 186 | depends on !MMU |
| @@ -223,9 +227,6 @@ config M5307 · 40 unmodified lines | ||
| 223 | 227 | help |
| 224 | 228 | Motorola ColdFire 5307 processor support. |
| 225 | 229 | |
| 226 | −config M53xx | |
| 227 | − bool | |
| 228 | − | |
| 229 | 230 | config M532x |
| 230 | 231 | bool "MCF532x" |
| 231 | 232 | depends on !MMU |
| @@ -251,9 +252,6 @@ config M5407 · 19 unmodified lines | ||
| 251 | 252 | help |
| 252 | 253 | Motorola ColdFire 5407 processor support. |
| 253 | 254 | |
| 254 | −config M54xx | |
| 255 | − bool | |
| 256 | − | |
| 257 | 255 | config M547x |
| 258 | 256 | bool "MCF547x" |
| 259 | 257 | select M54xx |
| @@ -280,6 +278,17 @@ config M5441x · 20 unmodified lines | ||
| 280 | 278 | help |
| 281 | 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 | 292 | endif # COLDFIRE |
| 284 | 293 | |
| 285 | 294 | |
| @@ -416,22 +425,18 @@ config HAVE_MBAR · 130 unmodified lines | ||
| 416 | 425 | config HAVE_IPSBAR |
| 417 | 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 | 428 | config CLOCK_FREQ |
| 432 | 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 | 438 | default "66666666" |
| 434 | − depends on CLOCK_SET | |
| 439 | + depends on COLDFIRE | |
| 435 | 440 | help |
| 436 | 441 | Define the CPU clock frequency in use. This is the core clock |
| 437 | 442 | frequency, it may or may not be the same as the external clock |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,17 +12,12 @@ CONFIG_EXPERT=y · 5 unmodified lines | ||
| 16 | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 19 | −CONFIG_M520x=y | |
| 20 | −CONFIG_CLOCK_SET=y | |
| 21 | −CONFIG_CLOCK_FREQ=166666666 | |
| 22 | −CONFIG_CLOCK_DIV=2 | |
| 23 | −CONFIG_M5208EVB=y | |
| 15 | +# CONFIG_MMU is not set | |
| 24 | 16 | # CONFIG_4KSTACKS is not set |
| 25 | 17 | CONFIG_RAMBASE=0x40000000 |
| 26 | 18 | CONFIG_RAMSIZE=0x2000000 |
| 27 | 19 | CONFIG_VECTORBASE=0x40000000 |
| 28 | 20 | CONFIG_KERNELBASE=0x40020000 |
| 29 | −CONFIG_RAM16BIT=y | |
| 30 | 21 | CONFIG_BINFMT_FLAT=y |
| 31 | 22 | CONFIG_NET=y |
| 32 | 23 | CONFIG_PACKET=y |
| @@ -40,24 +31,19 @@ CONFIG_INET=y · 7 unmodified lines | ||
| 40 | 31 | # CONFIG_IPV6 is not set |
| 41 | 32 | # CONFIG_FW_LOADER is not set |
| 42 | 33 | CONFIG_MTD=y |
| 43 | −CONFIG_MTD_CHAR=y | |
| 44 | 34 | CONFIG_MTD_BLOCK=y |
| 45 | 35 | CONFIG_MTD_RAM=y |
| 46 | 36 | CONFIG_MTD_UCLINUX=y |
| 47 | 37 | CONFIG_BLK_DEV_RAM=y |
| 48 | −# CONFIG_MISC_DEVICES is not set | |
| 49 | 38 | CONFIG_NETDEVICES=y |
| 50 | −CONFIG_NET_ETHERNET=y | |
| 51 | 39 | CONFIG_FEC=y |
| 52 | −# CONFIG_NETDEV_1000 is not set | |
| 53 | −# CONFIG_NETDEV_10000 is not set | |
| 54 | 40 | # CONFIG_INPUT is not set |
| 55 | 41 | # CONFIG_SERIO is not set |
| 56 | 42 | # CONFIG_VT is not set |
| 43 | +# CONFIG_UNIX98_PTYS is not set | |
| 57 | 44 | CONFIG_SERIAL_MCF=y |
| 58 | 45 | CONFIG_SERIAL_MCF_BAUDRATE=115200 |
| 59 | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 60 | −# CONFIG_UNIX98_PTYS is not set | |
| 61 | 47 | # CONFIG_HW_RANDOM is not set |
| 62 | 48 | # CONFIG_HWMON is not set |
| 63 | 49 | # CONFIG_USB_SUPPORT is not set |
| @@ -68,8 +54,6 @@ CONFIG_EXT2_FS=y · 4 unmodified lines | ||
| 68 | 54 | CONFIG_ROMFS_FS=y |
| 69 | 55 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 70 | 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 | 57 | CONFIG_BOOTPARAM=y |
| 75 | 58 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 59 | +CONFIG_FULLDEBUG=y | |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,10 +12,8 @@ CONFIG_EXPERT=y · 5 unmodified lines | ||
| 16 | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | +# CONFIG_MMU is not set | |
| 19 | 16 | CONFIG_M5249=y |
| 20 | −CONFIG_CLOCK_SET=y | |
| 21 | −CONFIG_CLOCK_FREQ=140000000 | |
| 22 | −CONFIG_CLOCK_DIV=2 | |
| 23 | 17 | CONFIG_M5249C3=y |
| 24 | 18 | CONFIG_RAMBASE=0x00000000 |
| 25 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -38,23 +32,18 @@ CONFIG_INET=y · 12 unmodified lines | ||
| 38 | 32 | # CONFIG_IPV6 is not set |
| 39 | 33 | # CONFIG_FW_LOADER is not set |
| 40 | 34 | CONFIG_MTD=y |
| 41 | −CONFIG_MTD_CHAR=y | |
| 42 | 35 | CONFIG_MTD_BLOCK=y |
| 43 | 36 | CONFIG_MTD_RAM=y |
| 44 | 37 | CONFIG_MTD_UCLINUX=y |
| 45 | 38 | CONFIG_BLK_DEV_RAM=y |
| 46 | −# CONFIG_MISC_DEVICES is not set | |
| 47 | 39 | CONFIG_NETDEVICES=y |
| 48 | −CONFIG_NET_ETHERNET=y | |
| 49 | −# CONFIG_NETDEV_1000 is not set | |
| 50 | −# CONFIG_NETDEV_10000 is not set | |
| 51 | 40 | CONFIG_PPP=y |
| 52 | 41 | # CONFIG_INPUT is not set |
| 53 | 42 | # CONFIG_SERIO is not set |
| 54 | 43 | # CONFIG_VT is not set |
| 44 | +# CONFIG_UNIX98_PTYS is not set | |
| 55 | 45 | CONFIG_SERIAL_MCF=y |
| 56 | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 57 | −# CONFIG_UNIX98_PTYS is not set | |
| 58 | 47 | # CONFIG_HWMON is not set |
| 59 | 48 | # CONFIG_USB_SUPPORT is not set |
| 60 | 49 | CONFIG_EXT2_FS=y |
| @@ -62,7 +51,5 @@ CONFIG_EXT2_FS=y · 1 unmodified line | ||
| 62 | 51 | CONFIG_ROMFS_FS=y |
| 63 | 52 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 64 | 53 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 65 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 66 | 54 | CONFIG_BOOTPARAM=y |
| 67 | 55 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 68 | −# CONFIG_CRC32 is not set | |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,8 +12,8 @@ CONFIG_EXPERT=y · 5 unmodified lines | ||
| 16 | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | +# CONFIG_MMU is not set | |
| 19 | 16 | CONFIG_M5272=y |
| 20 | −CONFIG_CLOCK_SET=y | |
| 21 | 17 | CONFIG_M5272C3=y |
| 22 | 18 | CONFIG_RAMBASE=0x00000000 |
| 23 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -36,23 +32,18 @@ CONFIG_INET=y · 12 unmodified lines | ||
| 36 | 32 | # CONFIG_IPV6 is not set |
| 37 | 33 | # CONFIG_FW_LOADER is not set |
| 38 | 34 | CONFIG_MTD=y |
| 39 | −CONFIG_MTD_CHAR=y | |
| 40 | 35 | CONFIG_MTD_BLOCK=y |
| 41 | 36 | CONFIG_MTD_RAM=y |
| 42 | 37 | CONFIG_MTD_UCLINUX=y |
| 43 | 38 | CONFIG_BLK_DEV_RAM=y |
| 44 | −# CONFIG_MISC_DEVICES is not set | |
| 45 | 39 | CONFIG_NETDEVICES=y |
| 46 | −CONFIG_NET_ETHERNET=y | |
| 47 | 40 | CONFIG_FEC=y |
| 48 | −# CONFIG_NETDEV_1000 is not set | |
| 49 | −# CONFIG_NETDEV_10000 is not set | |
| 50 | 41 | # CONFIG_INPUT is not set |
| 51 | 42 | # CONFIG_SERIO is not set |
| 52 | 43 | # CONFIG_VT is not set |
| 44 | +# CONFIG_UNIX98_PTYS is not set | |
| 53 | 45 | CONFIG_SERIAL_MCF=y |
| 54 | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 55 | −# CONFIG_UNIX98_PTYS is not set | |
| 56 | 47 | # CONFIG_HWMON is not set |
| 57 | 48 | # CONFIG_USB_SUPPORT is not set |
| 58 | 49 | CONFIG_EXT2_FS=y |
| @@ -61,6 +52,5 @@ CONFIG_EXT2_FS=y · 2 unmodified lines | ||
| 61 | 52 | CONFIG_ROMFS_FS=y |
| 62 | 53 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 63 | 54 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 64 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 65 | 55 | CONFIG_BOOTPARAM=y |
| 66 | 56 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,11 +12,8 @@ CONFIG_EXPERT=y · 5 unmodified lines | ||
| 16 | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | +# CONFIG_MMU is not set | |
| 19 | 16 | CONFIG_M5275=y |
| 20 | −CONFIG_CLOCK_SET=y | |
| 21 | −CONFIG_CLOCK_FREQ=150000000 | |
| 22 | −CONFIG_CLOCK_DIV=2 | |
| 23 | −CONFIG_M5275EVB=y | |
| 24 | 17 | # CONFIG_4KSTACKS is not set |
| 25 | 18 | CONFIG_RAMBASE=0x00000000 |
| 26 | 19 | CONFIG_RAMSIZE=0x00000000 |
| @@ -39,24 +32,19 @@ CONFIG_INET=y · 12 unmodified lines | ||
| 39 | 32 | # CONFIG_IPV6 is not set |
| 40 | 33 | # CONFIG_FW_LOADER is not set |
| 41 | 34 | CONFIG_MTD=y |
| 42 | −CONFIG_MTD_CHAR=y | |
| 43 | 35 | CONFIG_MTD_BLOCK=y |
| 44 | 36 | CONFIG_MTD_RAM=y |
| 45 | 37 | CONFIG_MTD_UCLINUX=y |
| 46 | 38 | CONFIG_BLK_DEV_RAM=y |
| 47 | −# CONFIG_MISC_DEVICES is not set | |
| 48 | 39 | CONFIG_NETDEVICES=y |
| 49 | −CONFIG_NET_ETHERNET=y | |
| 50 | 40 | CONFIG_FEC=y |
| 51 | −# CONFIG_NETDEV_1000 is not set | |
| 52 | −# CONFIG_NETDEV_10000 is not set | |
| 53 | 41 | CONFIG_PPP=y |
| 54 | 42 | # CONFIG_INPUT is not set |
| 55 | 43 | # CONFIG_SERIO is not set |
| 56 | 44 | # CONFIG_VT is not set |
| 45 | +# CONFIG_UNIX98_PTYS is not set | |
| 57 | 46 | CONFIG_SERIAL_MCF=y |
| 58 | 47 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 59 | −# CONFIG_UNIX98_PTYS is not set | |
| 60 | 48 | # CONFIG_HWMON is not set |
| 61 | 49 | # CONFIG_USB_SUPPORT is not set |
| 62 | 50 | CONFIG_EXT2_FS=y |
| @@ -65,8 +53,5 @@ CONFIG_EXT2_FS=y · 2 unmodified lines | ||
| 65 | 53 | CONFIG_ROMFS_FS=y |
| 66 | 54 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 67 | 55 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 68 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 69 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 70 | 56 | CONFIG_BOOTPARAM=y |
| 71 | 57 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 72 | −# CONFIG_CRC32 is not set | |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,10 +12,8 @@ CONFIG_EXPERT=y · 5 unmodified lines | ||
| 16 | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | +# CONFIG_MMU is not set | |
| 19 | 16 | CONFIG_M5307=y |
| 20 | −CONFIG_CLOCK_SET=y | |
| 21 | −CONFIG_CLOCK_FREQ=90000000 | |
| 22 | −CONFIG_CLOCK_DIV=2 | |
| 23 | 17 | CONFIG_M5307C3=y |
| 24 | 18 | CONFIG_RAMBASE=0x00000000 |
| 25 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -38,16 +32,11 @@ CONFIG_INET=y · 12 unmodified lines | ||
| 38 | 32 | # CONFIG_IPV6 is not set |
| 39 | 33 | # CONFIG_FW_LOADER is not set |
| 40 | 34 | CONFIG_MTD=y |
| 41 | −CONFIG_MTD_CHAR=y | |
| 42 | 35 | CONFIG_MTD_BLOCK=y |
| 43 | 36 | CONFIG_MTD_RAM=y |
| 44 | 37 | CONFIG_MTD_UCLINUX=y |
| 45 | 38 | CONFIG_BLK_DEV_RAM=y |
| 46 | −# CONFIG_MISC_DEVICES is not set | |
| 47 | 39 | CONFIG_NETDEVICES=y |
| 48 | −CONFIG_NET_ETHERNET=y | |
| 49 | −# CONFIG_NETDEV_1000 is not set | |
| 50 | −# CONFIG_NETDEV_10000 is not set | |
| 51 | 40 | CONFIG_PPP=y |
| 52 | 41 | CONFIG_SLIP=y |
| 53 | 42 | CONFIG_SLIP_COMPRESSED=y |
| @@ -56,21 +45,17 @@ CONFIG_SLIP_COMPRESSED=y · 2 unmodified lines | ||
| 56 | 45 | # CONFIG_INPUT_MOUSE is not set |
| 57 | 46 | # CONFIG_SERIO is not set |
| 58 | 47 | # CONFIG_VT is not set |
| 48 | +# CONFIG_LEGACY_PTYS is not set | |
| 59 | 49 | CONFIG_SERIAL_MCF=y |
| 60 | 50 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 61 | −# CONFIG_LEGACY_PTYS is not set | |
| 62 | 51 | # CONFIG_HW_RANDOM is not set |
| 63 | 52 | # CONFIG_HWMON is not set |
| 64 | −# CONFIG_HID_SUPPORT is not set | |
| 65 | 53 | # CONFIG_USB_SUPPORT is not set |
| 66 | 54 | CONFIG_EXT2_FS=y |
| 67 | 55 | # CONFIG_DNOTIFY is not set |
| 68 | 56 | CONFIG_ROMFS_FS=y |
| 69 | 57 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 70 | 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 | 59 | CONFIG_BOOTPARAM=y |
| 75 | 60 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 76 | −# CONFIG_CRC32 is not set | |
| 61 | +CONFIG_FULLDEBUG=y | |
| @@ -1,10 +1,6 @@ | ||
| 1 | −# CONFIG_MMU is not set | |
| 2 | −CONFIG_EXPERIMENTAL=y | |
| 3 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 5 | 2 | CONFIG_EXPERT=y |
| 6 | 3 | # CONFIG_KALLSYMS is not set |
| 7 | −# CONFIG_HOTPLUG is not set | |
| 8 | 4 | # CONFIG_FUTEX is not set |
| 9 | 5 | # CONFIG_EPOLL is not set |
| 10 | 6 | # CONFIG_SIGNALFD is not set |
| @@ -17,9 +13,8 @@ CONFIG_MODULE_UNLOAD=y · 6 unmodified lines | ||
| 17 | 13 | # CONFIG_BLK_DEV_BSG is not set |
| 18 | 14 | # CONFIG_IOSCHED_DEADLINE is not set |
| 19 | 15 | # CONFIG_IOSCHED_CFQ is not set |
| 16 | +# CONFIG_MMU is not set | |
| 20 | 17 | CONFIG_M5407=y |
| 21 | −CONFIG_CLOCK_SET=y | |
| 22 | −CONFIG_CLOCK_FREQ=50000000 | |
| 23 | 18 | CONFIG_M5407C3=y |
| 24 | 19 | CONFIG_RAMBASE=0x00000000 |
| 25 | 20 | CONFIG_RAMSIZE=0x00000000 |
| @@ -38,22 +33,17 @@ CONFIG_INET=y · 12 unmodified lines | ||
| 38 | 33 | # CONFIG_IPV6 is not set |
| 39 | 34 | # CONFIG_FW_LOADER is not set |
| 40 | 35 | CONFIG_MTD=y |
| 41 | −CONFIG_MTD_CHAR=y | |
| 42 | 36 | CONFIG_MTD_BLOCK=y |
| 43 | 37 | CONFIG_MTD_RAM=y |
| 44 | 38 | CONFIG_MTD_UCLINUX=y |
| 45 | 39 | CONFIG_BLK_DEV_RAM=y |
| 46 | −# CONFIG_MISC_DEVICES is not set | |
| 47 | 40 | CONFIG_NETDEVICES=y |
| 48 | −CONFIG_NET_ETHERNET=y | |
| 49 | −# CONFIG_NETDEV_1000 is not set | |
| 50 | −# CONFIG_NETDEV_10000 is not set | |
| 51 | 41 | CONFIG_PPP=y |
| 52 | 42 | # CONFIG_INPUT is not set |
| 53 | 43 | # CONFIG_VT is not set |
| 44 | +# CONFIG_UNIX98_PTYS is not set | |
| 54 | 45 | CONFIG_SERIAL_MCF=y |
| 55 | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 56 | −# CONFIG_UNIX98_PTYS is not set | |
| 57 | 47 | # CONFIG_HW_RANDOM is not set |
| 58 | 48 | # CONFIG_HWMON is not set |
| 59 | 49 | # CONFIG_USB_SUPPORT is not set |
| @@ -63,8 +53,5 @@ CONFIG_EXT2_FS=y · 3 unmodified lines | ||
| 63 | 53 | CONFIG_ROMFS_FS=y |
| 64 | 54 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 65 | 55 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 66 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 67 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 68 | 56 | CONFIG_BOOTPARAM=y |
| 69 | 57 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 70 | −# CONFIG_CRC32 is not set | |
| @@ -1,11 +1,7 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | 1 | # CONFIG_SWAP is not set |
| 3 | 2 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −CONFIG_SYSFS_DEPRECATED=y | |
| 5 | −CONFIG_SYSFS_DEPRECATED_V2=y | |
| 6 | 3 | CONFIG_SYSCTL_SYSCALL=y |
| 7 | 4 | # CONFIG_KALLSYMS is not set |
| 8 | −# CONFIG_HOTPLUG is not set | |
| 9 | 5 | # CONFIG_FUTEX is not set |
| 10 | 6 | # CONFIG_EPOLL is not set |
| 11 | 7 | # CONFIG_SIGNALFD is not set |
| @@ -20,19 +16,16 @@ CONFIG_MODULES=y · 8 unmodified lines | ||
| 20 | 16 | # CONFIG_IOSCHED_DEADLINE is not set |
| 21 | 17 | # CONFIG_IOSCHED_CFQ is not set |
| 22 | 18 | CONFIG_COLDFIRE=y |
| 23 | −CONFIG_M547x=y | |
| 24 | −CONFIG_CLOCK_SET=y | |
| 25 | −CONFIG_CLOCK_FREQ=266000000 | |
| 26 | 19 | # CONFIG_4KSTACKS is not set |
| 27 | 20 | CONFIG_RAMBASE=0x0 |
| 28 | 21 | CONFIG_RAMSIZE=0x2000000 |
| 29 | 22 | CONFIG_VECTORBASE=0x0 |
| 30 | 23 | CONFIG_MBAR=0xff000000 |
| 31 | 24 | CONFIG_KERNELBASE=0x20000 |
| 25 | +CONFIG_PCI=y | |
| 32 | 26 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 33 | 27 | # CONFIG_FW_LOADER is not set |
| 34 | 28 | CONFIG_MTD=y |
| 35 | −CONFIG_MTD_CHAR=y | |
| 36 | 29 | CONFIG_MTD_BLOCK=y |
| 37 | 30 | CONFIG_MTD_CFI=y |
| 38 | 31 | CONFIG_MTD_JEDECPROBE=y |
| @@ -18,6 +18,7 @@ generic-y += kvm_para.h · 17 unmodified lines | ||
| 18 | 18 | generic-y += local.h |
| 19 | 19 | generic-y += local64.h |
| 20 | 20 | generic-y += mcs_spinlock.h |
| 21 | +generic-y += mm-arch-hooks.h | |
| 21 | 22 | generic-y += mman.h |
| 22 | 23 | generic-y += mutex.h |
| 23 | 24 | generic-y += percpu.h |
| @@ -19,7 +19,7 @@ · 18 unmodified lines | ||
| 19 | 19 | * in any case new boards come along from time to time that have yet |
| 20 | 20 | * another different clocking frequency. |
| 21 | 21 | */ |
| 22 | −#ifdef CONFIG_CLOCK_SET | |
| 22 | +#ifdef CONFIG_CLOCK_FREQ | |
| 23 | 23 | #define MCF_CLK CONFIG_CLOCK_FREQ |
| 24 | 24 | #else |
| 25 | 25 | #error "Don't know what your ColdFire CPU clock frequency is??" |
| @@ -413,7 +413,8 @@ static inline void isa_delay(void) · 412 unmodified lines | ||
| 413 | 413 | #define writew(val, addr) out_le16((addr), (val)) |
| 414 | 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 | 419 | * We need to define dummy functions for GENERIC_IOMAP support. |
| 419 | 420 | */ |
| @@ -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 */ | |
| @@ -25,6 +25,7 @@ generic-y += kvm_para.h · 24 unmodified lines | ||
| 25 | 25 | generic-y += local.h |
| 26 | 26 | generic-y += local64.h |
| 27 | 27 | generic-y += mcs_spinlock.h |
| 28 | +generic-y += mm-arch-hooks.h | |
| 28 | 29 | generic-y += msgbuf.h |
| 29 | 30 | generic-y += mutex.h |
| 30 | 31 | generic-y += param.h |
| @@ -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 */ | |
| @@ -6,6 +6,7 @@ generic-y += device.h · 5 unmodified lines | ||
| 6 | 6 | generic-y += exec.h |
| 7 | 7 | generic-y += irq_work.h |
| 8 | 8 | generic-y += mcs_spinlock.h |
| 9 | +generic-y += mm-arch-hooks.h | |
| 9 | 10 | generic-y += preempt.h |
| 10 | 11 | generic-y += syscalls.h |
| 11 | 12 | generic-y += trace_clock.h |
| @@ -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 */ | |
| @@ -1427,6 +1427,7 @@ config CPU_MIPS64_R6 · 1426 unmodified lines | ||
| 1427 | 1427 | select CPU_SUPPORTS_HIGHMEM |
| 1428 | 1428 | select CPU_SUPPORTS_MSA |
| 1429 | 1429 | select GENERIC_CSUM |
| 1430 | + select MIPS_O32_FP64_SUPPORT if MIPS32_O32 | |
| 1430 | 1431 | help |
| 1431 | 1432 | Choose this option to build a kernel for release 6 or later of the |
| 1432 | 1433 | MIPS64 architecture. New MIPS processors, starting with the Warrior |
| @@ -2262,11 +2263,6 @@ config MIPS_CM · 829 unmodified lines | ||
| 2262 | 2263 | config MIPS_CPC |
| 2263 | 2264 | bool |
| 2264 | 2265 | |
| 2265 | −config SB1_PASS_1_WORKAROUNDS | |
| 2266 | − bool | |
| 2267 | − depends on CPU_SB1_PASS_1 | |
| 2268 | − default y | |
| 2269 | − | |
| 2270 | 2266 | config SB1_PASS_2_WORKAROUNDS |
| 2271 | 2267 | bool |
| 2272 | 2268 | depends on CPU_SB1 && (CPU_SB1_PASS_2_2 || CPU_SB1_PASS_2) |
| @@ -181,13 +181,6 @@ cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,) · 180 unmodified lines | ||
| 181 | 181 | cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) |
| 182 | 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 | 184 | # For smartmips configurations, there are hundreds of warnings due to ISA overrides |
| 192 | 185 | # in assembly and header files. smartmips is only supported for MIPS32r1 onwards |
| 193 | 186 | # and there is no support for 64-bit. Various '.set mips2' or '.set mips3' or |
| @@ -7,6 +7,7 @@ generic-y += emergency-restart.h · 6 unmodified lines | ||
| 7 | 7 | generic-y += irq_work.h |
| 8 | 8 | generic-y += local64.h |
| 9 | 9 | generic-y += mcs_spinlock.h |
| 10 | +generic-y += mm-arch-hooks.h | |
| 10 | 11 | generic-y += mutex.h |
| 11 | 12 | generic-y += parport.h |
| 12 | 13 | generic-y += percpu.h |
| @@ -74,7 +74,7 @@ static inline int __enable_fpu(enum fpu_mode mode) · 73 unmodified lines | ||
| 74 | 74 | goto fr_common; |
| 75 | 75 | |
| 76 | 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 | 78 | || defined(CONFIG_64BIT)) |
| 79 | 79 | /* we only have a 32-bit FPU */ |
| 80 | 80 | return SIGFPE; |
| @@ -13,8 +13,7 @@ · 12 unmodified lines | ||
| 13 | 13 | #define R4600_V2_HIT_CACHEOP_WAR 0 |
| 14 | 14 | #define R5432_CP0_INTERRUPT_WAR 0 |
| 15 | 15 | |
| 16 | −#if defined(CONFIG_SB1_PASS_1_WORKAROUNDS) || \ | |
| 17 | − defined(CONFIG_SB1_PASS_2_WORKAROUNDS) | |
| 16 | +#if defined(CONFIG_SB1_PASS_2_WORKAROUNDS) | |
| 18 | 17 | |
| 19 | 18 | #ifndef __ASSEMBLY__ |
| 20 | 19 | extern int sb1250_m3_workaround_needed(void); |
| @@ -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 */ | |
| @@ -16,7 +16,7 @@ · 15 unmodified lines | ||
| 16 | 16 | |
| 17 | 17 | /* |
| 18 | 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 | 21 | struct sigcontext { |
| 22 | 22 | unsigned int sc_regmask; /* Unused */ |
| @@ -46,7 +46,7 @@ struct sigcontext { · 23 unmodified lines | ||
| 46 | 46 | #include <linux/posix_types.h> |
| 47 | 47 | /* |
| 48 | 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 | 51 | * Warning: this structure illdefined with sc_badvaddr being just an unsigned |
| 52 | 52 | * int so it was changed to unsigned long in 2.6.0-test1. This may break |
| @@ -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 | 4 | * Copyright (C) 1996 David S. Miller |
| 5 | 5 | * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle |
| @@ -81,11 +81,6 @@ choice · 80 unmodified lines | ||
| 81 | 81 | prompt "SiByte SOC Stepping" |
| 82 | 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 | 84 | config CPU_SB1_PASS_2_1250 |
| 90 | 85 | bool "1250 An" |
| 91 | 86 | depends on SIBYTE_SB1250 |
| @@ -81,10 +81,7 @@ void check_bus_watcher(void) · 80 unmodified lines | ||
| 81 | 81 | { |
| 82 | 82 | u32 status, l2_err, memio_err; |
| 83 | 83 | |
| 84 | −#ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | |
| 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) | |
| 84 | +#if defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) | |
| 88 | 85 | /* Use non-destructive register */ |
| 89 | 86 | status = csr_in32(IOADDR(A_SCD_BUS_ERR_STATUS_DEBUG)); |
| 90 | 87 | #elif defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) |
| @@ -202,12 +202,10 @@ void __init sb1250_setup(void) · 201 unmodified lines | ||
| 202 | 202 | |
| 203 | 203 | switch (war_pass) { |
| 204 | 204 | case K_SYS_REVISION_BCM1250_PASS1: |
| 205 | −#ifndef CONFIG_SB1_PASS_1_WORKAROUNDS | |
| 206 | 205 | printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, " |
| 207 | 206 | "and the kernel doesn't have the proper " |
| 208 | 207 | "workarounds compiled in. @@@@\n"); |
| 209 | 208 | bad_config = 1; |
| 210 | −#endif | |
| 211 | 209 | break; |
| 212 | 210 | case K_SYS_REVISION_BCM1250_PASS2: |
| 213 | 211 | /* Pass 2 - easiest as default for now - so many numbers */ |
| @@ -5,6 +5,7 @@ generic-y += cputime.h · 4 unmodified lines | ||
| 5 | 5 | generic-y += exec.h |
| 6 | 6 | generic-y += irq_work.h |
| 7 | 7 | generic-y += mcs_spinlock.h |
| 8 | +generic-y += mm-arch-hooks.h | |
| 8 | 9 | generic-y += preempt.h |
| 9 | 10 | generic-y += sections.h |
| 10 | 11 | generic-y += trace_clock.h |
| @@ -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 */ | |
| @@ -30,6 +30,7 @@ generic-y += kmap_types.h · 29 unmodified lines | ||
| 30 | 30 | generic-y += kvm_para.h |
| 31 | 31 | generic-y += local.h |
| 32 | 32 | generic-y += mcs_spinlock.h |
| 33 | +generic-y += mm-arch-hooks.h | |
| 33 | 34 | generic-y += mman.h |
| 34 | 35 | generic-y += module.h |
| 35 | 36 | generic-y += msgbuf.h |
| @@ -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 */ | |
| @@ -17,6 +17,7 @@ config OPENRISC · 16 unmodified lines | ||
| 17 | 17 | select GENERIC_IRQ_SHOW |
| 18 | 18 | select GENERIC_IOMAP |
| 19 | 19 | select GENERIC_CPU_DEVICES |
| 20 | + select HAVE_UID16 | |
| 20 | 21 | select GENERIC_ATOMIC64 |
| 21 | 22 | select GENERIC_CLOCKEVENTS |
| 22 | 23 | select GENERIC_STRNCPY_FROM_USER |
| @@ -31,9 +32,6 @@ config MMU · 8 unmodified lines | ||
| 31 | 32 | config HAVE_DMA_ATTRS |
| 32 | 33 | def_bool y |
| 33 | 34 | |
| 34 | −config UID16 | |
| 35 | − def_bool y | |
| 36 | − | |
| 37 | 35 | config RWSEM_GENERIC_SPINLOCK |
| 38 | 36 | def_bool y |
| 39 | 37 | |
| @@ -36,6 +36,7 @@ generic-y += kmap_types.h · 35 unmodified lines | ||
| 36 | 36 | generic-y += kvm_para.h |
| 37 | 37 | generic-y += local.h |
| 38 | 38 | generic-y += mcs_spinlock.h |
| 39 | +generic-y += mm-arch-hooks.h | |
| 39 | 40 | generic-y += mman.h |
| 40 | 41 | generic-y += module.h |
| 41 | 42 | generic-y += msgbuf.h |
| @@ -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 */ | |
| @@ -15,6 +15,7 @@ generic-y += kvm_para.h · 14 unmodified lines | ||
| 15 | 15 | generic-y += local.h |
| 16 | 16 | generic-y += local64.h |
| 17 | 17 | generic-y += mcs_spinlock.h |
| 18 | +generic-y += mm-arch-hooks.h | |
| 18 | 19 | generic-y += mutex.h |
| 19 | 20 | generic-y += param.h |
| 20 | 21 | generic-y += percpu.h |
| @@ -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 */ | |
| @@ -72,7 +72,7 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) · 71 unmodified lines | ||
| 72 | 72 | |
| 73 | 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 | 77 | * This is the permanent pmd attached to the pgd; |
| 78 | 78 | * cannot free it. |
| @@ -81,6 +81,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) · 2 unmodified lines | ||
| 81 | 81 | */ |
| 82 | 82 | mm_inc_nr_pmds(mm); |
| 83 | 83 | return; |
| 84 | + } | |
| 84 | 85 | free_pages((unsigned long)pmd, PMD_ORDER); |
| 85 | 86 | } |
| 86 | 87 | |
| @@ -3,5 +3,6 @@ · 2 unmodified lines | ||
| 3 | 3 | generic-y += clkdev.h |
| 4 | 4 | generic-y += irq_work.h |
| 5 | 5 | generic-y += mcs_spinlock.h |
| 6 | +generic-y += mm-arch-hooks.h | |
| 6 | 7 | generic-y += preempt.h |
| 7 | 8 | generic-y += trace_clock.h |
| @@ -57,7 +57,10 @@ union ctlreg0 { · 56 unmodified lines | ||
| 57 | 57 | unsigned long lap : 1; /* Low-address-protection control */ |
| 58 | 58 | unsigned long : 4; |
| 59 | 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 | |
| @@ -14,6 +14,7 @@ · 13 unmodified lines | ||
| 14 | 14 | |
| 15 | 15 | #define is_hugepage_only_range(mm, addr, len) 0 |
| 16 | 16 | #define hugetlb_free_pgd_range free_pgd_range |
| 17 | +#define hugepages_supported() (MACHINE_HAS_HPAGE) | |
| 17 | 18 | |
| 18 | 19 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, |
| 19 | 20 | pte_t *ptep, pte_t pte); |
| @@ -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 */ | |
| @@ -17,10 +17,7 @@ · 16 unmodified lines | ||
| 17 | 17 | #define PAGE_DEFAULT_ACC 0 |
| 18 | 18 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) |
| 19 | 19 | |
| 20 | −#include <asm/setup.h> | |
| 21 | −#ifndef __ASSEMBLY__ | |
| 22 | − | |
| 23 | −extern int HPAGE_SHIFT; | |
| 20 | +#define HPAGE_SHIFT 20 | |
| 24 | 21 | #define HPAGE_SIZE (1UL << HPAGE_SHIFT) |
| 25 | 22 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) |
| 26 | 23 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
| @@ -30,6 +27,9 @@ extern int HPAGE_SHIFT; · 3 unmodified lines | ||
| 30 | 27 | #define ARCH_HAS_PREPARE_HUGEPAGE |
| 31 | 28 | #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH |
| 32 | 29 | |
| 30 | +#include <asm/setup.h> | |
| 31 | +#ifndef __ASSEMBLY__ | |
| 32 | + | |
| 33 | 33 | static inline void storage_key_init_range(unsigned long start, unsigned long end) |
| 34 | 34 | { |
| 35 | 35 | #if PAGE_DEFAULT_KEY |
| @@ -87,7 +87,15 @@ struct sf_raw_sample { · 86 unmodified lines | ||
| 87 | 87 | } __packed; |
| 88 | 88 | |
| 89 | 89 | /* Perf hardware reserve and release functions */ |
| 90 | +#ifdef CONFIG_PERF_EVENTS | |
| 90 | 91 | int perf_reserve_sampling(void); |
| 91 | 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 | 101 | #endif /* _ASM_S390_PERF_EVENT_H */ |
| @@ -23,15 +23,15 @@ · 22 unmodified lines | ||
| 23 | 23 | |
| 24 | 24 | int main(void) |
| 25 | 25 | { |
| 26 | − DEFINE(__THREAD_info, offsetof(struct task_struct, stack)); | |
| 27 | − DEFINE(__THREAD_ksp, offsetof(struct task_struct, thread.ksp)); | |
| 28 | − DEFINE(__THREAD_mm_segment, offsetof(struct task_struct, thread.mm_segment)); | |
| 29 | − BLANK(); | |
| 26 | + DEFINE(__TASK_thread_info, offsetof(struct task_struct, stack)); | |
| 27 | + DEFINE(__TASK_thread, offsetof(struct task_struct, thread)); | |
| 30 | 28 | DEFINE(__TASK_pid, offsetof(struct task_struct, pid)); |
| 31 | 29 | BLANK(); |
| 32 | − DEFINE(__THREAD_per_cause, offsetof(struct task_struct, thread.per_event.cause)); | |
| 33 | − DEFINE(__THREAD_per_address, offsetof(struct task_struct, thread.per_event.address)); | |
| 34 | − DEFINE(__THREAD_per_paid, offsetof(struct task_struct, thread.per_event.paid)); | |
| 30 | + DEFINE(__THREAD_ksp, offsetof(struct thread_struct, ksp)); | |
| 31 | + DEFINE(__THREAD_per_cause, offsetof(struct thread_struct, per_event.cause)); | |
| 32 | + DEFINE(__THREAD_per_address, offsetof(struct thread_struct, per_event.address)); | |
| 33 | + DEFINE(__THREAD_per_paid, offsetof(struct thread_struct, per_event.paid)); | |
| 34 | + DEFINE(__THREAD_trap_tdb, offsetof(struct thread_struct, trap_tdb)); | |
| 35 | 35 | BLANK(); |
| 36 | 36 | DEFINE(__TI_task, offsetof(struct thread_info, task)); |
| 37 | 37 | DEFINE(__TI_flags, offsetof(struct thread_info, flags)); |
| @@ -176,7 +176,6 @@ int main(void) · 138 unmodified lines | ||
| 176 | 176 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); |
| 177 | 177 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); |
| 178 | 178 | DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); |
| 179 | − DEFINE(__THREAD_trap_tdb, offsetof(struct task_struct, thread.trap_tdb)); | |
| 180 | 179 | DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce)); |
| 181 | 180 | DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c)); |
| 182 | 181 | DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20)); |
| @@ -178,17 +178,21 @@ _PIF_WORK = (_PIF_PER_TRAP) · 177 unmodified lines | ||
| 178 | 178 | */ |
| 179 | 179 | ENTRY(__switch_to) |
| 180 | 180 | stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task |
| 181 | − stg %r15,__THREAD_ksp(%r2) # store kernel stack of prev | |
| 182 | − lg %r4,__THREAD_info(%r2) # get thread_info of prev | |
| 183 | − lg %r5,__THREAD_info(%r3) # get thread_info of next | |
| 181 | + lgr %r1,%r2 | |
| 182 | + aghi %r1,__TASK_thread # thread_struct of prev task | |
| 183 | + lg %r4,__TASK_thread_info(%r2) # get thread_info of prev | |
| 184 | + lg %r5,__TASK_thread_info(%r3) # get thread_info of next | |
| 185 | + stg %r15,__THREAD_ksp(%r1) # store kernel stack of prev | |
| 186 | + lgr %r1,%r3 | |
| 187 | + aghi %r1,__TASK_thread # thread_struct of next task | |
| 184 | 188 | lgr %r15,%r5 |
| 185 | 189 | aghi %r15,STACK_INIT # end of kernel stack of next |
| 186 | 190 | stg %r3,__LC_CURRENT # store task struct of next |
| 187 | 191 | stg %r5,__LC_THREAD_INFO # store thread info of next |
| 188 | 192 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack |
| 193 | + lg %r15,__THREAD_ksp(%r1) # load kernel stack of next | |
| 189 | 194 | lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 |
| 190 | 195 | mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next |
| 191 | − lg %r15,__THREAD_ksp(%r3) # load kernel stack of next | |
| 192 | 196 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task |
| 193 | 197 | br %r14 |
| 194 | 198 | |
| @@ -417,6 +421,7 @@ ENTRY(pgm_check_handler) · 222 unmodified lines | ||
| 417 | 421 | LAST_BREAK %r14 |
| 418 | 422 | lg %r15,__LC_KERNEL_STACK |
| 419 | 423 | lg %r14,__TI_task(%r12) |
| 424 | + aghi %r14,__TASK_thread # pointer to thread_struct | |
| 420 | 425 | lghi %r13,__LC_PGM_TDB |
| 421 | 426 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort |
| 422 | 427 | jz 2f |
| @@ -21,6 +21,7 @@ · 20 unmodified lines | ||
| 21 | 21 | #include <asm/nmi.h> |
| 22 | 22 | #include <asm/crw.h> |
| 23 | 23 | #include <asm/switch_to.h> |
| 24 | +#include <asm/ctl_reg.h> | |
| 24 | 25 | |
| 25 | 26 | struct mcck_struct { |
| 26 | 27 | int kill_task; |
| @@ -129,26 +130,30 @@ static int notrace s390_revalidate_registers(struct mci *mci) · 102 unmodified lines | ||
| 129 | 130 | } else |
| 130 | 131 | asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area)); |
| 131 | 132 | |
| 132 | − asm volatile( | |
| 133 | − " ld 0,0(%0)\n" | |
| 134 | − " ld 1,8(%0)\n" | |
| 135 | − " ld 2,16(%0)\n" | |
| 136 | − " ld 3,24(%0)\n" | |
| 137 | − " ld 4,32(%0)\n" | |
| 138 | − " ld 5,40(%0)\n" | |
| 139 | − " ld 6,48(%0)\n" | |
| 140 | − " ld 7,56(%0)\n" | |
| 141 | − " ld 8,64(%0)\n" | |
| 142 | − " ld 9,72(%0)\n" | |
| 143 | − " ld 10,80(%0)\n" | |
| 144 | − " ld 11,88(%0)\n" | |
| 145 | − " ld 12,96(%0)\n" | |
| 146 | − " ld 13,104(%0)\n" | |
| 147 | − " ld 14,112(%0)\n" | |
| 148 | − " ld 15,120(%0)\n" | |
| 149 | − : : "a" (fpt_save_area)); | |
| 150 | − /* Revalidate vector registers */ | |
| 151 | − if (MACHINE_HAS_VX && current->thread.vxrs) { | |
| 133 | + if (!MACHINE_HAS_VX) { | |
| 134 | + /* Revalidate floating point registers */ | |
| 135 | + asm volatile( | |
| 136 | + " ld 0,0(%0)\n" | |
| 137 | + " ld 1,8(%0)\n" | |
| 138 | + " ld 2,16(%0)\n" | |
| 139 | + " ld 3,24(%0)\n" | |
| 140 | + " ld 4,32(%0)\n" | |
| 141 | + " ld 5,40(%0)\n" | |
| 142 | + " ld 6,48(%0)\n" | |
| 143 | + " ld 7,56(%0)\n" | |
| 144 | + " ld 8,64(%0)\n" | |
| 145 | + " ld 9,72(%0)\n" | |
| 146 | + " ld 10,80(%0)\n" | |
| 147 | + " ld 11,88(%0)\n" | |
| 148 | + " ld 12,96(%0)\n" | |
| 149 | + " ld 13,104(%0)\n" | |
| 150 | + " ld 14,112(%0)\n" | |
| 151 | + " ld 15,120(%0)\n" | |
| 152 | + : : "a" (fpt_save_area)); | |
| 153 | + } else { | |
| 154 | + /* Revalidate vector registers */ | |
| 155 | + union ctlreg0 cr0; | |
| 156 | + | |
| 152 | 157 | if (!mci->vr) { |
| 153 | 158 | /* |
| 154 | 159 | * Vector registers can't be restored and therefore |
| @@ -156,8 +161,12 @@ static int notrace s390_revalidate_registers(struct mci *mci) · 1 unmodified line | ||
| 156 | 161 | */ |
| 157 | 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 | 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 | 171 | /* Revalidate access registers */ |
| 163 | 172 | asm volatile( |
| @@ -163,7 +163,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, · 162 unmodified lines | ||
| 163 | 163 | asmlinkage void execve_tail(void) |
| 164 | 164 | { |
| 165 | 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 | /* |
| @@ -270,6 +270,8 @@ ENTRY(_sclp_print_early) · 269 unmodified lines | ||
| 270 | 270 | jno .Lesa2 |
| 271 | 271 | ahi %r15,-80 |
| 272 | 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 | 275 | .Lesa2: |
| 274 | 276 | lr %r10,%r2 # save string pointer |
| 275 | 277 | lhi %r2,0 |
| @@ -291,6 +293,8 @@ ENTRY(_sclp_print_early) · 15 unmodified lines | ||
| 291 | 293 | .Lesa3: |
| 292 | 294 | lm %r6,%r15,120(%r15) # restore registers |
| 293 | 295 | br %r14 |
| 296 | +.Lzeroes: | |
| 297 | + .fill 64,4,0 | |
| 294 | 298 | |
| 295 | 299 | .LwritedataS4: |
| 296 | 300 | .long 0x00760005 # SCLP command for write data |
| @@ -885,8 +885,6 @@ void __init setup_arch(char **cmdline_p) · 884 unmodified lines | ||
| 885 | 885 | */ |
| 886 | 886 | setup_hwcaps(); |
| 887 | 887 | |
| 888 | − HPAGE_SHIFT = MACHINE_HAS_HPAGE ? 20 : 0; | |
| 889 | − | |
| 890 | 888 | /* |
| 891 | 889 | * Create kernel page tables and switch to virtual addressing. |
| 892 | 890 | */ |
| @@ -259,7 +259,7 @@ void vector_exception(struct pt_regs *regs) · 258 unmodified lines | ||
| 259 | 259 | } |
| 260 | 260 | |
| 261 | 261 | /* get vector interrupt code from fpc */ |
| 262 | − asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); | |
| 262 | + asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc)); | |
| 263 | 263 | vic = (current->thread.fp_regs.fpc & 0xf00) >> 8; |
| 264 | 264 | switch (vic) { |
| 265 | 265 | case 1: /* invalid vector operation */ |
| @@ -297,7 +297,7 @@ void data_exception(struct pt_regs *regs) · 31 unmodified lines | ||
| 297 | 297 | |
| 298 | 298 | location = get_trap_ip(regs); |
| 299 | 299 | |
| 300 | − asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); | |
| 300 | + asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc)); | |
| 301 | 301 | /* Check for vector register enablement */ |
| 302 | 302 | if (MACHINE_HAS_VX && !current->thread.vxrs && |
| 303 | 303 | (current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) { |
| @@ -31,8 +31,6 @@ · 30 unmodified lines | ||
| 31 | 31 | #define ALLOC_ORDER 2 |
| 32 | 32 | #define FRAG_MASK 0x03 |
| 33 | 33 | |
| 34 | −int HPAGE_SHIFT; | |
| 35 | − | |
| 36 | 34 | unsigned long *crst_table_alloc(struct mm_struct *mm) |
| 37 | 35 | { |
| 38 | 36 | struct page *page = alloc_pages(GFP_KERNEL, ALLOC_ORDER); |
| @@ -16,6 +16,7 @@ · 15 unmodified lines | ||
| 16 | 16 | #include <linux/fs.h> |
| 17 | 17 | #include <linux/module.h> |
| 18 | 18 | #include <asm/processor.h> |
| 19 | +#include <asm/perf_event.h> | |
| 19 | 20 | |
| 20 | 21 | #include "../../../drivers/oprofile/oprof.h" |
| 21 | 22 | |
| @@ -7,6 +7,7 @@ generic-y += clkdev.h · 6 unmodified lines | ||
| 7 | 7 | generic-y += cputime.h |
| 8 | 8 | generic-y += irq_work.h |
| 9 | 9 | generic-y += mcs_spinlock.h |
| 10 | +generic-y += mm-arch-hooks.h | |
| 10 | 11 | generic-y += preempt.h |
| 11 | 12 | generic-y += sections.h |
| 12 | 13 | generic-y += trace_clock.h |
| @@ -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 */ | |
| @@ -16,6 +16,7 @@ generic-y += kvm_para.h · 15 unmodified lines | ||
| 16 | 16 | generic-y += local.h |
| 17 | 17 | generic-y += local64.h |
| 18 | 18 | generic-y += mcs_spinlock.h |
| 19 | +generic-y += mm-arch-hooks.h | |
| 19 | 20 | generic-y += mman.h |
| 20 | 21 | generic-y += msgbuf.h |
| 21 | 22 | generic-y += param.h |
| @@ -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 */ | |
| @@ -12,6 +12,7 @@ generic-y += linkage.h · 11 unmodified lines | ||
| 12 | 12 | generic-y += local.h |
| 13 | 13 | generic-y += local64.h |
| 14 | 14 | generic-y += mcs_spinlock.h |
| 15 | +generic-y += mm-arch-hooks.h | |
| 15 | 16 | generic-y += module.h |
| 16 | 17 | generic-y += mutex.h |
| 17 | 18 | generic-y += preempt.h |
| @@ -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 */ | |
| @@ -19,6 +19,7 @@ generic-y += irq_regs.h · 18 unmodified lines | ||
| 19 | 19 | generic-y += local.h |
| 20 | 20 | generic-y += local64.h |
| 21 | 21 | generic-y += mcs_spinlock.h |
| 22 | +generic-y += mm-arch-hooks.h | |
| 22 | 23 | generic-y += msgbuf.h |
| 23 | 24 | generic-y += mutex.h |
| 24 | 25 | generic-y += param.h |
| @@ -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 */ | |
| @@ -16,6 +16,7 @@ generic-y += irq_regs.h · 15 unmodified lines | ||
| 16 | 16 | generic-y += irq_work.h |
| 17 | 17 | generic-y += kdebug.h |
| 18 | 18 | generic-y += mcs_spinlock.h |
| 19 | +generic-y += mm-arch-hooks.h | |
| 19 | 20 | generic-y += mutex.h |
| 20 | 21 | generic-y += param.h |
| 21 | 22 | generic-y += pci.h |
| @@ -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 */ | |
| @@ -26,6 +26,7 @@ generic-y += kdebug.h · 25 unmodified lines | ||
| 26 | 26 | generic-y += kmap_types.h |
| 27 | 27 | generic-y += local.h |
| 28 | 28 | generic-y += mcs_spinlock.h |
| 29 | +generic-y += mm-arch-hooks.h | |
| 29 | 30 | generic-y += mman.h |
| 30 | 31 | generic-y += module.h |
| 31 | 32 | generic-y += msgbuf.h |
| @@ -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 */ | |
| @@ -41,6 +41,7 @@ config X86 · 40 unmodified lines | ||
| 41 | 41 | select ARCH_USE_CMPXCHG_LOCKREF if X86_64 |
| 42 | 42 | select ARCH_USE_QUEUED_RWLOCKS |
| 43 | 43 | select ARCH_USE_QUEUED_SPINLOCKS |
| 44 | + select ARCH_WANTS_DYNAMIC_TASK_STRUCT | |
| 44 | 45 | select ARCH_WANT_FRAME_POINTERS |
| 45 | 46 | select ARCH_WANT_IPC_PARSE_VERSION if X86_32 |
| 46 | 47 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| @@ -297,6 +297,18 @@ config OPTIMIZE_INLINING · 296 unmodified lines | ||
| 297 | 297 | |
| 298 | 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 | 312 | config DEBUG_NMI_SELFTEST |
| 301 | 313 | bool "NMI Selftest" |
| 302 | 314 | depends on DEBUG_KERNEL && X86_LOCAL_APIC |
| @@ -1237,11 +1237,12 @@ ENTRY(nmi) · 1236 unmodified lines | ||
| 1237 | 1237 | * If the variable is not set and the stack is not the NMI |
| 1238 | 1238 | * stack then: |
| 1239 | 1239 | * o Set the special variable on the stack |
| 1240 | − * o Copy the interrupt frame into a "saved" location on the stack | |
| 1241 | − * o Copy the interrupt frame into a "copy" location on the stack | |
| 1240 | + * o Copy the interrupt frame into an "outermost" location on the | |
| 1241 | + * stack | |
| 1242 | + * o Copy the interrupt frame into an "iret" location on the stack | |
| 1242 | 1243 | * o Continue processing the NMI |
| 1243 | 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 | 1246 | * o return back to the first NMI |
| 1246 | 1247 | * |
| 1247 | 1248 | * Now on exit of the first NMI, we first clear the stack variable |
| @@ -1250,31 +1251,151 @@ ENTRY(nmi) · 2 unmodified lines | ||
| 1250 | 1251 | * a nested NMI that updated the copy interrupt stack frame, a |
| 1251 | 1252 | * jump will be made to the repeat_nmi code that will handle the second |
| 1252 | 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 | 1261 | /* Use %rdx as our temp variable throughout */ |
| 1256 | 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 | |
| 1260 | − * space, which means it is definitely not nested. | |
| 1362 | + * Determine whether we're a nested NMI. | |
| 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) | |
| 1263 | − jne first_nmi | |
| 1371 | + | |
| 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 | |
| 1267 | − * executing. | |
| 1381 | + * Now check "NMI executing". If it's set, then we're nested. | |
| 1382 | + * This will not detect if we interrupted an outer NMI just | |
| 1383 | + * before IRET. | |
| 1268 | 1384 | */ |
| 1269 | 1385 | cmpl $1, -8(%rsp) |
| 1270 | 1386 | je nested_nmi |
| 1271 | 1387 | |
| 1272 | 1388 | /* |
| 1273 | − * Now test if the previous stack was an NMI stack. | |
| 1274 | − * We need the double check. We check the NMI stack to satisfy the | |
| 1275 | − * race when the first NMI clears the variable before returning. | |
| 1276 | − * We check the variable because the first NMI could be in a | |
| 1277 | − * breakpoint routine using a breakpoint stack. | |
| 1389 | + * Now test if the previous stack was an NMI stack. This covers | |
| 1390 | + * the case where we interrupt an outer NMI after it clears | |
| 1391 | + * "NMI executing" but before IRET. We need to be careful, though: | |
| 1392 | + * there is one case in which RSP could point to the NMI 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 | 1400 | lea 6*8(%rsp), %rdx |
| 1280 | 1401 | /* Compare the NMI stack (rdx) with the stack we came from (4*8(%rsp)) */ |
| @@ -1286,25 +1407,20 @@ ENTRY(nmi) · 5 unmodified lines | ||
| 1286 | 1407 | cmpq %rdx, 4*8(%rsp) |
| 1287 | 1408 | /* If it is below the NMI stack, it is a normal NMI */ |
| 1288 | 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 | 1418 | nested_nmi: |
| 1292 | 1419 | /* |
| 1293 | − * Do nothing if we interrupted the fixup in repeat_nmi. | |
| 1294 | − * It's about to repeat the NMI handler, so we are fine | |
| 1295 | − * with ignoring this one. | |
| 1420 | + * Modify the "iret" frame to point to repeat_nmi, forcing another | |
| 1421 | + * iteration of NMI handling. | |
| 1296 | 1422 | */ |
| 1297 | − movq $repeat_nmi, %rdx | |
| 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 | |
| 1423 | + subq $8, %rsp | |
| 1308 | 1424 | leaq -10*8(%rsp), %rdx |
| 1309 | 1425 | pushq $__KERNEL_DS |
| 1310 | 1426 | pushq %rdx |
| @@ -1318,61 +1434,42 @@ nested_nmi: · 7 unmodified lines | ||
| 1318 | 1434 | nested_nmi_out: |
| 1319 | 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 | 1438 | INTERRUPT_RETURN |
| 1323 | 1439 | |
| 1324 | 1440 | first_nmi: |
| 1325 | − /* | |
| 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 */ | |
| 1441 | + /* Restore rdx. */ | |
| 1361 | 1442 | movq (%rsp), %rdx |
| 1362 | 1443 | |
| 1363 | − /* Set the NMI executing variable on the stack. */ | |
| 1364 | − pushq $1 | |
| 1444 | + /* Make room for "NMI executing". */ | |
| 1445 | + pushq $0 | |
| 1365 | 1446 | |
| 1366 | − /* Leave room for the "copied" frame */ | |
| 1447 | + /* Leave room for the "iret" frame */ | |
| 1367 | 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 | 1451 | .rept 5 |
| 1371 | 1452 | pushq 11*8(%rsp) |
| 1372 | 1453 | .endr |
| 1373 | 1454 | |
| 1374 | 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 | 1474 | * If there was a nested NMI, the first NMI's iret will return |
| 1378 | 1475 | * here. But NMIs are still enabled and we can take another |
| @@ -1381,16 +1478,20 @@ first_nmi: · 2 unmodified lines | ||
| 1381 | 1478 | * it will just return, as we are about to repeat an NMI anyway. |
| 1382 | 1479 | * This makes it safe to copy to the stack frame that a nested |
| 1383 | 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 | |
| 1388 | − * is benign for the non-repeat case, where 1 was pushed just above | |
| 1389 | − * to this very stack slot). | |
| 1491 | + * Copy the "outermost" frame to the "iret" frame. NMIs that nest | |
| 1492 | + * here must not modify the "iret" frame while we're writing to | |
| 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 | 1495 | addq $(10*8), %rsp |
| 1395 | 1496 | .rept 5 |
| 1396 | 1497 | pushq -6*8(%rsp) |
| @@ -1399,9 +1500,9 @@ repeat_nmi: · 2 unmodified lines | ||
| 1399 | 1500 | end_repeat_nmi: |
| 1400 | 1501 | |
| 1401 | 1502 | /* |
| 1402 | − * Everything below this point can be preempted by a nested | |
| 1403 | − * NMI if the first NMI took an exception and reset our iret stack | |
| 1404 | − * so that we repeat another NMI. | |
| 1503 | + * Everything below this point can be preempted by a nested NMI. | |
| 1504 | + * If this happens, then the inner NMI will change the "iret" | |
| 1505 | + * frame to point back to repeat_nmi. | |
| 1405 | 1506 | */ |
| 1406 | 1507 | pushq $-1 /* ORIG_RAX: no syscall to restart */ |
| 1407 | 1508 | ALLOC_PT_GPREGS_ON_STACK |
| @@ -1415,28 +1516,11 @@ end_repeat_nmi: · 7 unmodified lines | ||
| 1415 | 1516 | */ |
| 1416 | 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 | 1519 | /* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */ |
| 1430 | 1520 | movq %rsp, %rdi |
| 1431 | 1521 | movq $-1, %rsi |
| 1432 | 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 | 1524 | testl %ebx, %ebx /* swapgs needed? */ |
| 1441 | 1525 | jnz nmi_restore |
| 1442 | 1526 | nmi_swapgs: |
| @@ -1444,11 +1528,26 @@ nmi_swapgs: · 1 unmodified line | ||
| 1444 | 1528 | nmi_restore: |
| 1445 | 1529 | RESTORE_EXTRA_REGS |
| 1446 | 1530 | RESTORE_C_REGS |
| 1447 | − /* Pop the extra iret frame at once */ | |
| 1531 | + | |
| 1532 | + /* Point RSP at the "iret" frame. */ | |
| 1448 | 1533 | REMOVE_PT_GPREGS_FROM_STACK 6*8 |
| 1449 | 1534 | |
| 1450 | − /* Clear the NMI executing stack variable */ | |
| 1451 | − movq $0, 5*8(%rsp) | |
| 1535 | + /* | |
| 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 | 1551 | INTERRUPT_RETURN |
| 1453 | 1552 | END(nmi) |
| 1454 | 1553 | |
| @@ -9,3 +9,4 @@ generic-y += cputime.h · 8 unmodified lines | ||
| 9 | 9 | generic-y += dma-contiguous.h |
| 10 | 10 | generic-y += early_ioremap.h |
| 11 | 11 | generic-y += mcs_spinlock.h |
| 12 | +generic-y += mm-arch-hooks.h | |
| @@ -189,6 +189,7 @@ union fpregs_state { · 188 unmodified lines | ||
| 189 | 189 | struct fxregs_state fxsave; |
| 190 | 190 | struct swregs_state soft; |
| 191 | 191 | struct xregs_state xsave; |
| 192 | + u8 __padding[PAGE_SIZE]; | |
| 192 | 193 | }; |
| 193 | 194 | |
| 194 | 195 | /* |
| @@ -197,40 +198,6 @@ union fpregs_state { · 2 unmodified lines | ||
| 197 | 198 | * state fields: |
| 198 | 199 | */ |
| 199 | 200 | struct fpu { |
| 200 | − /* | |
| 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 | 201 | /* |
| 235 | 202 | * @last_cpu: |
| 236 | 203 | * |
| @@ -288,6 +255,43 @@ struct fpu { · 51 unmodified lines | ||
| 288 | 255 | * deal with bursty apps that only use the FPU for a short time: |
| 289 | 256 | */ |
| 290 | 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 | 297 | #endif /* _ASM_X86_FPU_H */ |
| @@ -25,36 +25,9 @@ · 24 unmodified lines | ||
| 25 | 25 | |
| 26 | 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 | 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 | 29 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 47 | 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 | 31 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 59 | 32 | u32 *out, u32 outlen); |
| 60 | 33 | |
| @@ -604,6 +604,8 @@ struct kvm_arch { · 603 unmodified lines | ||
| 604 | 604 | bool iommu_noncoherent; |
| 605 | 605 | #define __KVM_HAVE_ARCH_NONCOHERENT_DMA |
| 606 | 606 | atomic_t noncoherent_dma_count; |
| 607 | +#define __KVM_HAVE_ARCH_ASSIGNED_DEVICE | |
| 608 | + atomic_t assigned_device_count; | |
| 607 | 609 | struct kvm_pic *vpic; |
| 608 | 610 | struct kvm_ioapic *vioapic; |
| 609 | 611 | struct kvm_pit *vpit; |
| @@ -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 */ | |
| @@ -23,7 +23,7 @@ extern struct static_key rdpmc_always_available; · 22 unmodified lines | ||
| 23 | 23 | |
| 24 | 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 | 27 | atomic_read(&mm->context.perf_rdpmc_allowed)) |
| 28 | 28 | cr4_set_bits(X86_CR4_PCE); |
| 29 | 29 | else |
| @@ -390,9 +390,6 @@ struct thread_struct { · 389 unmodified lines | ||
| 390 | 390 | #endif |
| 391 | 391 | unsigned long gs; |
| 392 | 392 | |
| 393 | − /* Floating point and extended processor state */ | |
| 394 | − struct fpu fpu; | |
| 395 | − | |
| 396 | 393 | /* Save middle states of ptrace breakpoints */ |
| 397 | 394 | struct perf_event *ptrace_bps[HBP_NUM]; |
| 398 | 395 | /* Debug status used for traps, single steps, etc... */ |
| @@ -418,6 +415,13 @@ struct thread_struct { · 19 unmodified lines | ||
| 418 | 415 | unsigned long iopl; |
| 419 | 416 | /* Max allowed port in the bitmap, in bytes: */ |
| 420 | 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 | /* |
| @@ -108,6 +108,8 @@ · 107 unmodified lines | ||
| 108 | 108 | #define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE (1 << 4) |
| 109 | 109 | /* Support for a virtual guest idle state is available */ |
| 110 | 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 | 115 | * Implementation recommendations. Indicates which behaviors the hypervisor |
| @@ -4,6 +4,8 @@ · 3 unmodified lines | ||
| 4 | 4 | #include <asm/fpu/internal.h> |
| 5 | 5 | #include <asm/tlbflush.h> |
| 6 | 6 | |
| 7 | +#include <linux/sched.h> | |
| 8 | + | |
| 7 | 9 | /* |
| 8 | 10 | * Initialize the TS bit in CR0 according to the style of context-switches |
| 9 | 11 | * we are using: |
| @@ -136,6 +138,43 @@ static void __init fpu__init_system_generic(void) · 126 unmodified lines | ||
| 136 | 138 | unsigned int xstate_size; |
| 137 | 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 | 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) · 145 unmodified lines | ||
| 287 | 326 | fpu__init_system_generic(); |
| 288 | 327 | fpu__init_system_xstate_size_legacy(); |
| 289 | 328 | fpu__init_system_xstate(); |
| 329 | + fpu__init_task_struct_size(); | |
| 290 | 330 | |
| 291 | 331 | fpu__init_system_ctx_switch(); |
| 292 | 332 | } |
| @@ -408,15 +408,15 @@ static void default_do_nmi(struct pt_regs *regs) · 407 unmodified lines | ||
| 408 | 408 | NOKPROBE_SYMBOL(default_do_nmi); |
| 409 | 409 | |
| 410 | 410 | /* |
| 411 | − * NMIs can hit breakpoints which will cause it to lose its | |
| 412 | − * NMI context with the CPU when the breakpoint does an iret. | |
| 413 | − */ | |
| 414 | −#ifdef CONFIG_X86_32 | |
| 415 | −/* | |
| 416 | − * For i386, NMIs use the same stack as the kernel, and we can | |
| 417 | − * add a workaround to the iret problem in C (preventing nested | |
| 418 | − * NMIs if an NMI takes a trap). Simply have 3 states the NMI | |
| 419 | − * can be in: | |
| 411 | + * NMIs can page fault or hit breakpoints which will cause it to lose | |
| 412 | + * its NMI context with the CPU when the breakpoint or page fault does an IRET. | |
| 413 | + * | |
| 414 | + * As a result, NMIs can nest if NMIs get unmasked due an IRET during | |
| 415 | + * NMI processing. On x86_64, the asm glue protects us from nested NMIs | |
| 416 | + * if the outer NMI came from kernel mode, but we can still nest if the | |
| 417 | + * outer NMI came from user mode. | |
| 418 | + * | |
| 419 | + * To handle these nested NMIs, we have three states: | |
| 420 | 420 | * |
| 421 | 421 | * 1) not running |
| 422 | 422 | * 2) executing |
| @@ -430,15 +430,14 @@ NOKPROBE_SYMBOL(default_do_nmi); · 7 unmodified lines | ||
| 430 | 430 | * (Note, the latch is binary, thus multiple NMIs triggering, |
| 431 | 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 | |
| 434 | − * NMI can preempt it. We do not want to allow this new NMI | |
| 435 | − * to run, but we want to execute it when the first one finishes. | |
| 436 | − * We set the state to "latched", and the exit of the first NMI will | |
| 437 | − * perform a dec_return, if the result is zero (NOT_RUNNING), then | |
| 438 | − * it will simply exit the NMI handler. If not, the dec_return | |
| 439 | − * would have set the state to NMI_EXECUTING (what we want it to | |
| 440 | − * be when we are running). In this case, we simply jump back | |
| 441 | − * to rerun the NMI handler again, and restart the 'latched' NMI. | |
| 433 | + * If an NMI executes an iret, another NMI can preempt it. We do not | |
| 434 | + * want to allow this new NMI to run, but we want to execute it when the | |
| 435 | + * first one finishes. We set the state to "latched", and the exit of | |
| 436 | + * the first NMI will perform a dec_return, if the result is zero | |
| 437 | + * (NOT_RUNNING), then it will simply exit the NMI handler. If not, the | |
| 438 | + * dec_return would have set the state to NMI_EXECUTING (what we want it | |
| 439 | + * to be when we are running). In this case, we simply jump back to | |
| 440 | + * rerun the NMI handler again, and restart the 'latched' NMI. | |
| 442 | 441 | * |
| 443 | 442 | * No trap (breakpoint or page fault) should be hit before nmi_restart, |
| 444 | 443 | * thus there is no race between the first check of state for NOT_RUNNING |
| @@ -461,49 +460,36 @@ enum nmi_states { · 16 unmodified lines | ||
| 461 | 460 | static DEFINE_PER_CPU(enum nmi_states, nmi_state); |
| 462 | 461 | static DEFINE_PER_CPU(unsigned long, nmi_cr2); |
| 463 | 462 | |
| 464 | −#define nmi_nesting_preprocess(regs) \ | |
| 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 */ | |
| 463 | +#ifdef CONFIG_X86_64 | |
| 483 | 464 | /* |
| 484 | − * In x86_64 things are a bit more difficult. This has the same problem | |
| 485 | − * where an NMI hitting a breakpoint that calls iret will remove the | |
| 486 | − * NMI context, allowing a nested NMI to enter. What makes this more | |
| 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. | |
| 465 | + * In x86_64, we need to handle breakpoint -> NMI -> breakpoint. Without | |
| 466 | + * some care, the inner breakpoint will clobber the outer breakpoint's | |
| 467 | + * stack. | |
| 493 | 468 | * |
| 494 | − * If a breakpoint is being processed, and the debug stack is being used, | |
| 495 | − * if an NMI comes in and also hits a breakpoint, the stack pointer | |
| 496 | − * will be set to the same fixed address as the breakpoint that was | |
| 497 | − * interrupted, causing that stack to be corrupted. To handle this case, | |
| 498 | − * check if the stack that was interrupted is the debug stack, and if | |
| 499 | − * so, change the IDT so that new breakpoints will use the current stack | |
| 500 | − * and not switch to the fixed address. On return of the NMI, switch back | |
| 501 | − * to the original IDT. | |
| 469 | + * If a breakpoint is being processed, and the debug stack is being | |
| 470 | + * used, if an NMI comes in and also hits a breakpoint, the stack | |
| 471 | + * pointer will be set to the same fixed address as the breakpoint that | |
| 472 | + * was interrupted, causing that stack to be corrupted. To handle this | |
| 473 | + * case, check if the stack that was interrupted is the debug stack, and | |
| 474 | + * if so, change the IDT so that new breakpoints will use the current | |
| 475 | + * stack and not switch to the fixed address. On return of the NMI, | |
| 476 | + * switch back to the original IDT. | |
| 502 | 477 | */ |
| 503 | 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 | 494 | * If we interrupted a breakpoint, it is possible that |
| 509 | 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) · 4 unmodified lines | ||
| 514 | 500 | debug_stack_set_zero(); |
| 515 | 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 | 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 | 505 | nmi_enter(); |
| 534 | 506 | |
| 535 | 507 | inc_irq_stat(__nmi_count); |
| @@ -539,8 +511,17 @@ do_nmi(struct pt_regs *regs, long error_code) · 3 unmodified lines | ||
| 539 | 511 | |
| 540 | 512 | nmi_exit(); |
| 541 | 513 | |
| 542 | − /* On i386, may loop back to preprocess */ | |
| 543 | − nmi_nesting_postprocess(); | |
| 514 | +#ifdef CONFIG_X86_64 | |
| 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 | 526 | NOKPROBE_SYMBOL(do_nmi); |
| 546 | 527 | |
| @@ -81,7 +81,7 @@ EXPORT_SYMBOL_GPL(idle_notifier_unregister); · 80 unmodified lines | ||
| 81 | 81 | */ |
| 82 | 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 | 86 | return fpu__copy(&dst->thread.fpu, &src->thread.fpu); |
| 87 | 87 | } |
| @@ -992,8 +992,17 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle) · 991 unmodified lines | ||
| 992 | 992 | |
| 993 | 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 | 1002 | err = do_boot_cpu(apicid, cpu, tidle); |
| 1003 | + | |
| 996 | 1004 | if (err) { |
| 1005 | + irq_unlock_sparse(); | |
| 997 | 1006 | pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu); |
| 998 | 1007 | return -EIO; |
| 999 | 1008 | } |
| @@ -1011,6 +1020,8 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle) · 11 unmodified lines | ||
| 1011 | 1020 | touch_nmi_watchdog(); |
| 1012 | 1021 | } |
| 1013 | 1022 | |
| 1023 | + irq_unlock_sparse(); | |
| 1024 | + | |
| 1014 | 1025 | return 0; |
| 1015 | 1026 | } |
| 1016 | 1027 | |
| @@ -98,6 +98,8 @@ int kvm_update_cpuid(struct kvm_vcpu *vcpu) · 97 unmodified lines | ||
| 98 | 98 | best->ebx = xstate_required_size(vcpu->arch.xcr0, true); |
| 99 | 99 | |
| 100 | 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 | 105 | * The existing code assumes virtual address is 48-bit in the canonical |
| @@ -200,6 +200,7 @@ int kvm_assign_device(struct kvm *kvm, struct pci_dev *pdev) · 199 unmodified lines | ||
| 200 | 200 | goto out_unmap; |
| 201 | 201 | } |
| 202 | 202 | |
| 203 | + kvm_arch_start_assignment(kvm); | |
| 203 | 204 | pci_set_dev_assigned(pdev); |
| 204 | 205 | |
| 205 | 206 | dev_info(&pdev->dev, "kvm assign device\n"); |
| @@ -224,6 +225,7 @@ int kvm_deassign_device(struct kvm *kvm, struct pci_dev *pdev) · 18 unmodified lines | ||
| 224 | 225 | iommu_detach_device(domain, &pdev->dev); |
| 225 | 226 | |
| 226 | 227 | pci_clear_dev_assigned(pdev); |
| 228 | + kvm_arch_end_assignment(kvm); | |
| 227 | 229 | |
| 228 | 230 | dev_info(&pdev->dev, "kvm deassign device\n"); |
| 229 | 231 | |
| @@ -2479,6 +2479,14 @@ static int mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn, · 2478 unmodified lines | ||
| 2479 | 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 | 2490 | static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, |
| 2483 | 2491 | unsigned pte_access, int level, |
| 2484 | 2492 | gfn_t gfn, pfn_t pfn, bool speculative, |
| @@ -2506,7 +2514,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, · 21 unmodified lines | ||
| 2506 | 2514 | spte |= PT_PAGE_SIZE_MASK; |
| 2507 | 2515 | if (tdp_enabled) |
| 2508 | 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 | 2519 | if (host_writable) |
| 2512 | 2520 | spte |= SPTE_HOST_WRITEABLE; |
| @@ -865,6 +865,64 @@ static void svm_disable_lbrv(struct vcpu_svm *svm) · 864 unmodified lines | ||
| 865 | 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 | 926 | static __init int svm_hardware_setup(void) |
| 869 | 927 | { |
| 870 | 928 | int cpu; |
| @@ -931,6 +989,7 @@ static __init int svm_hardware_setup(void) · 60 unmodified lines | ||
| 931 | 989 | } else |
| 932 | 990 | kvm_disable_tdp(); |
| 933 | 991 | |
| 992 | + build_mtrr2protval(); | |
| 934 | 993 | return 0; |
| 935 | 994 | |
| 936 | 995 | err: |
| @@ -1085,6 +1144,39 @@ static u64 svm_compute_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc) · 148 unmodified lines | ||
| 1085 | 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 | 1180 | static void init_vmcb(struct vcpu_svm *svm, bool init_event) |
| 1089 | 1181 | { |
| 1090 | 1182 | struct vmcb_control_area *control = &svm->vmcb->control; |
| @@ -1180,6 +1272,7 @@ static void init_vmcb(struct vcpu_svm *svm, bool init_event) · 89 unmodified lines | ||
| 1180 | 1272 | clr_cr_intercept(svm, INTERCEPT_CR3_READ); |
| 1181 | 1273 | clr_cr_intercept(svm, INTERCEPT_CR3_WRITE); |
| 1182 | 1274 | save->g_pat = svm->vcpu.arch.pat; |
| 1275 | + svm_set_guest_pat(svm, &save->g_pat); | |
| 1183 | 1276 | save->cr3 = 0; |
| 1184 | 1277 | save->cr4 = 0; |
| 1185 | 1278 | } |
| @@ -3254,6 +3347,16 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) · 2068 unmodified lines | ||
| 3254 | 3347 | case MSR_VM_IGNNE: |
| 3255 | 3348 | vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); |
| 3256 | 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 | 3360 | default: |
| 3258 | 3361 | return kvm_set_msr_common(vcpu, msr); |
| 3259 | 3362 | } |
| @@ -4088,11 +4191,6 @@ static bool svm_has_high_real_mode_segbase(void) · 828 unmodified lines | ||
| 4088 | 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 | 4194 | static void svm_cpuid_update(struct kvm_vcpu *vcpu) |
| 4097 | 4195 | { |
| 4098 | 4196 | } |
| @@ -8632,22 +8632,17 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio) · 8631 unmodified lines | ||
| 8632 | 8632 | u64 ipat = 0; |
| 8633 | 8633 | |
| 8634 | 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 | 8636 | * 2. EPT with VT-d: |
| 8637 | 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 | 8639 | * b. VT-d with snooping control feature: snooping control feature of |
| 8640 | 8640 | * VT-d engine can guarantee the cache correctness. Just set it |
| 8641 | 8641 | * to WB to keep consistent with host. So the same as item 3. |
| 8642 | 8642 | * 3. EPT without VT-d: always map as WB and set IPAT=1 to keep |
| 8643 | 8643 | * consistent with host MTRR |
| 8644 | 8644 | */ |
| 8645 | − if (is_mmio) { | |
| 8646 | − cache = MTRR_TYPE_UNCACHABLE; | |
| 8647 | − goto exit; | |
| 8648 | − } | |
| 8649 | − | |
| 8650 | − if (!kvm_arch_has_noncoherent_dma(vcpu->kvm)) { | |
| 8645 | + if (!is_mmio && !kvm_arch_has_noncoherent_dma(vcpu->kvm)) { | |
| 8651 | 8646 | ipat = VMX_EPT_IPAT_BIT; |
| 8652 | 8647 | cache = MTRR_TYPE_WRBACK; |
| 8653 | 8648 | goto exit; |
| @@ -3157,8 +3157,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src) · 3156 unmodified lines | ||
| 3157 | 3157 | cpuid_count(XSTATE_CPUID, index, |
| 3158 | 3158 | &size, &offset, &ecx, &edx); |
| 3159 | 3159 | memcpy(dest, src + offset, size); |
| 3160 | − } else | |
| 3161 | − WARN_ON_ONCE(1); | |
| 3160 | + } | |
| 3162 | 3161 | |
| 3163 | 3162 | valid -= feature; |
| 3164 | 3163 | } |
| @@ -7315,11 +7314,6 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, · 4150 unmodified lines | ||
| 7315 | 7314 | |
| 7316 | 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 | 7317 | return vcpu; |
| 7324 | 7318 | } |
| 7325 | 7319 | |
| @@ -8218,6 +8212,24 @@ bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) · 892 unmodified lines | ||
| 8218 | 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 | 8233 | void kvm_arch_register_noncoherent_dma(struct kvm *kvm) |
| 8222 | 8234 | { |
| 8223 | 8235 | atomic_inc(&kvm->arch.noncoherent_dma_count); |
| @@ -19,6 +19,7 @@ generic-y += linkage.h · 18 unmodified lines | ||
| 19 | 19 | generic-y += local.h |
| 20 | 20 | generic-y += local64.h |
| 21 | 21 | generic-y += mcs_spinlock.h |
| 22 | +generic-y += mm-arch-hooks.h | |
| 22 | 23 | generic-y += percpu.h |
| 23 | 24 | generic-y += preempt.h |
| 24 | 25 | generic-y += resource.h |
| @@ -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 */ | |
| @@ -51,7 +51,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, · 50 unmodified lines | ||
| 51 | 51 | unsigned long idx = BIO_POOL_NONE; |
| 52 | 52 | unsigned inline_vecs; |
| 53 | 53 | |
| 54 | − if (!bs) { | |
| 54 | + if (!bs || !bs->bio_integrity_pool) { | |
| 55 | 55 | bip = kmalloc(sizeof(struct bio_integrity_payload) + |
| 56 | 56 | sizeof(struct bio_vec) * nr_vecs, gfp_mask); |
| 57 | 57 | inline_vecs = nr_vecs; |
| @@ -104,7 +104,7 @@ void bio_integrity_free(struct bio *bio) · 46 unmodified lines | ||
| 104 | 104 | kfree(page_address(bip->bip_vec->bv_page) + |
| 105 | 105 | bip->bip_vec->bv_offset); |
| 106 | 106 | |
| 107 | − if (bs) { | |
| 107 | + if (bs && bs->bio_integrity_pool) { | |
| 108 | 108 | if (bip->bip_slab != BIO_POOL_NONE) |
| 109 | 109 | bvec_free(bs->bvec_integrity_pool, bip->bip_vec, |
| 110 | 110 | bip->bip_slab); |
| @@ -29,6 +29,14 @@ · 28 unmodified lines | ||
| 29 | 29 | |
| 30 | 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 | 40 | static DEFINE_MUTEX(blkcg_pol_mutex); |
| 33 | 41 | |
| 34 | 42 | struct blkcg blkcg_root; |
| @@ -38,6 +46,8 @@ struct cgroup_subsys_state * const blkcg_root_css = &blkcg_root.css; · 3 unmodified lines | ||
| 38 | 46 | |
| 39 | 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 | 51 | static bool blkcg_policy_enabled(struct request_queue *q, |
| 42 | 52 | const struct blkcg_policy *pol) |
| 43 | 53 | { |
| @@ -453,20 +463,7 @@ static int blkcg_reset_stats(struct cgroup_subsys_state *css, · 409 unmodified lines | ||
| 453 | 463 | struct blkcg_gq *blkg; |
| 454 | 464 | int i; |
| 455 | 465 | |
| 456 | − /* | |
| 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(); | |
| 466 | + mutex_lock(&blkcg_pol_mutex); | |
| 470 | 467 | spin_lock_irq(&blkcg->lock); |
| 471 | 468 | |
| 472 | 469 | /* |
| @@ -822,8 +819,17 @@ static void blkcg_css_free(struct cgroup_subsys_state *css) · 349 unmodified lines | ||
| 822 | 819 | { |
| 823 | 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 | 831 | kfree(blkcg); |
| 832 | + } | |
| 827 | 833 | } |
| 828 | 834 | |
| 829 | 835 | static struct cgroup_subsys_state * |
| @@ -833,6 +839,8 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css) · 3 unmodified lines | ||
| 833 | 839 | struct cgroup_subsys_state *ret; |
| 834 | 840 | int i; |
| 835 | 841 | |
| 842 | + mutex_lock(&blkcg_pol_mutex); | |
| 843 | + | |
| 836 | 844 | if (!parent_css) { |
| 837 | 845 | blkcg = &blkcg_root; |
| 838 | 846 | goto done; |
| @@ -875,14 +883,17 @@ done: · 36 unmodified lines | ||
| 875 | 883 | #ifdef CONFIG_CGROUP_WRITEBACK |
| 876 | 884 | INIT_LIST_HEAD(&blkcg->cgwb_list); |
| 877 | 885 | #endif |
| 886 | + list_add_tail(&blkcg->all_blkcgs_node, &all_blkcgs); | |
| 887 | + | |
| 888 | + mutex_unlock(&blkcg_pol_mutex); | |
| 878 | 889 | return &blkcg->css; |
| 879 | 890 | |
| 880 | 891 | free_pd_blkcg: |
| 881 | 892 | for (i--; i >= 0; i--) |
| 882 | 893 | kfree(blkcg->pd[i]); |
| 883 | − | |
| 884 | 894 | free_blkcg: |
| 885 | 895 | kfree(blkcg); |
| 896 | + mutex_unlock(&blkcg_pol_mutex); | |
| 886 | 897 | return ret; |
| 887 | 898 | } |
| 888 | 899 | |
| @@ -1037,10 +1048,8 @@ int blkcg_activate_policy(struct request_queue *q, · 148 unmodified lines | ||
| 1037 | 1048 | const struct blkcg_policy *pol) |
| 1038 | 1049 | { |
| 1039 | 1050 | LIST_HEAD(pds); |
| 1040 | − LIST_HEAD(cpds); | |
| 1041 | 1051 | struct blkcg_gq *blkg; |
| 1042 | 1052 | struct blkg_policy_data *pd, *nd; |
| 1043 | − struct blkcg_policy_data *cpd, *cnd; | |
| 1044 | 1053 | int cnt = 0, ret; |
| 1045 | 1054 | |
| 1046 | 1055 | if (blkcg_policy_enabled(q, pol)) |
| @@ -1053,10 +1062,7 @@ int blkcg_activate_policy(struct request_queue *q, · 6 unmodified lines | ||
| 1053 | 1062 | cnt++; |
| 1054 | 1063 | spin_unlock_irq(q->queue_lock); |
| 1055 | 1064 | |
| 1056 | − /* | |
| 1057 | − * Allocate per-blkg and per-blkcg policy data | |
| 1058 | − * for all existing blkgs. | |
| 1059 | − */ | |
| 1065 | + /* allocate per-blkg policy data for all existing blkgs */ | |
| 1060 | 1066 | while (cnt--) { |
| 1061 | 1067 | pd = kzalloc_node(pol->pd_size, GFP_KERNEL, q->node); |
| 1062 | 1068 | if (!pd) { |
| @@ -1064,15 +1070,6 @@ int blkcg_activate_policy(struct request_queue *q, · 1 unmodified line | ||
| 1064 | 1070 | goto out_free; |
| 1065 | 1071 | } |
| 1066 | 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, · 3 unmodified lines | ||
| 1082 | 1079 | spin_lock_irq(q->queue_lock); |
| 1083 | 1080 | |
| 1084 | 1081 | list_for_each_entry(blkg, &q->blkg_list, q_node) { |
| 1085 | − if (WARN_ON(list_empty(&pds)) || | |
| 1086 | − WARN_ON(pol->cpd_size && list_empty(&cpds))) { | |
| 1082 | + if (WARN_ON(list_empty(&pds))) { | |
| 1087 | 1083 | /* umm... this shouldn't happen, just abort */ |
| 1088 | 1084 | ret = -ENOMEM; |
| 1089 | 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 | 1087 | pd = list_first_entry(&pds, struct blkg_policy_data, alloc_node); |
| 1095 | 1088 | list_del_init(&pd->alloc_node); |
| 1096 | 1089 | |
| 1097 | 1090 | /* grab blkcg lock too while installing @pd on @blkg */ |
| 1098 | 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 | 1093 | blkg->pd[pol->plid] = pd; |
| 1112 | 1094 | pd->blkg = blkg; |
| 1113 | 1095 | pd->plid = pol->plid; |
| @@ -1124,8 +1106,6 @@ out_free: · 10 unmodified lines | ||
| 1124 | 1106 | blk_queue_bypass_end(q); |
| 1125 | 1107 | list_for_each_entry_safe(pd, nd, &pds, alloc_node) |
| 1126 | 1108 | kfree(pd); |
| 1127 | − list_for_each_entry_safe(cpd, cnd, &cpds, alloc_node) | |
| 1128 | − kfree(cpd); | |
| 1129 | 1109 | return ret; |
| 1130 | 1110 | } |
| 1131 | 1111 | EXPORT_SYMBOL_GPL(blkcg_activate_policy); |
| @@ -1162,8 +1142,6 @@ void blkcg_deactivate_policy(struct request_queue *q, · 30 unmodified lines | ||
| 1162 | 1142 | |
| 1163 | 1143 | kfree(blkg->pd[pol->plid]); |
| 1164 | 1144 | blkg->pd[pol->plid] = NULL; |
| 1165 | − kfree(blkg->blkcg->pd[pol->plid]); | |
| 1166 | − blkg->blkcg->pd[pol->plid] = NULL; | |
| 1167 | 1145 | |
| 1168 | 1146 | spin_unlock(&blkg->blkcg->lock); |
| 1169 | 1147 | } |
| @@ -1182,11 +1160,13 @@ EXPORT_SYMBOL_GPL(blkcg_deactivate_policy); · 12 unmodified lines | ||
| 1182 | 1160 | */ |
| 1183 | 1161 | int blkcg_policy_register(struct blkcg_policy *pol) |
| 1184 | 1162 | { |
| 1163 | + struct blkcg *blkcg; | |
| 1185 | 1164 | int i, ret; |
| 1186 | 1165 | |
| 1187 | 1166 | if (WARN_ON(pol->pd_size < sizeof(struct blkg_policy_data))) |
| 1188 | 1167 | return -EINVAL; |
| 1189 | 1168 | |
| 1169 | + mutex_lock(&blkcg_pol_register_mutex); | |
| 1190 | 1170 | mutex_lock(&blkcg_pol_mutex); |
| 1191 | 1171 | |
| 1192 | 1172 | /* find an empty slot */ |
| @@ -1195,19 +1175,49 @@ int blkcg_policy_register(struct blkcg_policy *pol) · 2 unmodified lines | ||
| 1195 | 1175 | if (!blkcg_policy[i]) |
| 1196 | 1176 | break; |
| 1197 | 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 | 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 | 1203 | /* everything is in place, add intf files for the new policy */ |
| 1205 | 1204 | if (pol->cftypes) |
| 1206 | 1205 | WARN_ON(cgroup_add_legacy_cftypes(&blkio_cgrp_subsys, |
| 1207 | 1206 | pol->cftypes)); |
| 1208 | − ret = 0; | |
| 1209 | −out_unlock: | |
| 1207 | + mutex_unlock(&blkcg_pol_register_mutex); | |
| 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 | 1219 | mutex_unlock(&blkcg_pol_mutex); |
| 1220 | + mutex_unlock(&blkcg_pol_register_mutex); | |
| 1211 | 1221 | return ret; |
| 1212 | 1222 | } |
| 1213 | 1223 | EXPORT_SYMBOL_GPL(blkcg_policy_register); |
| @@ -1220,7 +1230,9 @@ EXPORT_SYMBOL_GPL(blkcg_policy_register); · 6 unmodified lines | ||
| 1220 | 1230 | */ |
| 1221 | 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 | 1237 | if (WARN_ON(blkcg_policy[pol->plid] != pol)) |
| 1226 | 1238 | goto out_unlock; |
| @@ -1229,9 +1241,19 @@ void blkcg_policy_unregister(struct blkcg_policy *pol) · 2 unmodified lines | ||
| 1229 | 1241 | if (pol->cftypes) |
| 1230 | 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 | 1253 | blkcg_policy[pol->plid] = NULL; |
| 1234 | −out_unlock: | |
| 1254 | + | |
| 1235 | 1255 | mutex_unlock(&blkcg_pol_mutex); |
| 1256 | +out_unlock: | |
| 1257 | + mutex_unlock(&blkcg_pol_register_mutex); | |
| 1236 | 1258 | } |
| 1237 | 1259 | EXPORT_SYMBOL_GPL(blkcg_policy_unregister); |
| @@ -3370,7 +3370,7 @@ EXPORT_SYMBOL(blk_post_runtime_resume); · 3369 unmodified lines | ||
| 3370 | 3370 | int __init blk_dev_init(void) |
| 3371 | 3371 | { |
| 3372 | 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 | 3375 | /* used for unplugging and affects IO latency/throughput - HIGHPRI */ |
| 3376 | 3376 | kblockd_workqueue = alloc_workqueue("kblockd", |
| @@ -1998,7 +1998,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, · 1997 unmodified lines | ||
| 1998 | 1998 | goto err_hctxs; |
| 1999 | 1999 | |
| 2000 | 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 | 2003 | q->nr_queues = nr_cpu_ids; |
| 2004 | 2004 | q->nr_hw_queues = set->nr_hw_queues; |
| @@ -193,6 +193,7 @@ static bool acpi_decode_space(struct resource_win *win, · 192 unmodified lines | ||
| 193 | 193 | u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16; |
| 194 | 194 | bool wp = addr->info.mem.write_protect; |
| 195 | 195 | u64 len = attr->address_length; |
| 196 | + u64 start, end, offset = 0; | |
| 196 | 197 | struct resource *res = &win->res; |
| 197 | 198 | |
| 198 | 199 | /* |
| @@ -204,9 +205,6 @@ static bool acpi_decode_space(struct resource_win *win, · 5 unmodified lines | ||
| 204 | 205 | pr_debug("ACPI: Invalid address space min_addr_fix %d, max_addr_fix %d, len %llx\n", |
| 205 | 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 | 209 | * For bridges that translate addresses across the bridge, |
| 212 | 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, · 1 unmodified line | ||
| 214 | 212 | * primary side. Non-bridge devices must list 0 for all Address |
| 215 | 213 | * Translation offset bits. |
| 216 | 214 | */ |
| 217 | − if (addr->producer_consumer == ACPI_PRODUCER) { | |
| 218 | − res->start += attr->translation_offset; | |
| 219 | − res->end += attr->translation_offset; | |
| 220 | − } else if (attr->translation_offset) { | |
| 215 | + if (addr->producer_consumer == ACPI_PRODUCER) | |
| 216 | + offset = attr->translation_offset; | |
| 217 | + else if (attr->translation_offset) | |
| 221 | 218 | pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n", |
| 222 | 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 | 233 | switch (addr->resource_type) { |
| @@ -236,8 +244,6 @@ static bool acpi_decode_space(struct resource_win *win, · 10 unmodified lines | ||
| 236 | 244 | return false; |
| 237 | 245 | } |
| 238 | 246 | |
| 239 | − win->offset = attr->translation_offset; | |
| 240 | − | |
| 241 | 247 | if (addr->producer_consumer == ACPI_PRODUCER) |
| 242 | 248 | res->flags |= IORESOURCE_WINDOW; |
| 243 | 249 | |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Arasan Compact Flash host controller source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2011 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -968,7 +968,7 @@ static struct platform_driver arasan_cf_driver = { · 957 unmodified lines | ||
| 968 | 968 | |
| 969 | 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 | 972 | MODULE_DESCRIPTION("Arasan ATA Compact Flash driver"); |
| 973 | 973 | MODULE_LICENSE("GPL"); |
| 974 | 974 | MODULE_ALIAS("platform:" DRIVER_NAME); |
| @@ -2108,8 +2108,17 @@ static void nvme_alloc_ns(struct nvme_dev *dev, unsigned nsid) · 2107 unmodified lines | ||
| 2108 | 2108 | goto out_free_disk; |
| 2109 | 2109 | |
| 2110 | 2110 | add_disk(ns->disk); |
| 2111 | − if (ns->ms) | |
| 2112 | − revalidate_disk(ns->disk); | |
| 2111 | + if (ns->ms) { | |
| 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 | 2122 | return; |
| 2114 | 2123 | out_free_disk: |
| 2115 | 2124 | kfree(disk); |
| @@ -472,12 +472,11 @@ int btbcm_setup_apple(struct hci_dev *hdev) · 471 unmodified lines | ||
| 472 | 472 | |
| 473 | 473 | /* Read Verbose Config Version Info */ |
| 474 | 474 | skb = btbcm_read_verbose_config(hdev); |
| 475 | − if (IS_ERR(skb)) | |
| 476 | − return PTR_ERR(skb); | |
| 477 | − | |
| 478 | − BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1], | |
| 479 | − get_unaligned_le16(skb->data + 5)); | |
| 480 | − kfree_skb(skb); | |
| 475 | + if (!IS_ERR(skb)) { | |
| 476 | + BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1], | |
| 477 | + get_unaligned_le16(skb->data + 5)); | |
| 478 | + kfree_skb(skb); | |
| 479 | + } | |
| 481 | 480 | |
| 482 | 481 | set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); |
| 483 | 482 | |
| @@ -129,8 +129,9 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev, · 128 unmodified lines | ||
| 129 | 129 | |
| 130 | 130 | device_initialize(&chip->dev); |
| 131 | 131 | |
| 132 | − chip->cdev.owner = chip->pdev->driver->owner; | |
| 133 | 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 | 136 | return chip; |
| 136 | 137 | } |
| @@ -233,6 +233,14 @@ static int crb_acpi_add(struct acpi_device *device) · 232 unmodified lines | ||
| 233 | 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 | 244 | if (buf->hdr.length < sizeof(struct acpi_tpm2)) { |
| 237 | 245 | dev_err(dev, "TPM2 ACPI table has wrong size"); |
| 238 | 246 | return -EINVAL; |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 3 | + * Viresh Kumar <vireshk@kernel.org> | |
| 4 | 4 | * |
| 5 | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | 6 | * License version 2. This program is licensed "as is" without any |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 3 | + * Viresh Kumar <vireshk@kernel.org> | |
| 4 | 4 | * |
| 5 | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | 6 | * License version 2. This program is licensed "as is" without any |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 3 | + * Viresh Kumar <vireshk@kernel.org> | |
| 4 | 4 | * |
| 5 | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | 6 | * License version 2. This program is licensed "as is" without any |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 3 | + * Viresh Kumar <vireshk@kernel.org> | |
| 4 | 4 | * |
| 5 | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | 6 | * License version 2. This program is licensed "as is" without any |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 3 | + * Viresh Kumar <vireshk@kernel.org> | |
| 4 | 4 | * |
| 5 | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | 6 | * License version 2. This program is licensed "as is" without any |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Clock framework definitions for SPEAr platform |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr1310 machine clock framework source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * SPEAr1340 machine clock framework source file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * SPEAr3xx machines clock framework source file |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * SPEAr6xx machines clock framework source file |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -169,6 +169,15 @@ struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) · 168 unmodified lines | ||
| 169 | 169 | } |
| 170 | 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 | 181 | static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall) |
| 173 | 182 | { |
| 174 | 183 | u64 idle_time; |
| @@ -1132,6 +1141,7 @@ static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu) · 957 unmodified lines | ||
| 1132 | 1141 | |
| 1133 | 1142 | down_write(&policy->rwsem); |
| 1134 | 1143 | policy->cpu = cpu; |
| 1144 | + policy->governor = NULL; | |
| 1135 | 1145 | up_write(&policy->rwsem); |
| 1136 | 1146 | } |
| 1137 | 1147 | |
| @@ -297,15 +297,6 @@ int cpufreq_table_validate_and_show(struct cpufreq_policy *policy, · 296 unmodified lines | ||
| 297 | 297 | } |
| 298 | 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 | 300 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
| 310 | 301 | MODULE_DESCRIPTION("CPUfreq frequency table helpers"); |
| 311 | 302 | MODULE_LICENSE("GPL"); |
| @@ -112,7 +112,12 @@ int cpuidle_find_deepest_state(struct cpuidle_driver *drv, · 111 unmodified lines | ||
| 112 | 112 | static void enter_freeze_proper(struct cpuidle_driver *drv, |
| 113 | 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 | 122 | * The state used here cannot be a "coupled" one, because the "coupled" |
| 118 | 123 | * cpuidle mechanism enables interrupts and doing that with timekeeping |
| @@ -122,7 +127,7 @@ static void enter_freeze_proper(struct cpuidle_driver *drv, · 3 unmodified lines | ||
| 122 | 127 | WARN_ON(!irqs_disabled()); |
| 123 | 128 | /* |
| 124 | 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 | 131 | * critical sections, so tell RCU about that. |
| 127 | 132 | */ |
| 128 | 133 | RCU_NONIDLE(tick_unfreeze()); |
| @@ -1746,4 +1746,4 @@ EXPORT_SYMBOL_GPL(dw_dma_enable); · 1745 unmodified lines | ||
| 1746 | 1746 | MODULE_LICENSE("GPL v2"); |
| 1747 | 1747 | MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller core driver"); |
| 1748 | 1748 | MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); |
| 1749 | −MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | |
| 1749 | +MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); | |
| @@ -87,6 +87,15 @@ static int brcmstb_gpio_remove(struct platform_device *pdev) · 86 unmodified lines | ||
| 87 | 87 | struct brcmstb_gpio_bank *bank; |
| 88 | 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 | 99 | list_for_each(pos, &priv->bank_list) { |
| 91 | 100 | bank = list_entry(pos, struct brcmstb_gpio_bank, node); |
| 92 | 101 | ret = bgpio_remove(&bank->bgc); |
| @@ -143,6 +152,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) · 50 unmodified lines | ||
| 143 | 152 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
| 144 | 153 | if (!priv) |
| 145 | 154 | return -ENOMEM; |
| 155 | + platform_set_drvdata(pdev, priv); | |
| 156 | + INIT_LIST_HEAD(&priv->bank_list); | |
| 146 | 157 | |
| 147 | 158 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 148 | 159 | reg_base = devm_ioremap_resource(dev, res); |
| @@ -153,7 +164,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) · 4 unmodified lines | ||
| 153 | 164 | priv->reg_base = reg_base; |
| 154 | 165 | priv->pdev = pdev; |
| 155 | 166 | |
| 156 | − INIT_LIST_HEAD(&priv->bank_list); | |
| 157 | 167 | if (brcmstb_gpio_sanity_check_banks(dev, np, res)) |
| 158 | 168 | return -EINVAL; |
| 159 | 169 | |
| @@ -221,8 +231,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) · 61 unmodified lines | ||
| 221 | 231 | dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n", |
| 222 | 232 | priv->num_banks, priv->gpio_base, gpio_base - 1); |
| 223 | 233 | |
| 224 | − platform_set_drvdata(pdev, priv); | |
| 225 | − | |
| 226 | 234 | return 0; |
| 227 | 235 | |
| 228 | 236 | fail: |
| @@ -578,15 +578,13 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) · 577 unmodified lines | ||
| 578 | 578 | writel_relaxed(~0, &g->clr_falling); |
| 579 | 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 | 582 | * Each chip handles 32 gpios, and each irq bank consists of 16 |
| 586 | 583 | * gpio irqs. Pass the irq bank's corresponding controller to |
| 587 | 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 | 589 | binten |= BIT(bank); |
| 592 | 590 | } |
| @@ -603,6 +603,7 @@ static int max732x_setup_gpio(struct max732x_chip *chip, · 602 unmodified lines | ||
| 603 | 603 | gc->base = gpio_start; |
| 604 | 604 | gc->ngpio = port; |
| 605 | 605 | gc->label = chip->client->name; |
| 606 | + gc->dev = &chip->client->dev; | |
| 606 | 607 | gc->owner = THIS_MODULE; |
| 607 | 608 | |
| 608 | 609 | return port; |
| @@ -500,8 +500,10 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) · 499 unmodified lines | ||
| 500 | 500 | |
| 501 | 501 | spin_lock_irqsave(&bank->lock, flags); |
| 502 | 502 | retval = omap_set_gpio_triggering(bank, offset, type); |
| 503 | − if (retval) | |
| 503 | + if (retval) { | |
| 504 | + spin_unlock_irqrestore(&bank->lock, flags); | |
| 504 | 505 | goto error; |
| 506 | + } | |
| 505 | 507 | omap_gpio_init_irq(bank, offset); |
| 506 | 508 | if (!omap_gpio_is_input(bank, offset)) { |
| 507 | 509 | spin_unlock_irqrestore(&bank->lock, flags); |
| @@ -1185,6 +1187,7 @@ static int omap_gpio_probe(struct platform_device *pdev) · 677 unmodified lines | ||
| 1185 | 1187 | bank->irq = res->start; |
| 1186 | 1188 | bank->dev = dev; |
| 1187 | 1189 | bank->chip.dev = dev; |
| 1190 | + bank->chip.owner = THIS_MODULE; | |
| 1188 | 1191 | bank->dbck_flag = pdata->dbck_flag; |
| 1189 | 1192 | bank->stride = pdata->bank_stride; |
| 1190 | 1193 | bank->width = pdata->bank_width; |
| @@ -570,6 +570,10 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, · 569 unmodified lines | ||
| 570 | 570 | "could not connect irqchip to gpiochip\n"); |
| 571 | 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 | 579 | return 0; |
| @@ -220,9 +220,9 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) · 219 unmodified lines | ||
| 220 | 220 | if (!chip->gpio_width[1]) |
| 221 | 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 | 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 | 226 | chip->gpio_dir[1]); |
| 227 | 227 | } |
| 228 | 228 | |
| @@ -757,6 +757,7 @@ static int zynq_gpio_remove(struct platform_device *pdev) · 756 unmodified lines | ||
| 757 | 757 | gpiochip_remove(&gpio->chip); |
| 758 | 758 | clk_disable_unprepare(gpio->clk); |
| 759 | 759 | device_set_wakeup_capable(&pdev->dev, 0); |
| 760 | + pm_runtime_disable(&pdev->dev); | |
| 760 | 761 | return 0; |
| 761 | 762 | } |
| 762 | 763 | |
| @@ -669,6 +669,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, · 668 unmodified lines | ||
| 669 | 669 | static int amdgpu_cs_dependencies(struct amdgpu_device *adev, |
| 670 | 670 | struct amdgpu_cs_parser *p) |
| 671 | 671 | { |
| 672 | + struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | |
| 672 | 673 | struct amdgpu_ib *ib; |
| 673 | 674 | int i, j, r; |
| 674 | 675 | |
| @@ -694,6 +695,7 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, · 19 unmodified lines | ||
| 694 | 695 | for (j = 0; j < num_deps; ++j) { |
| 695 | 696 | struct amdgpu_fence *fence; |
| 696 | 697 | struct amdgpu_ring *ring; |
| 698 | + struct amdgpu_ctx *ctx; | |
| 697 | 699 | |
| 698 | 700 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, |
| 699 | 701 | deps[j].ip_instance, |
| @@ -701,14 +703,21 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, · 1 unmodified line | ||
| 701 | 703 | if (r) |
| 702 | 704 | return r; |
| 703 | 705 | |
| 706 | + ctx = amdgpu_ctx_get(fpriv, deps[j].ctx_id); | |
| 707 | + if (ctx == NULL) | |
| 708 | + return -EINVAL; | |
| 709 | + | |
| 704 | 710 | r = amdgpu_fence_recreate(ring, p->filp, |
| 705 | 711 | deps[j].handle, |
| 706 | 712 | &fence); |
| 707 | − if (r) | |
| 713 | + if (r) { | |
| 714 | + amdgpu_ctx_put(ctx); | |
| 708 | 715 | return r; |
| 716 | + } | |
| 709 | 717 | |
| 710 | 718 | amdgpu_sync_fence(&ib->sync, fence); |
| 711 | 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, · 93 unmodified lines | ||
| 808 | 817 | |
| 809 | 818 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, |
| 810 | 819 | wait->in.ring, &ring); |
| 811 | − if (r) | |
| 820 | + if (r) { | |
| 821 | + amdgpu_ctx_put(ctx); | |
| 812 | 822 | return r; |
| 823 | + } | |
| 813 | 824 | |
| 814 | 825 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); |
| 815 | − if (r) | |
| 826 | + if (r) { | |
| 827 | + amdgpu_ctx_put(ctx); | |
| 816 | 828 | return r; |
| 829 | + } | |
| 817 | 830 | |
| 818 | 831 | r = fence_wait_timeout(&fence->base, true, timeout); |
| 819 | 832 | amdgpu_fence_unref(&fence); |
| @@ -1207,10 +1207,15 @@ static int amdgpu_early_init(struct amdgpu_device *adev) · 1206 unmodified lines | ||
| 1207 | 1207 | } else { |
| 1208 | 1208 | if (adev->ip_blocks[i].funcs->early_init) { |
| 1209 | 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 | 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 | |
| @@ -1679,25 +1679,31 @@ static int cz_dpm_unforce_dpm_levels(struct amdgpu_device *adev) · 1678 unmodified lines | ||
| 1679 | 1679 | if (ret) |
| 1680 | 1680 | return ret; |
| 1681 | 1681 | |
| 1682 | − DRM_INFO("DPM unforce state min=%d, max=%d.\n", | |
| 1683 | − pi->sclk_dpm.soft_min_clk, | |
| 1684 | − pi->sclk_dpm.soft_max_clk); | |
| 1682 | + DRM_DEBUG("DPM unforce state min=%d, max=%d.\n", | |
| 1683 | + pi->sclk_dpm.soft_min_clk, | |
| 1684 | + pi->sclk_dpm.soft_max_clk); | |
| 1685 | 1685 | |
| 1686 | 1686 | return 0; |
| 1687 | 1687 | } |
| 1688 | 1688 | |
| 1689 | 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 | 1692 | int ret = 0; |
| 1693 | 1693 | |
| 1694 | 1694 | switch (level) { |
| 1695 | 1695 | case AMDGPU_DPM_FORCED_LEVEL_HIGH: |
| 1696 | + ret = cz_dpm_unforce_dpm_levels(adev); | |
| 1697 | + if (ret) | |
| 1698 | + return ret; | |
| 1696 | 1699 | ret = cz_dpm_force_highest(adev); |
| 1697 | 1700 | if (ret) |
| 1698 | 1701 | return ret; |
| 1699 | 1702 | break; |
| 1700 | 1703 | case AMDGPU_DPM_FORCED_LEVEL_LOW: |
| 1704 | + ret = cz_dpm_unforce_dpm_levels(adev); | |
| 1705 | + if (ret) | |
| 1706 | + return ret; | |
| 1701 | 1707 | ret = cz_dpm_force_lowest(adev); |
| 1702 | 1708 | if (ret) |
| 1703 | 1709 | return ret; |
| @@ -1711,6 +1717,8 @@ static int cz_dpm_force_dpm_level(struct amdgpu_device *adev, · 7 unmodified lines | ||
| 1711 | 1717 | break; |
| 1712 | 1718 | } |
| 1713 | 1719 | |
| 1720 | + adev->pm.dpm.forced_level = level; | |
| 1721 | + | |
| 1714 | 1722 | return ret; |
| 1715 | 1723 | } |
| 1716 | 1724 | |
| @@ -2566,6 +2566,7 @@ static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) · 2565 unmodified lines | ||
| 2566 | 2566 | struct drm_device *dev = crtc->dev; |
| 2567 | 2567 | struct amdgpu_device *adev = dev->dev_private; |
| 2568 | 2568 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
| 2569 | + unsigned type; | |
| 2569 | 2570 | |
| 2570 | 2571 | switch (mode) { |
| 2571 | 2572 | case DRM_MODE_DPMS_ON: |
| @@ -2574,6 +2575,9 @@ static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) · 2 unmodified lines | ||
| 2574 | 2575 | dce_v8_0_vga_enable(crtc, true); |
| 2575 | 2576 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
| 2576 | 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 | 2581 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
| 2578 | 2582 | dce_v8_0_crtc_load_lut(crtc); |
| 2579 | 2583 | break; |
| @@ -1813,10 +1813,7 @@ static u32 gfx_v8_0_get_rb_disabled(struct amdgpu_device *adev, · 1812 unmodified lines | ||
| 1813 | 1813 | u32 data, mask; |
| 1814 | 1814 | |
| 1815 | 1815 | data = RREG32(mmCC_RB_BACKEND_DISABLE); |
| 1816 | − if (data & 1) | |
| 1817 | − data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; | |
| 1818 | − else | |
| 1819 | − data = 0; | |
| 1816 | + data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; | |
| 1820 | 1817 | |
| 1821 | 1818 | data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); |
| 1822 | 1819 | |
| @@ -122,6 +122,32 @@ static void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) · 121 unmodified lines | ||
| 122 | 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 | 151 | static u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg) |
| 126 | 152 | { |
| 127 | 153 | unsigned long flags; |
| @@ -1222,8 +1248,13 @@ static int vi_common_early_init(void *handle) · 1094 unmodified lines | ||
| 1222 | 1248 | bool smc_enabled = false; |
| 1223 | 1249 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| 1224 | 1250 | |
| 1225 | − adev->smc_rreg = &vi_smc_rreg; | |
| 1226 | − adev->smc_wreg = &vi_smc_wreg; | |
| 1251 | + if (adev->flags & AMDGPU_IS_APU) { | |
| 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 | 1258 | adev->pcie_rreg = &vi_pcie_rreg; |
| 1228 | 1259 | adev->pcie_wreg = &vi_pcie_wreg; |
| 1229 | 1260 | adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg; |
| @@ -531,8 +531,6 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc, · 530 unmodified lines | ||
| 531 | 531 | |
| 532 | 532 | drm_crtc_vblank_off(crtc); |
| 533 | 533 | |
| 534 | − crtc->mode = *adj; | |
| 535 | − | |
| 536 | 534 | val = dcrtc->dumb_ctrl & ~CFG_DUMB_ENA; |
| 537 | 535 | if (val != dcrtc->dumb_ctrl) { |
| 538 | 536 | dcrtc->dumb_ctrl = val; |
| @@ -69,8 +69,9 @@ void armada_gem_free_object(struct drm_gem_object *obj) · 68 unmodified lines | ||
| 69 | 69 | |
| 70 | 70 | if (dobj->obj.import_attach) { |
| 71 | 71 | /* We only ever display imported data */ |
| 72 | − dma_buf_unmap_attachment(dobj->obj.import_attach, dobj->sgt, | |
| 73 | − DMA_TO_DEVICE); | |
| 72 | + if (dobj->sgt) | |
| 73 | + dma_buf_unmap_attachment(dobj->obj.import_attach, | |
| 74 | + dobj->sgt, DMA_TO_DEVICE); | |
| 74 | 75 | drm_prime_gem_destroy(&dobj->obj, NULL); |
| 75 | 76 | } |
| 76 | 77 | |
| @@ -7,6 +7,7 @@ · 6 unmodified lines | ||
| 7 | 7 | * published by the Free Software Foundation. |
| 8 | 8 | */ |
| 9 | 9 | #include <drm/drmP.h> |
| 10 | +#include <drm/drm_plane_helper.h> | |
| 10 | 11 | #include "armada_crtc.h" |
| 11 | 12 | #include "armada_drm.h" |
| 12 | 13 | #include "armada_fb.h" |
| @@ -85,16 +86,8 @@ static void armada_plane_vbl(struct armada_crtc *dcrtc, void *data) · 72 unmodified lines | ||
| 85 | 86 | |
| 86 | 87 | if (fb) |
| 87 | 88 | armada_drm_queue_unref_work(dcrtc->crtc.dev, fb); |
| 88 | −} | |
| 89 | 89 | |
| 90 | −static unsigned armada_limit(int start, unsigned size, unsigned max) | |
| 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; | |
| 90 | + wake_up(&dplane->vbl.wait); | |
| 98 | 91 | } |
| 99 | 92 | |
| 100 | 93 | static int |
| @@ -105,26 +98,39 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, · 4 unmodified lines | ||
| 105 | 98 | { |
| 106 | 99 | struct armada_plane *dplane = drm_to_armada_plane(plane); |
| 107 | 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 | 117 | uint32_t val, ctrl0; |
| 109 | 118 | unsigned idx = 0; |
| 119 | + bool visible; | |
| 110 | 120 | int ret; |
| 111 | 121 | |
| 112 | − crtc_w = armada_limit(crtc_x, crtc_w, dcrtc->crtc.mode.hdisplay); | |
| 113 | − crtc_h = armada_limit(crtc_y, crtc_h, dcrtc->crtc.mode.vdisplay); | |
| 122 | + ret = drm_plane_helper_check_update(plane, crtc, fb, &src, &dest, &clip, | |
| 123 | + 0, INT_MAX, true, false, &visible); | |
| 124 | + if (ret) | |
| 125 | + return ret; | |
| 126 | + | |
| 114 | 127 | ctrl0 = CFG_DMA_FMT(drm_fb_to_armada_fb(fb)->fmt) | |
| 115 | 128 | CFG_DMA_MOD(drm_fb_to_armada_fb(fb)->mod) | |
| 116 | 129 | CFG_CBSH_ENA | CFG_DMA_HSMOOTH | CFG_DMA_ENA; |
| 117 | 130 | |
| 118 | 131 | /* Does the position/size result in nothing to display? */ |
| 119 | − if (crtc_w == 0 || crtc_h == 0) { | |
| 132 | + if (!visible) | |
| 120 | 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 | 135 | if (!dcrtc->plane) { |
| 130 | 136 | dcrtc->plane = plane; |
| @@ -134,15 +140,19 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, · 3 unmodified lines | ||
| 134 | 140 | /* FIXME: overlay on an interlaced display */ |
| 135 | 141 | /* Just updating the position/size? */ |
| 136 | 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 | 145 | dplane->src_hw = val; |
| 139 | 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 | 149 | dplane->dst_hw = val; |
| 142 | 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 | 153 | dplane->dst_yx = val; |
| 145 | 154 | writel_relaxed(val, dcrtc->base + LCD_SPU_DMA_OVSA_HPXL_VLN); |
| 155 | + | |
| 146 | 156 | return 0; |
| 147 | 157 | } else if (~dplane->ctrl0 & ctrl0 & CFG_DMA_ENA) { |
| 148 | 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, · 1 unmodified line | ||
| 150 | 160 | dcrtc->base + LCD_SPU_SRAM_PARA1); |
| 151 | 161 | } |
| 152 | 162 | |
| 153 | − ret = wait_event_timeout(dplane->vbl.wait, | |
| 154 | − list_empty(&dplane->vbl.update.node), | |
| 155 | − HZ/25); | |
| 156 | − if (ret < 0) | |
| 157 | − return ret; | |
| 163 | + wait_event_timeout(dplane->vbl.wait, | |
| 164 | + list_empty(&dplane->vbl.update.node), | |
| 165 | + HZ/25); | |
| 158 | 166 | |
| 159 | 167 | if (plane->fb != fb) { |
| 160 | 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 | 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, · 13 unmodified lines | ||
| 178 | 187 | older_fb); |
| 179 | 188 | } |
| 180 | 189 | |
| 181 | − src_y >>= 16; | |
| 182 | − src_x >>= 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; | |
| 190 | + src_y = src.y1 >> 16; | |
| 191 | + src_x = src.x1 >> 16; | |
| 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 | 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 | 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 | 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 | 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 | 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 | 223 | LCD_SPU_DMA_START_ADDR_V1); |
| 202 | 224 | |
| 203 | 225 | val = fb->pitches[0] << 16 | fb->pitches[0]; |
| @@ -208,24 +230,27 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, · 4 unmodified lines | ||
| 208 | 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 | 234 | if (dplane->src_hw != val) { |
| 213 | 235 | dplane->src_hw = val; |
| 214 | 236 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 215 | 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 | 241 | if (dplane->dst_hw != val) { |
| 219 | 242 | dplane->dst_hw = val; |
| 220 | 243 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 221 | 244 | LCD_SPU_DZM_HPXL_VLN); |
| 222 | 245 | } |
| 223 | − val = crtc_y << 16 | crtc_x; | |
| 246 | + | |
| 247 | + val = dest.y1 << 16 | dest.x1; | |
| 224 | 248 | if (dplane->dst_yx != val) { |
| 225 | 249 | dplane->dst_yx = val; |
| 226 | 250 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 227 | 251 | LCD_SPU_DMA_OVSA_HPXL_VLN); |
| 228 | 252 | } |
| 253 | + | |
| 229 | 254 | if (dplane->ctrl0 != ctrl0) { |
| 230 | 255 | dplane->ctrl0 = ctrl0; |
| 231 | 256 | armada_reg_queue_mod(dplane->vbl.regs, idx, ctrl0, |
| @@ -279,7 +304,11 @@ static int armada_plane_disable(struct drm_plane *plane) · 47 unmodified lines | ||
| 279 | 304 | |
| 280 | 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 | 314 | static int armada_plane_set_property(struct drm_plane *plane, |
| @@ -2706,8 +2706,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, · 2705 unmodified lines | ||
| 2706 | 2706 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 2707 | 2707 | return -EINVAL; |
| 2708 | 2708 | |
| 2709 | − /* For some reason crtc x/y offsets are signed internally. */ | |
| 2710 | − if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX) | |
| 2709 | + /* | |
| 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 | 2714 | return -ERANGE; |
| 2712 | 2715 | |
| 2713 | 2716 | drm_modeset_lock_all(dev); |
| @@ -70,6 +70,8 @@ · 69 unmodified lines | ||
| 70 | 70 | |
| 71 | 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 | 75 | typedef struct drm_version_32 { |
| 74 | 76 | int version_major; /**< Major version */ |
| 75 | 77 | int version_minor; /**< Minor version */ |
| @@ -1016,6 +1018,63 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, · 940 unmodified lines | ||
| 1016 | 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 | 1078 | static drm_ioctl_compat_t *drm_compat_ioctls[] = { |
| 1020 | 1079 | [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, |
| 1021 | 1080 | [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, |
| @@ -1048,6 +1107,7 @@ static drm_ioctl_compat_t *drm_compat_ioctls[] = { · 26 unmodified lines | ||
| 1048 | 1107 | [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, |
| 1049 | 1108 | #endif |
| 1050 | 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 | /** |
| @@ -826,6 +826,7 @@ struct intel_context { · 825 unmodified lines | ||
| 826 | 826 | struct kref ref; |
| 827 | 827 | int user_handle; |
| 828 | 828 | uint8_t remap_slice; |
| 829 | + struct drm_i915_private *i915; | |
| 829 | 830 | struct drm_i915_file_private *file_priv; |
| 830 | 831 | struct i915_ctx_hang_stats hang_stats; |
| 831 | 832 | struct i915_hw_ppgtt *ppgtt; |
| @@ -2036,8 +2037,6 @@ struct drm_i915_gem_object { · 1204 unmodified lines | ||
| 2036 | 2037 | unsigned int cache_level:3; |
| 2037 | 2038 | unsigned int cache_dirty:1; |
| 2038 | 2039 | |
| 2039 | − unsigned int has_dma_mapping:1; | |
| 2040 | − | |
| 2041 | 2040 | unsigned int frontbuffer_bits:INTEL_FRONTBUFFER_BITS; |
| 2042 | 2041 | |
| 2043 | 2042 | unsigned int pin_display; |
| @@ -3116,7 +3115,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor); · 1072 unmodified lines | ||
| 3116 | 3115 | int i915_debugfs_connector_add(struct drm_connector *connector); |
| 3117 | 3116 | void intel_display_crc_init(struct drm_device *dev); |
| 3118 | 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 | 3120 | static inline void intel_display_crc_init(struct drm_device *dev) {} |
| 3121 | 3121 | #endif |
| 3122 | 3122 | |
| @@ -213,7 +213,6 @@ i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) · 212 unmodified lines | ||
| 213 | 213 | sg_dma_len(sg) = obj->base.size; |
| 214 | 214 | |
| 215 | 215 | obj->pages = st; |
| 216 | − obj->has_dma_mapping = true; | |
| 217 | 216 | return 0; |
| 218 | 217 | } |
| 219 | 218 | |
| @@ -265,8 +264,6 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj) · 45 unmodified lines | ||
| 265 | 264 | |
| 266 | 265 | sg_free_table(obj->pages); |
| 267 | 266 | kfree(obj->pages); |
| 268 | − | |
| 269 | − obj->has_dma_mapping = false; | |
| 270 | 267 | } |
| 271 | 268 | |
| 272 | 269 | static void |
| @@ -2139,6 +2136,8 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) · 1866 unmodified lines | ||
| 2139 | 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 | 2141 | if (i915_gem_object_needs_bit17_swizzle(obj)) |
| 2143 | 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) · 54 unmodified lines | ||
| 2199 | 2198 | struct sg_page_iter sg_iter; |
| 2200 | 2199 | struct page *page; |
| 2201 | 2200 | unsigned long last_pfn = 0; /* suppress gcc warning */ |
| 2201 | + int ret; | |
| 2202 | 2202 | gfp_t gfp; |
| 2203 | 2203 | |
| 2204 | 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) · 41 unmodified lines | ||
| 2246 | 2246 | */ |
| 2247 | 2247 | i915_gem_shrink_all(dev_priv); |
| 2248 | 2248 | page = shmem_read_mapping_page(mapping, i); |
| 2249 | − if (IS_ERR(page)) | |
| 2249 | + if (IS_ERR(page)) { | |
| 2250 | + ret = PTR_ERR(page); | |
| 2250 | 2251 | goto err_pages; |
| 2252 | + } | |
| 2251 | 2253 | } |
| 2252 | 2254 | #ifdef CONFIG_SWIOTLB |
| 2253 | 2255 | if (swiotlb_nr_tbl()) { |
| @@ -2276,6 +2278,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) · 22 unmodified lines | ||
| 2276 | 2278 | sg_mark_end(sg); |
| 2277 | 2279 | obj->pages = st; |
| 2278 | 2280 | |
| 2281 | + ret = i915_gem_gtt_prepare_object(obj); | |
| 2282 | + if (ret) | |
| 2283 | + goto err_pages; | |
| 2284 | + | |
| 2279 | 2285 | if (i915_gem_object_needs_bit17_swizzle(obj)) |
| 2280 | 2286 | i915_gem_object_do_bit_17_swizzle(obj); |
| 2281 | 2287 | |
| @@ -2300,10 +2306,10 @@ err_pages: · 18 unmodified lines | ||
| 2300 | 2306 | * space and so want to translate the error from shmemfs back to our |
| 2301 | 2307 | * usual understanding of ENOMEM. |
| 2302 | 2308 | */ |
| 2303 | − if (PTR_ERR(page) == -ENOSPC) | |
| 2304 | − return -ENOMEM; | |
| 2305 | − else | |
| 2306 | − return PTR_ERR(page); | |
| 2309 | + if (ret == -ENOSPC) | |
| 2310 | + ret = -ENOMEM; | |
| 2311 | + | |
| 2312 | + return ret; | |
| 2307 | 2313 | } |
| 2308 | 2314 | |
| 2309 | 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, · 232 unmodified lines | ||
| 2542 | 2548 | } |
| 2543 | 2549 | |
| 2544 | 2550 | request->emitted_jiffies = jiffies; |
| 2551 | + ring->last_submitted_seqno = request->seqno; | |
| 2545 | 2552 | list_add_tail(&request->list, &ring->request_list); |
| 2546 | 2553 | request->file_priv = NULL; |
| 2547 | 2554 | |
| @@ -3247,10 +3254,8 @@ int i915_vma_unbind(struct i915_vma *vma) · 699 unmodified lines | ||
| 3247 | 3254 | |
| 3248 | 3255 | /* Since the unbound list is global, only move to that list if |
| 3249 | 3256 | * no more VMAs exist. */ |
| 3250 | − if (list_empty(&obj->vma_list)) { | |
| 3251 | − i915_gem_gtt_finish_object(obj); | |
| 3257 | + if (list_empty(&obj->vma_list)) | |
| 3252 | 3258 | list_move_tail(&obj->global_list, &dev_priv->mm.unbound_list); |
| 3253 | − } | |
| 3254 | 3259 | |
| 3255 | 3260 | /* And finally now the object is completely decoupled from this vma, |
| 3256 | 3261 | * we can drop its hold on the backing storage and allow it to be |
| @@ -3768,22 +3773,16 @@ search_free: · 511 unmodified lines | ||
| 3768 | 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 | 3776 | trace_i915_vma_bind(vma, flags); |
| 3776 | 3777 | ret = i915_vma_bind(vma, obj->cache_level, flags); |
| 3777 | 3778 | if (ret) |
| 3778 | − goto err_finish_gtt; | |
| 3779 | + goto err_remove_node; | |
| 3779 | 3780 | |
| 3780 | 3781 | list_move_tail(&obj->global_list, &dev_priv->mm.bound_list); |
| 3781 | 3782 | list_add_tail(&vma->mm_list, &vm->inactive_list); |
| 3782 | 3783 | |
| 3783 | 3784 | return vma; |
| 3784 | 3785 | |
| 3785 | −err_finish_gtt: | |
| 3786 | − i915_gem_gtt_finish_object(obj); | |
| 3787 | 3786 | err_remove_node: |
| 3788 | 3787 | drm_mm_remove_node(&vma->node); |
| 3789 | 3788 | err_free_vma: |
| @@ -135,8 +135,7 @@ static int get_context_size(struct drm_device *dev) · 134 unmodified lines | ||
| 135 | 135 | |
| 136 | 136 | void i915_gem_context_free(struct kref *ctx_ref) |
| 137 | 137 | { |
| 138 | − struct intel_context *ctx = container_of(ctx_ref, | |
| 139 | − typeof(*ctx), ref); | |
| 138 | + struct intel_context *ctx = container_of(ctx_ref, typeof(*ctx), ref); | |
| 140 | 139 | |
| 141 | 140 | trace_i915_context_free(ctx); |
| 142 | 141 | |
| @@ -195,6 +194,7 @@ __create_hw_context(struct drm_device *dev, · 52 unmodified lines | ||
| 195 | 194 | |
| 196 | 195 | kref_init(&ctx->ref); |
| 197 | 196 | list_add_tail(&ctx->link, &dev_priv->context_list); |
| 197 | + ctx->i915 = dev_priv; | |
| 198 | 198 | |
| 199 | 199 | if (dev_priv->hw_context_size) { |
| 200 | 200 | struct drm_i915_gem_object *obj = |
| @@ -256,7 +256,6 @@ static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) · 255 unmodified lines | ||
| 256 | 256 | return PTR_ERR(sg); |
| 257 | 257 | |
| 258 | 258 | obj->pages = sg; |
| 259 | − obj->has_dma_mapping = true; | |
| 260 | 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) · 1 unmodified line | ||
| 264 | 263 | { |
| 265 | 264 | dma_buf_unmap_attachment(obj->base.import_attach, |
| 266 | 265 | obj->pages, DMA_BIDIRECTIONAL); |
| 267 | − obj->has_dma_mapping = false; | |
| 268 | 266 | } |
| 269 | 267 | |
| 270 | 268 | static const struct drm_i915_gem_object_ops i915_gem_object_dmabuf_ops = { |
| @@ -1723,9 +1723,6 @@ void i915_gem_suspend_gtt_mappings(struct drm_device *dev) · 1722 unmodified lines | ||
| 1723 | 1723 | |
| 1724 | 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 | 1726 | if (!dma_map_sg(&obj->base.dev->pdev->dev, |
| 1730 | 1727 | obj->pages->sgl, obj->pages->nents, |
| 1731 | 1728 | PCI_DMA_BIDIRECTIONAL)) |
| @@ -1972,10 +1969,8 @@ void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj) · 240 unmodified lines | ||
| 1972 | 1969 | |
| 1973 | 1970 | interruptible = do_idling(dev_priv); |
| 1974 | 1971 | |
| 1975 | − if (!obj->has_dma_mapping) | |
| 1976 | − dma_unmap_sg(&dev->pdev->dev, | |
| 1977 | − obj->pages->sgl, obj->pages->nents, | |
| 1978 | − PCI_DMA_BIDIRECTIONAL); | |
| 1972 | + dma_unmap_sg(&dev->pdev->dev, obj->pages->sgl, obj->pages->nents, | |
| 1973 | + PCI_DMA_BIDIRECTIONAL); | |
| 1979 | 1974 | |
| 1980 | 1975 | undo_idling(dev_priv, interruptible); |
| 1981 | 1976 | } |
| @@ -416,7 +416,6 @@ _i915_gem_object_create_stolen(struct drm_device *dev, · 415 unmodified lines | ||
| 416 | 416 | if (obj->pages == NULL) |
| 417 | 417 | goto cleanup; |
| 418 | 418 | |
| 419 | − obj->has_dma_mapping = true; | |
| 420 | 419 | i915_gem_object_pin_pages(obj); |
| 421 | 420 | obj->stolen = stolen; |
| 422 | 421 | |
| @@ -183,18 +183,8 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) · 182 unmodified lines | ||
| 183 | 183 | if (IS_GEN4(dev)) { |
| 184 | 184 | uint32_t ddc2 = I915_READ(DCC2); |
| 185 | 185 | |
| 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 | − */ | |
| 186 | + if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) | |
| 194 | 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 | 190 | if (dcc == 0xffffffff) { |
| @@ -545,6 +545,26 @@ err: · 544 unmodified lines | ||
| 545 | 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 | 568 | static void |
| 549 | 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) · 33 unmodified lines | ||
| 584 | 604 | if (obj->userptr.work != &work->work) { |
| 585 | 605 | ret = 0; |
| 586 | 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 | 608 | if (ret == 0) { |
| 589 | 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 | 613 | pinned = 0; |
| 591 | 614 | } |
| 592 | 615 | } |
| @@ -693,7 +716,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) · 100 unmodified lines | ||
| 693 | 716 | } |
| 694 | 717 | } |
| 695 | 718 | } else { |
| 696 | − ret = st_set_pages(&obj->pages, pvec, num_pages); | |
| 719 | + ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages); | |
| 697 | 720 | if (ret == 0) { |
| 698 | 721 | obj->userptr.work = NULL; |
| 699 | 722 | pinned = 0; |
| @@ -715,6 +738,8 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj) · 15 unmodified lines | ||
| 715 | 738 | if (obj->madv != I915_MADV_WILLNEED) |
| 716 | 739 | obj->dirty = 0; |
| 717 | 740 | |
| 741 | + i915_gem_gtt_finish_object(obj); | |
| 742 | + | |
| 718 | 743 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
| 719 | 744 | struct page *page = sg_page_iter_page(&sg_iter); |
| 720 | 745 | |
| @@ -204,7 +204,7 @@ long i915_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) · 203 unmodified lines | ||
| 204 | 204 | drm_ioctl_compat_t *fn = NULL; |
| 205 | 205 | int ret; |
| 206 | 206 | |
| 207 | − if (nr < DRM_COMMAND_BASE) | |
| 207 | + if (nr < DRM_COMMAND_BASE || nr >= DRM_COMMAND_END) | |
| 208 | 208 | return drm_compat_ioctl(filp, cmd, arg); |
| 209 | 209 | |
| 210 | 210 | if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls)) |
| @@ -2706,18 +2706,11 @@ static void gen8_disable_vblank(struct drm_device *dev, int pipe) · 2705 unmodified lines | ||
| 2706 | 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 | 2709 | static bool |
| 2717 | −ring_idle(struct intel_engine_cs *ring) | |
| 2710 | +ring_idle(struct intel_engine_cs *ring, u32 seqno) | |
| 2718 | 2711 | { |
| 2719 | 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 | 2716 | static bool |
| @@ -2939,7 +2932,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work) · 215 unmodified lines | ||
| 2939 | 2932 | acthd = intel_ring_get_active_head(ring); |
| 2940 | 2933 | |
| 2941 | 2934 | if (ring->hangcheck.seqno == seqno) { |
| 2942 | − if (ring_idle(ring)) { | |
| 2935 | + if (ring_idle(ring, seqno)) { | |
| 2943 | 2936 | ring->hangcheck.action = HANGCHECK_IDLE; |
| 2944 | 2937 | |
| 2945 | 2938 | if (waitqueue_active(&ring->irq_queue)) { |
| @@ -727,7 +727,7 @@ DECLARE_EVENT_CLASS(i915_context, · 726 unmodified lines | ||
| 727 | 727 | TP_fast_assign( |
| 728 | 728 | __entry->ctx = ctx; |
| 729 | 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 | 733 | TP_printk("dev=%u, ctx=%p, ctx_vm=%p", |
| @@ -6315,9 +6315,6 @@ static void intel_crtc_disable(struct drm_crtc *crtc) · 6314 unmodified lines | ||
| 6315 | 6315 | struct drm_connector *connector; |
| 6316 | 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 | 6318 | intel_crtc_disable_planes(crtc); |
| 6322 | 6319 | dev_priv->display.crtc_disable(crtc); |
| 6323 | 6320 | dev_priv->display.off(crtc); |
| @@ -12591,7 +12588,8 @@ static int __intel_set_mode(struct drm_crtc *modeset_crtc, · 6267 unmodified lines | ||
| 12591 | 12588 | continue; |
| 12592 | 12589 | |
| 12593 | 12590 | if (!crtc_state->enable) { |
| 12594 | − intel_crtc_disable(crtc); | |
| 12591 | + if (crtc->state->enable) | |
| 12592 | + intel_crtc_disable(crtc); | |
| 12595 | 12593 | } else if (crtc->state->enable) { |
| 12596 | 12594 | intel_crtc_disable_planes(crtc); |
| 12597 | 12595 | dev_priv->display.crtc_disable(crtc); |
| @@ -13276,7 +13274,7 @@ intel_check_primary_plane(struct drm_plane *plane, · 678 unmodified lines | ||
| 13276 | 13274 | if (ret) |
| 13277 | 13275 | return ret; |
| 13278 | 13276 | |
| 13279 | − if (intel_crtc->active) { | |
| 13277 | + if (crtc_state ? crtc_state->base.active : intel_crtc->active) { | |
| 13280 | 13278 | struct intel_plane_state *old_state = |
| 13281 | 13279 | to_intel_plane_state(plane->state); |
| 13282 | 13280 | |
| @@ -275,6 +275,13 @@ struct intel_engine_cs { · 274 unmodified lines | ||
| 275 | 275 | * Do we have some not yet emitted requests outstanding? |
| 276 | 276 | */ |
| 277 | 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 | 285 | bool gpu_caches_dirty; |
| 279 | 286 | |
| 280 | 287 | wait_queue_head_t irq_queue; |
| @@ -301,7 +301,7 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder) · 300 unmodified lines | ||
| 301 | 301 | |
| 302 | 302 | switch (tve->mode) { |
| 303 | 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 | 305 | tve->hsync_pin, tve->vsync_pin); |
| 306 | 306 | break; |
| 307 | 307 | case TVE_MODE_TVOUT: |
| @@ -21,6 +21,7 @@ · 20 unmodified lines | ||
| 21 | 21 | #include <drm/drm_panel.h> |
| 22 | 22 | #include <linux/videodev2.h> |
| 23 | 23 | #include <video/of_display_timing.h> |
| 24 | +#include <linux/of_graph.h> | |
| 24 | 25 | |
| 25 | 26 | #include "imx-drm.h" |
| 26 | 27 | |
| @@ -208,7 +209,7 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data) · 181 unmodified lines | ||
| 208 | 209 | { |
| 209 | 210 | struct drm_device *drm = data; |
| 210 | 211 | struct device_node *np = dev->of_node; |
| 211 | − struct device_node *panel_node; | |
| 212 | + struct device_node *port; | |
| 212 | 213 | const u8 *edidp; |
| 213 | 214 | struct imx_parallel_display *imxpd; |
| 214 | 215 | int ret; |
| @@ -234,11 +235,19 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data) · 19 unmodified lines | ||
| 234 | 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 | − if (panel_node) { | |
| 239 | − imxpd->panel = of_drm_find_panel(panel_node); | |
| 240 | − if (!imxpd->panel) | |
| 241 | − return -EPROBE_DEFER; | |
| 238 | + /* port@1 is the output port */ | |
| 239 | + port = of_graph_get_port_by_id(np, 1); | |
| 240 | + if (port) { | |
| 241 | + struct device_node *endpoint, *remote; | |
| 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 | 253 | imxpd->dev = dev; |
| @@ -5818,7 +5818,7 @@ int ci_dpm_init(struct radeon_device *rdev) · 5817 unmodified lines | ||
| 5818 | 5818 | tmp |= DPM_ENABLED; |
| 5819 | 5819 | break; |
| 5820 | 5820 | default: |
| 5821 | − DRM_ERROR("Invalid PCC GPIO: %u!\n", gpio.shift); | |
| 5821 | + DRM_DEBUG("Invalid PCC GPIO: %u!\n", gpio.shift); | |
| 5822 | 5822 | break; |
| 5823 | 5823 | } |
| 5824 | 5824 | WREG32_SMC(CNB_PWRMGT_CNTL, tmp); |
| @@ -260,8 +260,10 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, · 259 unmodified lines | ||
| 260 | 260 | } |
| 261 | 261 | } |
| 262 | 262 | } |
| 263 | − mb(); | |
| 264 | − radeon_gart_tlb_flush(rdev); | |
| 263 | + if (rdev->gart.ptr) { | |
| 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, · 38 unmodified lines | ||
| 306 | 308 | page_base += RADEON_GPU_PAGE_SIZE; |
| 307 | 309 | } |
| 308 | 310 | } |
| 309 | − mb(); | |
| 310 | − radeon_gart_tlb_flush(rdev); | |
| 311 | + if (rdev->gart.ptr) { | |
| 312 | + mb(); | |
| 313 | + radeon_gart_tlb_flush(rdev); | |
| 314 | + } | |
| 311 | 315 | return 0; |
| 312 | 316 | } |
| 313 | 317 | |
| @@ -36,6 +36,7 @@ void radeon_gem_object_free(struct drm_gem_object *gobj) · 35 unmodified lines | ||
| 36 | 36 | if (robj) { |
| 37 | 37 | if (robj->gem_base.import_attach) |
| 38 | 38 | drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg); |
| 39 | + radeon_mn_unregister(robj); | |
| 39 | 40 | radeon_bo_unref(&robj); |
| 40 | 41 | } |
| 41 | 42 | } |
| @@ -75,7 +75,6 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo) · 74 unmodified lines | ||
| 75 | 75 | bo = container_of(tbo, struct radeon_bo, tbo); |
| 76 | 76 | |
| 77 | 77 | radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1); |
| 78 | − radeon_mn_unregister(bo); | |
| 79 | 78 | |
| 80 | 79 | mutex_lock(&bo->rdev->gem.mutex); |
| 81 | 80 | list_del_init(&bo->list); |
| @@ -2926,6 +2926,7 @@ static struct si_dpm_quirk si_dpm_quirk_list[] = { · 2925 unmodified lines | ||
| 2926 | 2926 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ |
| 2927 | 2927 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, |
| 2928 | 2928 | { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, |
| 2929 | + { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 }, | |
| 2929 | 2930 | { 0, 0, 0, 0 }, |
| 2930 | 2931 | }; |
| 2931 | 2932 | |
| @@ -555,7 +555,6 @@ static struct platform_driver rockchip_drm_platform_driver = { · 554 unmodified lines | ||
| 555 | 555 | .probe = rockchip_drm_platform_probe, |
| 556 | 556 | .remove = rockchip_drm_platform_remove, |
| 557 | 557 | .driver = { |
| 558 | − .owner = THIS_MODULE, | |
| 559 | 558 | .name = "rockchip-drm", |
| 560 | 559 | .of_match_table = rockchip_drm_dt_ids, |
| 561 | 560 | .pm = &rockchip_drm_pm_ops, |
| @@ -162,7 +162,8 @@ static void rockchip_drm_output_poll_changed(struct drm_device *dev) · 161 unmodified lines | ||
| 162 | 162 | struct rockchip_drm_private *private = dev->dev_private; |
| 163 | 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 | 169 | static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { |
| @@ -54,55 +54,56 @@ static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) · 53 unmodified lines | ||
| 54 | 54 | &rk_obj->dma_attrs); |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | −int rockchip_gem_mmap_buf(struct drm_gem_object *obj, | |
| 58 | − struct vm_area_struct *vma) | |
| 57 | +static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, | |
| 58 | + struct vm_area_struct *vma) | |
| 59 | + | |
| 59 | 60 | { |
| 61 | + int ret; | |
| 60 | 62 | struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); |
| 61 | 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 | − vm_size = vma->vm_end - vma->vm_start; | |
| 66 | − | |
| 67 | − if (vm_size > obj->size) | |
| 68 | − return -EINVAL; | |
| 65 | + /* | |
| 66 | + * dma_alloc_attrs() allocated a struct page table for rk_obj, so clear | |
| 67 | + * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). | |
| 68 | + */ | |
| 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 | 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 */ | |
| 75 | −int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |
| 79 | +int rockchip_gem_mmap_buf(struct drm_gem_object *obj, | |
| 80 | + struct vm_area_struct *vma) | |
| 76 | 81 | { |
| 77 | − struct drm_file *priv = filp->private_data; | |
| 78 | − struct drm_device *dev = priv->minor->dev; | |
| 79 | − struct drm_gem_object *obj; | |
| 80 | − struct drm_vma_offset_node *node; | |
| 82 | + struct drm_device *drm = obj->dev; | |
| 81 | 83 | int ret; |
| 82 | 84 | |
| 83 | − if (drm_device_is_unplugged(dev)) | |
| 84 | − return -ENODEV; | |
| 85 | + mutex_lock(&drm->struct_mutex); | |
| 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, | |
| 89 | − vma->vm_pgoff, | |
| 90 | − vma_pages(vma)); | |
| 91 | − if (!node) { | |
| 92 | − mutex_unlock(&dev->struct_mutex); | |
| 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 | − } | |
| 94 | +/* drm driver mmap file operations */ | |
| 95 | +int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |
| 96 | +{ | |
| 97 | + struct drm_gem_object *obj; | |
| 98 | + int ret; | |
| 99 | 99 | |
| 100 | − obj = container_of(node, struct drm_gem_object, vma_node); | |
| 101 | − ret = rockchip_gem_mmap_buf(obj, vma); | |
| 100 | + ret = drm_gem_mmap(filp, 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 | 109 | struct rockchip_gem_object * |
| @@ -170,6 +170,7 @@ struct vop_win_phy { · 169 unmodified lines | ||
| 170 | 170 | |
| 171 | 171 | struct vop_reg enable; |
| 172 | 172 | struct vop_reg format; |
| 173 | + struct vop_reg rb_swap; | |
| 173 | 174 | struct vop_reg act_info; |
| 174 | 175 | struct vop_reg dsp_info; |
| 175 | 176 | struct vop_reg dsp_st; |
| @@ -199,8 +200,12 @@ struct vop_data { · 23 unmodified lines | ||
| 199 | 200 | static const uint32_t formats_01[] = { |
| 200 | 201 | DRM_FORMAT_XRGB8888, |
| 201 | 202 | DRM_FORMAT_ARGB8888, |
| 203 | + DRM_FORMAT_XBGR8888, | |
| 204 | + DRM_FORMAT_ABGR8888, | |
| 202 | 205 | DRM_FORMAT_RGB888, |
| 206 | + DRM_FORMAT_BGR888, | |
| 203 | 207 | DRM_FORMAT_RGB565, |
| 208 | + DRM_FORMAT_BGR565, | |
| 204 | 209 | DRM_FORMAT_NV12, |
| 205 | 210 | DRM_FORMAT_NV16, |
| 206 | 211 | DRM_FORMAT_NV24, |
| @@ -209,8 +214,12 @@ static const uint32_t formats_01[] = { · 2 unmodified lines | ||
| 209 | 214 | static const uint32_t formats_234[] = { |
| 210 | 215 | DRM_FORMAT_XRGB8888, |
| 211 | 216 | DRM_FORMAT_ARGB8888, |
| 217 | + DRM_FORMAT_XBGR8888, | |
| 218 | + DRM_FORMAT_ABGR8888, | |
| 212 | 219 | DRM_FORMAT_RGB888, |
| 220 | + DRM_FORMAT_BGR888, | |
| 213 | 221 | DRM_FORMAT_RGB565, |
| 222 | + DRM_FORMAT_BGR565, | |
| 214 | 223 | }; |
| 215 | 224 | |
| 216 | 225 | static const struct vop_win_phy win01_data = { |
| @@ -218,6 +227,7 @@ static const struct vop_win_phy win01_data = { · 1 unmodified line | ||
| 218 | 227 | .nformats = ARRAY_SIZE(formats_01), |
| 219 | 228 | .enable = VOP_REG(WIN0_CTRL0, 0x1, 0), |
| 220 | 229 | .format = VOP_REG(WIN0_CTRL0, 0x7, 1), |
| 230 | + .rb_swap = VOP_REG(WIN0_CTRL0, 0x1, 12), | |
| 221 | 231 | .act_info = VOP_REG(WIN0_ACT_INFO, 0x1fff1fff, 0), |
| 222 | 232 | .dsp_info = VOP_REG(WIN0_DSP_INFO, 0x0fff0fff, 0), |
| 223 | 233 | .dsp_st = VOP_REG(WIN0_DSP_ST, 0x1fff1fff, 0), |
| @@ -234,6 +244,7 @@ static const struct vop_win_phy win23_data = { · 10 unmodified lines | ||
| 234 | 244 | .nformats = ARRAY_SIZE(formats_234), |
| 235 | 245 | .enable = VOP_REG(WIN2_CTRL0, 0x1, 0), |
| 236 | 246 | .format = VOP_REG(WIN2_CTRL0, 0x7, 1), |
| 247 | + .rb_swap = VOP_REG(WIN2_CTRL0, 0x1, 12), | |
| 237 | 248 | .dsp_info = VOP_REG(WIN2_DSP_INFO0, 0x0fff0fff, 0), |
| 238 | 249 | .dsp_st = VOP_REG(WIN2_DSP_ST0, 0x1fff1fff, 0), |
| 239 | 250 | .yrgb_mst = VOP_REG(WIN2_MST0, 0xffffffff, 0), |
| @@ -242,15 +253,6 @@ static const struct vop_win_phy win23_data = { · 2 unmodified lines | ||
| 242 | 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 | 256 | static const struct vop_ctrl ctrl_data = { |
| 255 | 257 | .standby = VOP_REG(SYS_CTRL, 0x1, 22), |
| 256 | 258 | .gate_en = VOP_REG(SYS_CTRL, 0x1, 23), |
| @@ -282,14 +284,14 @@ static const struct vop_reg_data vop_init_reg_table[] = { · 25 unmodified lines | ||
| 282 | 284 | /* |
| 283 | 285 | * Note: rk3288 has a dedicated 'cursor' window, however, that window requires |
| 284 | 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 | 290 | static const struct vop_win_data rk3288_vop_win_data[] = { |
| 288 | 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 | 293 | { .base = 0x00, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, |
| 291 | − { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, | |
| 292 | − { .base = 0x00, .phy = &cursor_data, .type = DRM_PLANE_TYPE_OVERLAY }, | |
| 294 | + { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_CURSOR }, | |
| 293 | 295 | }; |
| 294 | 296 | |
| 295 | 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, · 56 unmodified lines | ||
| 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 | 370 | static enum vop_data_format vop_convert_format(uint32_t format) |
| 356 | 371 | { |
| 357 | 372 | switch (format) { |
| 358 | 373 | case DRM_FORMAT_XRGB8888: |
| 359 | 374 | case DRM_FORMAT_ARGB8888: |
| 375 | + case DRM_FORMAT_XBGR8888: | |
| 376 | + case DRM_FORMAT_ABGR8888: | |
| 360 | 377 | return VOP_FMT_ARGB8888; |
| 361 | 378 | case DRM_FORMAT_RGB888: |
| 379 | + case DRM_FORMAT_BGR888: | |
| 362 | 380 | return VOP_FMT_RGB888; |
| 363 | 381 | case DRM_FORMAT_RGB565: |
| 382 | + case DRM_FORMAT_BGR565: | |
| 364 | 383 | return VOP_FMT_RGB565; |
| 365 | 384 | case DRM_FORMAT_NV12: |
| 366 | 385 | return VOP_FMT_YUV420SP; |
| @@ -378,6 +397,7 @@ static bool is_alpha_support(uint32_t format) · 11 unmodified lines | ||
| 378 | 397 | { |
| 379 | 398 | switch (format) { |
| 380 | 399 | case DRM_FORMAT_ARGB8888: |
| 400 | + case DRM_FORMAT_ABGR8888: | |
| 381 | 401 | return true; |
| 382 | 402 | default: |
| 383 | 403 | return false; |
| @@ -588,6 +608,7 @@ static int vop_update_plane_event(struct drm_plane *plane, · 204 unmodified lines | ||
| 588 | 608 | enum vop_data_format format; |
| 589 | 609 | uint32_t val; |
| 590 | 610 | bool is_alpha; |
| 611 | + bool rb_swap; | |
| 591 | 612 | bool visible; |
| 592 | 613 | int ret; |
| 593 | 614 | struct drm_rect dest = { |
| @@ -621,6 +642,7 @@ static int vop_update_plane_event(struct drm_plane *plane, · 27 unmodified lines | ||
| 621 | 642 | return 0; |
| 622 | 643 | |
| 623 | 644 | is_alpha = is_alpha_support(fb->pixel_format); |
| 645 | + rb_swap = has_rb_swapped(fb->pixel_format); | |
| 624 | 646 | format = vop_convert_format(fb->pixel_format); |
| 625 | 647 | if (format < 0) |
| 626 | 648 | return format; |
| @@ -689,6 +711,7 @@ static int vop_update_plane_event(struct drm_plane *plane, · 62 unmodified lines | ||
| 689 | 711 | val = (dsp_sty - 1) << 16; |
| 690 | 712 | val |= (dsp_stx - 1) & 0xffff; |
| 691 | 713 | VOP_WIN_SET(vop, win, dsp_st, val); |
| 714 | + VOP_WIN_SET(vop, win, rb_swap, rb_swap); | |
| 692 | 715 | |
| 693 | 716 | if (is_alpha) { |
| 694 | 717 | VOP_WIN_SET(vop, win, dst_alpha_ctl, |
| @@ -963,14 +963,13 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) · 962 unmodified lines | ||
| 963 | 963 | } else { |
| 964 | 964 | pool->npages_free += count; |
| 965 | 965 | list_splice(&ttm_dma->pages_list, &pool->free_list); |
| 966 | − npages = count; | |
| 967 | − if (pool->npages_free > _manager->options.max_size) { | |
| 966 | + /* | |
| 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 | 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 | 974 | spin_unlock_irqrestore(&pool->lock, irq_flags); |
| 976 | 975 | |
| @@ -1107,6 +1107,9 @@ static int ipu_irq_init(struct ipu_soc *ipu) · 1106 unmodified lines | ||
| 1107 | 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 | 1113 | for (i = 0; i < IPU_NUM_IRQS; i += 32) { |
| 1111 | 1114 | gc = irq_get_domain_generic_chip(ipu->domain, i); |
| 1112 | 1115 | gc->reg_base = ipu->cm_reg; |
| @@ -1464,7 +1464,7 @@ static void bmc150_accel_unregister_triggers(struct bmc150_accel_data *data, · 1463 unmodified lines | ||
| 1464 | 1464 | { |
| 1465 | 1465 | int i; |
| 1466 | 1466 | |
| 1467 | − for (i = from; i >= 0; i++) { | |
| 1467 | + for (i = from; i >= 0; i--) { | |
| 1468 | 1468 | if (data->triggers[i].indio_trig) { |
| 1469 | 1469 | iio_trigger_unregister(data->triggers[i].indio_trig); |
| 1470 | 1470 | data->triggers[i].indio_trig = NULL; |
| @@ -153,8 +153,7 @@ config DA9150_GPADC · 152 unmodified lines | ||
| 153 | 153 | |
| 154 | 154 | config CC10001_ADC |
| 155 | 155 | tristate "Cosmic Circuits 10001 ADC driver" |
| 156 | − depends on HAVE_CLK || REGULATOR | |
| 157 | − depends on HAS_IOMEM | |
| 156 | + depends on HAS_IOMEM && HAVE_CLK && REGULATOR | |
| 158 | 157 | select IIO_BUFFER |
| 159 | 158 | select IIO_TRIGGERED_BUFFER |
| 160 | 159 | help |
| @@ -182,7 +182,7 @@ struct at91_adc_caps { · 181 unmodified lines | ||
| 182 | 182 | u8 ts_pen_detect_sensitivity; |
| 183 | 183 | |
| 184 | 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 | 187 | u8 num_channels; |
| 188 | 188 | struct at91_adc_reg_desc registers; |
| @@ -201,7 +201,7 @@ struct at91_adc_state { · 12 unmodified lines | ||
| 201 | 201 | u8 num_channels; |
| 202 | 202 | void __iomem *reg_base; |
| 203 | 203 | struct at91_adc_reg_desc *registers; |
| 204 | − u8 startup_time; | |
| 204 | + u32 startup_time; | |
| 205 | 205 | u8 sample_hold_time; |
| 206 | 206 | bool sleep_mode; |
| 207 | 207 | struct iio_trigger **trig; |
| @@ -779,7 +779,7 @@ ret: · 571 unmodified lines | ||
| 779 | 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 | 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) · 4 unmodified lines | ||
| 790 | 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 | 796 | * For sama5d3x and at91sam9x5, the formula changes to: |
| @@ -349,3 +349,7 @@ static struct platform_driver rockchip_saradc_driver = { · 348 unmodified lines | ||
| 349 | 349 | }; |
| 350 | 350 | |
| 351 | 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"); | |
| @@ -833,7 +833,8 @@ static int twl4030_madc_probe(struct platform_device *pdev) · 832 unmodified lines | ||
| 833 | 833 | irq = platform_get_irq(pdev, 0); |
| 834 | 834 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, |
| 835 | 835 | twl4030_madc_threaded_irq_handler, |
| 836 | − IRQF_TRIGGER_RISING, "twl4030_madc", madc); | |
| 836 | + IRQF_TRIGGER_RISING | IRQF_ONESHOT, | |
| 837 | + "twl4030_madc", madc); | |
| 837 | 838 | if (ret) { |
| 838 | 839 | dev_err(&pdev->dev, "could not request irq\n"); |
| 839 | 840 | goto err_i2c; |
| @@ -36,6 +36,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) · 35 unmodified lines | ||
| 36 | 36 | s32 poll_value = 0; |
| 37 | 37 | |
| 38 | 38 | if (state) { |
| 39 | + if (!atomic_read(&st->user_requested_state)) | |
| 40 | + return 0; | |
| 39 | 41 | if (sensor_hub_device_open(st->hsdev)) |
| 40 | 42 | return -EIO; |
| 41 | 43 | |
| @@ -52,8 +54,12 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) · 10 unmodified lines | ||
| 52 | 54 | |
| 53 | 55 | poll_value = hid_sensor_read_poll_value(st); |
| 54 | 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 | 61 | return 0; |
| 62 | + | |
| 57 | 63 | sensor_hub_device_close(st->hsdev); |
| 58 | 64 | state_val = hid_sensor_get_usage_index(st->hsdev, |
| 59 | 65 | st->power_state.report_id, |
| @@ -92,9 +98,11 @@ EXPORT_SYMBOL(hid_sensor_power_state); · 32 unmodified lines | ||
| 92 | 98 | |
| 93 | 99 | int hid_sensor_power_state(struct hid_sensor_common *st, bool state) |
| 94 | 100 | { |
| 101 | + | |
| 95 | 102 | #ifdef CONFIG_PM |
| 96 | 103 | int ret; |
| 97 | 104 | |
| 105 | + atomic_set(&st->user_requested_state, state); | |
| 98 | 106 | if (state) |
| 99 | 107 | ret = pm_runtime_get_sync(&st->pdev->dev); |
| 100 | 108 | else { |
| @@ -109,6 +117,7 @@ int hid_sensor_power_state(struct hid_sensor_common *st, bool state) · 8 unmodified lines | ||
| 109 | 117 | |
| 110 | 118 | return 0; |
| 111 | 119 | #else |
| 120 | + atomic_set(&st->user_requested_state, state); | |
| 112 | 121 | return _hid_sensor_power_state(st, state); |
| 113 | 122 | #endif |
| 114 | 123 | } |
| @@ -22,7 +22,7 @@ · 21 unmodified lines | ||
| 22 | 22 | #include "ad5624r.h" |
| 23 | 23 | |
| 24 | 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 | 27 | u32 data; |
| 28 | 28 | u8 msg[3]; |
| @@ -35,7 +35,7 @@ static int ad5624r_spi_write(struct spi_device *spi, · 6 unmodified lines | ||
| 35 | 35 | * 14-, 12-bit input code followed by 0, 2, or 4 don't care bits, |
| 36 | 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 | 39 | msg[0] = data >> 16; |
| 40 | 40 | msg[1] = data >> 8; |
| 41 | 41 | msg[2] = data; |
| @@ -431,6 +431,23 @@ static int inv_mpu6050_write_gyro_scale(struct inv_mpu6050_state *st, int val) · 430 unmodified lines | ||
| 431 | 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 | 451 | static int inv_mpu6050_write_accel_scale(struct inv_mpu6050_state *st, int val) |
| 435 | 452 | { |
| 436 | 453 | int result, i; |
| @@ -696,6 +713,7 @@ static const struct iio_info mpu_info = { · 259 unmodified lines | ||
| 696 | 713 | .driver_module = THIS_MODULE, |
| 697 | 714 | .read_raw = &inv_mpu6050_read_raw, |
| 698 | 715 | .write_raw = &inv_mpu6050_write_raw, |
| 716 | + .write_raw_get_fmt = &inv_write_raw_get_fmt, | |
| 699 | 717 | .attrs = &inv_attribute_group, |
| 700 | 718 | .validate_trigger = inv_mpu6050_validate_trigger, |
| 701 | 719 | }; |
| @@ -188,6 +188,7 @@ config SENSORS_LM3533 · 187 unmodified lines | ||
| 188 | 188 | config LTR501 |
| 189 | 189 | tristate "LTR-501ALS-01 light sensor" |
| 190 | 190 | depends on I2C |
| 191 | + select REGMAP_I2C | |
| 191 | 192 | select IIO_BUFFER |
| 192 | 193 | select IIO_TRIGGERED_BUFFER |
| 193 | 194 | help |
| @@ -201,6 +202,7 @@ config LTR501 · 7 unmodified lines | ||
| 201 | 202 | config STK3310 |
| 202 | 203 | tristate "STK3310 ALS and proximity sensor" |
| 203 | 204 | depends on I2C |
| 205 | + select REGMAP_I2C | |
| 204 | 206 | help |
| 205 | 207 | Say yes here to get support for the Sensortek STK3310 ambient light |
| 206 | 208 | and proximity sensor. The STK3311 model is also supported by this |
| @@ -123,7 +123,7 @@ static int cm3323_set_it_bits(struct cm3323_data *data, int val, int val2) · 122 unmodified lines | ||
| 123 | 123 | for (i = 0; i < ARRAY_SIZE(cm3323_int_time); i++) { |
| 124 | 124 | if (val == cm3323_int_time[i].val && |
| 125 | 125 | val2 == cm3323_int_time[i].val2) { |
| 126 | − reg_conf = data->reg_conf; | |
| 126 | + reg_conf = data->reg_conf & ~CM3323_CONF_IT_MASK; | |
| 127 | 127 | reg_conf |= i << CM3323_CONF_IT_SHIFT; |
| 128 | 128 | |
| 129 | 129 | ret = i2c_smbus_write_word_data(data->client, |
| @@ -1302,7 +1302,7 @@ static int ltr501_init(struct ltr501_data *data) · 1301 unmodified lines | ||
| 1302 | 1302 | if (ret < 0) |
| 1303 | 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 | 1307 | ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status); |
| 1308 | 1308 | if (ret < 0) |
| @@ -43,7 +43,6 @@ · 42 unmodified lines | ||
| 43 | 43 | #define STK3311_CHIP_ID_VAL 0x1D |
| 44 | 44 | #define STK3310_PSINT_EN 0x01 |
| 45 | 45 | #define STK3310_PS_MAX_VAL 0xFFFF |
| 46 | −#define STK3310_THRESH_MAX 0xFFFF | |
| 47 | 46 | |
| 48 | 47 | #define STK3310_DRIVER_NAME "stk3310" |
| 49 | 48 | #define STK3310_REGMAP_NAME "stk3310_regmap" |
| @@ -84,15 +83,13 @@ static const struct reg_field stk3310_reg_field_flag_psint = · 34 unmodified lines | ||
| 84 | 83 | REG_FIELD(STK3310_REG_FLAG, 4, 4); |
| 85 | 84 | static const struct reg_field stk3310_reg_field_flag_nf = |
| 86 | 85 | REG_FIELD(STK3310_REG_FLAG, 0, 0); |
| 87 | −/* | |
| 88 | − * Maximum PS values with regard to scale. Used to export the 'inverse' | |
| 89 | − * PS value (high values for far objects, low values for near objects). | |
| 90 | − */ | |
| 86 | + | |
| 87 | +/* Estimate maximum proximity values with regard to measurement scale. */ | |
| 91 | 88 | static const int stk3310_ps_max[4] = { |
| 92 | − STK3310_PS_MAX_VAL / 64, | |
| 93 | − STK3310_PS_MAX_VAL / 16, | |
| 94 | − STK3310_PS_MAX_VAL / 4, | |
| 95 | − STK3310_PS_MAX_VAL, | |
| 89 | + STK3310_PS_MAX_VAL / 640, | |
| 90 | + STK3310_PS_MAX_VAL / 160, | |
| 91 | + STK3310_PS_MAX_VAL / 40, | |
| 92 | + STK3310_PS_MAX_VAL / 10 | |
| 96 | 93 | }; |
| 97 | 94 | |
| 98 | 95 | static const int stk3310_scale_table[][2] = { |
| @@ -128,14 +125,14 @@ static const struct iio_event_spec stk3310_events[] = { · 29 unmodified lines | ||
| 128 | 125 | /* Proximity event */ |
| 129 | 126 | { |
| 130 | 127 | .type = IIO_EV_TYPE_THRESH, |
| 131 | − .dir = IIO_EV_DIR_FALLING, | |
| 128 | + .dir = IIO_EV_DIR_RISING, | |
| 132 | 129 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | |
| 133 | 130 | BIT(IIO_EV_INFO_ENABLE), |
| 134 | 131 | }, |
| 135 | 132 | /* Out-of-proximity event */ |
| 136 | 133 | { |
| 137 | 134 | .type = IIO_EV_TYPE_THRESH, |
| 138 | − .dir = IIO_EV_DIR_RISING, | |
| 135 | + .dir = IIO_EV_DIR_FALLING, | |
| 139 | 136 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | |
| 140 | 137 | BIT(IIO_EV_INFO_ENABLE), |
| 141 | 138 | }, |
| @@ -205,23 +202,16 @@ static int stk3310_read_event(struct iio_dev *indio_dev, · 63 unmodified lines | ||
| 205 | 202 | u8 reg; |
| 206 | 203 | u16 buf; |
| 207 | 204 | int ret; |
| 208 | − unsigned int index; | |
| 209 | 205 | struct stk3310_data *data = iio_priv(indio_dev); |
| 210 | 206 | |
| 211 | 207 | if (info != IIO_EV_INFO_VALUE) |
| 212 | 208 | return -EINVAL; |
| 213 | 209 | |
| 214 | − /* | |
| 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 | − */ | |
| 210 | + /* Only proximity interrupts are implemented at the moment. */ | |
| 221 | 211 | if (dir == IIO_EV_DIR_RISING) |
| 222 | − reg = STK3310_REG_THDL_PS; | |
| 223 | − else if (dir == IIO_EV_DIR_FALLING) | |
| 224 | 212 | reg = STK3310_REG_THDH_PS; |
| 213 | + else if (dir == IIO_EV_DIR_FALLING) | |
| 214 | + reg = STK3310_REG_THDL_PS; | |
| 225 | 215 | else |
| 226 | 216 | return -EINVAL; |
| 227 | 217 | |
| @@ -232,8 +222,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev, · 4 unmodified lines | ||
| 232 | 222 | dev_err(&data->client->dev, "register read failed\n"); |
| 233 | 223 | return ret; |
| 234 | 224 | } |
| 235 | − regmap_field_read(data->reg_ps_gain, &index); | |
| 236 | − *val = swab16(stk3310_ps_max[index] - buf); | |
| 225 | + *val = swab16(buf); | |
| 237 | 226 | |
| 238 | 227 | return IIO_VAL_INT; |
| 239 | 228 | } |
| @@ -257,13 +246,13 @@ static int stk3310_write_event(struct iio_dev *indio_dev, · 17 unmodified lines | ||
| 257 | 246 | return -EINVAL; |
| 258 | 247 | |
| 259 | 248 | if (dir == IIO_EV_DIR_RISING) |
| 260 | − reg = STK3310_REG_THDL_PS; | |
| 261 | − else if (dir == IIO_EV_DIR_FALLING) | |
| 262 | 249 | reg = STK3310_REG_THDH_PS; |
| 250 | + else if (dir == IIO_EV_DIR_FALLING) | |
| 251 | + reg = STK3310_REG_THDL_PS; | |
| 263 | 252 | else |
| 264 | 253 | return -EINVAL; |
| 265 | 254 | |
| 266 | − buf = swab16(stk3310_ps_max[index] - val); | |
| 255 | + buf = swab16(val); | |
| 267 | 256 | ret = regmap_bulk_write(data->regmap, reg, &buf, 2); |
| 268 | 257 | if (ret < 0) |
| 269 | 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, · 64 unmodified lines | ||
| 334 | 323 | return ret; |
| 335 | 324 | } |
| 336 | 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 | 326 | mutex_unlock(&data->lock); |
| 346 | 327 | return IIO_VAL_INT; |
| 347 | 328 | case IIO_CHAN_INFO_INT_TIME: |
| @@ -581,8 +562,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) · 233 unmodified lines | ||
| 581 | 562 | } |
| 582 | 563 | event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, |
| 583 | 564 | IIO_EV_TYPE_THRESH, |
| 584 | − (dir ? IIO_EV_DIR_RISING : | |
| 585 | − IIO_EV_DIR_FALLING)); | |
| 565 | + (dir ? IIO_EV_DIR_FALLING : | |
| 566 | + IIO_EV_DIR_RISING)); | |
| 586 | 567 | iio_push_event(indio_dev, event, data->timestamp); |
| 587 | 568 | |
| 588 | 569 | /* Reset the interrupt flag */ |
| @@ -185,7 +185,7 @@ static int tcs3414_write_raw(struct iio_dev *indio_dev, · 184 unmodified lines | ||
| 185 | 185 | if (val != 0) |
| 186 | 186 | return -EINVAL; |
| 187 | 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 | 189 | data->timing &= ~TCS3414_INTEG_MASK; |
| 190 | 190 | data->timing |= i; |
| 191 | 191 | return i2c_smbus_write_byte_data( |
| @@ -84,10 +84,10 @@ · 83 unmodified lines | ||
| 84 | 84 | #define MMC35240_OTP_START_ADDR 0x1B |
| 85 | 85 | |
| 86 | 86 | enum mmc35240_resolution { |
| 87 | − MMC35240_16_BITS_SLOW = 0, /* 100 Hz */ | |
| 88 | − MMC35240_16_BITS_FAST, /* 200 Hz */ | |
| 89 | − MMC35240_14_BITS, /* 333 Hz */ | |
| 90 | − MMC35240_12_BITS, /* 666 Hz */ | |
| 87 | + MMC35240_16_BITS_SLOW = 0, /* 7.92 ms */ | |
| 88 | + MMC35240_16_BITS_FAST, /* 4.08 ms */ | |
| 89 | + MMC35240_14_BITS, /* 2.16 ms */ | |
| 90 | + MMC35240_12_BITS, /* 1.20 ms */ | |
| 91 | 91 | }; |
| 92 | 92 | |
| 93 | 93 | enum mmc35240_axis { |
| @@ -100,22 +100,22 @@ static const struct { · 6 unmodified lines | ||
| 100 | 100 | int sens[3]; /* sensitivity per X, Y, Z axis */ |
| 101 | 101 | int nfo; /* null field output */ |
| 102 | 102 | } mmc35240_props_table[] = { |
| 103 | − /* 16 bits, 100Hz ODR */ | |
| 103 | + /* 16 bits, 125Hz ODR */ | |
| 104 | 104 | { |
| 105 | 105 | {1024, 1024, 1024}, |
| 106 | 106 | 32768, |
| 107 | 107 | }, |
| 108 | − /* 16 bits, 200Hz ODR */ | |
| 108 | + /* 16 bits, 250Hz ODR */ | |
| 109 | 109 | { |
| 110 | 110 | {1024, 1024, 770}, |
| 111 | 111 | 32768, |
| 112 | 112 | }, |
| 113 | − /* 14 bits, 333Hz ODR */ | |
| 113 | + /* 14 bits, 450Hz ODR */ | |
| 114 | 114 | { |
| 115 | 115 | {256, 256, 193}, |
| 116 | 116 | 8192, |
| 117 | 117 | }, |
| 118 | − /* 12 bits, 666Hz ODR */ | |
| 118 | + /* 12 bits, 800Hz ODR */ | |
| 119 | 119 | { |
| 120 | 120 | {64, 64, 48}, |
| 121 | 121 | 2048, |
| @@ -133,9 +133,15 @@ struct mmc35240_data { · 11 unmodified lines | ||
| 133 | 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 | 146 | #define MMC35240_CHANNEL(_axis) { \ |
| 141 | 147 | .type = IIO_MAGN, \ |
| @@ -168,7 +174,8 @@ static int mmc35240_get_samp_freq_index(struct mmc35240_data *data, · 26 unmodified lines | ||
| 168 | 174 | int i; |
| 169 | 175 | |
| 170 | 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 | 179 | return i; |
| 173 | 180 | return -EINVAL; |
| 174 | 181 | } |
| @@ -378,9 +385,9 @@ static int mmc35240_read_raw(struct iio_dev *indio_dev, · 203 unmodified lines | ||
| 378 | 385 | if (i < 0 || i >= ARRAY_SIZE(mmc35240_samp_freq)) |
| 379 | 386 | return -EINVAL; |
| 380 | 387 | |
| 381 | − *val = mmc35240_samp_freq[i]; | |
| 382 | − *val2 = 0; | |
| 383 | − return IIO_VAL_INT; | |
| 388 | + *val = mmc35240_samp_freq[i].val; | |
| 389 | + *val2 = mmc35240_samp_freq[i].val2; | |
| 390 | + return IIO_VAL_INT_PLUS_MICRO; | |
| 384 | 391 | default: |
| 385 | 392 | return -EINVAL; |
| 386 | 393 | } |
| @@ -80,6 +80,7 @@ · 79 unmodified lines | ||
| 80 | 80 | #define SX9500_COMPSTAT_MASK GENMASK(3, 0) |
| 81 | 81 | |
| 82 | 82 | #define SX9500_NUM_CHANNELS 4 |
| 83 | +#define SX9500_CHAN_MASK GENMASK(SX9500_NUM_CHANNELS - 1, 0) | |
| 83 | 84 | |
| 84 | 85 | struct sx9500_data { |
| 85 | 86 | struct mutex mutex; |
| @@ -281,7 +282,7 @@ static int sx9500_read_prox_data(struct sx9500_data *data, · 195 unmodified lines | ||
| 281 | 282 | if (ret < 0) |
| 282 | 283 | return ret; |
| 283 | 284 | |
| 284 | − *val = 32767 - (s16)be16_to_cpu(regval); | |
| 285 | + *val = be16_to_cpu(regval); | |
| 285 | 286 | |
| 286 | 287 | return IIO_VAL_INT; |
| 287 | 288 | } |
| @@ -329,20 +330,20 @@ static int sx9500_read_proximity(struct sx9500_data *data, · 41 unmodified lines | ||
| 329 | 330 | else |
| 330 | 331 | ret = sx9500_wait_for_sample(data); |
| 331 | 332 | |
| 332 | − if (ret < 0) | |
| 333 | − return ret; | |
| 334 | − | |
| 335 | 333 | mutex_lock(&data->mutex); |
| 336 | 334 | |
| 337 | − ret = sx9500_read_prox_data(data, chan, val); | |
| 338 | 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 | 339 | if (ret < 0) |
| 343 | − goto out; | |
| 340 | + goto out_dec_data_rdy; | |
| 344 | 341 | |
| 345 | 342 | ret = sx9500_dec_data_rdy_users(data); |
| 343 | + if (ret < 0) | |
| 344 | + goto out_dec_chan; | |
| 345 | + | |
| 346 | + ret = sx9500_dec_chan_users(data, chan->channel); | |
| 346 | 347 | if (ret < 0) |
| 347 | 348 | goto out; |
| 348 | 349 | |
| @@ -350,6 +351,8 @@ static int sx9500_read_proximity(struct sx9500_data *data, · 1 unmodified line | ||
| 350 | 351 | |
| 351 | 352 | goto out; |
| 352 | 353 | |
| 354 | +out_dec_data_rdy: | |
| 355 | + sx9500_dec_data_rdy_users(data); | |
| 353 | 356 | out_dec_chan: |
| 354 | 357 | sx9500_dec_chan_users(data, chan->channel); |
| 355 | 358 | out: |
| @@ -679,7 +682,7 @@ out: · 323 unmodified lines | ||
| 679 | 682 | static int sx9500_buffer_preenable(struct iio_dev *indio_dev) |
| 680 | 683 | { |
| 681 | 684 | struct sx9500_data *data = iio_priv(indio_dev); |
| 682 | − int ret, i; | |
| 685 | + int ret = 0, i; | |
| 683 | 686 | |
| 684 | 687 | mutex_lock(&data->mutex); |
| 685 | 688 | |
| @@ -703,7 +706,7 @@ static int sx9500_buffer_preenable(struct iio_dev *indio_dev) · 17 unmodified lines | ||
| 703 | 706 | static int sx9500_buffer_predisable(struct iio_dev *indio_dev) |
| 704 | 707 | { |
| 705 | 708 | struct sx9500_data *data = iio_priv(indio_dev); |
| 706 | − int ret, i; | |
| 709 | + int ret = 0, i; | |
| 707 | 710 | |
| 708 | 711 | iio_triggered_buffer_predisable(indio_dev); |
| 709 | 712 | |
| @@ -800,8 +803,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) · 90 unmodified lines | ||
| 800 | 803 | unsigned int val; |
| 801 | 804 | |
| 802 | 805 | ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
| 803 | − GENMASK(SX9500_NUM_CHANNELS, 0), | |
| 804 | − GENMASK(SX9500_NUM_CHANNELS, 0)); | |
| 806 | + SX9500_CHAN_MASK, SX9500_CHAN_MASK); | |
| 805 | 807 | if (ret < 0) |
| 806 | 808 | return ret; |
| 807 | 809 | |
| @@ -821,7 +823,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) · 13 unmodified lines | ||
| 821 | 823 | |
| 822 | 824 | out: |
| 823 | 825 | regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
| 824 | − GENMASK(SX9500_NUM_CHANNELS, 0), 0); | |
| 826 | + SX9500_CHAN_MASK, 0); | |
| 825 | 827 | return ret; |
| 826 | 828 | } |
| 827 | 829 | |
| @@ -132,6 +132,9 @@ static int tmp006_write_raw(struct iio_dev *indio_dev, · 131 unmodified lines | ||
| 132 | 132 | struct tmp006_data *data = iio_priv(indio_dev); |
| 133 | 133 | int i; |
| 134 | 134 | |
| 135 | + if (mask != IIO_CHAN_INFO_SAMP_FREQ) | |
| 136 | + return -EINVAL; | |
| 137 | + | |
| 135 | 138 | for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++) |
| 136 | 139 | if ((val == tmp006_freqs[i][0]) && |
| 137 | 140 | (val2 == tmp006_freqs[i][1])) { |
| @@ -88,7 +88,7 @@ void agent_send_response(const struct ib_mad_hdr *mad_hdr, const struct ib_grh * · 87 unmodified lines | ||
| 88 | 88 | struct ib_ah *ah; |
| 89 | 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 | 92 | port_priv = ib_get_agent_port(device, 0); |
| 93 | 93 | else |
| 94 | 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 * · 27 unmodified lines | ||
| 122 | 122 | memcpy(send_buf->mad, mad_hdr, resp_mad_len); |
| 123 | 123 | send_buf->ah = ah; |
| 124 | 124 | |
| 125 | − if (device->node_type == RDMA_NODE_IB_SWITCH) { | |
| 125 | + if (rdma_cap_ib_switch(device)) { | |
| 126 | 126 | mad_send_wr = container_of(send_buf, |
| 127 | 127 | struct ib_mad_send_wr_private, |
| 128 | 128 | send_buf); |
| @@ -169,6 +169,7 @@ struct cm_device { · 168 unmodified lines | ||
| 169 | 169 | struct ib_device *ib_device; |
| 170 | 170 | struct device *device; |
| 171 | 171 | u8 ack_delay; |
| 172 | + int going_down; | |
| 172 | 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) · 630 unmodified lines | ||
| 805 | 806 | { |
| 806 | 807 | int wait_time; |
| 807 | 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 | 815 | spin_lock_irqsave(&cm.lock, flags); |
| 810 | 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) · 7 unmodified lines | ||
| 818 | 824 | */ |
| 819 | 825 | cm_id_priv->id.state = IB_CM_TIMEWAIT; |
| 820 | 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, | |
| 822 | − msecs_to_jiffies(wait_time)); | |
| 827 | + | |
| 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 | 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) · 2479 unmodified lines | ||
| 3305 | 3317 | struct cm_work *work; |
| 3306 | 3318 | unsigned long flags; |
| 3307 | 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 | 3326 | work = kmalloc(sizeof *work, GFP_ATOMIC); |
| 3310 | 3327 | if (!work) |
| @@ -3343,7 +3360,17 @@ static int cm_establish(struct ib_cm_id *cm_id) · 32 unmodified lines | ||
| 3343 | 3360 | work->remote_id = cm_id->remote_id; |
| 3344 | 3361 | work->mad_recv_wc = NULL; |
| 3345 | 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 | 3374 | out: |
| 3348 | 3375 | return ret; |
| 3349 | 3376 | } |
| @@ -3394,6 +3421,7 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent, · 44 unmodified lines | ||
| 3394 | 3421 | enum ib_cm_event_type event; |
| 3395 | 3422 | u16 attr_id; |
| 3396 | 3423 | int paths = 0; |
| 3424 | + int going_down = 0; | |
| 3397 | 3425 | |
| 3398 | 3426 | switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) { |
| 3399 | 3427 | case CM_REQ_ATTR_ID: |
| @@ -3452,7 +3480,19 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent, · 52 unmodified lines | ||
| 3452 | 3480 | work->cm_event.event = event; |
| 3453 | 3481 | work->mad_recv_wc = mad_recv_wc; |
| 3454 | 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 | 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) · 312 unmodified lines | ||
| 3771 | 3811 | |
| 3772 | 3812 | cm_dev->ib_device = ib_device; |
| 3773 | 3813 | cm_get_ack_delay(cm_dev); |
| 3774 | − | |
| 3814 | + cm_dev->going_down = 0; | |
| 3775 | 3815 | cm_dev->device = device_create(&cm_class, &ib_device->dev, |
| 3776 | 3816 | MKDEV(0, 0), NULL, |
| 3777 | 3817 | "%s", ib_device->name); |
| @@ -3864,14 +3904,23 @@ static void cm_remove_one(struct ib_device *ib_device) · 86 unmodified lines | ||
| 3864 | 3904 | list_del(&cm_dev->list); |
| 3865 | 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 | 3911 | for (i = 1; i <= ib_device->phys_port_cnt; i++) { |
| 3868 | 3912 | if (!rdma_cap_ib_cm(ib_device, i)) |
| 3869 | 3913 | continue; |
| 3870 | 3914 | |
| 3871 | 3915 | port = cm_dev->port[i-1]; |
| 3872 | 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 | 3922 | flush_workqueue(cm.wq); |
| 3923 | + ib_unregister_mad_agent(port->mad_agent); | |
| 3875 | 3924 | cm_remove_port_fs(port); |
| 3876 | 3925 | } |
| 3877 | 3926 | device_unregister(cm_dev->device); |
| @@ -67,7 +67,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) · 66 unmodified lines | ||
| 67 | 67 | err_str = "Invalid port mapper client"; |
| 68 | 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 | 72 | return 0; |
| 72 | 73 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client); |
| 73 | 74 | if (!skb) { |
| @@ -106,7 +107,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) · 32 unmodified lines | ||
| 106 | 107 | ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL); |
| 107 | 108 | if (ret) { |
| 108 | 109 | skb = NULL; /* skb is freed in the netlink send-op handling */ |
| 109 | − iwpm_set_registered(nl_client, 1); | |
| 110 | 110 | iwpm_user_pid = IWPM_PID_UNAVAILABLE; |
| 111 | 111 | err_str = "Unable to send a nlmsg"; |
| 112 | 112 | goto pid_query_error; |
| @@ -144,12 +144,12 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) · 31 unmodified lines | ||
| 144 | 144 | err_str = "Invalid port mapper client"; |
| 145 | 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 | 150 | err_str = "Unregistered port mapper client"; |
| 149 | 151 | goto add_mapping_error; |
| 150 | 152 | } |
| 151 | − if (!iwpm_valid_pid()) | |
| 152 | − return 0; | |
| 153 | 153 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client); |
| 154 | 154 | if (!skb) { |
| 155 | 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) · 58 unmodified lines | ||
| 214 | 214 | err_str = "Invalid port mapper client"; |
| 215 | 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 | 220 | err_str = "Unregistered port mapper client"; |
| 219 | 221 | goto query_mapping_error; |
| 220 | 222 | } |
| 221 | − if (!iwpm_valid_pid()) | |
| 222 | − return 0; | |
| 223 | 223 | ret = -ENOMEM; |
| 224 | 224 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client); |
| 225 | 225 | if (!skb) { |
| @@ -288,12 +288,12 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client) · 62 unmodified lines | ||
| 288 | 288 | err_str = "Invalid port mapper client"; |
| 289 | 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 | 294 | err_str = "Unregistered port mapper client"; |
| 293 | 295 | goto remove_mapping_error; |
| 294 | 296 | } |
| 295 | − if (!iwpm_valid_pid()) | |
| 296 | − return 0; | |
| 297 | 297 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client); |
| 298 | 298 | if (!skb) { |
| 299 | 299 | ret = -ENOMEM; |
| @@ -388,7 +388,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb) · 88 unmodified lines | ||
| 388 | 388 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", |
| 389 | 389 | __func__, iwpm_user_pid); |
| 390 | 390 | if (iwpm_valid_client(nl_client)) |
| 391 | − iwpm_set_registered(nl_client, 1); | |
| 391 | + iwpm_set_registration(nl_client, IWPM_REG_VALID); | |
| 392 | 392 | register_pid_response_exit: |
| 393 | 393 | nlmsg_request->request_done = 1; |
| 394 | 394 | /* always for found nlmsg_request */ |
| @@ -644,7 +644,6 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) · 249 unmodified lines | ||
| 644 | 644 | { |
| 645 | 645 | struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX]; |
| 646 | 646 | const char *msg_type = "Mapping Info response"; |
| 647 | − int iwpm_pid; | |
| 648 | 647 | u8 nl_client; |
| 649 | 648 | char *iwpm_name; |
| 650 | 649 | u16 iwpm_version; |
| @@ -669,14 +668,14 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) · 18 unmodified lines | ||
| 669 | 668 | __func__, nl_client); |
| 670 | 669 | return ret; |
| 671 | 670 | } |
| 672 | − iwpm_set_registered(nl_client, 0); | |
| 671 | + iwpm_set_registration(nl_client, IWPM_REG_INCOMPL); | |
| 673 | 672 | atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); |
| 673 | + iwpm_user_pid = cb->nlh->nlmsg_pid; | |
| 674 | 674 | if (!iwpm_mapinfo_available()) |
| 675 | 675 | return 0; |
| 676 | − iwpm_pid = cb->nlh->nlmsg_pid; | |
| 677 | 676 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", |
| 678 | − __func__, iwpm_pid); | |
| 679 | − ret = iwpm_send_mapinfo(nl_client, iwpm_pid); | |
| 677 | + __func__, iwpm_user_pid); | |
| 678 | + ret = iwpm_send_mapinfo(nl_client, iwpm_user_pid); | |
| 680 | 679 | return ret; |
| 681 | 680 | } |
| 682 | 681 | EXPORT_SYMBOL(iwpm_mapping_info_cb); |
| @@ -78,6 +78,7 @@ init_exit: · 77 unmodified lines | ||
| 78 | 78 | mutex_unlock(&iwpm_admin_lock); |
| 79 | 79 | if (!ret) { |
| 80 | 80 | iwpm_set_valid(nl_client, 1); |
| 81 | + iwpm_set_registration(nl_client, IWPM_REG_UNDEF); | |
| 81 | 82 | pr_debug("%s: Mapinfo and reminfo tables are created\n", |
| 82 | 83 | __func__); |
| 83 | 84 | } |
| @@ -106,6 +107,7 @@ int iwpm_exit(u8 nl_client) · 22 unmodified lines | ||
| 106 | 107 | } |
| 107 | 108 | mutex_unlock(&iwpm_admin_lock); |
| 108 | 109 | iwpm_set_valid(nl_client, 0); |
| 110 | + iwpm_set_registration(nl_client, IWPM_REG_UNDEF); | |
| 109 | 111 | return 0; |
| 110 | 112 | } |
| 111 | 113 | EXPORT_SYMBOL(iwpm_exit); |
| @@ -397,17 +399,23 @@ void iwpm_set_valid(u8 nl_client, int valid) · 285 unmodified lines | ||
| 397 | 399 | } |
| 398 | 400 | |
| 399 | 401 | /* valid client */ |
| 400 | −int iwpm_registered_client(u8 nl_client) | |
| 402 | +u32 iwpm_get_registration(u8 nl_client) | |
| 401 | 403 | { |
| 402 | 404 | return iwpm_admin.reg_list[nl_client]; |
| 403 | 405 | } |
| 404 | 406 | |
| 405 | 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 | 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 | 419 | int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, |
| 412 | 420 | struct sockaddr_storage *b_sockaddr) |
| 413 | 421 | { |
| @@ -58,6 +58,10 @@ · 57 unmodified lines | ||
| 58 | 58 | #define IWPM_PID_UNDEFINED -1 |
| 59 | 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 | 65 | struct iwpm_nlmsg_request { |
| 62 | 66 | struct list_head inprocess_list; |
| 63 | 67 | __u32 nlmsg_seq; |
| @@ -88,7 +92,7 @@ struct iwpm_admin_data { · 24 unmodified lines | ||
| 88 | 92 | atomic_t refcount; |
| 89 | 93 | atomic_t nlmsg_seq; |
| 90 | 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); · 64 unmodified lines | ||
| 159 | 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 | 168 | * @nl_client: The index of the netlink client |
| 169 | + * @reg: The given registration type to compare with | |
| 164 | 170 | * |
| 165 | 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 | 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 | 193 | * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of |
| @@ -769,7 +769,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, · 768 unmodified lines | ||
| 769 | 769 | bool opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device, |
| 770 | 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 | 773 | smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) |
| 774 | 774 | port_num = send_wr->wr.ud.port_num; |
| 775 | 775 | else |
| @@ -787,14 +787,15 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, · 11 unmodified lines | ||
| 787 | 787 | if ((opa_get_smp_direction(opa_smp) |
| 788 | 788 | ? opa_smp->route.dr.dr_dlid : opa_smp->route.dr.dr_slid) == |
| 789 | 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 | 792 | port_num) == IB_SMI_DISCARD) { |
| 792 | 793 | ret = -EINVAL; |
| 793 | 794 | dev_err(&device->dev, "OPA Invalid directed route\n"); |
| 794 | 795 | goto out; |
| 795 | 796 | } |
| 796 | 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 | 799 | opa_drslid & 0xffff0000) { |
| 799 | 800 | ret = -EINVAL; |
| 800 | 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, · 9 unmodified lines | ||
| 810 | 811 | } else { |
| 811 | 812 | if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) == |
| 812 | 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 | 815 | IB_SMI_DISCARD) { |
| 815 | 816 | ret = -EINVAL; |
| 816 | 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 · 1213 unmodified lines | ||
| 2030 | 2031 | struct ib_smp *smp = (struct ib_smp *)recv->mad; |
| 2031 | 2032 | |
| 2032 | 2033 | if (smi_handle_dr_smp_recv(smp, |
| 2033 | − port_priv->device->node_type, | |
| 2034 | + rdma_cap_ib_switch(port_priv->device), | |
| 2034 | 2035 | port_num, |
| 2035 | 2036 | port_priv->device->phys_port_cnt) == |
| 2036 | 2037 | IB_SMI_DISCARD) |
| @@ -2042,13 +2043,13 @@ static enum smi_action handle_ib_smi(const struct ib_mad_port_private *port_priv · 5 unmodified lines | ||
| 2042 | 2043 | |
| 2043 | 2044 | if (retsmi == IB_SMI_SEND) { /* don't forward */ |
| 2044 | 2045 | if (smi_handle_dr_smp_send(smp, |
| 2045 | − port_priv->device->node_type, | |
| 2046 | + rdma_cap_ib_switch(port_priv->device), | |
| 2046 | 2047 | port_num) == IB_SMI_DISCARD) |
| 2047 | 2048 | return IB_SMI_DISCARD; |
| 2048 | 2049 | |
| 2049 | 2050 | if (smi_check_local_smp(smp, port_priv->device) == IB_SMI_DISCARD) |
| 2050 | 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 | 2053 | /* forward case for switches */ |
| 2053 | 2054 | memcpy(response, recv, mad_priv_size(response)); |
| 2054 | 2055 | response->header.recv_wc.wc = &response->header.wc; |
| @@ -2115,7 +2116,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, · 60 unmodified lines | ||
| 2115 | 2116 | struct opa_smp *smp = (struct opa_smp *)recv->mad; |
| 2116 | 2117 | |
| 2117 | 2118 | if (opa_smi_handle_dr_smp_recv(smp, |
| 2118 | − port_priv->device->node_type, | |
| 2119 | + rdma_cap_ib_switch(port_priv->device), | |
| 2119 | 2120 | port_num, |
| 2120 | 2121 | port_priv->device->phys_port_cnt) == |
| 2121 | 2122 | IB_SMI_DISCARD) |
| @@ -2127,7 +2128,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, · 5 unmodified lines | ||
| 2127 | 2128 | |
| 2128 | 2129 | if (retsmi == IB_SMI_SEND) { /* don't forward */ |
| 2129 | 2130 | if (opa_smi_handle_dr_smp_send(smp, |
| 2130 | − port_priv->device->node_type, | |
| 2131 | + rdma_cap_ib_switch(port_priv->device), | |
| 2131 | 2132 | port_num) == IB_SMI_DISCARD) |
| 2132 | 2133 | return IB_SMI_DISCARD; |
| 2133 | 2134 | |
| @@ -2135,7 +2136,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, · 1 unmodified line | ||
| 2135 | 2136 | IB_SMI_DISCARD) |
| 2136 | 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 | 2140 | /* forward case for switches */ |
| 2140 | 2141 | memcpy(response, recv, mad_priv_size(response)); |
| 2141 | 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, · 93 unmodified lines | ||
| 2235 | 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 | 2240 | port_num = wc->port_num; |
| 2240 | 2241 | else |
| 2241 | 2242 | port_num = port_priv->port_num; |
| @@ -3297,17 +3298,11 @@ static int ib_mad_port_close(struct ib_device *device, int port_num) · 1055 unmodified lines | ||
| 3297 | 3298 | |
| 3298 | 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 = 0; | |
| 3304 | − end = 0; | |
| 3305 | − } else { | |
| 3306 | − start = 1; | |
| 3307 | − end = device->phys_port_cnt; | |
| 3308 | − } | |
| 3303 | + start = rdma_start_port(device); | |
| 3309 | 3304 | |
| 3310 | − for (i = start; i <= end; i++) { | |
| 3305 | + for (i = start; i <= rdma_end_port(device); i++) { | |
| 3311 | 3306 | if (!rdma_cap_ib_mad(device, i)) |
| 3312 | 3307 | continue; |
| 3313 | 3308 | |
| @@ -3342,17 +3337,9 @@ error: · 28 unmodified lines | ||
| 3342 | 3337 | |
| 3343 | 3338 | static void ib_mad_remove_device(struct ib_device *device) |
| 3344 | 3339 | { |
| 3345 | − int start, end, 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 | − } | |
| 3340 | + int i; | |
| 3354 | 3341 | |
| 3355 | − for (i = start; i <= end; i++) { | |
| 3342 | + for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { | |
| 3356 | 3343 | if (!rdma_cap_ib_mad(device, i)) |
| 3357 | 3344 | continue; |
| 3358 | 3345 | |
| @@ -812,12 +812,8 @@ static void mcast_add_one(struct ib_device *device) · 811 unmodified lines | ||
| 812 | 812 | if (!dev) |
| 813 | 813 | return; |
| 814 | 814 | |
| 815 | − if (device->node_type == RDMA_NODE_IB_SWITCH) | |
| 816 | − dev->start_port = dev->end_port = 0; | |
| 817 | − else { | |
| 818 | − dev->start_port = 1; | |
| 819 | − dev->end_port = device->phys_port_cnt; | |
| 820 | − } | |
| 815 | + dev->start_port = rdma_start_port(device); | |
| 816 | + dev->end_port = rdma_end_port(device); | |
| 821 | 817 | |
| 822 | 818 | for (i = 0; i <= dev->end_port - dev->start_port; i++) { |
| 823 | 819 | if (!rdma_cap_ib_mcast(device, dev->start_port + i)) |
| @@ -39,12 +39,12 @@ · 38 unmodified lines | ||
| 39 | 39 | |
| 40 | 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 | 43 | int port_num, int phys_port_cnt); |
| 44 | 44 | int opa_smi_get_fwd_port(struct opa_smp *smp); |
| 45 | 45 | extern enum smi_forward_action opa_smi_check_forward_dr_smp(struct opa_smp *smp); |
| 46 | 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 | 50 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM |
| @@ -1156,12 +1156,8 @@ static void ib_sa_add_one(struct ib_device *device) · 1155 unmodified lines | ||
| 1156 | 1156 | int s, e, i; |
| 1157 | 1157 | int count = 0; |
| 1158 | 1158 | |
| 1159 | − if (device->node_type == RDMA_NODE_IB_SWITCH) | |
| 1160 | − s = e = 0; | |
| 1161 | − else { | |
| 1162 | − s = 1; | |
| 1163 | − e = device->phys_port_cnt; | |
| 1164 | − } | |
| 1159 | + s = rdma_start_port(device); | |
| 1160 | + e = rdma_end_port(device); | |
| 1165 | 1161 | |
| 1166 | 1162 | sa_dev = kzalloc(sizeof *sa_dev + |
| 1167 | 1163 | (e - s + 1) * sizeof (struct ib_sa_port), |
| @@ -41,7 +41,7 @@ · 40 unmodified lines | ||
| 41 | 41 | #include "smi.h" |
| 42 | 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 | 45 | u8 *hop_ptr, u8 hop_cnt, |
| 46 | 46 | const u8 *initial_path, |
| 47 | 47 | const u8 *return_path, |
| @@ -64,7 +64,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, · 16 unmodified lines | ||
| 64 | 64 | |
| 65 | 65 | /* C14-9:2 */ |
| 66 | 66 | if (*hop_ptr && *hop_ptr < hop_cnt) { |
| 67 | − if (node_type != RDMA_NODE_IB_SWITCH) | |
| 67 | + if (!is_switch) | |
| 68 | 68 | return IB_SMI_DISCARD; |
| 69 | 69 | |
| 70 | 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, · 6 unmodified lines | ||
| 77 | 77 | if (*hop_ptr == hop_cnt) { |
| 78 | 78 | /* return_path set when received */ |
| 79 | 79 | (*hop_ptr)++; |
| 80 | − return (node_type == RDMA_NODE_IB_SWITCH || | |
| 80 | + return (is_switch || | |
| 81 | 81 | dr_dlid_is_permissive ? |
| 82 | 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, · 12 unmodified lines | ||
| 96 | 96 | |
| 97 | 97 | /* C14-13:2 */ |
| 98 | 98 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { |
| 99 | − if (node_type != RDMA_NODE_IB_SWITCH) | |
| 99 | + if (!is_switch) | |
| 100 | 100 | return IB_SMI_DISCARD; |
| 101 | 101 | |
| 102 | 102 | (*hop_ptr)--; |
| @@ -108,7 +108,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, · 5 unmodified lines | ||
| 108 | 108 | if (*hop_ptr == 1) { |
| 109 | 109 | (*hop_ptr)--; |
| 110 | 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 | 112 | dr_slid_is_permissive ? |
| 113 | 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, · 12 unmodified lines | ||
| 127 | 127 | * Return IB_SMI_DISCARD if the SMP should be discarded |
| 128 | 128 | */ |
| 129 | 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 | 133 | &smp->hop_ptr, smp->hop_cnt, |
| 134 | 134 | smp->initial_path, |
| 135 | 135 | smp->return_path, |
| @@ -139,9 +139,9 @@ enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, · 3 unmodified lines | ||
| 139 | 139 | } |
| 140 | 140 | |
| 141 | 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 | 145 | &smp->hop_ptr, smp->hop_cnt, |
| 146 | 146 | smp->route.dr.initial_path, |
| 147 | 147 | smp->route.dr.return_path, |
| @@ -152,7 +152,7 @@ enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, · 4 unmodified lines | ||
| 152 | 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 | 156 | int phys_port_cnt, |
| 157 | 157 | u8 *hop_ptr, u8 hop_cnt, |
| 158 | 158 | const u8 *initial_path, |
| @@ -173,7 +173,7 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, · 14 unmodified lines | ||
| 173 | 173 | |
| 174 | 174 | /* C14-9:2 -- intermediate hop */ |
| 175 | 175 | if (*hop_ptr && *hop_ptr < hop_cnt) { |
| 176 | − if (node_type != RDMA_NODE_IB_SWITCH) | |
| 176 | + if (!is_switch) | |
| 177 | 177 | return IB_SMI_DISCARD; |
| 178 | 178 | |
| 179 | 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, · 8 unmodified lines | ||
| 188 | 188 | return_path[*hop_ptr] = port_num; |
| 189 | 189 | /* hop_ptr updated when sending */ |
| 190 | 190 | |
| 191 | − return (node_type == RDMA_NODE_IB_SWITCH || | |
| 191 | + return (is_switch || | |
| 192 | 192 | dr_dlid_is_permissive ? |
| 193 | 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, · 13 unmodified lines | ||
| 208 | 208 | |
| 209 | 209 | /* C14-13:2 */ |
| 210 | 210 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { |
| 211 | − if (node_type != RDMA_NODE_IB_SWITCH) | |
| 211 | + if (!is_switch) | |
| 212 | 212 | return IB_SMI_DISCARD; |
| 213 | 213 | |
| 214 | 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, · 9 unmodified lines | ||
| 224 | 224 | return IB_SMI_HANDLE; |
| 225 | 225 | } |
| 226 | 226 | /* hop_ptr updated when sending */ |
| 227 | − return (node_type == RDMA_NODE_IB_SWITCH ? | |
| 228 | − IB_SMI_HANDLE : IB_SMI_DISCARD); | |
| 227 | + return (is_switch ? IB_SMI_HANDLE : IB_SMI_DISCARD); | |
| 229 | 228 | } |
| 230 | 229 | |
| 231 | 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, · 6 unmodified lines | ||
| 238 | 237 | * Adjust information for a received SMP |
| 239 | 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 | 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 | 244 | &smp->hop_ptr, smp->hop_cnt, |
| 246 | 245 | smp->initial_path, |
| 247 | 246 | smp->return_path, |
| @@ -254,10 +253,10 @@ enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type, · 6 unmodified lines | ||
| 254 | 253 | * Adjust information for a received SMP |
| 255 | 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 | 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 | 260 | &smp->hop_ptr, smp->hop_cnt, |
| 262 | 261 | smp->route.dr.initial_path, |
| 263 | 262 | smp->route.dr.return_path, |
| @@ -51,12 +51,12 @@ enum smi_forward_action { · 50 unmodified lines | ||
| 51 | 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 | 55 | int port_num, int phys_port_cnt); |
| 56 | 56 | int smi_get_fwd_port(struct ib_smp *smp); |
| 57 | 57 | extern enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp); |
| 58 | 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 | 62 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM |
| @@ -870,7 +870,7 @@ int ib_device_register_sysfs(struct ib_device *device, · 869 unmodified lines | ||
| 870 | 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 | 874 | ret = add_port(device, 0, port_callback); |
| 875 | 875 | if (ret) |
| 876 | 876 | goto err_put; |
| @@ -1193,6 +1193,7 @@ static int ib_ucm_close(struct inode *inode, struct file *filp) · 1192 unmodified lines | ||
| 1193 | 1193 | return 0; |
| 1194 | 1194 | } |
| 1195 | 1195 | |
| 1196 | +static DECLARE_BITMAP(overflow_map, IB_UCM_MAX_DEVICES); | |
| 1196 | 1197 | static void ib_ucm_release_dev(struct device *dev) |
| 1197 | 1198 | { |
| 1198 | 1199 | struct ib_ucm_device *ucm_dev; |
| @@ -1202,7 +1203,7 @@ static void ib_ucm_release_dev(struct device *dev) · 3 unmodified lines | ||
| 1202 | 1203 | if (ucm_dev->devnum < IB_UCM_MAX_DEVICES) |
| 1203 | 1204 | clear_bit(ucm_dev->devnum, dev_map); |
| 1204 | 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 | 1207 | kfree(ucm_dev); |
| 1207 | 1208 | } |
| 1208 | 1209 | |
| @@ -1226,7 +1227,6 @@ static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr, · 17 unmodified lines | ||
| 1226 | 1227 | static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL); |
| 1227 | 1228 | |
| 1228 | 1229 | static dev_t overflow_maj; |
| 1229 | −static DECLARE_BITMAP(overflow_map, IB_UCM_MAX_DEVICES); | |
| 1230 | 1230 | static int find_overflow_devnum(void) |
| 1231 | 1231 | { |
| 1232 | 1232 | int ret; |
| @@ -1354,10 +1354,10 @@ static void ucma_lock_files(struct ucma_file *file1, struct ucma_file *file2) · 1353 unmodified lines | ||
| 1354 | 1354 | /* Acquire mutex's based on pointer comparison to prevent deadlock. */ |
| 1355 | 1355 | if (file1 < file2) { |
| 1356 | 1356 | mutex_lock(&file1->mut); |
| 1357 | − mutex_lock(&file2->mut); | |
| 1357 | + mutex_lock_nested(&file2->mut, SINGLE_DEPTH_NESTING); | |
| 1358 | 1358 | } else { |
| 1359 | 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) · 252 unmodified lines | ||
| 1616 | 1616 | device_remove_file(ucma_misc.this_device, &dev_attr_abi_version); |
| 1617 | 1617 | misc_deregister(&ucma_misc); |
| 1618 | 1618 | idr_destroy(&ctx_idr); |
| 1619 | + idr_destroy(&multicast_idr); | |
| 1619 | 1620 | } |
| 1620 | 1621 | |
| 1621 | 1622 | module_init(ucma_init); |
| @@ -226,8 +226,9 @@ int ehca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, · 225 unmodified lines | ||
| 226 | 226 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 227 | 227 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 228 | 228 | |
| 229 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 230 | − *out_mad_size != sizeof(*out_mad)); | |
| 229 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 230 | + *out_mad_size != sizeof(*out_mad))) | |
| 231 | + return IB_MAD_RESULT_FAILURE; | |
| 231 | 232 | |
| 232 | 233 | if (!port_num || port_num > ibdev->phys_port_cnt || !in_wc) |
| 233 | 234 | return IB_MAD_RESULT_FAILURE; |
| @@ -1499,8 +1499,9 @@ int ipath_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, · 1498 unmodified lines | ||
| 1499 | 1499 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 1500 | 1500 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 1501 | 1501 | |
| 1502 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 1503 | − *out_mad_size != sizeof(*out_mad)); | |
| 1502 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 1503 | + *out_mad_size != sizeof(*out_mad))) | |
| 1504 | + return IB_MAD_RESULT_FAILURE; | |
| 1504 | 1505 | |
| 1505 | 1506 | switch (in_mad->mad_hdr.mgmt_class) { |
| 1506 | 1507 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: |
| @@ -2044,9 +2044,9 @@ int ipath_register_ib_device(struct ipath_devdata *dd) · 2043 unmodified lines | ||
| 2044 | 2044 | |
| 2045 | 2045 | spin_lock_init(&idev->qp_table.lock); |
| 2046 | 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 | 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 | 2051 | ret = ipath_init_qp_table(idev, ib_ipath_qp_table_size); |
| 2052 | 2052 | if (ret) |
| @@ -860,21 +860,31 @@ int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, · 859 unmodified lines | ||
| 860 | 860 | struct mlx4_ib_dev *dev = to_mdev(ibdev); |
| 861 | 861 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 862 | 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 | − *out_mad_size != sizeof(*out_mad)); | |
| 865 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_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)) { | |
| 868 | − case IB_LINK_LAYER_INFINIBAND: | |
| 869 | − if (!mlx4_is_slave(dev->dev)) | |
| 870 | − return ib_process_mad(ibdev, mad_flags, port_num, in_wc, | |
| 871 | − in_grh, in_mad, out_mad); | |
| 872 | − case IB_LINK_LAYER_ETHERNET: | |
| 873 | − return iboe_process_mad(ibdev, mad_flags, port_num, in_wc, | |
| 874 | − in_grh, in_mad, out_mad); | |
| 875 | − default: | |
| 876 | − return -EINVAL; | |
| 869 | + /* iboe_process_mad() which uses the HCA flow-counters to implement IB PMA | |
| 870 | + * queries, should be called only by VFs and for that specific purpose | |
| 871 | + */ | |
| 872 | + if (link == IB_LINK_LAYER_INFINIBAND) { | |
| 873 | + if (mlx4_is_slave(dev->dev) && | |
| 874 | + in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT && | |
| 875 | + in_mad->mad_hdr.attr_id == IB_PMA_PORT_COUNTERS) | |
| 876 | + return iboe_process_mad(ibdev, mad_flags, port_num, in_wc, | |
| 877 | + in_grh, in_mad, out_mad); | |
| 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 | 890 | static void send_handler(struct ib_mad_agent *agent, |
| @@ -253,14 +253,15 @@ static int mlx4_ib_query_device(struct ib_device *ibdev, · 252 unmodified lines | ||
| 253 | 253 | props->hca_core_clock = dev->dev->caps.hca_core_clock * 1000UL; |
| 254 | 254 | props->timestamp_mask = 0xFFFFFFFFFFFFULL; |
| 255 | 255 | |
| 256 | − err = mlx4_get_internal_clock_params(dev->dev, &clock_params); | |
| 257 | − if (err) | |
| 258 | − goto out; | |
| 256 | + if (!mlx4_is_slave(dev->dev)) | |
| 257 | + err = mlx4_get_internal_clock_params(dev->dev, &clock_params); | |
| 259 | 258 | |
| 260 | 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 | 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 | 267 | if (uhw->outlen) { |
| @@ -2669,31 +2670,33 @@ static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init) · 2402 unmodified lines | ||
| 2669 | 2670 | dm = kcalloc(ports, sizeof(*dm), GFP_ATOMIC); |
| 2670 | 2671 | if (!dm) { |
| 2671 | 2672 | pr_err("failed to allocate memory for tunneling qp update\n"); |
| 2672 | − goto out; | |
| 2673 | + return; | |
| 2673 | 2674 | } |
| 2674 | 2675 | |
| 2675 | 2676 | for (i = 0; i < ports; i++) { |
| 2676 | 2677 | dm[i] = kmalloc(sizeof (struct mlx4_ib_demux_work), GFP_ATOMIC); |
| 2677 | 2678 | if (!dm[i]) { |
| 2678 | 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 | − if (dm[i]) | |
| 2681 | − kfree(dm[i]); | |
| 2682 | − } | |
| 2680 | + while (--i >= 0) | |
| 2681 | + kfree(dm[i]); | |
| 2683 | 2682 | goto out; |
| 2684 | 2683 | } |
| 2685 | − } | |
| 2686 | − /* initialize or tear down tunnel QPs for the slave */ | |
| 2687 | − for (i = 0; i < ports; i++) { | |
| 2688 | 2684 | INIT_WORK(&dm[i]->work, mlx4_ib_tunnels_update_work); |
| 2689 | 2685 | dm[i]->port = first_port + i + 1; |
| 2690 | 2686 | dm[i]->slave = slave; |
| 2691 | 2687 | dm[i]->do_init = do_init; |
| 2692 | 2688 | dm[i]->dev = ibdev; |
| 2693 | − spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags); | |
| 2694 | − if (!ibdev->sriov.is_going_down) | |
| 2689 | + } | |
| 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 | 2694 | queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work); |
| 2696 | 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 | 2701 | out: |
| 2699 | 2702 | kfree(dm); |
| @@ -68,8 +68,9 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, · 67 unmodified lines | ||
| 68 | 68 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 69 | 69 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 70 | 70 | |
| 71 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 72 | − *out_mad_size != sizeof(*out_mad)); | |
| 71 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 72 | + *out_mad_size != sizeof(*out_mad))) | |
| 73 | + return IB_MAD_RESULT_FAILURE; | |
| 73 | 74 | |
| 74 | 75 | slid = in_wc ? in_wc->slid : be16_to_cpu(IB_LID_PERMISSIVE); |
| 75 | 76 | |
| @@ -209,8 +209,9 @@ int mthca_process_mad(struct ib_device *ibdev, · 208 unmodified lines | ||
| 209 | 209 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 210 | 210 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 211 | 211 | |
| 212 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 213 | − *out_mad_size != sizeof(*out_mad)); | |
| 212 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 213 | + *out_mad_size != sizeof(*out_mad))) | |
| 214 | + return IB_MAD_RESULT_FAILURE; | |
| 214 | 215 | |
| 215 | 216 | /* Forward locally generated traps to the SM */ |
| 216 | 217 | if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP && |
| @@ -1520,8 +1520,9 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi · 1519 unmodified lines | ||
| 1520 | 1520 | int rc = arpindex; |
| 1521 | 1521 | struct net_device *netdev; |
| 1522 | 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 | 1526 | if (IS_ERR(rt)) { |
| 1526 | 1527 | printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", |
| 1527 | 1528 | __func__, dst_ip); |
| @@ -1533,7 +1534,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi · 5 unmodified lines | ||
| 1533 | 1534 | else |
| 1534 | 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 | 1539 | rcu_read_lock(); |
| 1539 | 1540 | if (neigh) { |
| @@ -3861,7 +3861,7 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr, · 3860 unmodified lines | ||
| 3861 | 3861 | (((u32)mac_addr[2]) << 24) | (((u32)mac_addr[3]) << 16) | |
| 3862 | 3862 | (((u32)mac_addr[4]) << 8) | (u32)mac_addr[5]); |
| 3863 | 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 | 3865 | } else { |
| 3866 | 3866 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = 0; |
| 3867 | 3867 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = 0; |
| @@ -215,8 +215,9 @@ int ocrdma_process_mad(struct ib_device *ibdev, · 214 unmodified lines | ||
| 215 | 215 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 216 | 216 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 217 | 217 | |
| 218 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 219 | − *out_mad_size != sizeof(*out_mad)); | |
| 218 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 219 | + *out_mad_size != sizeof(*out_mad))) | |
| 220 | + return IB_MAD_RESULT_FAILURE; | |
| 220 | 221 | |
| 221 | 222 | switch (in_mad->mad_hdr.mgmt_class) { |
| 222 | 223 | case IB_MGMT_CLASS_PERF_MGMT: |
| @@ -696,6 +696,7 @@ static void __exit ocrdma_exit_module(void) · 695 unmodified lines | ||
| 696 | 696 | ocrdma_unregister_inet6addr_notifier(); |
| 697 | 697 | ocrdma_unregister_inetaddr_notifier(); |
| 698 | 698 | ocrdma_rem_debugfs(); |
| 699 | + idr_destroy(&ocrdma_dev_id); | |
| 699 | 700 | } |
| 700 | 701 | |
| 701 | 702 | module_init(ocrdma_init_module); |
| @@ -2412,8 +2412,9 @@ int qib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port, · 2411 unmodified lines | ||
| 2412 | 2412 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 2413 | 2413 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 2414 | 2414 | |
| 2415 | − BUG_ON(in_mad_size != sizeof(*in_mad) || | |
| 2416 | − *out_mad_size != sizeof(*out_mad)); | |
| 2415 | + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || | |
| 2416 | + *out_mad_size != sizeof(*out_mad))) | |
| 2417 | + return IB_MAD_RESULT_FAILURE; | |
| 2417 | 2418 | |
| 2418 | 2419 | switch (in_mad->mad_hdr.mgmt_class) { |
| 2419 | 2420 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: |
| @@ -239,7 +239,7 @@ struct ipoib_cm_tx { · 238 unmodified lines | ||
| 239 | 239 | struct net_device *dev; |
| 240 | 240 | struct ipoib_neigh *neigh; |
| 241 | 241 | struct ipoib_path *path; |
| 242 | − struct ipoib_cm_tx_buf *tx_ring; | |
| 242 | + struct ipoib_tx_buf *tx_ring; | |
| 243 | 243 | unsigned tx_head; |
| 244 | 244 | unsigned tx_tail; |
| 245 | 245 | unsigned long flags; |
| @@ -504,6 +504,33 @@ int ipoib_mcast_stop_thread(struct net_device *dev); · 258 unmodified lines | ||
| 504 | 504 | void ipoib_mcast_dev_down(struct net_device *dev); |
| 505 | 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 | 534 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
| 508 | 535 | struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); |
| 509 | 536 | int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); |
| @@ -694,14 +694,12 @@ repost: · 693 unmodified lines | ||
| 694 | 694 | static inline int post_send(struct ipoib_dev_priv *priv, |
| 695 | 695 | struct ipoib_cm_tx *tx, |
| 696 | 696 | unsigned int wr_id, |
| 697 | − u64 addr, int len) | |
| 697 | + struct ipoib_tx_buf *tx_req) | |
| 698 | 698 | { |
| 699 | 699 | struct ib_send_wr *bad_wr; |
| 700 | 700 | |
| 701 | − priv->tx_sge[0].addr = addr; | |
| 702 | − priv->tx_sge[0].length = len; | |
| 701 | + ipoib_build_sge(priv, tx_req); | |
| 703 | 702 | |
| 704 | − priv->tx_wr.num_sge = 1; | |
| 705 | 703 | priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM; |
| 706 | 704 | |
| 707 | 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, · 2 unmodified lines | ||
| 710 | 708 | void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx) |
| 711 | 709 | { |
| 712 | 710 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 713 | − struct ipoib_cm_tx_buf *tx_req; | |
| 714 | − u64 addr; | |
| 711 | + struct ipoib_tx_buf *tx_req; | |
| 715 | 712 | int rc; |
| 716 | 713 | |
| 717 | 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_ · 17 unmodified lines | ||
| 735 | 732 | */ |
| 736 | 733 | tx_req = &tx->tx_ring[tx->tx_head & (ipoib_sendq_size - 1)]; |
| 737 | 734 | tx_req->skb = skb; |
| 738 | − addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE); | |
| 739 | − if (unlikely(ib_dma_mapping_error(priv->ca, addr))) { | |
| 735 | + | |
| 736 | + if (unlikely(ipoib_dma_map_tx(priv->ca, tx_req))) { | |
| 740 | 737 | ++dev->stats.tx_errors; |
| 741 | 738 | dev_kfree_skb_any(skb); |
| 742 | 739 | return; |
| 743 | 740 | } |
| 744 | 741 | |
| 745 | − tx_req->mapping = addr; | |
| 746 | − | |
| 747 | 742 | skb_orphan(skb); |
| 748 | 743 | skb_dst_drop(skb); |
| 749 | 744 | |
| 750 | − rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), | |
| 751 | − addr, skb->len); | |
| 745 | + rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), tx_req); | |
| 752 | 746 | if (unlikely(rc)) { |
| 753 | 747 | ipoib_warn(priv, "post_send failed, error %d\n", rc); |
| 754 | 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 | 750 | dev_kfree_skb_any(skb); |
| 757 | 751 | } else { |
| 758 | 752 | dev->trans_start = jiffies; |
| @@ -777,7 +771,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) · 18 unmodified lines | ||
| 777 | 771 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 778 | 772 | struct ipoib_cm_tx *tx = wc->qp->qp_context; |
| 779 | 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 | 775 | unsigned long flags; |
| 782 | 776 | |
| 783 | 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) · 7 unmodified lines | ||
| 791 | 785 | |
| 792 | 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 | 790 | /* FIXME: is this right? Shouldn't we only increment on success? */ |
| 797 | 791 | ++dev->stats.tx_packets; |
| @@ -1036,6 +1030,9 @@ static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_ · 238 unmodified lines | ||
| 1036 | 1030 | |
| 1037 | 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 | 1036 | tx_qp = ib_create_qp(priv->pd, &attr); |
| 1040 | 1037 | if (PTR_ERR(tx_qp) == -EINVAL) { |
| 1041 | 1038 | ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n", |
| @@ -1170,7 +1167,7 @@ err_tx: · 128 unmodified lines | ||
| 1170 | 1167 | static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p) |
| 1171 | 1168 | { |
| 1172 | 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 | 1171 | unsigned long begin; |
| 1175 | 1172 | |
| 1176 | 1173 | ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n", |
| @@ -1197,8 +1194,7 @@ timeout: · 20 unmodified lines | ||
| 1197 | 1194 | |
| 1198 | 1195 | while ((int) p->tx_tail - (int) p->tx_head < 0) { |
| 1199 | 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, | |
| 1201 | − DMA_TO_DEVICE); | |
| 1197 | + ipoib_dma_unmap_tx(priv, tx_req); | |
| 1202 | 1198 | dev_kfree_skb_any(tx_req->skb); |
| 1203 | 1199 | ++p->tx_tail; |
| 1204 | 1200 | netif_tx_lock_bh(p->dev); |
| @@ -1455,7 +1451,6 @@ static void ipoib_cm_stale_task(struct work_struct *work) · 250 unmodified lines | ||
| 1455 | 1451 | spin_unlock_irq(&priv->lock); |
| 1456 | 1452 | } |
| 1457 | 1453 | |
| 1458 | − | |
| 1459 | 1454 | static ssize_t show_mode(struct device *d, struct device_attribute *attr, |
| 1460 | 1455 | char *buf) |
| 1461 | 1456 | { |
| @@ -263,8 +263,7 @@ repost: · 262 unmodified lines | ||
| 263 | 263 | "for buf %d\n", wr_id); |
| 264 | 264 | } |
| 265 | 265 | |
| 266 | −static int ipoib_dma_map_tx(struct ib_device *ca, | |
| 267 | − struct ipoib_tx_buf *tx_req) | |
| 266 | +int ipoib_dma_map_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req) | |
| 268 | 267 | { |
| 269 | 268 | struct sk_buff *skb = tx_req->skb; |
| 270 | 269 | u64 *mapping = tx_req->mapping; |
| @@ -305,8 +304,8 @@ partial_error: · 34 unmodified lines | ||
| 305 | 304 | return -EIO; |
| 306 | 305 | } |
| 307 | 306 | |
| 308 | −static void ipoib_dma_unmap_tx(struct ib_device *ca, | |
| 309 | − struct ipoib_tx_buf *tx_req) | |
| 307 | +void ipoib_dma_unmap_tx(struct ipoib_dev_priv *priv, | |
| 308 | + struct ipoib_tx_buf *tx_req) | |
| 310 | 309 | { |
| 311 | 310 | struct sk_buff *skb = tx_req->skb; |
| 312 | 311 | u64 *mapping = tx_req->mapping; |
| @@ -314,7 +313,8 @@ static void ipoib_dma_unmap_tx(struct ib_device *ca, · 1 unmodified line | ||
| 314 | 313 | int off; |
| 315 | 314 | |
| 316 | 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 | 318 | off = 1; |
| 319 | 319 | } else |
| 320 | 320 | off = 0; |
| @@ -322,8 +322,8 @@ static void ipoib_dma_unmap_tx(struct ib_device *ca, · 1 unmodified line | ||
| 322 | 322 | for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) { |
| 323 | 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), | |
| 326 | − DMA_TO_DEVICE); | |
| 325 | + ib_dma_unmap_page(priv->ca, mapping[i + off], | |
| 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) · 59 unmodified lines | ||
| 389 | 389 | |
| 390 | 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 | 394 | ++dev->stats.tx_packets; |
| 395 | 395 | dev->stats.tx_bytes += tx_req->skb->len; |
| @@ -514,24 +514,10 @@ static inline int post_send(struct ipoib_dev_priv *priv, · 118 unmodified lines | ||
| 514 | 514 | void *head, int hlen) |
| 515 | 515 | { |
| 516 | 516 | struct ib_send_wr *bad_wr; |
| 517 | − int i, off; | |
| 518 | 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)) { | |
| 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; | |
| 519 | + ipoib_build_sge(priv, tx_req); | |
| 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 | 521 | priv->tx_wr.wr_id = wr_id; |
| 536 | 522 | priv->tx_wr.wr.ud.remote_qpn = qpn; |
| 537 | 523 | priv->tx_wr.wr.ud.ah = address; |
| @@ -617,7 +603,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, · 79 unmodified lines | ||
| 617 | 603 | ipoib_warn(priv, "post_send failed, error %d\n", rc); |
| 618 | 604 | ++dev->stats.tx_errors; |
| 619 | 605 | --priv->tx_outstanding; |
| 620 | − ipoib_dma_unmap_tx(priv->ca, tx_req); | |
| 606 | + ipoib_dma_unmap_tx(priv, tx_req); | |
| 621 | 607 | dev_kfree_skb_any(skb); |
| 622 | 608 | if (netif_queue_stopped(dev)) |
| 623 | 609 | netif_wake_queue(dev); |
| @@ -868,7 +854,7 @@ int ipoib_ib_dev_stop(struct net_device *dev) · 244 unmodified lines | ||
| 868 | 854 | while ((int) priv->tx_tail - (int) priv->tx_head < 0) { |
| 869 | 855 | tx_req = &priv->tx_ring[priv->tx_tail & |
| 870 | 856 | (ipoib_sendq_size - 1)]; |
| 871 | − ipoib_dma_unmap_tx(priv->ca, tx_req); | |
| 857 | + ipoib_dma_unmap_tx(priv, tx_req); | |
| 872 | 858 | dev_kfree_skb_any(tx_req->skb); |
| 873 | 859 | ++priv->tx_tail; |
| 874 | 860 | --priv->tx_outstanding; |
| @@ -985,20 +971,21 @@ static inline int update_child_pkey(struct ipoib_dev_priv *priv) · 110 unmodified lines | ||
| 985 | 971 | } |
| 986 | 972 | |
| 987 | 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 | 977 | struct ipoib_dev_priv *cpriv; |
| 991 | 978 | struct net_device *dev = priv->dev; |
| 992 | 979 | int result; |
| 993 | 980 | |
| 994 | − down_read(&priv->vlan_rwsem); | |
| 981 | + down_read_nested(&priv->vlan_rwsem, nesting); | |
| 995 | 982 | |
| 996 | 983 | /* |
| 997 | 984 | * Flush any child interfaces too -- they might be up even if |
| 998 | 985 | * the parent is down. |
| 999 | 986 | */ |
| 1000 | 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 | 990 | up_read(&priv->vlan_rwsem); |
| 1004 | 991 | |
| @@ -1076,7 +1063,7 @@ void ipoib_ib_dev_flush_light(struct work_struct *work) · 71 unmodified lines | ||
| 1076 | 1063 | struct ipoib_dev_priv *priv = |
| 1077 | 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 | 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) · 1 unmodified line | ||
| 1084 | 1071 | struct ipoib_dev_priv *priv = |
| 1085 | 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 | 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) · 1 unmodified line | ||
| 1092 | 1079 | struct ipoib_dev_priv *priv = |
| 1093 | 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 | 1085 | void ipoib_ib_dev_cleanup(struct net_device *dev) |
| @@ -190,7 +190,7 @@ static netdev_features_t ipoib_fix_features(struct net_device *dev, netdev_featu · 189 unmodified lines | ||
| 190 | 190 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 191 | 191 | |
| 192 | 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 | 195 | return features; |
| 196 | 196 | } |
| @@ -232,6 +232,7 @@ int ipoib_set_mode(struct net_device *dev, const char *buf) · 35 unmodified lines | ||
| 232 | 232 | ipoib_warn(priv, "enabling connected mode " |
| 233 | 233 | "will cause multicast packet drops\n"); |
| 234 | 234 | netdev_update_features(dev); |
| 235 | + dev_set_mtu(dev, ipoib_cm_max_mtu(dev)); | |
| 235 | 236 | rtnl_unlock(); |
| 236 | 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, · 1339 unmodified lines | ||
| 1577 | 1578 | SET_NETDEV_DEV(priv->dev, hca->dma_device); |
| 1578 | 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 | 1583 | priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu); |
| 1582 | 1584 | else { |
| 1583 | 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, · 14 unmodified lines | ||
| 1598 | 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 | 1605 | goto device_init_failed; |
| 1603 | 1606 | |
| 1604 | 1607 | /* |
| @@ -1684,7 +1687,7 @@ static void ipoib_add_one(struct ib_device *device) · 79 unmodified lines | ||
| 1684 | 1687 | struct list_head *dev_list; |
| 1685 | 1688 | struct net_device *dev; |
| 1686 | 1689 | struct ipoib_dev_priv *priv; |
| 1687 | − int s, e, p; | |
| 1690 | + int p; | |
| 1688 | 1691 | int count = 0; |
| 1689 | 1692 | |
| 1690 | 1693 | dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL); |
| @@ -1693,15 +1696,7 @@ static void ipoib_add_one(struct ib_device *device) · 2 unmodified lines | ||
| 1693 | 1696 | |
| 1694 | 1697 | INIT_LIST_HEAD(dev_list); |
| 1695 | 1698 | |
| 1696 | − if (device->node_type == RDMA_NODE_IB_SWITCH) { | |
| 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) { | |
| 1699 | + for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { | |
| 1705 | 1700 | if (!rdma_protocol_ib(device, p)) |
| 1706 | 1701 | continue; |
| 1707 | 1702 | dev = ipoib_add_port("ib%d", device, p); |
| @@ -161,13 +161,10 @@ static int srp_tmo_set(const char *val, const struct kernel_param *kp) · 160 unmodified lines | ||
| 161 | 161 | { |
| 162 | 162 | int tmo, res; |
| 163 | 163 | |
| 164 | − if (strncmp(val, "off", 3) != 0) { | |
| 165 | − res = kstrtoint(val, 0, &tmo); | |
| 166 | − if (res) | |
| 167 | − goto out; | |
| 168 | − } else { | |
| 169 | − tmo = -1; | |
| 170 | − } | |
| 164 | + res = srp_parse_tmo(&tmo, val); | |
| 165 | + if (res) | |
| 166 | + goto out; | |
| 167 | + | |
| 171 | 168 | if (kp->arg == &srp_reconnect_delay) |
| 172 | 169 | res = srp_tmo_valid(tmo, srp_fast_io_fail_tmo, |
| 173 | 170 | srp_dev_loss_tmo); |
| @@ -3379,7 +3376,7 @@ static void srp_add_one(struct ib_device *device) · 3205 unmodified lines | ||
| 3379 | 3376 | struct srp_device *srp_dev; |
| 3380 | 3377 | struct ib_device_attr *dev_attr; |
| 3381 | 3378 | struct srp_host *host; |
| 3382 | − int mr_page_shift, s, e, p; | |
| 3379 | + int mr_page_shift, p; | |
| 3383 | 3380 | u64 max_pages_per_mr; |
| 3384 | 3381 | |
| 3385 | 3382 | dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL); |
| @@ -3443,15 +3440,7 @@ static void srp_add_one(struct ib_device *device) · 57 unmodified lines | ||
| 3443 | 3440 | if (IS_ERR(srp_dev->mr)) |
| 3444 | 3441 | goto err_pd; |
| 3445 | 3442 | |
| 3446 | − if (device->node_type == RDMA_NODE_IB_SWITCH) { | |
| 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) { | |
| 3443 | + for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { | |
| 3455 | 3444 | host = srp_add_port(srp_dev, p); |
| 3456 | 3445 | if (host) |
| 3457 | 3446 | list_add_tail(&host->list, &srp_dev->dev_list); |
| @@ -302,7 +302,7 @@ static void srpt_get_iou(struct ib_dm_mad *mad) · 301 unmodified lines | ||
| 302 | 302 | int i; |
| 303 | 303 | |
| 304 | 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 | 306 | ioui->max_controllers = 16; |
| 307 | 307 | |
| 308 | 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, · 21 unmodified lines | ||
| 330 | 330 | |
| 331 | 331 | if (!slot || slot > 16) { |
| 332 | 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 | 334 | return; |
| 335 | 335 | } |
| 336 | 336 | |
| 337 | 337 | if (slot > 2) { |
| 338 | 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 | 340 | return; |
| 341 | 341 | } |
| 342 | 342 | |
| @@ -348,10 +348,10 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot, · 5 unmodified lines | ||
| 348 | 348 | iocp->device_version = cpu_to_be16(sdev->dev_attr.hw_ver); |
| 349 | 349 | iocp->subsys_vendor_id = cpu_to_be32(sdev->dev_attr.vendor_id); |
| 350 | 350 | iocp->subsys_device_id = 0x0; |
| 351 | − iocp->io_class = __constant_cpu_to_be16(SRP_REV16A_IB_IO_CLASS); | |
| 352 | − iocp->io_subclass = __constant_cpu_to_be16(SRP_IO_SUBCLASS); | |
| 353 | − iocp->protocol = __constant_cpu_to_be16(SRP_PROTOCOL); | |
| 354 | − iocp->protocol_version = __constant_cpu_to_be16(SRP_PROTOCOL_VERSION); | |
| 351 | + iocp->io_class = cpu_to_be16(SRP_REV16A_IB_IO_CLASS); | |
| 352 | + iocp->io_subclass = cpu_to_be16(SRP_IO_SUBCLASS); | |
| 353 | + iocp->protocol = cpu_to_be16(SRP_PROTOCOL); | |
| 354 | + iocp->protocol_version = cpu_to_be16(SRP_PROTOCOL_VERSION); | |
| 355 | 355 | iocp->send_queue_depth = cpu_to_be16(sdev->srq_size); |
| 356 | 356 | iocp->rdma_read_depth = 4; |
| 357 | 357 | iocp->send_size = cpu_to_be32(srp_max_req_size); |
| @@ -379,13 +379,13 @@ static void srpt_get_svc_entries(u64 ioc_guid, · 21 unmodified lines | ||
| 379 | 379 | |
| 380 | 380 | if (!slot || slot > 16) { |
| 381 | 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 | 383 | return; |
| 384 | 384 | } |
| 385 | 385 | |
| 386 | 386 | if (slot > 2 || lo > hi || hi > 1) { |
| 387 | 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 | 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, · 44 unmodified lines | ||
| 436 | 436 | break; |
| 437 | 437 | default: |
| 438 | 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 | 440 | break; |
| 441 | 441 | } |
| 442 | 442 | } |
| @@ -493,11 +493,11 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent, · 50 unmodified lines | ||
| 493 | 493 | break; |
| 494 | 494 | case IB_MGMT_METHOD_SET: |
| 495 | 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 | 497 | break; |
| 498 | 498 | default: |
| 499 | 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 | 501 | break; |
| 502 | 502 | } |
| 503 | 503 | |
| @@ -1535,7 +1535,7 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, · 1031 unmodified lines | ||
| 1535 | 1535 | memset(srp_rsp, 0, sizeof *srp_rsp); |
| 1536 | 1536 | srp_rsp->opcode = SRP_RSP; |
| 1537 | 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 | 1539 | srp_rsp->tag = tag; |
| 1540 | 1540 | srp_rsp->status = status; |
| 1541 | 1541 | |
| @@ -1585,8 +1585,8 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch, · 43 unmodified lines | ||
| 1585 | 1585 | memset(srp_rsp, 0, sizeof *srp_rsp); |
| 1586 | 1586 | |
| 1587 | 1587 | srp_rsp->opcode = SRP_RSP; |
| 1588 | − srp_rsp->req_lim_delta = __constant_cpu_to_be32(1 | |
| 1589 | − + atomic_xchg(&ch->req_lim_delta, 0)); | |
| 1588 | + srp_rsp->req_lim_delta = | |
| 1589 | + cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0)); | |
| 1590 | 1590 | srp_rsp->tag = tag; |
| 1591 | 1591 | |
| 1592 | 1592 | srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID; |
| @@ -1630,7 +1630,7 @@ static uint64_t srpt_unpack_lun(const uint8_t *lun, int len) · 37 unmodified lines | ||
| 1630 | 1630 | switch (len) { |
| 1631 | 1631 | case 8: |
| 1632 | 1632 | if ((*((__be64 *)lun) & |
| 1633 | − __constant_cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0) | |
| 1633 | + cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0) | |
| 1634 | 1634 | goto out_err; |
| 1635 | 1635 | break; |
| 1636 | 1636 | case 4: |
| @@ -2449,8 +2449,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 812 unmodified lines | ||
| 2449 | 2449 | } |
| 2450 | 2450 | |
| 2451 | 2451 | if (it_iu_len > srp_max_req_size || it_iu_len < 64) { |
| 2452 | − rej->reason = __constant_cpu_to_be32( | |
| 2453 | − SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE); | |
| 2452 | + rej->reason = cpu_to_be32( | |
| 2453 | + SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE); | |
| 2454 | 2454 | ret = -EINVAL; |
| 2455 | 2455 | pr_err("rejected SRP_LOGIN_REQ because its" |
| 2456 | 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, · 2 unmodified lines | ||
| 2459 | 2459 | } |
| 2460 | 2460 | |
| 2461 | 2461 | if (!sport->enabled) { |
| 2462 | − rej->reason = __constant_cpu_to_be32( | |
| 2463 | − SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2462 | + rej->reason = cpu_to_be32( | |
| 2463 | + SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2464 | 2464 | ret = -EINVAL; |
| 2465 | 2465 | pr_err("rejected SRP_LOGIN_REQ because the target port" |
| 2466 | 2466 | " has not yet been enabled\n"); |
| @@ -2505,8 +2505,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 38 unmodified lines | ||
| 2505 | 2505 | if (*(__be64 *)req->target_port_id != cpu_to_be64(srpt_service_guid) |
| 2506 | 2506 | || *(__be64 *)(req->target_port_id + 8) != |
| 2507 | 2507 | cpu_to_be64(srpt_service_guid)) { |
| 2508 | − rej->reason = __constant_cpu_to_be32( | |
| 2509 | − SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL); | |
| 2508 | + rej->reason = cpu_to_be32( | |
| 2509 | + SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL); | |
| 2510 | 2510 | ret = -ENOMEM; |
| 2511 | 2511 | pr_err("rejected SRP_LOGIN_REQ because it" |
| 2512 | 2512 | " has an invalid target port identifier.\n"); |
| @@ -2515,8 +2515,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 2 unmodified lines | ||
| 2515 | 2515 | |
| 2516 | 2516 | ch = kzalloc(sizeof *ch, GFP_KERNEL); |
| 2517 | 2517 | if (!ch) { |
| 2518 | − rej->reason = __constant_cpu_to_be32( | |
| 2519 | − SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2518 | + rej->reason = cpu_to_be32( | |
| 2519 | + SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2520 | 2520 | pr_err("rejected SRP_LOGIN_REQ because no memory.\n"); |
| 2521 | 2521 | ret = -ENOMEM; |
| 2522 | 2522 | goto reject; |
| @@ -2552,8 +2552,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 29 unmodified lines | ||
| 2552 | 2552 | |
| 2553 | 2553 | ret = srpt_create_ch_ib(ch); |
| 2554 | 2554 | if (ret) { |
| 2555 | − rej->reason = __constant_cpu_to_be32( | |
| 2556 | − SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2555 | + rej->reason = cpu_to_be32( | |
| 2556 | + SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2557 | 2557 | pr_err("rejected SRP_LOGIN_REQ because creating" |
| 2558 | 2558 | " a new RDMA channel failed.\n"); |
| 2559 | 2559 | goto free_ring; |
| @@ -2561,8 +2561,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 1 unmodified line | ||
| 2561 | 2561 | |
| 2562 | 2562 | ret = srpt_ch_qp_rtr(ch, ch->qp); |
| 2563 | 2563 | if (ret) { |
| 2564 | − rej->reason = __constant_cpu_to_be32( | |
| 2565 | − SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2564 | + rej->reason = cpu_to_be32(SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2566 | 2565 | pr_err("rejected SRP_LOGIN_REQ because enabling" |
| 2567 | 2566 | " RTR failed (error code = %d)\n", ret); |
| 2568 | 2567 | goto destroy_ib; |
| @@ -2580,15 +2579,15 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 11 unmodified lines | ||
| 2580 | 2579 | if (!nacl) { |
| 2581 | 2580 | pr_info("Rejected login because no ACL has been" |
| 2582 | 2581 | " configured yet for initiator %s.\n", ch->sess_name); |
| 2583 | − rej->reason = __constant_cpu_to_be32( | |
| 2584 | − SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED); | |
| 2582 | + rej->reason = cpu_to_be32( | |
| 2583 | + SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED); | |
| 2585 | 2584 | goto destroy_ib; |
| 2586 | 2585 | } |
| 2587 | 2586 | |
| 2588 | 2587 | ch->sess = transport_init_session(TARGET_PROT_NORMAL); |
| 2589 | 2588 | if (IS_ERR(ch->sess)) { |
| 2590 | − rej->reason = __constant_cpu_to_be32( | |
| 2591 | − SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2589 | + rej->reason = cpu_to_be32( | |
| 2590 | + SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | |
| 2592 | 2591 | pr_debug("Failed to create session\n"); |
| 2593 | 2592 | goto deregister_session; |
| 2594 | 2593 | } |
| @@ -2604,8 +2603,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · 9 unmodified lines | ||
| 2604 | 2603 | rsp->max_it_iu_len = req->req_it_iu_len; |
| 2605 | 2604 | rsp->max_ti_iu_len = req->req_it_iu_len; |
| 2606 | 2605 | ch->max_ti_iu_len = it_iu_len; |
| 2607 | − rsp->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT | |
| 2608 | − | SRP_BUF_FORMAT_INDIRECT); | |
| 2606 | + rsp->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT | |
| 2607 | + | SRP_BUF_FORMAT_INDIRECT); | |
| 2609 | 2608 | rsp->req_lim_delta = cpu_to_be32(ch->rq_size); |
| 2610 | 2609 | atomic_set(&ch->req_lim, ch->rq_size); |
| 2611 | 2610 | atomic_set(&ch->req_lim_delta, 0); |
| @@ -2655,8 +2654,8 @@ free_ch: · 43 unmodified lines | ||
| 2655 | 2654 | reject: |
| 2656 | 2655 | rej->opcode = SRP_LOGIN_REJ; |
| 2657 | 2656 | rej->tag = req->tag; |
| 2658 | − rej->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT | |
| 2659 | − | SRP_BUF_FORMAT_INDIRECT); | |
| 2657 | + rej->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT | |
| 2658 | + | SRP_BUF_FORMAT_INDIRECT); | |
| 2660 | 2659 | |
| 2661 | 2660 | ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0, |
| 2662 | 2661 | (void *)rej, sizeof *rej); |
| @@ -75,6 +75,13 @@ struct its_node { · 74 unmodified lines | ||
| 75 | 75 | |
| 76 | 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 | 86 | * The ITS view of a device - belongs to an ITS, a collection, owns an |
| 80 | 87 | * interrupt translation table, and a list of interrupts. |
| @@ -82,11 +89,8 @@ struct its_node { · 1 unmodified line | ||
| 82 | 89 | struct its_device { |
| 83 | 90 | struct list_head entry; |
| 84 | 91 | struct its_node *its; |
| 85 | − struct its_collection *collection; | |
| 92 | + struct event_lpi_map event_map; | |
| 86 | 93 | void *itt; |
| 87 | − unsigned long *lpi_map; | |
| 88 | − irq_hw_number_t lpi_base; | |
| 89 | − int nr_lpis; | |
| 90 | 94 | u32 nr_ites; |
| 91 | 95 | u32 device_id; |
| 92 | 96 | }; |
| @@ -99,6 +103,14 @@ static struct rdists *gic_rdists; · 6 unmodified lines | ||
| 99 | 103 | #define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist)) |
| 100 | 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 | 115 | * ITS command descriptors - parameters to be encoded in a command |
| 104 | 116 | * block. |
| @@ -134,7 +146,7 @@ struct its_cmd_desc { · 29 unmodified lines | ||
| 134 | 146 | struct { |
| 135 | 147 | struct its_device *dev; |
| 136 | 148 | struct its_collection *col; |
| 137 | − u32 id; | |
| 149 | + u32 event_id; | |
| 138 | 150 | } its_movi_cmd; |
| 139 | 151 | |
| 140 | 152 | struct { |
| @@ -241,7 +253,7 @@ static struct its_collection *its_build_mapd_cmd(struct its_cmd_block *cmd, · 100 unmodified lines | ||
| 241 | 253 | |
| 242 | 254 | its_fixup_cmd(cmd); |
| 243 | 255 | |
| 244 | − return desc->its_mapd_cmd.dev->collection; | |
| 256 | + return NULL; | |
| 245 | 257 | } |
| 246 | 258 | |
| 247 | 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, · 12 unmodified lines | ||
| 260 | 272 | static struct its_collection *its_build_mapvi_cmd(struct its_cmd_block *cmd, |
| 261 | 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 | 280 | its_encode_cmd(cmd, GITS_CMD_MAPVI); |
| 264 | 281 | its_encode_devid(cmd, desc->its_mapvi_cmd.dev->device_id); |
| 265 | 282 | its_encode_event_id(cmd, desc->its_mapvi_cmd.event_id); |
| 266 | 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 | 286 | its_fixup_cmd(cmd); |
| 270 | 287 | |
| 271 | − return desc->its_mapvi_cmd.dev->collection; | |
| 288 | + return col; | |
| 272 | 289 | } |
| 273 | 290 | |
| 274 | 291 | static struct its_collection *its_build_movi_cmd(struct its_cmd_block *cmd, |
| 275 | 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 | 299 | its_encode_cmd(cmd, GITS_CMD_MOVI); |
| 278 | 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 | 302 | its_encode_collection(cmd, desc->its_movi_cmd.col->col_id); |
| 281 | 303 | |
| 282 | 304 | its_fixup_cmd(cmd); |
| 283 | 305 | |
| 284 | − return desc->its_movi_cmd.dev->collection; | |
| 306 | + return col; | |
| 285 | 307 | } |
| 286 | 308 | |
| 287 | 309 | static struct its_collection *its_build_discard_cmd(struct its_cmd_block *cmd, |
| 288 | 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 | 317 | its_encode_cmd(cmd, GITS_CMD_DISCARD); |
| 291 | 318 | its_encode_devid(cmd, desc->its_discard_cmd.dev->device_id); |
| 292 | 319 | its_encode_event_id(cmd, desc->its_discard_cmd.event_id); |
| 293 | 320 | |
| 294 | 321 | its_fixup_cmd(cmd); |
| 295 | 322 | |
| 296 | − return desc->its_discard_cmd.dev->collection; | |
| 323 | + return col; | |
| 297 | 324 | } |
| 298 | 325 | |
| 299 | 326 | static struct its_collection *its_build_inv_cmd(struct its_cmd_block *cmd, |
| 300 | 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 | 334 | its_encode_cmd(cmd, GITS_CMD_INV); |
| 303 | 335 | its_encode_devid(cmd, desc->its_inv_cmd.dev->device_id); |
| 304 | 336 | its_encode_event_id(cmd, desc->its_inv_cmd.event_id); |
| 305 | 337 | |
| 306 | 338 | its_fixup_cmd(cmd); |
| 307 | 339 | |
| 308 | − return desc->its_inv_cmd.dev->collection; | |
| 340 | + return col; | |
| 309 | 341 | } |
| 310 | 342 | |
| 311 | 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, · 185 unmodified lines | ||
| 497 | 529 | |
| 498 | 530 | desc.its_movi_cmd.dev = dev; |
| 499 | 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 | 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) · 24 unmodified lines | ||
| 528 | 560 | static inline u32 its_get_event_id(struct irq_data *d) |
| 529 | 561 | { |
| 530 | 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 | 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, · 48 unmodified lines | ||
| 583 | 615 | |
| 584 | 616 | target_col = &its_dev->its->collections[cpu]; |
| 585 | 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 | 620 | return IRQ_SET_MASK_OK_DONE; |
| 589 | 621 | } |
| @@ -713,8 +745,10 @@ out: · 123 unmodified lines | ||
| 713 | 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 | 752 | int lpi; |
| 719 | 753 | |
| 720 | 754 | spin_lock(&lpi_lock); |
| @@ -731,7 +765,8 @@ static void its_lpi_free(unsigned long *bitmap, int base, int nr_ids) · 10 unmodified lines | ||
| 731 | 765 | |
| 732 | 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, · 361 unmodified lines | ||
| 1099 | 1134 | struct its_device *dev; |
| 1100 | 1135 | unsigned long *lpi_map; |
| 1101 | 1136 | unsigned long flags; |
| 1137 | + u16 *col_map = NULL; | |
| 1102 | 1138 | void *itt; |
| 1103 | 1139 | int lpi_base; |
| 1104 | 1140 | int nr_lpis; |
| 1105 | 1141 | int nr_ites; |
| 1106 | − int cpu; | |
| 1107 | 1142 | int sz; |
| 1108 | 1143 | |
| 1109 | 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, · 7 unmodified lines | ||
| 1117 | 1152 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; |
| 1118 | 1153 | itt = kzalloc(sz, GFP_KERNEL); |
| 1119 | 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 | 1159 | kfree(dev); |
| 1123 | 1160 | kfree(itt); |
| 1124 | 1161 | kfree(lpi_map); |
| 1162 | + kfree(col_map); | |
| 1125 | 1163 | return NULL; |
| 1126 | 1164 | } |
| 1127 | 1165 | |
| 1128 | 1166 | dev->its = its; |
| 1129 | 1167 | dev->itt = itt; |
| 1130 | 1168 | dev->nr_ites = nr_ites; |
| 1131 | − dev->lpi_map = lpi_map; | |
| 1132 | − dev->lpi_base = lpi_base; | |
| 1133 | − dev->nr_lpis = nr_lpis; | |
| 1169 | + dev->event_map.lpi_map = lpi_map; | |
| 1170 | + dev->event_map.col_map = col_map; | |
| 1171 | + dev->event_map.lpi_base = lpi_base; | |
| 1172 | + dev->event_map.nr_lpis = nr_lpis; | |
| 1134 | 1173 | dev->device_id = dev_id; |
| 1135 | 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, · 1 unmodified line | ||
| 1138 | 1177 | list_add(&dev->entry, &its->its_device_list); |
| 1139 | 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 | 1180 | /* Map device to its ITT */ |
| 1146 | 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) · 15 unmodified lines | ||
| 1163 | 1198 | { |
| 1164 | 1199 | int idx; |
| 1165 | 1200 | |
| 1166 | − idx = find_first_zero_bit(dev->lpi_map, dev->nr_lpis); | |
| 1167 | − if (idx == dev->nr_lpis) | |
| 1201 | + idx = find_first_zero_bit(dev->event_map.lpi_map, | |
| 1202 | + dev->event_map.nr_lpis); | |
| 1203 | + if (idx == dev->event_map.nr_lpis) | |
| 1168 | 1204 | return -ENOSPC; |
| 1169 | 1205 | |
| 1170 | − *hwirq = dev->lpi_base + idx; | |
| 1171 | − set_bit(idx, dev->lpi_map); | |
| 1206 | + *hwirq = dev->event_map.lpi_base + idx; | |
| 1207 | + set_bit(idx, dev->event_map.lpi_map); | |
| 1172 | 1208 | |
| 1173 | 1209 | return 0; |
| 1174 | 1210 | } |
| @@ -1288,7 +1324,8 @@ static int its_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, · 113 unmodified lines | ||
| 1288 | 1324 | irq_domain_set_hwirq_and_chip(domain, virq + i, |
| 1289 | 1325 | hwirq, &its_irq_chip, its_dev); |
| 1290 | 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 | 1331 | return 0; |
| @@ -1300,6 +1337,9 @@ static void its_irq_domain_activate(struct irq_domain *domain, · 5 unmodified lines | ||
| 1300 | 1337 | struct its_device *its_dev = irq_data_get_irq_chip_data(d); |
| 1301 | 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 | 1343 | /* Map the GIC IRQ and event to the device */ |
| 1304 | 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, · 21 unmodified lines | ||
| 1327 | 1367 | u32 event = its_get_event_id(data); |
| 1328 | 1368 | |
| 1329 | 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 | 1372 | /* Nuke the entry in the domain */ |
| 1333 | 1373 | irq_domain_reset_irq_data(data); |
| 1334 | 1374 | } |
| 1335 | 1375 | |
| 1336 | 1376 | /* If all interrupts have been freed, start mopping the floor */ |
| 1337 | − if (bitmap_empty(its_dev->lpi_map, its_dev->nr_lpis)) { | |
| 1338 | − its_lpi_free(its_dev->lpi_map, | |
| 1339 | − its_dev->lpi_base, | |
| 1340 | − its_dev->nr_lpis); | |
| 1377 | + if (bitmap_empty(its_dev->event_map.lpi_map, | |
| 1378 | + its_dev->event_map.nr_lpis)) { | |
| 1379 | + its_lpi_free(&its_dev->event_map); | |
| 1341 | 1380 | |
| 1342 | 1381 | /* Unmap device/itt */ |
| 1343 | 1382 | its_send_mapd(its_dev, 0); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * SPEAr platform shared irq layer source file |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * Copyright (C) 2012 ST Microelectronics |
| 8 | 8 | * Shiraz Hashim <shiraz.linux.kernel@gmail.com> |
| @@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) · 523 unmodified lines | ||
| 524 | 524 | cs->hw.ser->tty = tty; |
| 525 | 525 | atomic_set(&cs->hw.ser->refcnt, 1); |
| 526 | 526 | init_completion(&cs->hw.ser->dead_cmp); |
| 527 | − | |
| 528 | 527 | tty->disc_data = cs; |
| 529 | 528 | |
| 529 | + /* Set the amount of data we're willing to receive per call | |
| 530 | + * from the hardware driver to half of the input buffer size | |
| 531 | + * to leave some reserve. | |
| 532 | + * Note: We don't do flow control towards the hardware driver. | |
| 533 | + * If more data is received than will fit into the input buffer, | |
| 534 | + * it will be dropped and an error will be logged. This should | |
| 535 | + * never happen as the device is slow and the buffer size ample. | |
| 536 | + */ | |
| 537 | + tty->receive_room = RBUFSIZE/2; | |
| 538 | + | |
| 530 | 539 | /* OK.. Initialization of the datastructures and the HW is done.. Now |
| 531 | 540 | * startup system and notify the LL that we are ready to run |
| 532 | 541 | */ |
| @@ -597,28 +606,6 @@ static int gigaset_tty_hangup(struct tty_struct *tty) · 64 unmodified lines | ||
| 597 | 606 | return 0; |
| 598 | 607 | } |
| 599 | 608 | |
| 600 | −/* | |
| 601 | − * Read on the tty. | |
| 602 | − * Unused, received data goes only to the Gigaset driver. | |
| 603 | − */ | |
| 604 | −static ssize_t | |
| 605 | −gigaset_tty_read(struct tty_struct *tty, struct file *file, | |
| 606 | − unsigned char __user *buf, size_t count) | |
| 607 | −{ | |
| 608 | − return -EAGAIN; | |
| 609 | −} | |
| 610 | − | |
| 611 | −/* | |
| 612 | − * Write on the tty. | |
| 613 | − * Unused, transmit data comes only from the Gigaset driver. | |
| 614 | − */ | |
| 615 | −static ssize_t | |
| 616 | −gigaset_tty_write(struct tty_struct *tty, struct file *file, | |
| 617 | − const unsigned char *buf, size_t count) | |
| 618 | −{ | |
| 619 | − return -EAGAIN; | |
| 620 | −} | |
| 621 | − | |
| 622 | 609 | /* |
| 623 | 610 | * Ioctl on the tty. |
| 624 | 611 | * Called in process context only. |
| @@ -752,8 +739,6 @@ static struct tty_ldisc_ops gigaset_ldisc = { · 127 unmodified lines | ||
| 752 | 739 | .open = gigaset_tty_open, |
| 753 | 740 | .close = gigaset_tty_close, |
| 754 | 741 | .hangup = gigaset_tty_hangup, |
| 755 | − .read = gigaset_tty_read, | |
| 756 | − .write = gigaset_tty_write, | |
| 757 | 742 | .ioctl = gigaset_tty_ioctl, |
| 758 | 743 | .receive_buf = gigaset_tty_receive, |
| 759 | 744 | .write_wakeup = gigaset_tty_wakeup, |
| @@ -320,7 +320,6 @@ static inline void closure_wake_up(struct closure_waitlist *list) · 319 unmodified lines | ||
| 320 | 320 | do { \ |
| 321 | 321 | set_closure_fn(_cl, _fn, _wq); \ |
| 322 | 322 | closure_sub(_cl, CLOSURE_RUNNING + 1); \ |
| 323 | − return; \ | |
| 324 | 323 | } while (0) |
| 325 | 324 | |
| 326 | 325 | /** |
| @@ -349,7 +348,6 @@ do { \ · 22 unmodified lines | ||
| 349 | 348 | do { \ |
| 350 | 349 | set_closure_fn(_cl, _fn, _wq); \ |
| 351 | 350 | closure_queue(_cl); \ |
| 352 | − return; \ | |
| 353 | 351 | } while (0) |
| 354 | 352 | |
| 355 | 353 | /** |
| @@ -365,7 +363,6 @@ do { \ · 9 unmodified lines | ||
| 365 | 363 | do { \ |
| 366 | 364 | set_closure_fn(_cl, _destructor, NULL); \ |
| 367 | 365 | closure_sub(_cl, CLOSURE_RUNNING - CLOSURE_DESTRUCTOR + 1); \ |
| 368 | − return; \ | |
| 369 | 366 | } while (0) |
| 370 | 367 | |
| 371 | 368 | /** |
| @@ -105,6 +105,7 @@ void bch_generic_make_request(struct bio *bio, struct bio_split_pool *p) · 104 unmodified lines | ||
| 105 | 105 | } while (n != bio); |
| 106 | 106 | |
| 107 | 107 | continue_at(&s->cl, bch_bio_submit_split_done, NULL); |
| 108 | + return; | |
| 108 | 109 | submit: |
| 109 | 110 | generic_make_request(bio); |
| 110 | 111 | } |
| @@ -592,12 +592,14 @@ static void journal_write_unlocked(struct closure *cl) · 591 unmodified lines | ||
| 592 | 592 | |
| 593 | 593 | if (!w->need_write) { |
| 594 | 594 | closure_return_with_destructor(cl, journal_write_unlock); |
| 595 | + return; | |
| 595 | 596 | } else if (journal_full(&c->journal)) { |
| 596 | 597 | journal_reclaim(c); |
| 597 | 598 | spin_unlock(&c->journal.lock); |
| 598 | 599 | |
| 599 | 600 | btree_flush_write(c); |
| 600 | 601 | continue_at(cl, journal_write, system_wq); |
| 602 | + return; | |
| 601 | 603 | } |
| 602 | 604 | |
| 603 | 605 | c->journal.blocks_free -= set_blocks(w->data, block_bytes(c)); |
| @@ -88,8 +88,10 @@ static void bch_data_insert_keys(struct closure *cl) · 87 unmodified lines | ||
| 88 | 88 | if (journal_ref) |
| 89 | 89 | atomic_dec_bug(journal_ref); |
| 90 | 90 | |
| 91 | − if (!op->insert_data_done) | |
| 91 | + if (!op->insert_data_done) { | |
| 92 | 92 | continue_at(cl, bch_data_insert_start, op->wq); |
| 93 | + return; | |
| 94 | + } | |
| 93 | 95 | |
| 94 | 96 | bch_keylist_free(&op->insert_keys); |
| 95 | 97 | closure_return(cl); |
| @@ -216,8 +218,10 @@ static void bch_data_insert_start(struct closure *cl) · 120 unmodified lines | ||
| 216 | 218 | /* 1 for the device pointer and 1 for the chksum */ |
| 217 | 219 | if (bch_keylist_realloc(&op->insert_keys, |
| 218 | 220 | 3 + (op->csum ? 1 : 0), |
| 219 | − op->c)) | |
| 221 | + op->c)) { | |
| 220 | 222 | continue_at(cl, bch_data_insert_keys, op->wq); |
| 223 | + return; | |
| 224 | + } | |
| 221 | 225 | |
| 222 | 226 | k = op->insert_keys.top; |
| 223 | 227 | bkey_init(k); |
| @@ -255,6 +259,7 @@ static void bch_data_insert_start(struct closure *cl) · 31 unmodified lines | ||
| 255 | 259 | |
| 256 | 260 | op->insert_data_done = true; |
| 257 | 261 | continue_at(cl, bch_data_insert_keys, op->wq); |
| 262 | + return; | |
| 258 | 263 | err: |
| 259 | 264 | /* bch_alloc_sectors() blocks if s->writeback = true */ |
| 260 | 265 | BUG_ON(op->writeback); |
| @@ -576,8 +581,10 @@ static void cache_lookup(struct closure *cl) · 315 unmodified lines | ||
| 576 | 581 | ret = bch_btree_map_keys(&s->op, s->iop.c, |
| 577 | 582 | &KEY(s->iop.inode, bio->bi_iter.bi_sector, 0), |
| 578 | 583 | cache_lookup_fn, MAP_END_KEY); |
| 579 | − if (ret == -EAGAIN) | |
| 584 | + if (ret == -EAGAIN) { | |
| 580 | 585 | continue_at(cl, cache_lookup, bcache_wq); |
| 586 | + return; | |
| 587 | + } | |
| 581 | 588 | |
| 582 | 589 | closure_return(cl); |
| 583 | 590 | } |
| @@ -1085,6 +1092,7 @@ static void flash_dev_make_request(struct request_queue *q, struct bio *bio) · 501 unmodified lines | ||
| 1085 | 1092 | continue_at_nobarrier(&s->cl, |
| 1086 | 1093 | flash_dev_nodata, |
| 1087 | 1094 | bcache_wq); |
| 1095 | + return; | |
| 1088 | 1096 | } else if (rw) { |
| 1089 | 1097 | bch_keybuf_check_overlapping(&s->iop.c->moving_gc_keys, |
| 1090 | 1098 | &KEY(d->id, bio->bi_iter.bi_sector, 0), |
| @@ -424,7 +424,6 @@ static void free_migration(struct dm_cache_migration *mg) · 423 unmodified lines | ||
| 424 | 424 | wake_up(&cache->migration_wait); |
| 425 | 425 | |
| 426 | 426 | mempool_free(mg, cache->migration_pool); |
| 427 | − wake_worker(cache); | |
| 428 | 427 | } |
| 429 | 428 | |
| 430 | 429 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) |
| @@ -1947,6 +1946,7 @@ static int commit_if_needed(struct cache *cache) · 1516 unmodified lines | ||
| 1947 | 1946 | |
| 1948 | 1947 | static void process_deferred_bios(struct cache *cache) |
| 1949 | 1948 | { |
| 1949 | + bool prealloc_used = false; | |
| 1950 | 1950 | unsigned long flags; |
| 1951 | 1951 | struct bio_list bios; |
| 1952 | 1952 | struct bio *bio; |
| @@ -1981,13 +1981,16 @@ static void process_deferred_bios(struct cache *cache) · 28 unmodified lines | ||
| 1981 | 1981 | process_discard_bio(cache, &structs, bio); |
| 1982 | 1982 | else |
| 1983 | 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 | 1991 | static void process_deferred_cells(struct cache *cache) |
| 1990 | 1992 | { |
| 1993 | + bool prealloc_used = false; | |
| 1991 | 1994 | unsigned long flags; |
| 1992 | 1995 | struct dm_bio_prison_cell *cell, *tmp; |
| 1993 | 1996 | struct list_head cells; |
| @@ -2015,9 +2018,11 @@ static void process_deferred_cells(struct cache *cache) · 21 unmodified lines | ||
| 2015 | 2018 | } |
| 2016 | 2019 | |
| 2017 | 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 | 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) · 38 unmodified lines | ||
| 2062 | 2067 | |
| 2063 | 2068 | static void writeback_some_dirty_blocks(struct cache *cache) |
| 2064 | 2069 | { |
| 2065 | − int r = 0; | |
| 2070 | + bool prealloc_used = false; | |
| 2066 | 2071 | dm_oblock_t oblock; |
| 2067 | 2072 | dm_cblock_t cblock; |
| 2068 | 2073 | struct prealloc structs; |
| @@ -2072,23 +2077,21 @@ static void writeback_some_dirty_blocks(struct cache *cache) · 3 unmodified lines | ||
| 2072 | 2077 | memset(&structs, 0, sizeof(structs)); |
| 2073 | 2078 | |
| 2074 | 2079 | while (spare_migration_bandwidth(cache)) { |
| 2075 | − if (prealloc_data_structs(cache, &structs)) | |
| 2076 | − break; | |
| 2080 | + if (policy_writeback_work(cache->policy, &oblock, &cblock, busy)) | |
| 2081 | + break; /* no work to do */ | |
| 2077 | 2082 | |
| 2078 | − r = policy_writeback_work(cache->policy, &oblock, &cblock, busy); | |
| 2079 | − if (r) | |
| 2080 | − break; | |
| 2081 | − | |
| 2082 | − r = get_cell(cache, oblock, &structs, &old_ocell); | |
| 2083 | − if (r) { | |
| 2083 | + if (prealloc_data_structs(cache, &structs) || | |
| 2084 | + get_cell(cache, oblock, &structs, &old_ocell)) { | |
| 2084 | 2085 | policy_set_dirty(cache->policy, oblock); |
| 2085 | 2086 | break; |
| 2086 | 2087 | } |
| 2087 | 2088 | |
| 2088 | 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) · 1401 unmodified lines | ||
| 3496 | 3499 | * <#demotions> <#promotions> <#dirty> |
| 3497 | 3500 | * <#features> <features>* |
| 3498 | 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 | 3504 | static void cache_status(struct dm_target *ti, status_type_t type, |
| 3502 | 3505 | unsigned status_flags, char *result, unsigned maxlen) |
| @@ -3582,6 +3585,11 @@ static void cache_status(struct dm_target *ti, status_type_t type, · 79 unmodified lines | ||
| 3582 | 3585 | else |
| 3583 | 3586 | DMEMIT("rw "); |
| 3584 | 3587 | |
| 3588 | + if (dm_cache_metadata_needs_check(cache->cmd)) | |
| 3589 | + DMEMIT("needs_check "); | |
| 3590 | + else | |
| 3591 | + DMEMIT("- "); | |
| 3592 | + | |
| 3585 | 3593 | break; |
| 3586 | 3594 | |
| 3587 | 3595 | case STATUSTYPE_TABLE: |
| @@ -3820,7 +3828,7 @@ static void cache_io_hints(struct dm_target *ti, struct queue_limits *limits) · 232 unmodified lines | ||
| 3820 | 3828 | |
| 3821 | 3829 | static struct target_type cache_target = { |
| 3822 | 3830 | .name = "cache", |
| 3823 | − .version = {1, 7, 0}, | |
| 3831 | + .version = {1, 8, 0}, | |
| 3824 | 3832 | .module = THIS_MODULE, |
| 3825 | 3833 | .ctr = cache_ctr, |
| 3826 | 3834 | .dtr = cache_dtr, |
| @@ -18,6 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | #include <linux/init.h> |
| 19 | 19 | #include <linux/module.h> |
| 20 | 20 | #include <linux/slab.h> |
| 21 | +#include <linux/vmalloc.h> | |
| 21 | 22 | #include <linux/sort.h> |
| 22 | 23 | #include <linux/rbtree.h> |
| 23 | 24 | |
| @@ -268,7 +269,7 @@ struct pool { · 244 unmodified lines | ||
| 268 | 269 | process_mapping_fn process_prepared_mapping; |
| 269 | 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 | 275 | static enum pool_mode get_pool_mode(struct pool *pool); |
| @@ -2281,18 +2282,23 @@ static void do_waker(struct work_struct *ws) · 2006 unmodified lines | ||
| 2281 | 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 | 2288 | * We're holding onto IO to allow userland time to react. After the |
| 2286 | 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 | 2292 | static void do_no_space_timeout(struct work_struct *ws) |
| 2290 | 2293 | { |
| 2291 | 2294 | struct pool *pool = container_of(to_delayed_work(ws), struct pool, |
| 2292 | 2295 | no_space_timeout); |
| 2293 | 2296 | |
| 2294 | − if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space) | |
| 2295 | − set_pool_mode(pool, PM_READ_ONLY); | |
| 2297 | + if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space) { | |
| 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) · 71 unmodified lines | ||
| 2370 | 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 | 2387 | static bool passdown_enabled(struct pool_c *pt) |
| 2374 | 2388 | { |
| 2375 | 2389 | return pt->adjusted_pf.discard_passdown; |
| @@ -2454,7 +2468,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) · 78 unmodified lines | ||
| 2454 | 2468 | * frequently seeing this mode. |
| 2455 | 2469 | */ |
| 2456 | 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 | 2472 | pool->process_bio = process_bio_read_only; |
| 2459 | 2473 | pool->process_discard = process_discard_bio; |
| 2460 | 2474 | pool->process_cell = process_cell_read_only; |
| @@ -2777,6 +2791,7 @@ static void __pool_destroy(struct pool *pool) · 316 unmodified lines | ||
| 2777 | 2791 | { |
| 2778 | 2792 | __pool_table_remove(pool); |
| 2779 | 2793 | |
| 2794 | + vfree(pool->cell_sort_array); | |
| 2780 | 2795 | if (dm_pool_metadata_close(pool->pmd) < 0) |
| 2781 | 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, · 106 unmodified lines | ||
| 2889 | 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 | 2914 | pool->ref_count = 1; |
| 2893 | 2915 | pool->last_commit_jiffies = jiffies; |
| 2894 | 2916 | pool->pool_md = pool_md; |
| @@ -2897,6 +2919,8 @@ static struct pool *pool_create(struct mapped_device *pool_md, · 2 unmodified lines | ||
| 2897 | 2919 | |
| 2898 | 2920 | return pool; |
| 2899 | 2921 | |
| 2922 | +bad_sort_array: | |
| 2923 | + mempool_destroy(pool->mapping_pool); | |
| 2900 | 2924 | bad_mapping_pool: |
| 2901 | 2925 | dm_deferred_set_destroy(pool->all_io_ds); |
| 2902 | 2926 | bad_all_io_ds: |
| @@ -3714,6 +3738,7 @@ static void emit_flags(struct pool_features *pf, char *result, · 811 unmodified lines | ||
| 3714 | 3738 | * Status line is: |
| 3715 | 3739 | * <transaction id> <used metadata sectors>/<total metadata sectors> |
| 3716 | 3740 | * <used data sectors>/<total data sectors> <held metadata root> |
| 3741 | + * <pool mode> <discard config> <no space config> <needs_check> | |
| 3717 | 3742 | */ |
| 3718 | 3743 | static void pool_status(struct dm_target *ti, status_type_t type, |
| 3719 | 3744 | unsigned status_flags, char *result, unsigned maxlen) |
| @@ -3815,6 +3840,11 @@ static void pool_status(struct dm_target *ti, status_type_t type, · 95 unmodified lines | ||
| 3815 | 3840 | else |
| 3816 | 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 | 3848 | break; |
| 3819 | 3849 | |
| 3820 | 3850 | case STATUSTYPE_TABLE: |
| @@ -3918,7 +3948,7 @@ static struct target_type pool_target = { · 97 unmodified lines | ||
| 3918 | 3948 | .name = "thin-pool", |
| 3919 | 3949 | .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | |
| 3920 | 3950 | DM_TARGET_IMMUTABLE, |
| 3921 | − .version = {1, 15, 0}, | |
| 3951 | + .version = {1, 16, 0}, | |
| 3922 | 3952 | .module = THIS_MODULE, |
| 3923 | 3953 | .ctr = pool_ctr, |
| 3924 | 3954 | .dtr = pool_dtr, |
| @@ -4305,7 +4335,7 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) · 380 unmodified lines | ||
| 4305 | 4335 | |
| 4306 | 4336 | static struct target_type thin_target = { |
| 4307 | 4337 | .name = "thin", |
| 4308 | − .version = {1, 15, 0}, | |
| 4338 | + .version = {1, 16, 0}, | |
| 4309 | 4339 | .module = THIS_MODULE, |
| 4310 | 4340 | .ctr = thin_ctr, |
| 4311 | 4341 | .dtr = thin_dtr, |
| @@ -1067,13 +1067,10 @@ static void rq_end_stats(struct mapped_device *md, struct request *orig) · 1066 unmodified lines | ||
| 1067 | 1067 | */ |
| 1068 | 1068 | static void rq_completed(struct mapped_device *md, int rw, bool run_queue) |
| 1069 | 1069 | { |
| 1070 | − int nr_requests_pending; | |
| 1071 | − | |
| 1072 | 1070 | atomic_dec(&md->pending[rw]); |
| 1073 | 1071 | |
| 1074 | 1072 | /* nudge anyone waiting on suspend queue */ |
| 1075 | − nr_requests_pending = md_in_flight(md); | |
| 1076 | − if (!nr_requests_pending) | |
| 1073 | + if (!md_in_flight(md)) | |
| 1077 | 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) · 5 unmodified lines | ||
| 1085 | 1082 | if (run_queue) { |
| 1086 | 1083 | if (md->queue->mq_ops) |
| 1087 | 1084 | blk_mq_run_hw_queues(md->queue, true); |
| 1088 | − else if (!nr_requests_pending || | |
| 1089 | − (nr_requests_pending >= md->queue->nr_congestion_on)) | |
| 1085 | + else | |
| 1090 | 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) · 1188 unmodified lines | ||
| 2281 | 2277 | |
| 2282 | 2278 | static void cleanup_mapped_device(struct mapped_device *md) |
| 2283 | 2279 | { |
| 2284 | − cleanup_srcu_struct(&md->io_barrier); | |
| 2285 | − | |
| 2286 | 2280 | if (md->wq) |
| 2287 | 2281 | destroy_workqueue(md->wq); |
| 2288 | 2282 | if (md->kworker_task) |
| @@ -2294,6 +2288,8 @@ static void cleanup_mapped_device(struct mapped_device *md) · 5 unmodified lines | ||
| 2294 | 2288 | if (md->bs) |
| 2295 | 2289 | bioset_free(md->bs); |
| 2296 | 2290 | |
| 2291 | + cleanup_srcu_struct(&md->io_barrier); | |
| 2292 | + | |
| 2297 | 2293 | if (md->disk) { |
| 2298 | 2294 | spin_lock(&_minor_lock); |
| 2299 | 2295 | md->disk->private_data = NULL; |
| @@ -309,8 +309,8 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, · 308 unmodified lines | ||
| 309 | 309 | |
| 310 | 310 | if (s < 0 && nr_center < -s) { |
| 311 | 311 | /* not enough in central node */ |
| 312 | − shift(left, center, nr_center); | |
| 313 | − s = nr_center - target; | |
| 312 | + shift(left, center, -nr_center); | |
| 313 | + s += nr_center; | |
| 314 | 314 | shift(left, right, s); |
| 315 | 315 | nr_right += s; |
| 316 | 316 | } else |
| @@ -323,7 +323,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, · 6 unmodified lines | ||
| 323 | 323 | if (s > 0 && nr_center < s) { |
| 324 | 324 | /* not enough in central node */ |
| 325 | 325 | shift(center, right, nr_center); |
| 326 | − s = target - nr_center; | |
| 326 | + s -= nr_center; | |
| 327 | 327 | shift(left, right, s); |
| 328 | 328 | nr_left -= s; |
| 329 | 329 | } else |
| @@ -255,7 +255,7 @@ int dm_btree_del(struct dm_btree_info *info, dm_block_t root) · 254 unmodified lines | ||
| 255 | 255 | int r; |
| 256 | 256 | struct del_stack *s; |
| 257 | 257 | |
| 258 | − s = kmalloc(sizeof(*s), GFP_KERNEL); | |
| 258 | + s = kmalloc(sizeof(*s), GFP_NOIO); | |
| 259 | 259 | if (!s) |
| 260 | 260 | return -ENOMEM; |
| 261 | 261 | s->info = info; |
| @@ -6,7 +6,7 @@ · 5 unmodified lines | ||
| 6 | 6 | * |
| 7 | 7 | * License Terms: GNU General Public License, version 2 |
| 8 | 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 | 12 | #include <linux/i2c.h> |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Copyright (C) ST Microelectronics SA 2011 |
| 5 | 5 | * |
| 6 | 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 | 10 | #include <linux/spi/spi.h> |
| @@ -146,4 +146,4 @@ module_exit(stmpe_exit); · 135 unmodified lines | ||
| 146 | 146 | |
| 147 | 147 | MODULE_LICENSE("GPL v2"); |
| 148 | 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>"); | |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Support of SDHCI platform devices for spear soc family |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2010 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * Inspired by sdhci-pltfm.c |
| 10 | 10 | * |
| @@ -211,5 +211,5 @@ static struct platform_driver sdhci_driver = { · 200 unmodified lines | ||
| 211 | 211 | module_platform_driver(sdhci_driver); |
| 212 | 212 | |
| 213 | 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 | 215 | MODULE_LICENSE("GPL v2"); |
| @@ -625,6 +625,23 @@ static void bond_set_dev_addr(struct net_device *bond_dev, · 624 unmodified lines | ||
| 625 | 625 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); |
| 626 | 626 | } |
| 627 | 627 | |
| 628 | +static struct slave *bond_get_old_active(struct bonding *bond, | |
| 629 | + struct slave *new_active) | |
| 630 | +{ | |
| 631 | + struct slave *slave; | |
| 632 | + struct list_head *iter; | |
| 633 | + | |
| 634 | + bond_for_each_slave(bond, slave, iter) { | |
| 635 | + if (slave == new_active) | |
| 636 | + continue; | |
| 637 | + | |
| 638 | + if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr)) | |
| 639 | + return slave; | |
| 640 | + } | |
| 641 | + | |
| 642 | + return NULL; | |
| 643 | +} | |
| 644 | + | |
| 628 | 645 | /* bond_do_fail_over_mac |
| 629 | 646 | * |
| 630 | 647 | * Perform special MAC address swapping for fail_over_mac settings |
| @@ -652,6 +669,9 @@ static void bond_do_fail_over_mac(struct bonding *bond, · 21 unmodified lines | ||
| 652 | 669 | if (!new_active) |
| 653 | 670 | return; |
| 654 | 671 | |
| 672 | + if (!old_active) | |
| 673 | + old_active = bond_get_old_active(bond, new_active); | |
| 674 | + | |
| 655 | 675 | if (old_active) { |
| 656 | 676 | ether_addr_copy(tmp_mac, new_active->dev->dev_addr); |
| 657 | 677 | ether_addr_copy(saddr.sa_data, |
| @@ -1725,9 +1745,16 @@ err_free: · 1067 unmodified lines | ||
| 1725 | 1745 | |
| 1726 | 1746 | err_undo_flags: |
| 1727 | 1747 | /* Enslave of first slave has failed and we need to fix master's mac */ |
| 1728 | − if (!bond_has_slaves(bond) && | |
| 1729 | − ether_addr_equal_64bits(bond_dev->dev_addr, slave_dev->dev_addr)) | |
| 1730 | − eth_hw_addr_random(bond_dev); | |
| 1748 | + if (!bond_has_slaves(bond)) { | |
| 1749 | + if (ether_addr_equal_64bits(bond_dev->dev_addr, | |
| 1750 | + slave_dev->dev_addr)) | |
| 1751 | + eth_hw_addr_random(bond_dev); | |
| 1752 | + if (bond_dev->type != ARPHRD_ETHER) { | |
| 1753 | + ether_setup(bond_dev); | |
| 1754 | + bond_dev->flags |= IFF_MASTER; | |
| 1755 | + bond_dev->priv_flags &= ~IFF_TX_SKB_SHARING; | |
| 1756 | + } | |
| 1757 | + } | |
| 1731 | 1758 | |
| 1732 | 1759 | return res; |
| 1733 | 1760 | } |
| @@ -1916,6 +1943,7 @@ static int bond_release_and_destroy(struct net_device *bond_dev, · 182 unmodified lines | ||
| 1916 | 1943 | bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; |
| 1917 | 1944 | netdev_info(bond_dev, "Destroying bond %s\n", |
| 1918 | 1945 | bond_dev->name); |
| 1946 | + bond_remove_proc_entry(bond); | |
| 1919 | 1947 | unregister_netdevice(bond_dev); |
| 1920 | 1948 | } |
| 1921 | 1949 | return ret; |
| @@ -577,10 +577,10 @@ static void at91_rx_overflow_err(struct net_device *dev) · 576 unmodified lines | ||
| 577 | 577 | |
| 578 | 578 | cf->can_id |= CAN_ERR_CRTL; |
| 579 | 579 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
| 580 | − netif_receive_skb(skb); | |
| 581 | 580 | |
| 582 | 581 | stats->rx_packets++; |
| 583 | 582 | stats->rx_bytes += cf->can_dlc; |
| 583 | + netif_receive_skb(skb); | |
| 584 | 584 | } |
| 585 | 585 | |
| 586 | 586 | /** |
| @@ -642,10 +642,10 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb) · 55 unmodified lines | ||
| 642 | 642 | } |
| 643 | 643 | |
| 644 | 644 | at91_read_mb(dev, mb, cf); |
| 645 | − netif_receive_skb(skb); | |
| 646 | 645 | |
| 647 | 646 | stats->rx_packets++; |
| 648 | 647 | stats->rx_bytes += cf->can_dlc; |
| 648 | + netif_receive_skb(skb); | |
| 649 | 649 | |
| 650 | 650 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 651 | 651 | } |
| @@ -802,10 +802,10 @@ static int at91_poll_err(struct net_device *dev, int quota, u32 reg_sr) · 150 unmodified lines | ||
| 802 | 802 | return 0; |
| 803 | 803 | |
| 804 | 804 | at91_poll_err_frame(dev, cf, reg_sr); |
| 805 | − netif_receive_skb(skb); | |
| 806 | 805 | |
| 807 | 806 | dev->stats.rx_packets++; |
| 808 | 807 | dev->stats.rx_bytes += cf->can_dlc; |
| 808 | + netif_receive_skb(skb); | |
| 809 | 809 | |
| 810 | 810 | return 1; |
| 811 | 811 | } |
| @@ -1067,10 +1067,10 @@ static void at91_irq_err(struct net_device *dev) · 255 unmodified lines | ||
| 1067 | 1067 | return; |
| 1068 | 1068 | |
| 1069 | 1069 | at91_irq_err_state(dev, cf, new_state); |
| 1070 | − netif_rx(skb); | |
| 1071 | 1070 | |
| 1072 | 1071 | dev->stats.rx_packets++; |
| 1073 | 1072 | dev->stats.rx_bytes += cf->can_dlc; |
| 1073 | + netif_rx(skb); | |
| 1074 | 1074 | |
| 1075 | 1075 | priv->can.state = new_state; |
| 1076 | 1076 | } |
| @@ -424,10 +424,9 @@ static void bfin_can_rx(struct net_device *dev, u16 isrc) · 423 unmodified lines | ||
| 424 | 424 | cf->data[6 - i] = (6 - i) < cf->can_dlc ? (val >> 8) : 0; |
| 425 | 425 | } |
| 426 | 426 | |
| 427 | − netif_rx(skb); | |
| 428 | − | |
| 429 | 427 | stats->rx_packets++; |
| 430 | 428 | stats->rx_bytes += cf->can_dlc; |
| 429 | + netif_rx(skb); | |
| 431 | 430 | } |
| 432 | 431 | |
| 433 | 432 | static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) |
| @@ -508,10 +507,9 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) · 74 unmodified lines | ||
| 508 | 507 | |
| 509 | 508 | priv->can.state = state; |
| 510 | 509 | |
| 511 | − netif_rx(skb); | |
| 512 | − | |
| 513 | 510 | stats->rx_packets++; |
| 514 | 511 | stats->rx_bytes += cf->can_dlc; |
| 512 | + netif_rx(skb); | |
| 515 | 513 | |
| 516 | 514 | return 0; |
| 517 | 515 | } |
| @@ -504,10 +504,10 @@ static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1) · 503 unmodified lines | ||
| 504 | 504 | for (i = 0; i < cf->can_dlc; i++) |
| 505 | 505 | cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]); |
| 506 | 506 | } |
| 507 | − netif_rx(skb); | |
| 508 | 507 | |
| 509 | 508 | stats->rx_packets++; |
| 510 | 509 | stats->rx_bytes += cf->can_dlc; |
| 510 | + netif_rx(skb); | |
| 511 | 511 | } |
| 512 | 512 | |
| 513 | 513 | static int cc770_err(struct net_device *dev, u8 status) |
| @@ -584,10 +584,10 @@ static int cc770_err(struct net_device *dev, u8 status) · 70 unmodified lines | ||
| 584 | 584 | } |
| 585 | 585 | } |
| 586 | 586 | |
| 587 | − netif_rx(skb); | |
| 588 | 587 | |
| 589 | 588 | stats->rx_packets++; |
| 590 | 589 | stats->rx_bytes += cf->can_dlc; |
| 590 | + netif_rx(skb); | |
| 591 | 591 | |
| 592 | 592 | return 0; |
| 593 | 593 | } |
| @@ -577,10 +577,10 @@ static int flexcan_poll_bus_err(struct net_device *dev, u32 reg_esr) · 576 unmodified lines | ||
| 577 | 577 | return 0; |
| 578 | 578 | |
| 579 | 579 | do_bus_err(dev, cf, reg_esr); |
| 580 | − netif_receive_skb(skb); | |
| 581 | 580 | |
| 582 | 581 | dev->stats.rx_packets++; |
| 583 | 582 | dev->stats.rx_bytes += cf->can_dlc; |
| 583 | + netif_receive_skb(skb); | |
| 584 | 584 | |
| 585 | 585 | return 1; |
| 586 | 586 | } |
| @@ -622,10 +622,9 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr) · 35 unmodified lines | ||
| 622 | 622 | if (unlikely(new_state == CAN_STATE_BUS_OFF)) |
| 623 | 623 | can_bus_off(dev); |
| 624 | 624 | |
| 625 | − netif_receive_skb(skb); | |
| 626 | − | |
| 627 | 625 | dev->stats.rx_packets++; |
| 628 | 626 | dev->stats.rx_bytes += cf->can_dlc; |
| 627 | + netif_receive_skb(skb); | |
| 629 | 628 | |
| 630 | 629 | return 1; |
| 631 | 630 | } |
| @@ -670,10 +669,10 @@ static int flexcan_read_frame(struct net_device *dev) · 38 unmodified lines | ||
| 670 | 669 | } |
| 671 | 670 | |
| 672 | 671 | flexcan_read_fifo(dev, cf); |
| 673 | − netif_receive_skb(skb); | |
| 674 | 672 | |
| 675 | 673 | stats->rx_packets++; |
| 676 | 674 | stats->rx_bytes += cf->can_dlc; |
| 675 | + netif_receive_skb(skb); | |
| 677 | 676 | |
| 678 | 677 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 679 | 678 | |
| @@ -1216,11 +1216,12 @@ static int grcan_receive(struct net_device *dev, int budget) · 1215 unmodified lines | ||
| 1216 | 1216 | cf->data[i] = (u8)(slot[j] >> shift); |
| 1217 | 1217 | } |
| 1218 | 1218 | } |
| 1219 | − netif_receive_skb(skb); | |
| 1220 | 1219 | |
| 1221 | 1220 | /* Update statistics and read pointer */ |
| 1222 | 1221 | stats->rx_packets++; |
| 1223 | 1222 | stats->rx_bytes += cf->can_dlc; |
| 1223 | + netif_receive_skb(skb); | |
| 1224 | + | |
| 1224 | 1225 | rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size); |
| 1225 | 1226 | } |
| 1226 | 1227 | |
| @@ -377,10 +377,9 @@ static void sja1000_rx(struct net_device *dev) · 376 unmodified lines | ||
| 377 | 377 | /* release receive buffer */ |
| 378 | 378 | sja1000_write_cmdreg(priv, CMD_RRB); |
| 379 | 379 | |
| 380 | − netif_rx(skb); | |
| 381 | − | |
| 382 | 380 | stats->rx_packets++; |
| 383 | 381 | stats->rx_bytes += cf->can_dlc; |
| 382 | + netif_rx(skb); | |
| 384 | 383 | |
| 385 | 384 | can_led_event(dev, CAN_LED_EVENT_RX); |
| 386 | 385 | } |
| @@ -484,10 +483,9 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) · 97 unmodified lines | ||
| 484 | 483 | can_bus_off(dev); |
| 485 | 484 | } |
| 486 | 485 | |
| 487 | − netif_rx(skb); | |
| 488 | − | |
| 489 | 486 | stats->rx_packets++; |
| 490 | 487 | stats->rx_bytes += cf->can_dlc; |
| 488 | + netif_rx(skb); | |
| 491 | 489 | |
| 492 | 490 | return 0; |
| 493 | 491 | } |
| @@ -218,10 +218,10 @@ static void slc_bump(struct slcan *sl) · 217 unmodified lines | ||
| 218 | 218 | |
| 219 | 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), |
| 220 | 220 | &cf, sizeof(struct can_frame)); |
| 221 | − netif_rx_ni(skb); | |
| 222 | 221 | |
| 223 | 222 | sl->dev->stats.rx_packets++; |
| 224 | 223 | sl->dev->stats.rx_bytes += cf.can_dlc; |
| 224 | + netif_rx_ni(skb); | |
| 225 | 225 | } |
| 226 | 226 | |
| 227 | 227 | /* parse tty input stream */ |
| @@ -1086,8 +1086,8 @@ static int mcp251x_can_probe(struct spi_device *spi) · 1085 unmodified lines | ||
| 1086 | 1086 | if (ret) |
| 1087 | 1087 | goto out_clk; |
| 1088 | 1088 | |
| 1089 | − priv->power = devm_regulator_get(&spi->dev, "vdd"); | |
| 1090 | − priv->transceiver = devm_regulator_get(&spi->dev, "xceiver"); | |
| 1089 | + priv->power = devm_regulator_get_optional(&spi->dev, "vdd"); | |
| 1090 | + priv->transceiver = devm_regulator_get_optional(&spi->dev, "xceiver"); | |
| 1091 | 1091 | if ((PTR_ERR(priv->power) == -EPROBE_DEFER) || |
| 1092 | 1092 | (PTR_ERR(priv->transceiver) == -EPROBE_DEFER)) { |
| 1093 | 1093 | ret = -EPROBE_DEFER; |
| @@ -1222,17 +1222,16 @@ static int __maybe_unused mcp251x_can_resume(struct device *dev) · 128 unmodified lines | ||
| 1222 | 1222 | struct spi_device *spi = to_spi_device(dev); |
| 1223 | 1223 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
| 1224 | 1224 | |
| 1225 | − if (priv->after_suspend & AFTER_SUSPEND_POWER) { | |
| 1225 | + if (priv->after_suspend & AFTER_SUSPEND_POWER) | |
| 1226 | 1226 | mcp251x_power_enable(priv->power, 1); |
| 1227 | + | |
| 1228 | + if (priv->after_suspend & AFTER_SUSPEND_UP) { | |
| 1229 | + mcp251x_power_enable(priv->transceiver, 1); | |
| 1227 | 1230 | queue_work(priv->wq, &priv->restart_work); |
| 1228 | 1231 | } else { |
| 1229 | − if (priv->after_suspend & AFTER_SUSPEND_UP) { | |
| 1230 | − mcp251x_power_enable(priv->transceiver, 1); | |
| 1231 | − queue_work(priv->wq, &priv->restart_work); | |
| 1232 | − } else { | |
| 1233 | − priv->after_suspend = 0; | |
| 1234 | − } | |
| 1232 | + priv->after_suspend = 0; | |
| 1235 | 1233 | } |
| 1234 | + | |
| 1236 | 1235 | priv->force_quit = 0; |
| 1237 | 1236 | enable_irq(spi->irq); |
| 1238 | 1237 | return 0; |
| @@ -747,9 +747,9 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, · 746 unmodified lines | ||
| 747 | 747 | } |
| 748 | 748 | } |
| 749 | 749 | |
| 750 | − netif_rx(skb); | |
| 751 | 750 | stats->rx_packets++; |
| 752 | 751 | stats->rx_bytes += cf->can_dlc; |
| 752 | + netif_rx(skb); | |
| 753 | 753 | |
| 754 | 754 | return 0; |
| 755 | 755 | } |
| @@ -324,10 +324,9 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) · 323 unmodified lines | ||
| 324 | 324 | cf->data[i] = msg->msg.can_msg.msg[i]; |
| 325 | 325 | } |
| 326 | 326 | |
| 327 | − netif_rx(skb); | |
| 328 | − | |
| 329 | 327 | stats->rx_packets++; |
| 330 | 328 | stats->rx_bytes += cf->can_dlc; |
| 329 | + netif_rx(skb); | |
| 331 | 330 | } |
| 332 | 331 | |
| 333 | 332 | static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) |
| @@ -400,10 +399,9 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) · 66 unmodified lines | ||
| 400 | 399 | stats->rx_errors++; |
| 401 | 400 | } |
| 402 | 401 | |
| 403 | − netif_rx(skb); | |
| 404 | − | |
| 405 | 402 | stats->rx_packets++; |
| 406 | 403 | stats->rx_bytes += cf->can_dlc; |
| 404 | + netif_rx(skb); | |
| 407 | 405 | } |
| 408 | 406 | |
| 409 | 407 | /* |
| @@ -301,13 +301,12 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv, · 300 unmodified lines | ||
| 301 | 301 | cf->data[7] = rxerr; |
| 302 | 302 | } |
| 303 | 303 | |
| 304 | − netif_rx(skb); | |
| 305 | − | |
| 306 | 304 | priv->bec.txerr = txerr; |
| 307 | 305 | priv->bec.rxerr = rxerr; |
| 308 | 306 | |
| 309 | 307 | stats->rx_packets++; |
| 310 | 308 | stats->rx_bytes += cf->can_dlc; |
| 309 | + netif_rx(skb); | |
| 311 | 310 | } |
| 312 | 311 | } |
| 313 | 312 | |
| @@ -347,10 +346,9 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv, · 33 unmodified lines | ||
| 347 | 346 | cf->data[i] = msg->msg.rx.data[i]; |
| 348 | 347 | } |
| 349 | 348 | |
| 350 | − netif_rx(skb); | |
| 351 | − | |
| 352 | 349 | stats->rx_packets++; |
| 353 | 350 | stats->rx_bytes += cf->can_dlc; |
| 351 | + netif_rx(skb); | |
| 354 | 352 | } |
| 355 | 353 | |
| 356 | 354 | return; |
| @@ -526,9 +526,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, · 525 unmodified lines | ||
| 526 | 526 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 527 | 527 | } |
| 528 | 528 | |
| 529 | − netif_rx(skb); | |
| 530 | 529 | mc->netdev->stats.rx_packets++; |
| 531 | 530 | mc->netdev->stats.rx_bytes += cf->can_dlc; |
| 531 | + netif_rx(skb); | |
| 532 | 532 | |
| 533 | 533 | return 0; |
| 534 | 534 | } |
| @@ -659,12 +659,11 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) · 124 unmodified lines | ||
| 659 | 659 | hwts = skb_hwtstamps(skb); |
| 660 | 660 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 661 | 661 | |
| 662 | − /* push the skb */ | |
| 663 | − netif_rx(skb); | |
| 664 | − | |
| 665 | 662 | /* update statistics */ |
| 666 | 663 | mc->netdev->stats.rx_packets++; |
| 667 | 664 | mc->netdev->stats.rx_bytes += cf->can_dlc; |
| 665 | + /* push the skb */ | |
| 666 | + netif_rx(skb); | |
| 668 | 667 | |
| 669 | 668 | return 0; |
| 670 | 669 | |
| @@ -553,9 +553,9 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if, · 552 unmodified lines | ||
| 553 | 553 | hwts = skb_hwtstamps(skb); |
| 554 | 554 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 555 | 555 | |
| 556 | − netif_rx(skb); | |
| 557 | 556 | netdev->stats.rx_packets++; |
| 558 | 557 | netdev->stats.rx_bytes += can_frame->can_dlc; |
| 558 | + netif_rx(skb); | |
| 559 | 559 | |
| 560 | 560 | return 0; |
| 561 | 561 | } |
| @@ -670,9 +670,9 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, · 108 unmodified lines | ||
| 670 | 670 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); |
| 671 | 671 | hwts = skb_hwtstamps(skb); |
| 672 | 672 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 673 | − netif_rx(skb); | |
| 674 | 673 | netdev->stats.rx_packets++; |
| 675 | 674 | netdev->stats.rx_bytes += can_frame->can_dlc; |
| 675 | + netif_rx(skb); | |
| 676 | 676 | |
| 677 | 677 | return 0; |
| 678 | 678 | } |
| @@ -461,10 +461,9 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, · 460 unmodified lines | ||
| 461 | 461 | priv->bec.txerr = txerr; |
| 462 | 462 | priv->bec.rxerr = rxerr; |
| 463 | 463 | |
| 464 | − netif_rx(skb); | |
| 465 | − | |
| 466 | 464 | stats->rx_packets++; |
| 467 | 465 | stats->rx_bytes += cf->can_dlc; |
| 466 | + netif_rx(skb); | |
| 468 | 467 | } |
| 469 | 468 | |
| 470 | 469 | /* Read data and status frames */ |
| @@ -494,10 +493,9 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv, · 23 unmodified lines | ||
| 494 | 493 | else |
| 495 | 494 | memcpy(cf->data, msg->data, cf->can_dlc); |
| 496 | 495 | |
| 497 | − netif_rx(skb); | |
| 498 | − | |
| 499 | 496 | stats->rx_packets++; |
| 500 | 497 | stats->rx_bytes += cf->can_dlc; |
| 498 | + netif_rx(skb); | |
| 501 | 499 | |
| 502 | 500 | can_led_event(priv->netdev, CAN_LED_EVENT_RX); |
| 503 | 501 | } else { |
| @@ -696,9 +696,20 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds) · 695 unmodified lines | ||
| 696 | 696 | } |
| 697 | 697 | |
| 698 | 698 | /* Include the pseudo-PHY address and the broadcast PHY address to |
| 699 | − * divert reads towards our workaround | |
| 699 | + * divert reads towards our workaround. This is only required for | |
| 700 | + * 7445D0, since 7445E0 disconnects the internal switch pseudo-PHY such | |
| 701 | + * that we can use the regular SWITCH_MDIO master controller instead. | |
| 702 | + * | |
| 703 | + * By default, DSA initializes ds->phys_mii_mask to ds->phys_port_mask | |
| 704 | + * to have a 1:1 mapping between Port address and PHY address in order | |
| 705 | + * to utilize the slave_mii_bus instance to read from Port PHYs. This is | |
| 706 | + * not what we want here, so we initialize phys_mii_mask 0 to always | |
| 707 | + * utilize the "master" MDIO bus backed by the "mdio-unimac" driver. | |
| 700 | 708 | */ |
| 701 | − ds->phys_mii_mask |= ((1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0)); | |
| 709 | + if (of_machine_is_compatible("brcm,bcm7445d0")) | |
| 710 | + ds->phys_mii_mask |= ((1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0)); | |
| 711 | + else | |
| 712 | + ds->phys_mii_mask = 0; | |
| 702 | 713 | |
| 703 | 714 | rev = reg_readl(priv, REG_SWITCH_REVISION); |
| 704 | 715 | priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) & |
| @@ -1175,7 +1175,7 @@ int mv88e6xxx_leave_bridge(struct dsa_switch *ds, int port, u32 br_port_mask) · 1174 unmodified lines | ||
| 1175 | 1175 | |
| 1176 | 1176 | newfid = __ffs(ps->fid_mask); |
| 1177 | 1177 | ps->fid[port] = newfid; |
| 1178 | − ps->fid_mask &= (1 << newfid); | |
| 1178 | + ps->fid_mask &= ~(1 << newfid); | |
| 1179 | 1179 | ps->bridge_mask[fid] &= ~(1 << port); |
| 1180 | 1180 | ps->bridge_mask[newfid] = 1 << port; |
| 1181 | 1181 | |
| @@ -1508,16 +1508,7 @@ static void sbmac_channel_start(struct sbmac_softc *s) · 1507 unmodified lines | ||
| 1508 | 1508 | __raw_writeq(reg, port); |
| 1509 | 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 | 1511 | __raw_writeq(reg, port); |
| 1520 | −#endif | |
| 1521 | 1512 | |
| 1522 | 1513 | /* |
| 1523 | 1514 | * Set the receive filter for no packets, and write values |
| @@ -24,7 +24,6 @@ · 23 unmodified lines | ||
| 24 | 24 | #include <linux/module.h> |
| 25 | 25 | #include <linux/kernel.h> |
| 26 | 26 | #include <linux/string.h> |
| 27 | −#include <linux/pm_runtime.h> | |
| 28 | 27 | #include <linux/ptrace.h> |
| 29 | 28 | #include <linux/errno.h> |
| 30 | 29 | #include <linux/ioport.h> |
| @@ -78,7 +77,6 @@ static void fec_enet_itr_coal_init(struct net_device *ndev); · 47 unmodified lines | ||
| 78 | 77 | #define FEC_ENET_RAEM_V 0x8 |
| 79 | 78 | #define FEC_ENET_RAFL_V 0x8 |
| 80 | 79 | #define FEC_ENET_OPD_V 0xFFF0 |
| 81 | −#define FEC_MDIO_PM_TIMEOUT 100 /* ms */ | |
| 82 | 80 | |
| 83 | 81 | static struct platform_device_id fec_devtype[] = { |
| 84 | 82 | { |
| @@ -1769,13 +1767,7 @@ static void fec_enet_adjust_link(struct net_device *ndev) · 1684 unmodified lines | ||
| 1769 | 1767 | static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) |
| 1770 | 1768 | { |
| 1771 | 1769 | struct fec_enet_private *fep = bus->priv; |
| 1772 | − struct device *dev = &fep->pdev->dev; | |
| 1773 | 1770 | 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; | |
| 1779 | 1771 | |
| 1780 | 1772 | fep->mii_timeout = 0; |
| 1781 | 1773 | init_completion(&fep->mdio_done); |
| @@ -1791,30 +1783,18 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) · 9 unmodified lines | ||
| 1791 | 1783 | if (time_left == 0) { |
| 1792 | 1784 | fep->mii_timeout = 1; |
| 1793 | 1785 | netdev_err(fep->netdev, "MDIO read timeout\n"); |
| 1794 | − ret = -ETIMEDOUT; | |
| 1795 | − goto out; | |
| 1786 | + return -ETIMEDOUT; | |
| 1796 | 1787 | } |
| 1797 | 1788 | |
| 1798 | − ret = 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; | |
| 1789 | + /* return value */ | |
| 1790 | + return FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); | |
| 1805 | 1791 | } |
| 1806 | 1792 | |
| 1807 | 1793 | static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, |
| 1808 | 1794 | u16 value) |
| 1809 | 1795 | { |
| 1810 | 1796 | struct fec_enet_private *fep = bus->priv; |
| 1811 | − struct device *dev = &fep->pdev->dev; | |
| 1812 | 1797 | 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; | |
| 1818 | 1798 | |
| 1819 | 1799 | fep->mii_timeout = 0; |
| 1820 | 1800 | init_completion(&fep->mdio_done); |
| @@ -1831,13 +1811,10 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, · 10 unmodified lines | ||
| 1831 | 1811 | if (time_left == 0) { |
| 1832 | 1812 | fep->mii_timeout = 1; |
| 1833 | 1813 | netdev_err(fep->netdev, "MDIO write timeout\n"); |
| 1834 | − ret = -ETIMEDOUT; | |
| 1814 | + return -ETIMEDOUT; | |
| 1835 | 1815 | } |
| 1836 | 1816 | |
| 1837 | − pm_runtime_mark_last_busy(dev); | |
| 1838 | − pm_runtime_put_autosuspend(dev); | |
| 1839 | − | |
| 1840 | − return ret; | |
| 1817 | + return 0; | |
| 1841 | 1818 | } |
| 1842 | 1819 | |
| 1843 | 1820 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) |
| @@ -1849,6 +1826,9 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) · 5 unmodified lines | ||
| 1849 | 1826 | ret = clk_prepare_enable(fep->clk_ahb); |
| 1850 | 1827 | if (ret) |
| 1851 | 1828 | return ret; |
| 1829 | + ret = clk_prepare_enable(fep->clk_ipg); | |
| 1830 | + if (ret) | |
| 1831 | + goto failed_clk_ipg; | |
| 1852 | 1832 | if (fep->clk_enet_out) { |
| 1853 | 1833 | ret = clk_prepare_enable(fep->clk_enet_out); |
| 1854 | 1834 | if (ret) |
| @@ -1872,6 +1852,7 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) · 17 unmodified lines | ||
| 1872 | 1852 | } |
| 1873 | 1853 | } else { |
| 1874 | 1854 | clk_disable_unprepare(fep->clk_ahb); |
| 1855 | + clk_disable_unprepare(fep->clk_ipg); | |
| 1875 | 1856 | if (fep->clk_enet_out) |
| 1876 | 1857 | clk_disable_unprepare(fep->clk_enet_out); |
| 1877 | 1858 | if (fep->clk_ptp) { |
| @@ -1893,6 +1874,8 @@ failed_clk_ptp: · 15 unmodified lines | ||
| 1893 | 1874 | if (fep->clk_enet_out) |
| 1894 | 1875 | clk_disable_unprepare(fep->clk_enet_out); |
| 1895 | 1876 | failed_clk_enet_out: |
| 1877 | + clk_disable_unprepare(fep->clk_ipg); | |
| 1878 | +failed_clk_ipg: | |
| 1896 | 1879 | clk_disable_unprepare(fep->clk_ahb); |
| 1897 | 1880 | |
| 1898 | 1881 | return ret; |
| @@ -2864,14 +2847,10 @@ fec_enet_open(struct net_device *ndev) · 965 unmodified lines | ||
| 2864 | 2847 | struct fec_enet_private *fep = netdev_priv(ndev); |
| 2865 | 2848 | int ret; |
| 2866 | 2849 | |
| 2867 | − ret = pm_runtime_get_sync(&fep->pdev->dev); | |
| 2868 | − if (IS_ERR_VALUE(ret)) | |
| 2869 | − return ret; | |
| 2870 | − | |
| 2871 | 2850 | pinctrl_pm_select_default_state(&fep->pdev->dev); |
| 2872 | 2851 | ret = fec_enet_clk_enable(ndev, true); |
| 2873 | 2852 | if (ret) |
| 2874 | − goto clk_enable; | |
| 2853 | + return ret; | |
| 2875 | 2854 | |
| 2876 | 2855 | /* I should reset the ring buffers here, but I don't yet know |
| 2877 | 2856 | * a simple way to do that. |
| @@ -2902,9 +2881,6 @@ err_enet_mii_probe: · 24 unmodified lines | ||
| 2902 | 2881 | fec_enet_free_buffers(ndev); |
| 2903 | 2882 | err_enet_alloc: |
| 2904 | 2883 | 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); | |
| 2908 | 2884 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); |
| 2909 | 2885 | return ret; |
| 2910 | 2886 | } |
| @@ -2927,9 +2903,6 @@ fec_enet_close(struct net_device *ndev) · 16 unmodified lines | ||
| 2927 | 2903 | |
| 2928 | 2904 | fec_enet_clk_enable(ndev, false); |
| 2929 | 2905 | 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 | − | |
| 2933 | 2906 | fec_enet_free_buffers(ndev); |
| 2934 | 2907 | |
| 2935 | 2908 | return 0; |
| @@ -3415,10 +3388,6 @@ fec_probe(struct platform_device *pdev) · 479 unmodified lines | ||
| 3415 | 3388 | if (ret) |
| 3416 | 3389 | goto failed_clk; |
| 3417 | 3390 | |
| 3418 | − ret = clk_prepare_enable(fep->clk_ipg); | |
| 3419 | − if (ret) | |
| 3420 | − goto failed_clk_ipg; | |
| 3421 | − | |
| 3422 | 3391 | fep->reg_phy = devm_regulator_get(&pdev->dev, "phy"); |
| 3423 | 3392 | if (!IS_ERR(fep->reg_phy)) { |
| 3424 | 3393 | ret = regulator_enable(fep->reg_phy); |
| @@ -3465,8 +3434,6 @@ fec_probe(struct platform_device *pdev) · 40 unmodified lines | ||
| 3465 | 3434 | netif_carrier_off(ndev); |
| 3466 | 3435 | fec_enet_clk_enable(ndev, false); |
| 3467 | 3436 | pinctrl_pm_select_sleep_state(&pdev->dev); |
| 3468 | − pm_runtime_set_active(&pdev->dev); | |
| 3469 | − pm_runtime_enable(&pdev->dev); | |
| 3470 | 3437 | |
| 3471 | 3438 | ret = register_netdev(ndev); |
| 3472 | 3439 | if (ret) |
| @@ -3480,12 +3447,6 @@ fec_probe(struct platform_device *pdev) · 7 unmodified lines | ||
| 3480 | 3447 | |
| 3481 | 3448 | fep->rx_copybreak = COPYBREAK_DEFAULT; |
| 3482 | 3449 | 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 | − | |
| 3489 | 3450 | return 0; |
| 3490 | 3451 | |
| 3491 | 3452 | failed_register: |
| @@ -3496,8 +3457,6 @@ failed_init: · 4 unmodified lines | ||
| 3496 | 3457 | if (fep->reg_phy) |
| 3497 | 3458 | regulator_disable(fep->reg_phy); |
| 3498 | 3459 | failed_regulator: |
| 3499 | − clk_disable_unprepare(fep->clk_ipg); | |
| 3500 | −failed_clk_ipg: | |
| 3501 | 3460 | fec_enet_clk_enable(ndev, false); |
| 3502 | 3461 | failed_clk: |
| 3503 | 3462 | failed_phy: |
| @@ -3609,28 +3568,7 @@ failed_clk: · 105 unmodified lines | ||
| 3609 | 3568 | return ret; |
| 3610 | 3569 | } |
| 3611 | 3570 | |
| 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 | −}; | |
| 3571 | +static SIMPLE_DEV_PM_OPS(fec_pm_ops, fec_suspend, fec_resume); | |
| 3634 | 3572 | |
| 3635 | 3573 | static struct platform_driver fec_driver = { |
| 3636 | 3574 | .driver = { |
| @@ -1462,7 +1462,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 1461 unmodified lines | ||
| 1462 | 1462 | struct mvneta_rx_queue *rxq) |
| 1463 | 1463 | { |
| 1464 | 1464 | struct net_device *dev = pp->dev; |
| 1465 | − int rx_done, rx_filled; | |
| 1465 | + int rx_done; | |
| 1466 | 1466 | u32 rcvd_pkts = 0; |
| 1467 | 1467 | u32 rcvd_bytes = 0; |
| 1468 | 1468 | |
| @@ -1473,7 +1473,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 4 unmodified lines | ||
| 1473 | 1473 | rx_todo = rx_done; |
| 1474 | 1474 | |
| 1475 | 1475 | rx_done = 0; |
| 1476 | − rx_filled = 0; | |
| 1477 | 1476 | |
| 1478 | 1477 | /* Fairness NAPI loop */ |
| 1479 | 1478 | while (rx_done < rx_todo) { |
| @@ -1484,7 +1483,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 4 unmodified lines | ||
| 1484 | 1483 | int rx_bytes, err; |
| 1485 | 1484 | |
| 1486 | 1485 | rx_done++; |
| 1487 | − rx_filled++; | |
| 1488 | 1486 | rx_status = rx_desc->status; |
| 1489 | 1487 | rx_bytes = rx_desc->data_size - (ETH_FCS_LEN + MVNETA_MH_SIZE); |
| 1490 | 1488 | data = (unsigned char *)rx_desc->buf_cookie; |
| @@ -1524,6 +1522,14 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 33 unmodified lines | ||
| 1524 | 1522 | continue; |
| 1525 | 1523 | } |
| 1526 | 1524 | |
| 1525 | + /* Refill processing */ | |
| 1526 | + err = mvneta_rx_refill(pp, rx_desc); | |
| 1527 | + if (err) { | |
| 1528 | + netdev_err(dev, "Linux processing - Can't refill\n"); | |
| 1529 | + rxq->missed++; | |
| 1530 | + goto err_drop_frame; | |
| 1531 | + } | |
| 1532 | + | |
| 1527 | 1533 | skb = build_skb(data, pp->frag_size > PAGE_SIZE ? 0 : pp->frag_size); |
| 1528 | 1534 | if (!skb) |
| 1529 | 1535 | goto err_drop_frame; |
| @@ -1543,14 +1549,6 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 13 unmodified lines | ||
| 1543 | 1549 | mvneta_rx_csum(pp, rx_status, skb); |
| 1544 | 1550 | |
| 1545 | 1551 | napi_gro_receive(&pp->napi, skb); |
| 1546 | − | |
| 1547 | − /* Refill processing */ | |
| 1548 | − err = mvneta_rx_refill(pp, rx_desc); | |
| 1549 | − if (err) { | |
| 1550 | − netdev_err(dev, "Linux processing - Can't refill\n"); | |
| 1551 | − rxq->missed++; | |
| 1552 | − rx_filled--; | |
| 1553 | − } | |
| 1554 | 1552 | } |
| 1555 | 1553 | |
| 1556 | 1554 | if (rcvd_pkts) { |
| @@ -1563,7 +1561,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo, · 6 unmodified lines | ||
| 1563 | 1561 | } |
| 1564 | 1562 | |
| 1565 | 1563 | /* Update rxq management counters */ |
| 1566 | − mvneta_rxq_desc_num_update(pp, rxq, rx_done, rx_filled); | |
| 1564 | + mvneta_rxq_desc_num_update(pp, rxq, rx_done, rx_done); | |
| 1567 | 1565 | |
| 1568 | 1566 | return rx_done; |
| 1569 | 1567 | } |
| @@ -228,9 +228,7 @@ static void ravb_ring_format(struct net_device *ndev, int q) · 227 unmodified lines | ||
| 228 | 228 | struct ravb_desc *desc; |
| 229 | 229 | int rx_ring_size = sizeof(*rx_desc) * priv->num_rx_ring[q]; |
| 230 | 230 | int tx_ring_size = sizeof(*tx_desc) * priv->num_tx_ring[q]; |
| 231 | − struct sk_buff *skb; | |
| 232 | 231 | dma_addr_t dma_addr; |
| 233 | − void *buffer; | |
| 234 | 232 | int i; |
| 235 | 233 | |
| 236 | 234 | priv->cur_rx[q] = 0; |
| @@ -241,41 +239,28 @@ static void ravb_ring_format(struct net_device *ndev, int q) · 4 unmodified lines | ||
| 241 | 239 | memset(priv->rx_ring[q], 0, rx_ring_size); |
| 242 | 240 | /* Build RX ring buffer */ |
| 243 | 241 | for (i = 0; i < priv->num_rx_ring[q]; i++) { |
| 244 | − priv->rx_skb[q][i] = NULL; | |
| 245 | − skb = netdev_alloc_skb(ndev, PKT_BUF_SZ + RAVB_ALIGN - 1); | |
| 246 | − if (!skb) | |
| 247 | − break; | |
| 248 | − ravb_set_buffer_align(skb); | |
| 249 | 242 | /* RX descriptor */ |
| 250 | 243 | rx_desc = &priv->rx_ring[q][i]; |
| 251 | 244 | /* The size of the buffer should be on 16-byte boundary. */ |
| 252 | 245 | rx_desc->ds_cc = cpu_to_le16(ALIGN(PKT_BUF_SZ, 16)); |
| 253 | − dma_addr = dma_map_single(&ndev->dev, skb->data, | |
| 246 | + dma_addr = dma_map_single(&ndev->dev, priv->rx_skb[q][i]->data, | |
| 254 | 247 | ALIGN(PKT_BUF_SZ, 16), |
| 255 | 248 | DMA_FROM_DEVICE); |
| 256 | − if (dma_mapping_error(&ndev->dev, dma_addr)) { | |
| 257 | − dev_kfree_skb(skb); | |
| 258 | − break; | |
| 259 | − } | |
| 260 | − priv->rx_skb[q][i] = skb; | |
| 249 | + /* We just set the data size to 0 for a failed mapping which | |
| 250 | + * should prevent DMA from happening... | |
| 251 | + */ | |
| 252 | + if (dma_mapping_error(&ndev->dev, dma_addr)) | |
| 253 | + rx_desc->ds_cc = cpu_to_le16(0); | |
| 261 | 254 | rx_desc->dptr = cpu_to_le32(dma_addr); |
| 262 | 255 | rx_desc->die_dt = DT_FEMPTY; |
| 263 | 256 | } |
| 264 | 257 | rx_desc = &priv->rx_ring[q][i]; |
| 265 | 258 | rx_desc->dptr = cpu_to_le32((u32)priv->rx_desc_dma[q]); |
| 266 | 259 | rx_desc->die_dt = DT_LINKFIX; /* type */ |
| 267 | − priv->dirty_rx[q] = (u32)(i - priv->num_rx_ring[q]); | |
| 268 | 260 | |
| 269 | 261 | memset(priv->tx_ring[q], 0, tx_ring_size); |
| 270 | 262 | /* Build TX ring buffer */ |
| 271 | 263 | for (i = 0; i < priv->num_tx_ring[q]; i++) { |
| 272 | − priv->tx_skb[q][i] = NULL; | |
| 273 | − priv->tx_buffers[q][i] = NULL; | |
| 274 | − buffer = kmalloc(PKT_BUF_SZ + RAVB_ALIGN - 1, GFP_KERNEL); | |
| 275 | − if (!buffer) | |
| 276 | − break; | |
| 277 | − /* Aligned TX buffer */ | |
| 278 | − priv->tx_buffers[q][i] = buffer; | |
| 279 | 264 | tx_desc = &priv->tx_ring[q][i]; |
| 280 | 265 | tx_desc->die_dt = DT_EEMPTY; |
| 281 | 266 | } |
| @@ -298,7 +283,10 @@ static void ravb_ring_format(struct net_device *ndev, int q) · 16 unmodified lines | ||
| 298 | 283 | static int ravb_ring_init(struct net_device *ndev, int q) |
| 299 | 284 | { |
| 300 | 285 | struct ravb_private *priv = netdev_priv(ndev); |
| 286 | + struct sk_buff *skb; | |
| 301 | 287 | int ring_size; |
| 288 | + void *buffer; | |
| 289 | + int i; | |
| 302 | 290 | |
| 303 | 291 | /* Allocate RX and TX skb rings */ |
| 304 | 292 | priv->rx_skb[q] = kcalloc(priv->num_rx_ring[q], |
| @@ -308,12 +296,28 @@ static int ravb_ring_init(struct net_device *ndev, int q) · 3 unmodified lines | ||
| 308 | 296 | if (!priv->rx_skb[q] || !priv->tx_skb[q]) |
| 309 | 297 | goto error; |
| 310 | 298 | |
| 299 | + for (i = 0; i < priv->num_rx_ring[q]; i++) { | |
| 300 | + skb = netdev_alloc_skb(ndev, PKT_BUF_SZ + RAVB_ALIGN - 1); | |
| 301 | + if (!skb) | |
| 302 | + goto error; | |
| 303 | + ravb_set_buffer_align(skb); | |
| 304 | + priv->rx_skb[q][i] = skb; | |
| 305 | + } | |
| 306 | + | |
| 311 | 307 | /* Allocate rings for the aligned buffers */ |
| 312 | 308 | priv->tx_buffers[q] = kcalloc(priv->num_tx_ring[q], |
| 313 | 309 | sizeof(*priv->tx_buffers[q]), GFP_KERNEL); |
| 314 | 310 | if (!priv->tx_buffers[q]) |
| 315 | 311 | goto error; |
| 316 | 312 | |
| 313 | + for (i = 0; i < priv->num_tx_ring[q]; i++) { | |
| 314 | + buffer = kmalloc(PKT_BUF_SZ + RAVB_ALIGN - 1, GFP_KERNEL); | |
| 315 | + if (!buffer) | |
| 316 | + goto error; | |
| 317 | + /* Aligned TX buffer */ | |
| 318 | + priv->tx_buffers[q][i] = buffer; | |
| 319 | + } | |
| 320 | + | |
| 317 | 321 | /* Allocate all RX descriptors. */ |
| 318 | 322 | ring_size = sizeof(struct ravb_ex_rx_desc) * (priv->num_rx_ring[q] + 1); |
| 319 | 323 | priv->rx_ring[q] = dma_alloc_coherent(NULL, ring_size, |
| @@ -524,6 +528,10 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) · 204 unmodified lines | ||
| 524 | 528 | if (--boguscnt < 0) |
| 525 | 529 | break; |
| 526 | 530 | |
| 531 | + /* We use 0-byte descriptors to mark the DMA mapping errors */ | |
| 532 | + if (!pkt_len) | |
| 533 | + continue; | |
| 534 | + | |
| 527 | 535 | if (desc_status & MSC_MC) |
| 528 | 536 | stats->multicast++; |
| 529 | 537 | |
| @@ -543,10 +551,9 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) · 13 unmodified lines | ||
| 543 | 551 | |
| 544 | 552 | skb = priv->rx_skb[q][entry]; |
| 545 | 553 | priv->rx_skb[q][entry] = NULL; |
| 546 | − dma_sync_single_for_cpu(&ndev->dev, | |
| 547 | − le32_to_cpu(desc->dptr), | |
| 548 | − ALIGN(PKT_BUF_SZ, 16), | |
| 549 | − DMA_FROM_DEVICE); | |
| 554 | + dma_unmap_single(&ndev->dev, le32_to_cpu(desc->dptr), | |
| 555 | + ALIGN(PKT_BUF_SZ, 16), | |
| 556 | + DMA_FROM_DEVICE); | |
| 550 | 557 | get_ts &= (q == RAVB_NC) ? |
| 551 | 558 | RAVB_RXTSTAMP_TYPE_V2_L2_EVENT : |
| 552 | 559 | ~RAVB_RXTSTAMP_TYPE_V2_L2_EVENT; |
| @@ -584,17 +591,15 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q) · 31 unmodified lines | ||
| 584 | 591 | if (!skb) |
| 585 | 592 | break; /* Better luck next round. */ |
| 586 | 593 | ravb_set_buffer_align(skb); |
| 587 | − dma_unmap_single(&ndev->dev, le32_to_cpu(desc->dptr), | |
| 588 | − ALIGN(PKT_BUF_SZ, 16), | |
| 589 | − DMA_FROM_DEVICE); | |
| 590 | 594 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
| 591 | 595 | le16_to_cpu(desc->ds_cc), |
| 592 | 596 | DMA_FROM_DEVICE); |
| 593 | 597 | skb_checksum_none_assert(skb); |
| 594 | − if (dma_mapping_error(&ndev->dev, dma_addr)) { | |
| 595 | − dev_kfree_skb_any(skb); | |
| 596 | − break; | |
| 597 | − } | |
| 598 | + /* We just set the data size to 0 for a failed mapping | |
| 599 | + * which should prevent DMA from happening... | |
| 600 | + */ | |
| 601 | + if (dma_mapping_error(&ndev->dev, dma_addr)) | |
| 602 | + desc->ds_cc = cpu_to_le16(0); | |
| 598 | 603 | desc->dptr = cpu_to_le32(dma_addr); |
| 599 | 604 | priv->rx_skb[q][entry] = skb; |
| 600 | 605 | } |
| @@ -1279,7 +1284,6 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 678 unmodified lines | ||
| 1279 | 1284 | u32 dma_addr; |
| 1280 | 1285 | void *buffer; |
| 1281 | 1286 | u32 entry; |
| 1282 | − u32 tccr; | |
| 1283 | 1287 | |
| 1284 | 1288 | spin_lock_irqsave(&priv->lock, flags); |
| 1285 | 1289 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q]) { |
| @@ -1328,9 +1332,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 42 unmodified lines | ||
| 1328 | 1332 | dma_wmb(); |
| 1329 | 1333 | desc->die_dt = DT_FSINGLE; |
| 1330 | 1334 | |
| 1331 | − tccr = ravb_read(ndev, TCCR); | |
| 1332 | − if (!(tccr & (TCCR_TSRQ0 << q))) | |
| 1333 | − ravb_write(ndev, tccr | (TCCR_TSRQ0 << q), TCCR); | |
| 1335 | + ravb_write(ndev, ravb_read(ndev, TCCR) | (TCCR_TSRQ0 << q), TCCR); | |
| 1334 | 1336 | |
| 1335 | 1337 | priv->cur_tx[q]++; |
| 1336 | 1338 | if (priv->cur_tx[q] - priv->dirty_tx[q] >= priv->num_tx_ring[q] && |
| @@ -2843,7 +2843,7 @@ int stmmac_dvr_probe(struct device *device, · 2842 unmodified lines | ||
| 2843 | 2843 | if (res->mac) |
| 2844 | 2844 | memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN); |
| 2845 | 2845 | |
| 2846 | − dev_set_drvdata(device, priv); | |
| 2846 | + dev_set_drvdata(device, priv->dev); | |
| 2847 | 2847 | |
| 2848 | 2848 | /* Verify driver arguments */ |
| 2849 | 2849 | stmmac_verify_args(); |
| @@ -793,9 +793,7 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id) · 792 unmodified lines | ||
| 793 | 793 | static int cpsw_poll(struct napi_struct *napi, int budget) |
| 794 | 794 | { |
| 795 | 795 | struct cpsw_priv *priv = napi_to_priv(napi); |
| 796 | − int num_tx, num_rx; | |
| 797 | − | |
| 798 | − num_tx = cpdma_chan_process(priv->txch, 128); | |
| 796 | + int num_rx; | |
| 799 | 797 | |
| 800 | 798 | num_rx = cpdma_chan_process(priv->rxch, budget); |
| 801 | 799 | if (num_rx < budget) { |
| @@ -810,9 +808,8 @@ static int cpsw_poll(struct napi_struct *napi, int budget) · 8 unmodified lines | ||
| 810 | 808 | } |
| 811 | 809 | } |
| 812 | 810 | |
| 813 | − if (num_rx || num_tx) | |
| 814 | − cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n", | |
| 815 | − num_rx, num_tx); | |
| 811 | + if (num_rx) | |
| 812 | + cpsw_dbg(priv, intr, "poll %d rx pkts\n", num_rx); | |
| 816 | 813 | |
| 817 | 814 | return num_rx; |
| 818 | 815 | } |
| @@ -1617,11 +1617,11 @@ static int netcp_ndo_open(struct net_device *ndev) · 1616 unmodified lines | ||
| 1617 | 1617 | } |
| 1618 | 1618 | mutex_unlock(&netcp_modules_lock); |
| 1619 | 1619 | |
| 1620 | − netcp_rxpool_refill(netcp); | |
| 1621 | 1620 | napi_enable(&netcp->rx_napi); |
| 1622 | 1621 | napi_enable(&netcp->tx_napi); |
| 1623 | 1622 | knav_queue_enable_notify(netcp->tx_compl_q); |
| 1624 | 1623 | knav_queue_enable_notify(netcp->rx_queue); |
| 1624 | + netcp_rxpool_refill(netcp); | |
| 1625 | 1625 | netif_tx_wake_all_queues(ndev); |
| 1626 | 1626 | dev_dbg(netcp->ndev_dev, "netcp device %s opened\n", ndev->name); |
| 1627 | 1627 | return 0; |
| @@ -67,8 +67,6 @@ struct ipvl_dev { · 66 unmodified lines | ||
| 67 | 67 | struct ipvl_port *port; |
| 68 | 68 | struct net_device *phy_dev; |
| 69 | 69 | struct list_head addrs; |
| 70 | − int ipv4cnt; | |
| 71 | − int ipv6cnt; | |
| 72 | 70 | struct ipvl_pcpu_stats __percpu *pcpu_stats; |
| 73 | 71 | DECLARE_BITMAP(mac_filters, IPVLAN_MAC_FILTER_SIZE); |
| 74 | 72 | netdev_features_t sfeatures; |
| @@ -106,6 +104,11 @@ static inline struct ipvl_port *ipvlan_port_get_rcu(const struct net_device *d) · 31 unmodified lines | ||
| 106 | 104 | return rcu_dereference(d->rx_handler_data); |
| 107 | 105 | } |
| 108 | 106 | |
| 107 | +static inline struct ipvl_port *ipvlan_port_get_rcu_bh(const struct net_device *d) | |
| 108 | +{ | |
| 109 | + return rcu_dereference_bh(d->rx_handler_data); | |
| 110 | +} | |
| 111 | + | |
| 109 | 112 | static inline struct ipvl_port *ipvlan_port_get_rtnl(const struct net_device *d) |
| 110 | 113 | { |
| 111 | 114 | return rtnl_dereference(d->rx_handler_data); |
| @@ -124,5 +127,5 @@ struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, · 12 unmodified lines | ||
| 124 | 127 | bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6); |
| 125 | 128 | struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port, |
| 126 | 129 | const void *iaddr, bool is_v6); |
| 127 | −void ipvlan_ht_addr_del(struct ipvl_addr *addr, bool sync); | |
| 130 | +void ipvlan_ht_addr_del(struct ipvl_addr *addr); | |
| 128 | 131 | #endif /* __IPVLAN_H */ |
| @@ -85,11 +85,9 @@ void ipvlan_ht_addr_add(struct ipvl_dev *ipvlan, struct ipvl_addr *addr) · 84 unmodified lines | ||
| 85 | 85 | hlist_add_head_rcu(&addr->hlnode, &port->hlhead[hash]); |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | −void ipvlan_ht_addr_del(struct ipvl_addr *addr, bool sync) | |
| 88 | +void ipvlan_ht_addr_del(struct ipvl_addr *addr) | |
| 89 | 89 | { |
| 90 | 90 | hlist_del_init_rcu(&addr->hlnode); |
| 91 | − if (sync) | |
| 92 | − synchronize_rcu(); | |
| 93 | 91 | } |
| 94 | 92 | |
| 95 | 93 | struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, |
| @@ -531,7 +529,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev) · 435 unmodified lines | ||
| 531 | 529 | int ipvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) |
| 532 | 530 | { |
| 533 | 531 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 534 | − struct ipvl_port *port = ipvlan_port_get_rcu(ipvlan->phy_dev); | |
| 532 | + struct ipvl_port *port = ipvlan_port_get_rcu_bh(ipvlan->phy_dev); | |
| 535 | 533 | |
| 536 | 534 | if (!port) |
| 537 | 535 | goto out; |
| @@ -153,10 +153,9 @@ static int ipvlan_open(struct net_device *dev) · 152 unmodified lines | ||
| 153 | 153 | else |
| 154 | 154 | dev->flags &= ~IFF_NOARP; |
| 155 | 155 | |
| 156 | − if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | |
| 157 | − list_for_each_entry(addr, &ipvlan->addrs, anode) | |
| 158 | − ipvlan_ht_addr_add(ipvlan, addr); | |
| 159 | − } | |
| 156 | + list_for_each_entry(addr, &ipvlan->addrs, anode) | |
| 157 | + ipvlan_ht_addr_add(ipvlan, addr); | |
| 158 | + | |
| 160 | 159 | return dev_uc_add(phy_dev, phy_dev->dev_addr); |
| 161 | 160 | } |
| 162 | 161 | |
| @@ -171,10 +170,9 @@ static int ipvlan_stop(struct net_device *dev) · 8 unmodified lines | ||
| 171 | 170 | |
| 172 | 171 | dev_uc_del(phy_dev, phy_dev->dev_addr); |
| 173 | 172 | |
| 174 | − if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | |
| 175 | − list_for_each_entry(addr, &ipvlan->addrs, anode) | |
| 176 | − ipvlan_ht_addr_del(addr, !dev->dismantle); | |
| 177 | − } | |
| 173 | + list_for_each_entry(addr, &ipvlan->addrs, anode) | |
| 174 | + ipvlan_ht_addr_del(addr); | |
| 175 | + | |
| 178 | 176 | return 0; |
| 179 | 177 | } |
| 180 | 178 | |
| @@ -471,8 +469,6 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev, · 290 unmodified lines | ||
| 471 | 469 | ipvlan->port = port; |
| 472 | 470 | ipvlan->sfeatures = IPVLAN_FEATURES; |
| 473 | 471 | INIT_LIST_HEAD(&ipvlan->addrs); |
| 474 | − ipvlan->ipv4cnt = 0; | |
| 475 | − ipvlan->ipv6cnt = 0; | |
| 476 | 472 | |
| 477 | 473 | /* TODO Probably put random address here to be presented to the |
| 478 | 474 | * world but keep using the physical-dev address for the outgoing |
| @@ -508,12 +504,12 @@ static void ipvlan_link_delete(struct net_device *dev, struct list_head *head) · 29 unmodified lines | ||
| 508 | 504 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 509 | 505 | struct ipvl_addr *addr, *next; |
| 510 | 506 | |
| 511 | − if (ipvlan->ipv6cnt > 0 || ipvlan->ipv4cnt > 0) { | |
| 512 | − list_for_each_entry_safe(addr, next, &ipvlan->addrs, anode) { | |
| 513 | − ipvlan_ht_addr_del(addr, !dev->dismantle); | |
| 514 | − list_del(&addr->anode); | |
| 515 | − } | |
| 507 | + list_for_each_entry_safe(addr, next, &ipvlan->addrs, anode) { | |
| 508 | + ipvlan_ht_addr_del(addr); | |
| 509 | + list_del(&addr->anode); | |
| 510 | + kfree_rcu(addr, rcu); | |
| 516 | 511 | } |
| 512 | + | |
| 517 | 513 | list_del_rcu(&ipvlan->pnode); |
| 518 | 514 | unregister_netdevice_queue(dev, head); |
| 519 | 515 | netdev_upper_dev_unlink(ipvlan->phy_dev, dev); |
| @@ -627,7 +623,7 @@ static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) · 107 unmodified lines | ||
| 627 | 623 | memcpy(&addr->ip6addr, ip6_addr, sizeof(struct in6_addr)); |
| 628 | 624 | addr->atype = IPVL_IPV6; |
| 629 | 625 | list_add_tail(&addr->anode, &ipvlan->addrs); |
| 630 | − ipvlan->ipv6cnt++; | |
| 626 | + | |
| 631 | 627 | /* If the interface is not up, the address will be added to the hash |
| 632 | 628 | * list by ipvlan_open. |
| 633 | 629 | */ |
| @@ -645,10 +641,8 @@ static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) · 11 unmodified lines | ||
| 645 | 641 | if (!addr) |
| 646 | 642 | return; |
| 647 | 643 | |
| 648 | − ipvlan_ht_addr_del(addr, true); | |
| 644 | + ipvlan_ht_addr_del(addr); | |
| 649 | 645 | list_del(&addr->anode); |
| 650 | − ipvlan->ipv6cnt--; | |
| 651 | − WARN_ON(ipvlan->ipv6cnt < 0); | |
| 652 | 646 | kfree_rcu(addr, rcu); |
| 653 | 647 | |
| 654 | 648 | return; |
| @@ -661,6 +655,10 @@ static int ipvlan_addr6_event(struct notifier_block *unused, · 6 unmodified lines | ||
| 661 | 655 | struct net_device *dev = (struct net_device *)if6->idev->dev; |
| 662 | 656 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 663 | 657 | |
| 658 | + /* FIXME IPv6 autoconf calls us from bh without RTNL */ | |
| 659 | + if (in_softirq()) | |
| 660 | + return NOTIFY_DONE; | |
| 661 | + | |
| 664 | 662 | if (!netif_is_ipvlan(dev)) |
| 665 | 663 | return NOTIFY_DONE; |
| 666 | 664 | |
| @@ -699,7 +697,7 @@ static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) · 32 unmodified lines | ||
| 699 | 697 | memcpy(&addr->ip4addr, ip4_addr, sizeof(struct in_addr)); |
| 700 | 698 | addr->atype = IPVL_IPV4; |
| 701 | 699 | list_add_tail(&addr->anode, &ipvlan->addrs); |
| 702 | − ipvlan->ipv4cnt++; | |
| 700 | + | |
| 703 | 701 | /* If the interface is not up, the address will be added to the hash |
| 704 | 702 | * list by ipvlan_open. |
| 705 | 703 | */ |
| @@ -717,10 +715,8 @@ static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) · 11 unmodified lines | ||
| 717 | 715 | if (!addr) |
| 718 | 716 | return; |
| 719 | 717 | |
| 720 | − ipvlan_ht_addr_del(addr, true); | |
| 718 | + ipvlan_ht_addr_del(addr); | |
| 721 | 719 | list_del(&addr->anode); |
| 722 | − ipvlan->ipv4cnt--; | |
| 723 | − WARN_ON(ipvlan->ipv4cnt < 0); | |
| 724 | 720 | kfree_rcu(addr, rcu); |
| 725 | 721 | |
| 726 | 722 | return; |
| @@ -164,7 +164,7 @@ static int dp83867_config_init(struct phy_device *phydev) · 163 unmodified lines | ||
| 164 | 164 | return ret; |
| 165 | 165 | } |
| 166 | 166 | |
| 167 | − if ((phydev->interface >= PHY_INTERFACE_MODE_RGMII_ID) || | |
| 167 | + if ((phydev->interface >= PHY_INTERFACE_MODE_RGMII_ID) && | |
| 168 | 168 | (phydev->interface <= PHY_INTERFACE_MODE_RGMII_RXID)) { |
| 169 | 169 | val = phy_read_mmd_indirect(phydev, DP83867_RGMIICTL, |
| 170 | 170 | DP83867_DEVADDR, phydev->addr); |
| @@ -421,6 +421,8 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) · 420 unmodified lines | ||
| 421 | 421 | { |
| 422 | 422 | struct phy_device *phydev = to_phy_device(dev); |
| 423 | 423 | struct phy_driver *phydrv = to_phy_driver(drv); |
| 424 | + const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); | |
| 425 | + int i; | |
| 424 | 426 | |
| 425 | 427 | if (of_driver_match_device(dev, drv)) |
| 426 | 428 | return 1; |
| @@ -428,8 +430,21 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) · 1 unmodified line | ||
| 428 | 430 | if (phydrv->match_phy_device) |
| 429 | 431 | return phydrv->match_phy_device(phydev); |
| 430 | 432 | |
| 431 | − return (phydrv->phy_id & phydrv->phy_id_mask) == | |
| 432 | − (phydev->phy_id & phydrv->phy_id_mask); | |
| 433 | + if (phydev->is_c45) { | |
| 434 | + for (i = 1; i < num_ids; i++) { | |
| 435 | + if (!(phydev->c45_ids.devices_in_package & (1 << i))) | |
| 436 | + continue; | |
| 437 | + | |
| 438 | + if ((phydrv->phy_id & phydrv->phy_id_mask) == | |
| 439 | + (phydev->c45_ids.device_ids[i] & | |
| 440 | + phydrv->phy_id_mask)) | |
| 441 | + return 1; | |
| 442 | + } | |
| 443 | + return 0; | |
| 444 | + } else { | |
| 445 | + return (phydrv->phy_id & phydrv->phy_id_mask) == | |
| 446 | + (phydev->phy_id & phydrv->phy_id_mask); | |
| 447 | + } | |
| 433 | 448 | } |
| 434 | 449 | |
| 435 | 450 | #ifdef CONFIG_PM |
| @@ -757,6 +757,7 @@ static const struct usb_device_id products[] = { · 756 unmodified lines | ||
| 757 | 757 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ |
| 758 | 758 | {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ |
| 759 | 759 | {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ |
| 760 | + {QMI_FIXED_INTF(0x1199, 0x9041, 10)}, /* Sierra Wireless MC7305/MC7355 */ | |
| 760 | 761 | {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ |
| 761 | 762 | {QMI_FIXED_INTF(0x1199, 0x9053, 8)}, /* Sierra Wireless Modem */ |
| 762 | 763 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ |
| @@ -1828,7 +1828,8 @@ static int virtnet_probe(struct virtio_device *vdev) · 1827 unmodified lines | ||
| 1828 | 1828 | else |
| 1829 | 1829 | vi->hdr_len = sizeof(struct virtio_net_hdr); |
| 1830 | 1830 | |
| 1831 | − if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT)) | |
| 1831 | + if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) || | |
| 1832 | + virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) | |
| 1832 | 1833 | vi->any_header_sg = true; |
| 1833 | 1834 | |
| 1834 | 1835 | if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) |
| @@ -279,6 +279,7 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) · 278 unmodified lines | ||
| 279 | 279 | return; |
| 280 | 280 | case AR9300_DEVID_QCA956X: |
| 281 | 281 | ah->hw_version.macVersion = AR_SREV_VERSION_9561; |
| 282 | + return; | |
| 282 | 283 | } |
| 283 | 284 | |
| 284 | 285 | val = REG_READ(ah, AR_SREV) & AR_SREV_ID; |
| @@ -438,6 +438,12 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(unsigned int chnl) · 437 unmodified lines | ||
| 438 | 438 | #define RX_QUEUE_MASK 255 |
| 439 | 439 | #define RX_QUEUE_SIZE_LOG 8 |
| 440 | 440 | |
| 441 | +/* | |
| 442 | + * RX related structures and functions | |
| 443 | + */ | |
| 444 | +#define RX_FREE_BUFFERS 64 | |
| 445 | +#define RX_LOW_WATERMARK 8 | |
| 446 | + | |
| 441 | 447 | /** |
| 442 | 448 | * struct iwl_rb_status - reserve buffer status |
| 443 | 449 | * host memory mapped FH registers |
| @@ -540,13 +540,11 @@ static void iwl_set_hw_address_family_8000(struct device *dev, · 539 unmodified lines | ||
| 540 | 540 | hw_addr = (const u8 *)(mac_override + |
| 541 | 541 | MAC_ADDRESS_OVERRIDE_FAMILY_8000); |
| 542 | 542 | |
| 543 | − /* The byte order is little endian 16 bit, meaning 214365 */ | |
| 544 | − data->hw_addr[0] = hw_addr[1]; | |
| 545 | − data->hw_addr[1] = hw_addr[0]; | |
| 546 | − data->hw_addr[2] = hw_addr[3]; | |
| 547 | − data->hw_addr[3] = hw_addr[2]; | |
| 548 | − data->hw_addr[4] = hw_addr[5]; | |
| 549 | − data->hw_addr[5] = hw_addr[4]; | |
| 543 | + /* | |
| 544 | + * Store the MAC address from MAO section. | |
| 545 | + * No byte swapping is required in MAO section | |
| 546 | + */ | |
| 547 | + memcpy(data->hw_addr, hw_addr, ETH_ALEN); | |
| 550 | 548 | |
| 551 | 549 | /* |
| 552 | 550 | * Force the use of the OTP MAC address in case of reserved MAC |
| @@ -660,7 +660,8 @@ struct iwl_scan_config { · 659 unmodified lines | ||
| 660 | 660 | * iwl_umac_scan_flags |
| 661 | 661 | *@IWL_UMAC_SCAN_FLAG_PREEMPTIVE: scan process triggered by this scan request |
| 662 | 662 | * can be preempted by other scan requests with higher priority. |
| 663 | − * The low priority scan is aborted. | |
| 663 | + * The low priority scan will be resumed when the higher proirity scan is | |
| 664 | + * completed. | |
| 664 | 665 | *@IWL_UMAC_SCAN_FLAG_START_NOTIF: notification will be sent to the driver |
| 665 | 666 | * when scan starts. |
| 666 | 667 | */ |
| @@ -1109,6 +1109,9 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif, · 1108 unmodified lines | ||
| 1109 | 1109 | cmd->uid = cpu_to_le32(uid); |
| 1110 | 1110 | cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params)); |
| 1111 | 1111 | |
| 1112 | + if (type == IWL_MVM_SCAN_SCHED) | |
| 1113 | + cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE); | |
| 1114 | + | |
| 1112 | 1115 | if (iwl_mvm_scan_use_ebs(mvm, vif, n_iterations)) |
| 1113 | 1116 | cmd->channel_flags = IWL_SCAN_CHANNEL_FLAG_EBS | |
| 1114 | 1117 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | |
| @@ -1401,6 +1401,7 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm, · 1400 unmodified lines | ||
| 1401 | 1401 | bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE); |
| 1402 | 1402 | u8 sta_id; |
| 1403 | 1403 | int ret; |
| 1404 | + static const u8 __maybe_unused zero_addr[ETH_ALEN] = {0}; | |
| 1404 | 1405 | |
| 1405 | 1406 | lockdep_assert_held(&mvm->mutex); |
| 1406 | 1407 | |
| @@ -1467,7 +1468,7 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm, · 60 unmodified lines | ||
| 1467 | 1468 | end: |
| 1468 | 1469 | IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n", |
| 1469 | 1470 | keyconf->cipher, keyconf->keylen, keyconf->keyidx, |
| 1470 | − sta->addr, ret); | |
| 1471 | + sta ? sta->addr : zero_addr, ret); | |
| 1471 | 1472 | return ret; |
| 1472 | 1473 | } |
| 1473 | 1474 | |
| @@ -86,7 +86,7 @@ void iwl_mvm_te_clear_data(struct iwl_mvm *mvm, · 85 unmodified lines | ||
| 86 | 86 | { |
| 87 | 87 | lockdep_assert_held(&mvm->time_event_lock); |
| 88 | 88 | |
| 89 | − if (te_data->id == TE_MAX) | |
| 89 | + if (!te_data->vif) | |
| 90 | 90 | return; |
| 91 | 91 | |
| 92 | 92 | list_del(&te_data->list); |
| @@ -252,7 +252,7 @@ void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd, · 251 unmodified lines | ||
| 252 | 252 | |
| 253 | 253 | if (info->band == IEEE80211_BAND_2GHZ && |
| 254 | 254 | !iwl_mvm_bt_coex_is_shared_ant_avail(mvm)) |
| 255 | − rate_flags = BIT(mvm->cfg->non_shared_ant) << RATE_MCS_ANT_POS; | |
| 255 | + rate_flags = mvm->cfg->non_shared_ant << RATE_MCS_ANT_POS; | |
| 256 | 256 | else |
| 257 | 257 | rate_flags = |
| 258 | 258 | BIT(mvm->mgmt_last_antenna_idx) << RATE_MCS_ANT_POS; |
| @@ -368,12 +368,14 @@ static const struct pci_device_id iwl_hw_card_ids[] = { · 367 unmodified lines | ||
| 368 | 368 | /* 3165 Series */ |
| 369 | 369 | {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, |
| 370 | 370 | {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)}, |
| 371 | + {IWL_PCI_DEVICE(0x3166, 0x4212, iwl3165_2ac_cfg)}, | |
| 371 | 372 | {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)}, |
| 372 | 373 | {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)}, |
| 373 | 374 | {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)}, |
| 374 | 375 | {IWL_PCI_DEVICE(0x3166, 0x4310, iwl3165_2ac_cfg)}, |
| 375 | 376 | {IWL_PCI_DEVICE(0x3166, 0x4210, iwl3165_2ac_cfg)}, |
| 376 | 377 | {IWL_PCI_DEVICE(0x3165, 0x8010, iwl3165_2ac_cfg)}, |
| 378 | + {IWL_PCI_DEVICE(0x3165, 0x8110, iwl3165_2ac_cfg)}, | |
| 377 | 379 | |
| 378 | 380 | /* 7265 Series */ |
| 379 | 381 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, |
| @@ -426,9 +428,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { · 46 unmodified lines | ||
| 426 | 428 | {IWL_PCI_DEVICE(0x24F4, 0x1130, iwl8260_2ac_cfg)}, |
| 427 | 429 | {IWL_PCI_DEVICE(0x24F4, 0x1030, iwl8260_2ac_cfg)}, |
| 428 | 430 | {IWL_PCI_DEVICE(0x24F3, 0xC010, iwl8260_2ac_cfg)}, |
| 431 | + {IWL_PCI_DEVICE(0x24F3, 0xC110, iwl8260_2ac_cfg)}, | |
| 429 | 432 | {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)}, |
| 430 | − {IWL_PCI_DEVICE(0x24F4, 0xC030, iwl8260_2ac_cfg)}, | |
| 431 | − {IWL_PCI_DEVICE(0x24F4, 0xD030, iwl8260_2ac_cfg)}, | |
| 432 | 433 | {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)}, |
| 433 | 434 | {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)}, |
| 434 | 435 | {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)}, |
| @@ -44,15 +44,6 @@ · 43 unmodified lines | ||
| 44 | 44 | #include "iwl-io.h" |
| 45 | 45 | #include "iwl-op-mode.h" |
| 46 | 46 | |
| 47 | −/* | |
| 48 | − * RX related structures and functions | |
| 49 | − */ | |
| 50 | −#define RX_NUM_QUEUES 1 | |
| 51 | −#define RX_POST_REQ_ALLOC 2 | |
| 52 | −#define RX_CLAIM_REQ_ALLOC 8 | |
| 53 | −#define RX_POOL_SIZE ((RX_CLAIM_REQ_ALLOC - RX_POST_REQ_ALLOC) * RX_NUM_QUEUES) | |
| 54 | −#define RX_LOW_WATERMARK 8 | |
| 55 | − | |
| 56 | 47 | struct iwl_host_cmd; |
| 57 | 48 | |
| 58 | 49 | /*This file includes the declaration that are internal to the |
| @@ -86,29 +77,29 @@ struct isr_statistics { · 27 unmodified lines | ||
| 86 | 77 | * struct iwl_rxq - Rx queue |
| 87 | 78 | * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) |
| 88 | 79 | * @bd_dma: bus address of buffer of receive buffer descriptors (rbd) |
| 80 | + * @pool: | |
| 81 | + * @queue: | |
| 89 | 82 | * @read: Shared index to newest available Rx buffer |
| 90 | 83 | * @write: Shared index to oldest written Rx packet |
| 91 | 84 | * @free_count: Number of pre-allocated buffers in rx_free |
| 92 | − * @used_count: Number of RBDs handled to allocator to use for allocation | |
| 93 | 85 | * @write_actual: |
| 94 | − * @rx_free: list of RBDs with allocated RB ready for use | |
| 95 | − * @rx_used: list of RBDs with no RB attached | |
| 86 | + * @rx_free: list of free SKBs for use | |
| 87 | + * @rx_used: List of Rx buffers with no SKB | |
| 96 | 88 | * @need_update: flag to indicate we need to update read/write index |
| 97 | 89 | * @rb_stts: driver's pointer to receive buffer status |
| 98 | 90 | * @rb_stts_dma: bus address of receive buffer status |
| 99 | 91 | * @lock: |
| 100 | − * @pool: initial pool of iwl_rx_mem_buffer for the queue | |
| 101 | − * @queue: actual rx queue | |
| 102 | 92 | * |
| 103 | 93 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers |
| 104 | 94 | */ |
| 105 | 95 | struct iwl_rxq { |
| 106 | 96 | __le32 *bd; |
| 107 | 97 | dma_addr_t bd_dma; |
| 98 | + struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; | |
| 99 | + struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | |
| 108 | 100 | u32 read; |
| 109 | 101 | u32 write; |
| 110 | 102 | u32 free_count; |
| 111 | − u32 used_count; | |
| 112 | 103 | u32 write_actual; |
| 113 | 104 | struct list_head rx_free; |
| 114 | 105 | struct list_head rx_used; |
| @@ -116,32 +107,6 @@ struct iwl_rxq { · 1 unmodified line | ||
| 116 | 107 | struct iwl_rb_status *rb_stts; |
| 117 | 108 | dma_addr_t rb_stts_dma; |
| 118 | 109 | spinlock_t lock; |
| 119 | − struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE]; | |
| 120 | − struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | |
| 121 | −}; | |
| 122 | − | |
| 123 | −/** | |
| 124 | − * struct iwl_rb_allocator - Rx allocator | |
| 125 | − * @pool: initial pool of allocator | |
| 126 | − * @req_pending: number of requests the allcator had not processed yet | |
| 127 | − * @req_ready: number of requests honored and ready for claiming | |
| 128 | − * @rbd_allocated: RBDs with pages allocated and ready to be handled to | |
| 129 | − * the queue. This is a list of &struct iwl_rx_mem_buffer | |
| 130 | − * @rbd_empty: RBDs with no page attached for allocator use. This is a list | |
| 131 | − * of &struct iwl_rx_mem_buffer | |
| 132 | − * @lock: protects the rbd_allocated and rbd_empty lists | |
| 133 | − * @alloc_wq: work queue for background calls | |
| 134 | − * @rx_alloc: work struct for background calls | |
| 135 | − */ | |
| 136 | −struct iwl_rb_allocator { | |
| 137 | − struct iwl_rx_mem_buffer pool[RX_POOL_SIZE]; | |
| 138 | − atomic_t req_pending; | |
| 139 | − atomic_t req_ready; | |
| 140 | − struct list_head rbd_allocated; | |
| 141 | − struct list_head rbd_empty; | |
| 142 | − spinlock_t lock; | |
| 143 | − struct workqueue_struct *alloc_wq; | |
| 144 | − struct work_struct rx_alloc; | |
| 145 | 110 | }; |
| 146 | 111 | |
| 147 | 112 | struct iwl_dma_ptr { |
| @@ -285,7 +250,7 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx) · 137 unmodified lines | ||
| 285 | 250 | /** |
| 286 | 251 | * struct iwl_trans_pcie - PCIe transport specific data |
| 287 | 252 | * @rxq: all the RX queue data |
| 288 | − * @rba: allocator for RX replenishing | |
| 253 | + * @rx_replenish: work that will be called when buffers need to be allocated | |
| 289 | 254 | * @drv - pointer to iwl_drv |
| 290 | 255 | * @trans: pointer to the generic transport area |
| 291 | 256 | * @scd_base_addr: scheduler sram base address in SRAM |
| @@ -308,7 +273,7 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx) · 16 unmodified lines | ||
| 308 | 273 | */ |
| 309 | 274 | struct iwl_trans_pcie { |
| 310 | 275 | struct iwl_rxq rxq; |
| 311 | − struct iwl_rb_allocator rba; | |
| 276 | + struct work_struct rx_replenish; | |
| 312 | 277 | struct iwl_trans *trans; |
| 313 | 278 | struct iwl_drv *drv; |
| 314 | 279 | |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | /****************************************************************************** |
| 2 | 2 | * |
| 3 | 3 | * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. |
| 4 | − * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | |
| 4 | + * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH | |
| 5 | 5 | * |
| 6 | 6 | * Portions of this file are derived from the ipw3945 project, as well |
| 7 | 7 | * as portions of the ieee80211 subsystem header files. |
| @@ -74,29 +74,16 @@ · 66 unmodified lines | ||
| 74 | 74 | * resets the Rx queue buffers with new memory. |
| 75 | 75 | * |
| 76 | 76 | * The management in the driver is as follows: |
| 77 | − * + A list of pre-allocated RBDs is stored in iwl->rxq->rx_free. | |
| 78 | − * When the interrupt handler is called, the request is processed. | |
| 79 | − * The page is either stolen - transferred to the upper layer | |
| 80 | − * or reused - added immediately to the iwl->rxq->rx_free list. | |
| 81 | − * + When the page is stolen - the driver updates the matching queue's used | |
| 82 | − * count, detaches the RBD and transfers it to the queue used list. | |
| 83 | − * When there are two used RBDs - they are transferred to the allocator empty | |
| 84 | − * list. Work is then scheduled for the allocator to start allocating | |
| 85 | − * eight buffers. | |
| 86 | − * When there are another 6 used RBDs - they are transferred to the allocator | |
| 87 | − * empty list and the driver tries to claim the pre-allocated buffers and | |
| 88 | − * add them to iwl->rxq->rx_free. If it fails - it continues to claim them | |
| 89 | − * until ready. | |
| 90 | − * When there are 8+ buffers in the free list - either from allocation or from | |
| 91 | − * 8 reused unstolen pages - restock is called to update the FW and indexes. | |
| 92 | − * + In order to make sure the allocator always has RBDs to use for allocation | |
| 93 | − * the allocator has initial pool in the size of num_queues*(8-2) - the | |
| 94 | − * maximum missing RBDs per allocation request (request posted with 2 | |
| 95 | − * empty RBDs, there is no guarantee when the other 6 RBDs are supplied). | |
| 96 | − * The queues supplies the recycle of the rest of the RBDs. | |
| 77 | + * + A list of pre-allocated SKBs is stored in iwl->rxq->rx_free. When | |
| 78 | + * iwl->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled | |
| 79 | + * to replenish the iwl->rxq->rx_free. | |
| 80 | + * + In iwl_pcie_rx_replenish (scheduled) if 'processed' != 'read' then the | |
| 81 | + * iwl->rxq is replenished and the READ INDEX is updated (updating the | |
| 82 | + * 'processed' and 'read' driver indexes as well) | |
| 97 | 83 | * + A received packet is processed and handed to the kernel network stack, |
| 98 | 84 | * detached from the iwl->rxq. The driver 'processed' index is updated. |
| 99 | − * + If there are no allocated buffers in iwl->rxq->rx_free, | |
| 85 | + * + The Host/Firmware iwl->rxq is replenished at irq thread time from the | |
| 86 | + * rx_free list. If there are no allocated buffers in iwl->rxq->rx_free, | |
| 100 | 87 | * the READ INDEX is not incremented and iwl->status(RX_STALLED) is set. |
| 101 | 88 | * If there were enough free buffers and RX_STALLED is set it is cleared. |
| 102 | 89 | * |
| @@ -105,32 +92,18 @@ · 2 unmodified lines | ||
| 105 | 92 | * |
| 106 | 93 | * iwl_rxq_alloc() Allocates rx_free |
| 107 | 94 | * iwl_pcie_rx_replenish() Replenishes rx_free list from rx_used, and calls |
| 108 | − * iwl_pcie_rxq_restock. | |
| 109 | − * Used only during initialization. | |
| 95 | + * iwl_pcie_rxq_restock | |
| 110 | 96 | * iwl_pcie_rxq_restock() Moves available buffers from rx_free into Rx |
| 111 | 97 | * queue, updates firmware pointers, and updates |
| 112 | − * the WRITE index. | |
| 113 | − * iwl_pcie_rx_allocator() Background work for allocating pages. | |
| 98 | + * the WRITE index. If insufficient rx_free buffers | |
| 99 | + * are available, schedules iwl_pcie_rx_replenish | |
| 114 | 100 | * |
| 115 | 101 | * -- enable interrupts -- |
| 116 | 102 | * ISR - iwl_rx() Detach iwl_rx_mem_buffers from pool up to the |
| 117 | 103 | * READ INDEX, detaching the SKB from the pool. |
| 118 | 104 | * Moves the packet buffer from queue to rx_used. |
| 119 | − * Posts and claims requests to the allocator. | |
| 120 | 105 | * Calls iwl_pcie_rxq_restock to refill any empty |
| 121 | 106 | * slots. |
| 122 | − * | |
| 123 | − * RBD life-cycle: | |
| 124 | − * | |
| 125 | − * Init: | |
| 126 | − * rxq.pool -> rxq.rx_used -> rxq.rx_free -> rxq.queue | |
| 127 | − * | |
| 128 | − * Regular Receive interrupt: | |
| 129 | − * Page Stolen: | |
| 130 | − * rxq.queue -> rxq.rx_used -> allocator.rbd_empty -> | |
| 131 | − * allocator.rbd_allocated -> rxq.rx_free -> rxq.queue | |
| 132 | − * Page not Stolen: | |
| 133 | − * rxq.queue -> rxq.rx_free -> rxq.queue | |
| 134 | 107 | * ... |
| 135 | 108 | * |
| 136 | 109 | */ |
| @@ -267,6 +240,10 @@ static void iwl_pcie_rxq_restock(struct iwl_trans *trans) · 130 unmodified lines | ||
| 267 | 240 | rxq->free_count--; |
| 268 | 241 | } |
| 269 | 242 | spin_unlock(&rxq->lock); |
| 243 | + /* If the pre-allocated buffer pool is dropping low, schedule to | |
| 244 | + * refill it */ | |
| 245 | + if (rxq->free_count <= RX_LOW_WATERMARK) | |
| 246 | + schedule_work(&trans_pcie->rx_replenish); | |
| 270 | 247 | |
| 271 | 248 | /* If we've added more space for the firmware to place data, tell it. |
| 272 | 249 | * Increment device's write pointer in multiples of 8. */ |
| @@ -277,44 +254,6 @@ static void iwl_pcie_rxq_restock(struct iwl_trans *trans) · 4 unmodified lines | ||
| 277 | 254 | } |
| 278 | 255 | } |
| 279 | 256 | |
| 280 | −/* | |
| 281 | − * iwl_pcie_rx_alloc_page - allocates and returns a page. | |
| 282 | − * | |
| 283 | − */ | |
| 284 | −static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans) | |
| 285 | −{ | |
| 286 | − struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | |
| 287 | − struct iwl_rxq *rxq = &trans_pcie->rxq; | |
| 288 | − struct page *page; | |
| 289 | − gfp_t gfp_mask = GFP_KERNEL; | |
| 290 | − | |
| 291 | − if (rxq->free_count > RX_LOW_WATERMARK) | |
| 292 | − gfp_mask |= __GFP_NOWARN; | |
| 293 | − | |
| 294 | − if (trans_pcie->rx_page_order > 0) | |
| 295 | − gfp_mask |= __GFP_COMP; | |
| 296 | − | |
| 297 | − /* Alloc a new receive buffer */ | |
| 298 | − page = alloc_pages(gfp_mask, trans_pcie->rx_page_order); | |
| 299 | − if (!page) { | |
| 300 | − if (net_ratelimit()) | |
| 301 | − IWL_DEBUG_INFO(trans, "alloc_pages failed, order: %d\n", | |
| 302 | − trans_pcie->rx_page_order); | |
| 303 | − /* Issue an error if the hardware has consumed more than half | |
| 304 | − * of its free buffer list and we don't have enough | |
| 305 | − * pre-allocated buffers. | |
| 306 | −` */ | |
| 307 | − if (rxq->free_count <= RX_LOW_WATERMARK && | |
| 308 | − iwl_rxq_space(rxq) > (RX_QUEUE_SIZE / 2) && | |
| 309 | − net_ratelimit()) | |
| 310 | − IWL_CRIT(trans, | |
| 311 | − "Failed to alloc_pages with GFP_KERNEL. Only %u free buffers remaining.\n", | |
| 312 | − rxq->free_count); | |
| 313 | − return NULL; | |
| 314 | − } | |
| 315 | − return page; | |
| 316 | −} | |
| 317 | − | |
| 318 | 257 | /* |
| 319 | 258 | * iwl_pcie_rxq_alloc_rbs - allocate a page for each used RBD |
| 320 | 259 | * |
| @@ -324,12 +263,13 @@ static struct page *iwl_pcie_rx_alloc_page(struct iwl_trans *trans) · 3 unmodified lines | ||
| 324 | 263 | * iwl_pcie_rxq_restock. The latter function will update the HW to use the newly |
| 325 | 264 | * allocated buffers. |
| 326 | 265 | */ |
| 327 | −static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans) | |
| 266 | +static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans, gfp_t priority) | |
| 328 | 267 | { |
| 329 | 268 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 330 | 269 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 331 | 270 | struct iwl_rx_mem_buffer *rxb; |
| 332 | 271 | struct page *page; |
| 272 | + gfp_t gfp_mask = priority; | |
| 333 | 273 | |
| 334 | 274 | while (1) { |
| 335 | 275 | spin_lock(&rxq->lock); |
| @@ -339,10 +279,32 @@ static void iwl_pcie_rxq_alloc_rbs(struct iwl_trans *trans) · 3 unmodified lines | ||
| 339 | 279 | } |
| 340 | 280 | spin_unlock(&rxq->lock); |
| 341 | 281 | |
| 282 | + if (rxq->free_count > RX_LOW_WATERMARK) | |
| 283 | + gfp_mask |= __GFP_NOWARN; | |
| 284 | + | |
| 285 | + if (trans_pcie->rx_page_order > 0) | |
| 286 | + gfp_mask |= __GFP_COMP; | |
| 287 | + | |
| 342 | 288 | /* Alloc a new receive buffer */ |
| 343 | − page = iwl_pcie_rx_alloc_page(trans); | |
| 344 | − if (!page) | |
| 289 | + page = alloc_pages(gfp_mask, trans_pcie->rx_page_order); | |
| 290 | + if (!page) { | |
| 291 | + if (net_ratelimit()) | |
| 292 | + IWL_DEBUG_INFO(trans, "alloc_pages failed, " | |
| 293 | + "order: %d\n", | |
| 294 | + trans_pcie->rx_page_order); | |
| 295 | + | |
| 296 | + if ((rxq->free_count <= RX_LOW_WATERMARK) && | |
| 297 | + net_ratelimit()) | |
| 298 | + IWL_CRIT(trans, "Failed to alloc_pages with %s." | |
| 299 | + "Only %u free buffers remaining.\n", | |
| 300 | + priority == GFP_ATOMIC ? | |
| 301 | + "GFP_ATOMIC" : "GFP_KERNEL", | |
| 302 | + rxq->free_count); | |
| 303 | + /* We don't reschedule replenish work here -- we will | |
| 304 | + * call the restock method and if it still needs | |
| 305 | + * more buffers it will schedule replenish */ | |
| 345 | 306 | return; |
| 307 | + } | |
| 346 | 308 | |
| 347 | 309 | spin_lock(&rxq->lock); |
| 348 | 310 | |
| @@ -393,7 +355,7 @@ static void iwl_pcie_rxq_free_rbs(struct iwl_trans *trans) · 44 unmodified lines | ||
| 393 | 355 | |
| 394 | 356 | lockdep_assert_held(&rxq->lock); |
| 395 | 357 | |
| 396 | − for (i = 0; i < RX_QUEUE_SIZE; i++) { | |
| 358 | + for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) { | |
| 397 | 359 | if (!rxq->pool[i].page) |
| 398 | 360 | continue; |
| 399 | 361 | dma_unmap_page(trans->dev, rxq->pool[i].page_dma, |
| @@ -410,144 +372,32 @@ static void iwl_pcie_rxq_free_rbs(struct iwl_trans *trans) · 10 unmodified lines | ||
| 410 | 372 | * When moving to rx_free an page is allocated for the slot. |
| 411 | 373 | * |
| 412 | 374 | * Also restock the Rx queue via iwl_pcie_rxq_restock. |
| 413 | − * This is called only during initialization | |
| 375 | + * This is called as a scheduled work item (except for during initialization) | |
| 414 | 376 | */ |
| 415 | −static void iwl_pcie_rx_replenish(struct iwl_trans *trans) | |
| 377 | +static void iwl_pcie_rx_replenish(struct iwl_trans *trans, gfp_t gfp) | |
| 416 | 378 | { |
| 417 | − iwl_pcie_rxq_alloc_rbs(trans); | |
| 379 | + iwl_pcie_rxq_alloc_rbs(trans, gfp); | |
| 418 | 380 | |
| 419 | 381 | iwl_pcie_rxq_restock(trans); |
| 420 | 382 | } |
| 421 | 383 | |
| 422 | −/* | |
| 423 | − * iwl_pcie_rx_allocator - Allocates pages in the background for RX queues | |
| 424 | − * | |
| 425 | − * Allocates for each received request 8 pages | |
| 426 | − * Called as a scheduled work item. | |
| 427 | − */ | |
| 428 | −static void iwl_pcie_rx_allocator(struct iwl_trans *trans) | |
| 429 | −{ | |
| 430 | − struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | |
| 431 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 432 | − | |
| 433 | − while (atomic_read(&rba->req_pending)) { | |
| 434 | − int i; | |
| 435 | − struct list_head local_empty; | |
| 436 | − struct list_head local_allocated; | |
| 437 | − | |
| 438 | − INIT_LIST_HEAD(&local_allocated); | |
| 439 | − spin_lock(&rba->lock); | |
| 440 | − /* swap out the entire rba->rbd_empty to a local list */ | |
| 441 | − list_replace_init(&rba->rbd_empty, &local_empty); | |
| 442 | − spin_unlock(&rba->lock); | |
| 443 | − | |
| 444 | − for (i = 0; i < RX_CLAIM_REQ_ALLOC;) { | |
| 445 | − struct iwl_rx_mem_buffer *rxb; | |
| 446 | − struct page *page; | |
| 447 | − | |
| 448 | − /* List should never be empty - each reused RBD is | |
| 449 | − * returned to the list, and initial pool covers any | |
| 450 | − * possible gap between the time the page is allocated | |
| 451 | − * to the time the RBD is added. | |
| 452 | − */ | |
| 453 | − BUG_ON(list_empty(&local_empty)); | |
| 454 | − /* Get the first rxb from the rbd list */ | |
| 455 | − rxb = list_first_entry(&local_empty, | |
| 456 | − struct iwl_rx_mem_buffer, list); | |
| 457 | − BUG_ON(rxb->page); | |
| 458 | − | |
| 459 | − /* Alloc a new receive buffer */ | |
| 460 | − page = iwl_pcie_rx_alloc_page(trans); | |
| 461 | − if (!page) | |
| 462 | − continue; | |
| 463 | − rxb->page = page; | |
| 464 | − | |
| 465 | − /* Get physical address of the RB */ | |
| 466 | − rxb->page_dma = dma_map_page(trans->dev, page, 0, | |
| 467 | − PAGE_SIZE << trans_pcie->rx_page_order, | |
| 468 | − DMA_FROM_DEVICE); | |
| 469 | − if (dma_mapping_error(trans->dev, rxb->page_dma)) { | |
| 470 | − rxb->page = NULL; | |
| 471 | − __free_pages(page, trans_pcie->rx_page_order); | |
| 472 | − continue; | |
| 473 | − } | |
| 474 | − /* dma address must be no more than 36 bits */ | |
| 475 | − BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); | |
| 476 | − /* and also 256 byte aligned! */ | |
| 477 | − BUG_ON(rxb->page_dma & DMA_BIT_MASK(8)); | |
| 478 | − | |
| 479 | − /* move the allocated entry to the out list */ | |
| 480 | − list_move(&rxb->list, &local_allocated); | |
| 481 | − i++; | |
| 482 | − } | |
| 483 | − | |
| 484 | − spin_lock(&rba->lock); | |
| 485 | − /* add the allocated rbds to the allocator allocated list */ | |
| 486 | − list_splice_tail(&local_allocated, &rba->rbd_allocated); | |
| 487 | − /* add the unused rbds back to the allocator empty list */ | |
| 488 | − list_splice_tail(&local_empty, &rba->rbd_empty); | |
| 489 | − spin_unlock(&rba->lock); | |
| 490 | − | |
| 491 | − atomic_dec(&rba->req_pending); | |
| 492 | − atomic_inc(&rba->req_ready); | |
| 493 | − } | |
| 494 | −} | |
| 495 | − | |
| 496 | −/* | |
| 497 | − * iwl_pcie_rx_allocator_get - Returns the pre-allocated pages | |
| 498 | −.* | |
| 499 | −.* Called by queue when the queue posted allocation request and | |
| 500 | − * has freed 8 RBDs in order to restock itself. | |
| 501 | − */ | |
| 502 | −static int iwl_pcie_rx_allocator_get(struct iwl_trans *trans, | |
| 503 | − struct iwl_rx_mem_buffer | |
| 504 | − *out[RX_CLAIM_REQ_ALLOC]) | |
| 505 | −{ | |
| 506 | − struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | |
| 507 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 508 | − int i; | |
| 509 | − | |
| 510 | − if (atomic_dec_return(&rba->req_ready) < 0) { | |
| 511 | − atomic_inc(&rba->req_ready); | |
| 512 | − IWL_DEBUG_RX(trans, | |
| 513 | − "Allocation request not ready, pending requests = %d\n", | |
| 514 | − atomic_read(&rba->req_pending)); | |
| 515 | − return -ENOMEM; | |
| 516 | − } | |
| 517 | − | |
| 518 | − spin_lock(&rba->lock); | |
| 519 | − for (i = 0; i < RX_CLAIM_REQ_ALLOC; i++) { | |
| 520 | − /* Get next free Rx buffer, remove it from free list */ | |
| 521 | − out[i] = list_first_entry(&rba->rbd_allocated, | |
| 522 | − struct iwl_rx_mem_buffer, list); | |
| 523 | − list_del(&out[i]->list); | |
| 524 | − } | |
| 525 | − spin_unlock(&rba->lock); | |
| 526 | − | |
| 527 | − return 0; | |
| 528 | −} | |
| 529 | − | |
| 530 | −static void iwl_pcie_rx_allocator_work(struct work_struct *data) | |
| 384 | +static void iwl_pcie_rx_replenish_work(struct work_struct *data) | |
| 531 | 385 | { |
| 532 | − struct iwl_rb_allocator *rba_p = | |
| 533 | − container_of(data, struct iwl_rb_allocator, rx_alloc); | |
| 534 | 386 | struct iwl_trans_pcie *trans_pcie = |
| 535 | − container_of(rba_p, struct iwl_trans_pcie, rba); | |
| 387 | + container_of(data, struct iwl_trans_pcie, rx_replenish); | |
| 536 | 388 | |
| 537 | − iwl_pcie_rx_allocator(trans_pcie->trans); | |
| 389 | + iwl_pcie_rx_replenish(trans_pcie->trans, GFP_KERNEL); | |
| 538 | 390 | } |
| 539 | 391 | |
| 540 | 392 | static int iwl_pcie_rx_alloc(struct iwl_trans *trans) |
| 541 | 393 | { |
| 542 | 394 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 543 | 395 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 544 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 545 | 396 | struct device *dev = trans->dev; |
| 546 | 397 | |
| 547 | 398 | memset(&trans_pcie->rxq, 0, sizeof(trans_pcie->rxq)); |
| 548 | 399 | |
| 549 | 400 | spin_lock_init(&rxq->lock); |
| 550 | − spin_lock_init(&rba->lock); | |
| 551 | 401 | |
| 552 | 402 | if (WARN_ON(rxq->bd || rxq->rb_stts)) |
| 553 | 403 | return -EINVAL; |
| @@ -637,49 +487,15 @@ static void iwl_pcie_rx_init_rxb_lists(struct iwl_rxq *rxq) · 83 unmodified lines | ||
| 637 | 487 | INIT_LIST_HEAD(&rxq->rx_free); |
| 638 | 488 | INIT_LIST_HEAD(&rxq->rx_used); |
| 639 | 489 | rxq->free_count = 0; |
| 640 | − rxq->used_count = 0; | |
| 641 | 490 | |
| 642 | − for (i = 0; i < RX_QUEUE_SIZE; i++) | |
| 491 | + for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) | |
| 643 | 492 | list_add(&rxq->pool[i].list, &rxq->rx_used); |
| 644 | 493 | } |
| 645 | 494 | |
| 646 | −static void iwl_pcie_rx_init_rba(struct iwl_rb_allocator *rba) | |
| 647 | −{ | |
| 648 | − int i; | |
| 649 | − | |
| 650 | − lockdep_assert_held(&rba->lock); | |
| 651 | − | |
| 652 | − INIT_LIST_HEAD(&rba->rbd_allocated); | |
| 653 | − INIT_LIST_HEAD(&rba->rbd_empty); | |
| 654 | − | |
| 655 | − for (i = 0; i < RX_POOL_SIZE; i++) | |
| 656 | − list_add(&rba->pool[i].list, &rba->rbd_empty); | |
| 657 | −} | |
| 658 | − | |
| 659 | −static void iwl_pcie_rx_free_rba(struct iwl_trans *trans) | |
| 660 | −{ | |
| 661 | − struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | |
| 662 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 663 | − int i; | |
| 664 | − | |
| 665 | − lockdep_assert_held(&rba->lock); | |
| 666 | − | |
| 667 | − for (i = 0; i < RX_POOL_SIZE; i++) { | |
| 668 | − if (!rba->pool[i].page) | |
| 669 | − continue; | |
| 670 | − dma_unmap_page(trans->dev, rba->pool[i].page_dma, | |
| 671 | − PAGE_SIZE << trans_pcie->rx_page_order, | |
| 672 | − DMA_FROM_DEVICE); | |
| 673 | − __free_pages(rba->pool[i].page, trans_pcie->rx_page_order); | |
| 674 | − rba->pool[i].page = NULL; | |
| 675 | − } | |
| 676 | −} | |
| 677 | − | |
| 678 | 495 | int iwl_pcie_rx_init(struct iwl_trans *trans) |
| 679 | 496 | { |
| 680 | 497 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 681 | 498 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 682 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 683 | 499 | int i, err; |
| 684 | 500 | |
| 685 | 501 | if (!rxq->bd) { |
| @@ -687,21 +503,11 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) · 1 unmodified line | ||
| 687 | 503 | if (err) |
| 688 | 504 | return err; |
| 689 | 505 | } |
| 690 | − if (!rba->alloc_wq) | |
| 691 | − rba->alloc_wq = alloc_workqueue("rb_allocator", | |
| 692 | − WQ_HIGHPRI | WQ_UNBOUND, 1); | |
| 693 | − INIT_WORK(&rba->rx_alloc, iwl_pcie_rx_allocator_work); | |
| 694 | − | |
| 695 | − spin_lock(&rba->lock); | |
| 696 | − atomic_set(&rba->req_pending, 0); | |
| 697 | − atomic_set(&rba->req_ready, 0); | |
| 698 | − /* free all first - we might be reconfigured for a different size */ | |
| 699 | − iwl_pcie_rx_free_rba(trans); | |
| 700 | − iwl_pcie_rx_init_rba(rba); | |
| 701 | − spin_unlock(&rba->lock); | |
| 702 | 506 | |
| 703 | 507 | spin_lock(&rxq->lock); |
| 704 | 508 | |
| 509 | + INIT_WORK(&trans_pcie->rx_replenish, iwl_pcie_rx_replenish_work); | |
| 510 | + | |
| 705 | 511 | /* free all first - we might be reconfigured for a different size */ |
| 706 | 512 | iwl_pcie_rxq_free_rbs(trans); |
| 707 | 513 | iwl_pcie_rx_init_rxb_lists(rxq); |
| @@ -716,7 +522,7 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) · 8 unmodified lines | ||
| 716 | 522 | memset(rxq->rb_stts, 0, sizeof(*rxq->rb_stts)); |
| 717 | 523 | spin_unlock(&rxq->lock); |
| 718 | 524 | |
| 719 | − iwl_pcie_rx_replenish(trans); | |
| 525 | + iwl_pcie_rx_replenish(trans, GFP_KERNEL); | |
| 720 | 526 | |
| 721 | 527 | iwl_pcie_rx_hw_init(trans, rxq); |
| 722 | 528 | |
| @@ -731,7 +537,6 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) · 8 unmodified lines | ||
| 731 | 537 | { |
| 732 | 538 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 733 | 539 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 734 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 735 | 540 | |
| 736 | 541 | /*if rxq->bd is NULL, it means that nothing has been allocated, |
| 737 | 542 | * exit now */ |
| @@ -740,15 +545,7 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) · 2 unmodified lines | ||
| 740 | 545 | return; |
| 741 | 546 | } |
| 742 | 547 | |
| 743 | − cancel_work_sync(&rba->rx_alloc); | |
| 744 | − if (rba->alloc_wq) { | |
| 745 | − destroy_workqueue(rba->alloc_wq); | |
| 746 | − rba->alloc_wq = NULL; | |
| 747 | − } | |
| 748 | − | |
| 749 | − spin_lock(&rba->lock); | |
| 750 | − iwl_pcie_rx_free_rba(trans); | |
| 751 | − spin_unlock(&rba->lock); | |
| 548 | + cancel_work_sync(&trans_pcie->rx_replenish); | |
| 752 | 549 | |
| 753 | 550 | spin_lock(&rxq->lock); |
| 754 | 551 | iwl_pcie_rxq_free_rbs(trans); |
| @@ -769,43 +566,6 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) · 14 unmodified lines | ||
| 769 | 566 | rxq->rb_stts = NULL; |
| 770 | 567 | } |
| 771 | 568 | |
| 772 | −/* | |
| 773 | − * iwl_pcie_rx_reuse_rbd - Recycle used RBDs | |
| 774 | − * | |
| 775 | − * Called when a RBD can be reused. The RBD is transferred to the allocator. | |
| 776 | − * When there are 2 empty RBDs - a request for allocation is posted | |
| 777 | − */ | |
| 778 | −static void iwl_pcie_rx_reuse_rbd(struct iwl_trans *trans, | |
| 779 | − struct iwl_rx_mem_buffer *rxb, | |
| 780 | − struct iwl_rxq *rxq) | |
| 781 | −{ | |
| 782 | − struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | |
| 783 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 784 | − | |
| 785 | − /* Count the used RBDs */ | |
| 786 | − rxq->used_count++; | |
| 787 | − | |
| 788 | − /* Move the RBD to the used list, will be moved to allocator in batches | |
| 789 | − * before claiming or posting a request*/ | |
| 790 | − list_add_tail(&rxb->list, &rxq->rx_used); | |
| 791 | − | |
| 792 | − /* If we have RX_POST_REQ_ALLOC new released rx buffers - | |
| 793 | − * issue a request for allocator. Modulo RX_CLAIM_REQ_ALLOC is | |
| 794 | − * used for the case we failed to claim RX_CLAIM_REQ_ALLOC, | |
| 795 | − * after but we still need to post another request. | |
| 796 | − */ | |
| 797 | − if ((rxq->used_count % RX_CLAIM_REQ_ALLOC) == RX_POST_REQ_ALLOC) { | |
| 798 | − /* Move the 2 RBDs to the allocator ownership. | |
| 799 | − Allocator has another 6 from pool for the request completion*/ | |
| 800 | − spin_lock(&rba->lock); | |
| 801 | − list_splice_tail_init(&rxq->rx_used, &rba->rbd_empty); | |
| 802 | − spin_unlock(&rba->lock); | |
| 803 | − | |
| 804 | − atomic_inc(&rba->req_pending); | |
| 805 | − queue_work(rba->alloc_wq, &rba->rx_alloc); | |
| 806 | − } | |
| 807 | −} | |
| 808 | − | |
| 809 | 569 | static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, |
| 810 | 570 | struct iwl_rx_mem_buffer *rxb) |
| 811 | 571 | { |
| @@ -928,13 +688,13 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, · 116 unmodified lines | ||
| 928 | 688 | */ |
| 929 | 689 | __free_pages(rxb->page, trans_pcie->rx_page_order); |
| 930 | 690 | rxb->page = NULL; |
| 931 | − iwl_pcie_rx_reuse_rbd(trans, rxb, rxq); | |
| 691 | + list_add_tail(&rxb->list, &rxq->rx_used); | |
| 932 | 692 | } else { |
| 933 | 693 | list_add_tail(&rxb->list, &rxq->rx_free); |
| 934 | 694 | rxq->free_count++; |
| 935 | 695 | } |
| 936 | 696 | } else |
| 937 | − iwl_pcie_rx_reuse_rbd(trans, rxb, rxq); | |
| 697 | + list_add_tail(&rxb->list, &rxq->rx_used); | |
| 938 | 698 | } |
| 939 | 699 | |
| 940 | 700 | /* |
| @@ -944,7 +704,10 @@ static void iwl_pcie_rx_handle(struct iwl_trans *trans) · 3 unmodified lines | ||
| 944 | 704 | { |
| 945 | 705 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 946 | 706 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
| 947 | − u32 r, i, j; | |
| 707 | + u32 r, i; | |
| 708 | + u8 fill_rx = 0; | |
| 709 | + u32 count = 8; | |
| 710 | + int total_empty; | |
| 948 | 711 | |
| 949 | 712 | restart: |
| 950 | 713 | spin_lock(&rxq->lock); |
| @@ -957,6 +720,14 @@ restart: · 6 unmodified lines | ||
| 957 | 720 | if (i == r) |
| 958 | 721 | IWL_DEBUG_RX(trans, "HW = SW = %d\n", r); |
| 959 | 722 | |
| 723 | + /* calculate total frames need to be restock after handling RX */ | |
| 724 | + total_empty = r - rxq->write_actual; | |
| 725 | + if (total_empty < 0) | |
| 726 | + total_empty += RX_QUEUE_SIZE; | |
| 727 | + | |
| 728 | + if (total_empty > (RX_QUEUE_SIZE / 2)) | |
| 729 | + fill_rx = 1; | |
| 730 | + | |
| 960 | 731 | while (i != r) { |
| 961 | 732 | struct iwl_rx_mem_buffer *rxb; |
| 962 | 733 | |
| @@ -968,48 +739,29 @@ restart: · 5 unmodified lines | ||
| 968 | 739 | iwl_pcie_rx_handle_rb(trans, rxb); |
| 969 | 740 | |
| 970 | 741 | i = (i + 1) & RX_QUEUE_MASK; |
| 971 | − | |
| 972 | − /* If we have RX_CLAIM_REQ_ALLOC released rx buffers - | |
| 973 | − * try to claim the pre-allocated buffers from the allocator */ | |
| 974 | − if (rxq->used_count >= RX_CLAIM_REQ_ALLOC) { | |
| 975 | − struct iwl_rb_allocator *rba = &trans_pcie->rba; | |
| 976 | − struct iwl_rx_mem_buffer *out[RX_CLAIM_REQ_ALLOC]; | |
| 977 | − | |
| 978 | − /* Add the remaining 6 empty RBDs for allocator use */ | |
| 979 | − spin_lock(&rba->lock); | |
| 980 | − list_splice_tail_init(&rxq->rx_used, &rba->rbd_empty); | |
| 981 | − spin_unlock(&rba->lock); | |
| 982 | − | |
| 983 | − /* If not ready - continue, will try to reclaim later. | |
| 984 | − * No need to reschedule work - allocator exits only on | |
| 985 | − * success */ | |
| 986 | − if (!iwl_pcie_rx_allocator_get(trans, out)) { | |
| 987 | − /* If success - then RX_CLAIM_REQ_ALLOC | |
| 988 | − * buffers were retrieved and should be added | |
| 989 | − * to free list */ | |
| 990 | − rxq->used_count -= RX_CLAIM_REQ_ALLOC; | |
| 991 | − for (j = 0; j < RX_CLAIM_REQ_ALLOC; j++) { | |
| 992 | − list_add_tail(&out[j]->list, | |
| 993 | − &rxq->rx_free); | |
| 994 | − rxq->free_count++; | |
| 995 | − } | |
| 742 | + /* If there are a lot of unused frames, | |
| 743 | + * restock the Rx queue so ucode wont assert. */ | |
| 744 | + if (fill_rx) { | |
| 745 | + count++; | |
| 746 | + if (count >= 8) { | |
| 747 | + rxq->read = i; | |
| 748 | + spin_unlock(&rxq->lock); | |
| 749 | + iwl_pcie_rx_replenish(trans, GFP_ATOMIC); | |
| 750 | + count = 0; | |
| 751 | + goto restart; | |
| 996 | 752 | } |
| 997 | 753 | } |
| 998 | − /* handle restock for two cases: | |
| 999 | − * - we just pulled buffers from the allocator | |
| 1000 | − * - we have 8+ unstolen pages accumulated */ | |
| 1001 | − if (rxq->free_count >= RX_CLAIM_REQ_ALLOC) { | |
| 1002 | − rxq->read = i; | |
| 1003 | − spin_unlock(&rxq->lock); | |
| 1004 | − iwl_pcie_rxq_restock(trans); | |
| 1005 | − goto restart; | |
| 1006 | − } | |
| 1007 | 754 | } |
| 1008 | 755 | |
| 1009 | 756 | /* Backtrack one entry */ |
| 1010 | 757 | rxq->read = i; |
| 1011 | 758 | spin_unlock(&rxq->lock); |
| 1012 | 759 | |
| 760 | + if (fill_rx) | |
| 761 | + iwl_pcie_rx_replenish(trans, GFP_ATOMIC); | |
| 762 | + else | |
| 763 | + iwl_pcie_rxq_restock(trans); | |
| 764 | + | |
| 1013 | 765 | if (trans_pcie->napi.poll) |
| 1014 | 766 | napi_gro_flush(&trans_pcie->napi, false); |
| 1015 | 767 | } |
| @@ -182,7 +182,7 @@ static void iwl_trans_pcie_write_shr(struct iwl_trans *trans, u32 reg, u32 val) · 181 unmodified lines | ||
| 182 | 182 | |
| 183 | 183 | static void iwl_pcie_set_pwr(struct iwl_trans *trans, bool vaux) |
| 184 | 184 | { |
| 185 | − if (!trans->cfg->apmg_not_supported) | |
| 185 | + if (trans->cfg->apmg_not_supported) | |
| 186 | 186 | return; |
| 187 | 187 | |
| 188 | 188 | if (vaux && pci_pme_capable(to_pci_dev(trans->dev), PCI_D3cold)) |
| @@ -2459,7 +2459,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 2270 unmodified lines | ||
| 2459 | 2459 | struct iwl_trans_pcie *trans_pcie; |
| 2460 | 2460 | struct iwl_trans *trans; |
| 2461 | 2461 | u16 pci_cmd; |
| 2462 | − int err; | |
| 2462 | + int ret; | |
| 2463 | 2463 | |
| 2464 | 2464 | trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), |
| 2465 | 2465 | &pdev->dev, cfg, &trans_ops_pcie, 0); |
| @@ -2474,8 +2474,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 8 unmodified lines | ||
| 2474 | 2474 | spin_lock_init(&trans_pcie->ref_lock); |
| 2475 | 2475 | init_waitqueue_head(&trans_pcie->ucode_write_waitq); |
| 2476 | 2476 | |
| 2477 | − err = pci_enable_device(pdev); | |
| 2478 | − if (err) | |
| 2477 | + ret = pci_enable_device(pdev); | |
| 2478 | + if (ret) | |
| 2479 | 2479 | goto out_no_pci; |
| 2480 | 2480 | |
| 2481 | 2481 | if (!cfg->base_params->pcie_l1_allowed) { |
| @@ -2491,23 +2491,23 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 9 unmodified lines | ||
| 2491 | 2491 | |
| 2492 | 2492 | pci_set_master(pdev); |
| 2493 | 2493 | |
| 2494 | − err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); | |
| 2495 | − if (!err) | |
| 2496 | − err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36)); | |
| 2497 | − if (err) { | |
| 2498 | − err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); | |
| 2499 | − if (!err) | |
| 2500 | − err = pci_set_consistent_dma_mask(pdev, | |
| 2494 | + ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); | |
| 2495 | + if (!ret) | |
| 2496 | + ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36)); | |
| 2497 | + if (ret) { | |
| 2498 | + ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); | |
| 2499 | + if (!ret) | |
| 2500 | + ret = pci_set_consistent_dma_mask(pdev, | |
| 2501 | 2501 | DMA_BIT_MASK(32)); |
| 2502 | 2502 | /* both attempts failed: */ |
| 2503 | − if (err) { | |
| 2503 | + if (ret) { | |
| 2504 | 2504 | dev_err(&pdev->dev, "No suitable DMA available\n"); |
| 2505 | 2505 | goto out_pci_disable_device; |
| 2506 | 2506 | } |
| 2507 | 2507 | } |
| 2508 | 2508 | |
| 2509 | − err = pci_request_regions(pdev, DRV_NAME); | |
| 2510 | − if (err) { | |
| 2509 | + ret = pci_request_regions(pdev, DRV_NAME); | |
| 2510 | + if (ret) { | |
| 2511 | 2511 | dev_err(&pdev->dev, "pci_request_regions failed\n"); |
| 2512 | 2512 | goto out_pci_disable_device; |
| 2513 | 2513 | } |
| @@ -2515,7 +2515,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 1 unmodified line | ||
| 2515 | 2515 | trans_pcie->hw_base = pci_ioremap_bar(pdev, 0); |
| 2516 | 2516 | if (!trans_pcie->hw_base) { |
| 2517 | 2517 | dev_err(&pdev->dev, "pci_ioremap_bar failed\n"); |
| 2518 | − err = -ENODEV; | |
| 2518 | + ret = -ENODEV; | |
| 2519 | 2519 | goto out_pci_release_regions; |
| 2520 | 2520 | } |
| 2521 | 2521 | |
| @@ -2527,9 +2527,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 5 unmodified lines | ||
| 2527 | 2527 | trans_pcie->pci_dev = pdev; |
| 2528 | 2528 | iwl_disable_interrupts(trans); |
| 2529 | 2529 | |
| 2530 | − err = pci_enable_msi(pdev); | |
| 2531 | − if (err) { | |
| 2532 | − dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err); | |
| 2530 | + ret = pci_enable_msi(pdev); | |
| 2531 | + if (ret) { | |
| 2532 | + dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", ret); | |
| 2533 | 2533 | /* enable rfkill interrupt: hw bug w/a */ |
| 2534 | 2534 | pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd); |
| 2535 | 2535 | if (pci_cmd & PCI_COMMAND_INTX_DISABLE) { |
| @@ -2547,11 +2547,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 11 unmodified lines | ||
| 2547 | 2547 | */ |
| 2548 | 2548 | if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { |
| 2549 | 2549 | unsigned long flags; |
| 2550 | − int ret; | |
| 2551 | 2550 | |
| 2552 | 2551 | trans->hw_rev = (trans->hw_rev & 0xfff0) | |
| 2553 | 2552 | (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2); |
| 2554 | 2553 | |
| 2554 | + ret = iwl_pcie_prepare_card_hw(trans); | |
| 2555 | + if (ret) { | |
| 2556 | + IWL_WARN(trans, "Exit HW not ready\n"); | |
| 2557 | + goto out_pci_disable_msi; | |
| 2558 | + } | |
| 2559 | + | |
| 2555 | 2560 | /* |
| 2556 | 2561 | * in-order to recognize C step driver should read chip version |
| 2557 | 2562 | * id located at the AUX bus MISC address space. |
| @@ -2591,13 +2596,14 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, · 33 unmodified lines | ||
| 2591 | 2596 | /* Initialize the wait queue for commands */ |
| 2592 | 2597 | init_waitqueue_head(&trans_pcie->wait_command_queue); |
| 2593 | 2598 | |
| 2594 | − if (iwl_pcie_alloc_ict(trans)) | |
| 2599 | + ret = iwl_pcie_alloc_ict(trans); | |
| 2600 | + if (ret) | |
| 2595 | 2601 | goto out_pci_disable_msi; |
| 2596 | 2602 | |
| 2597 | − err = request_threaded_irq(pdev->irq, iwl_pcie_isr, | |
| 2603 | + ret = request_threaded_irq(pdev->irq, iwl_pcie_isr, | |
| 2598 | 2604 | iwl_pcie_irq_handler, |
| 2599 | 2605 | IRQF_SHARED, DRV_NAME, trans); |
| 2600 | − if (err) { | |
| 2606 | + if (ret) { | |
| 2601 | 2607 | IWL_ERR(trans, "Error allocating IRQ %d\n", pdev->irq); |
| 2602 | 2608 | goto out_free_ict; |
| 2603 | 2609 | } |
| @@ -2617,5 +2623,5 @@ out_pci_disable_device: · 13 unmodified lines | ||
| 2617 | 2623 | pci_disable_device(pdev); |
| 2618 | 2624 | out_no_pci: |
| 2619 | 2625 | iwl_trans_free(trans); |
| 2620 | − return ERR_PTR(err); | |
| 2626 | + return ERR_PTR(ret); | |
| 2621 | 2627 | } |
| @@ -1566,13 +1566,13 @@ static inline void xenvif_tx_dealloc_action(struct xenvif_queue *queue) · 1565 unmodified lines | ||
| 1566 | 1566 | smp_rmb(); |
| 1567 | 1567 | |
| 1568 | 1568 | while (dc != dp) { |
| 1569 | − BUG_ON(gop - queue->tx_unmap_ops > MAX_PENDING_REQS); | |
| 1569 | + BUG_ON(gop - queue->tx_unmap_ops >= MAX_PENDING_REQS); | |
| 1570 | 1570 | pending_idx = |
| 1571 | 1571 | queue->dealloc_ring[pending_index(dc++)]; |
| 1572 | 1572 | |
| 1573 | − pending_idx_release[gop-queue->tx_unmap_ops] = | |
| 1573 | + pending_idx_release[gop - queue->tx_unmap_ops] = | |
| 1574 | 1574 | pending_idx; |
| 1575 | − queue->pages_to_unmap[gop-queue->tx_unmap_ops] = | |
| 1575 | + queue->pages_to_unmap[gop - queue->tx_unmap_ops] = | |
| 1576 | 1576 | queue->mmap_pages[pending_idx]; |
| 1577 | 1577 | gnttab_set_unmap_op(gop, |
| 1578 | 1578 | idx_to_kaddr(queue, pending_idx), |
| @@ -473,6 +473,8 @@ static void bcm2835_gpio_irq_disable(struct irq_data *data) · 472 unmodified lines | ||
| 473 | 473 | |
| 474 | 474 | spin_lock_irqsave(&pc->irq_lock[bank], flags); |
| 475 | 475 | bcm2835_gpio_irq_config(pc, gpio, false); |
| 476 | + /* Clear events that were latched prior to clearing event sources */ | |
| 477 | + bcm2835_gpio_set_bit(pc, GPEDS0, gpio); | |
| 476 | 478 | clear_bit(offset, &pc->enabled_irq_map[bank]); |
| 477 | 479 | spin_unlock_irqrestore(&pc->irq_lock[bank], flags); |
| 478 | 480 | } |
| @@ -403,14 +403,13 @@ static int imx1_pinconf_set(struct pinctrl_dev *pctldev, · 402 unmodified lines | ||
| 403 | 403 | unsigned num_configs) |
| 404 | 404 | { |
| 405 | 405 | struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); |
| 406 | − const struct imx1_pinctrl_soc_info *info = ipctl->info; | |
| 407 | 406 | int i; |
| 408 | 407 | |
| 409 | 408 | for (i = 0; i != num_configs; ++i) { |
| 410 | 409 | imx1_write_bit(ipctl, pin_id, configs[i] & 0x01, MX1_PUEN); |
| 411 | 410 | |
| 412 | 411 | dev_dbg(ipctl->dev, "pinconf set pullup pin %s\n", |
| 413 | − info->pins[pin_id].name); | |
| 412 | + pin_desc_get(pctldev, pin_id)->name); | |
| 414 | 413 | } |
| 415 | 414 | |
| 416 | 415 | return 0; |
| @@ -787,7 +787,6 @@ static const struct pinmux_ops abx500_pinmux_ops = { · 786 unmodified lines | ||
| 787 | 787 | .set_mux = abx500_pmx_set, |
| 788 | 788 | .gpio_request_enable = abx500_gpio_request_enable, |
| 789 | 789 | .gpio_disable_free = abx500_gpio_disable_free, |
| 790 | − .strict = true, | |
| 791 | 790 | }; |
| 792 | 791 | |
| 793 | 792 | static int abx500_get_groups_cnt(struct pinctrl_dev *pctldev) |
| @@ -823,7 +823,7 @@ static int lpc18xx_pconf_set_i2c0(struct pinctrl_dev *pctldev, · 822 unmodified lines | ||
| 823 | 823 | break; |
| 824 | 824 | |
| 825 | 825 | case PIN_CONFIG_INPUT_SCHMITT_ENABLE: |
| 826 | − if (param) | |
| 826 | + if (param_val) | |
| 827 | 827 | *reg &= ~(LPC18XX_SCU_I2C0_ZIF << shift); |
| 828 | 828 | else |
| 829 | 829 | *reg |= (LPC18XX_SCU_I2C0_ZIF << shift); |
| @@ -876,7 +876,7 @@ static int lpc18xx_pconf_set_pin(struct pinctrl_dev *pctldev, · 46 unmodified lines | ||
| 876 | 876 | break; |
| 877 | 877 | |
| 878 | 878 | case PIN_CONFIG_INPUT_SCHMITT_ENABLE: |
| 879 | − if (param) | |
| 879 | + if (param_val) | |
| 880 | 880 | *reg &= ~LPC18XX_SCU_PIN_ZIF; |
| 881 | 881 | else |
| 882 | 882 | *reg |= LPC18XX_SCU_PIN_ZIF; |
| @@ -1760,7 +1760,8 @@ static int pcs_irq_init_chained_handler(struct pcs_device *pcs, · 1759 unmodified lines | ||
| 1760 | 1760 | int res; |
| 1761 | 1761 | |
| 1762 | 1762 | res = request_irq(pcs_soc->irq, pcs_irq_handler, |
| 1763 | − IRQF_SHARED | IRQF_NO_SUSPEND, | |
| 1763 | + IRQF_SHARED | IRQF_NO_SUSPEND | | |
| 1764 | + IRQF_NO_THREAD, | |
| 1764 | 1765 | name, pcs_soc); |
| 1765 | 1766 | if (res) { |
| 1766 | 1767 | pcs_soc->irq = -1; |
| @@ -33,11 +33,6 @@ · 32 unmodified lines | ||
| 33 | 33 | #include "../core.h" |
| 34 | 34 | #include "pinctrl-samsung.h" |
| 35 | 35 | |
| 36 | −#define GROUP_SUFFIX "-grp" | |
| 37 | −#define GSUFFIX_LEN sizeof(GROUP_SUFFIX) | |
| 38 | −#define FUNCTION_SUFFIX "-mux" | |
| 39 | −#define FSUFFIX_LEN sizeof(FUNCTION_SUFFIX) | |
| 40 | − | |
| 41 | 36 | /* list of all possible config options supported */ |
| 42 | 37 | static struct pin_config { |
| 43 | 38 | const char *property; |
| @@ -224,7 +224,7 @@ struct sh_pfc_soc_info { · 223 unmodified lines | ||
| 224 | 224 | |
| 225 | 225 | /* PINMUX_GPIO_GP_ALL - Expand to a list of sh_pfc_pin entries */ |
| 226 | 226 | #define _GP_GPIO(bank, _pin, _name, sfx) \ |
| 227 | − [(bank * 32) + _pin] = { \ | |
| 227 | + { \ | |
| 228 | 228 | .pin = (bank * 32) + _pin, \ |
| 229 | 229 | .name = __stringify(_name), \ |
| 230 | 230 | .enum_id = _name##_DATA, \ |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * Inspired from: |
| 8 | 8 | * - U300 Pinctl drivers |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver header file for the ST Microelectronics SPEAr pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr1310 pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2730,7 +2730,7 @@ static void __exit spear1310_pinctrl_exit(void) · 2721 unmodified lines | ||
| 2730 | 2730 | } |
| 2731 | 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 | 2734 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1310 pinctrl driver"); |
| 2735 | 2735 | MODULE_LICENSE("GPL v2"); |
| 2736 | 2736 | MODULE_DEVICE_TABLE(of, spear1310_pinctrl_of_match); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr1340 pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2046,7 +2046,7 @@ static void __exit spear1340_pinctrl_exit(void) · 2037 unmodified lines | ||
| 2046 | 2046 | } |
| 2047 | 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 | 2050 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1340 pinctrl driver"); |
| 2051 | 2051 | MODULE_LICENSE("GPL v2"); |
| 2052 | 2052 | MODULE_DEVICE_TABLE(of, spear1340_pinctrl_of_match); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr300 pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -703,7 +703,7 @@ static void __exit spear300_pinctrl_exit(void) · 694 unmodified lines | ||
| 703 | 703 | } |
| 704 | 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 | 707 | MODULE_DESCRIPTION("ST Microelectronics SPEAr300 pinctrl driver"); |
| 708 | 708 | MODULE_LICENSE("GPL v2"); |
| 709 | 709 | MODULE_DEVICE_TABLE(of, spear300_pinctrl_of_match); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr310 pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -426,7 +426,7 @@ static void __exit spear310_pinctrl_exit(void) · 417 unmodified lines | ||
| 426 | 426 | } |
| 427 | 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 | 430 | MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver"); |
| 431 | 431 | MODULE_LICENSE("GPL v2"); |
| 432 | 432 | MODULE_DEVICE_TABLE(of, spear310_pinctrl_of_match); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr320 pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -3467,7 +3467,7 @@ static void __exit spear320_pinctrl_exit(void) · 3458 unmodified lines | ||
| 3467 | 3467 | } |
| 3468 | 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 | 3471 | MODULE_DESCRIPTION("ST Microelectronics SPEAr320 pinctrl driver"); |
| 3472 | 3472 | MODULE_LICENSE("GPL v2"); |
| 3473 | 3473 | MODULE_DEVICE_TABLE(of, spear320_pinctrl_of_match); |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Driver for the ST Microelectronics SPEAr3xx pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * Header file for the ST Microelectronics SPEAr3xx pinmux |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -309,12 +309,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = { · 308 unmodified lines | ||
| 309 | 309 | static struct calling_interface_buffer *buffer; |
| 310 | 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 | 317 | static void get_buffer(void) |
| 315 | 318 | { |
| 316 | 319 | mutex_lock(&buffer_mutex); |
| 317 | − memset(buffer, 0, sizeof(struct calling_interface_buffer)); | |
| 320 | + clear_buffer(); | |
| 318 | 321 | } |
| 319 | 322 | |
| 320 | 323 | static void release_buffer(void) |
| @@ -548,21 +551,41 @@ static int dell_rfkill_set(void *data, bool blocked) · 227 unmodified lines | ||
| 548 | 551 | int disable = blocked ? 1 : 0; |
| 549 | 552 | unsigned long radio = (unsigned long)data; |
| 550 | 553 | int hwswitch_bit = (unsigned long)data - 1; |
| 554 | + int hwswitch; | |
| 555 | + int status; | |
| 556 | + int ret; | |
| 551 | 557 | |
| 552 | 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 | 570 | dell_send_request(buffer, 17, 11); |
| 571 | + ret = buffer->output[0]; | |
| 572 | + hwswitch = buffer->output[1]; | |
| 554 | 573 | |
| 555 | 574 | /* If the hardware switch controls this radio, and the hardware |
| 556 | 575 | switch is disabled, always disable the radio */ |
| 557 | − if ((hwswitch_state & BIT(hwswitch_bit)) && | |
| 558 | − !(buffer->output[1] & BIT(16))) | |
| 576 | + if (ret == 0 && (hwswitch & BIT(hwswitch_bit)) && | |
| 577 | + (status & BIT(0)) && !(status & BIT(16))) | |
| 559 | 578 | disable = 1; |
| 560 | 579 | |
| 580 | + clear_buffer(); | |
| 581 | + | |
| 561 | 582 | buffer->input[0] = (1 | (radio<<8) | (disable << 16)); |
| 562 | 583 | dell_send_request(buffer, 17, 11); |
| 584 | + ret = buffer->output[0]; | |
| 563 | 585 | |
| 586 | + out: | |
| 564 | 587 | release_buffer(); |
| 565 | − return 0; | |
| 588 | + return dell_smi_error(ret); | |
| 566 | 589 | } |
| 567 | 590 | |
| 568 | 591 | /* Must be called with the buffer held */ |
| @@ -572,6 +595,7 @@ static void dell_rfkill_update_sw_state(struct rfkill *rfkill, int radio, · 3 unmodified lines | ||
| 572 | 595 | if (status & BIT(0)) { |
| 573 | 596 | /* Has hw-switch, sync sw_state to BIOS */ |
| 574 | 597 | int block = rfkill_blocked(rfkill); |
| 598 | + clear_buffer(); | |
| 575 | 599 | buffer->input[0] = (1 | (radio << 8) | (block << 16)); |
| 576 | 600 | dell_send_request(buffer, 17, 11); |
| 577 | 601 | } else { |
| @@ -581,23 +605,43 @@ static void dell_rfkill_update_sw_state(struct rfkill *rfkill, int radio, · 3 unmodified lines | ||
| 581 | 605 | } |
| 582 | 606 | |
| 583 | 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 | 611 | rfkill_set_hw_state(rfkill, !(status & BIT(16))); |
| 588 | 612 | } |
| 589 | 613 | |
| 590 | 614 | static void dell_rfkill_query(struct rfkill *rfkill, void *data) |
| 591 | 615 | { |
| 616 | + int radio = ((unsigned long)data & 0xF); | |
| 617 | + int hwswitch; | |
| 592 | 618 | int status; |
| 619 | + int ret; | |
| 593 | 620 | |
| 594 | 621 | get_buffer(); |
| 622 | + | |
| 595 | 623 | dell_send_request(buffer, 17, 11); |
| 624 | + ret = buffer->output[0]; | |
| 596 | 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 | 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 | 647 | static const struct rfkill_ops dell_rfkill_ops = { |
| @@ -609,13 +653,27 @@ static struct dentry *dell_laptop_dir; · 5 unmodified lines | ||
| 609 | 653 | |
| 610 | 654 | static int dell_debugfs_show(struct seq_file *s, void *data) |
| 611 | 655 | { |
| 656 | + int hwswitch_state; | |
| 657 | + int hwswitch_ret; | |
| 612 | 658 | int status; |
| 659 | + int ret; | |
| 613 | 660 | |
| 614 | 661 | get_buffer(); |
| 662 | + | |
| 615 | 663 | dell_send_request(buffer, 17, 11); |
| 664 | + ret = buffer->output[0]; | |
| 616 | 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 | 674 | release_buffer(); |
| 618 | 675 | |
| 676 | + seq_printf(s, "return:\t%d\n", ret); | |
| 619 | 677 | seq_printf(s, "status:\t0x%X\n", status); |
| 620 | 678 | seq_printf(s, "Bit 0 : Hardware switch supported: %lu\n", |
| 621 | 679 | status & BIT(0)); |
| @@ -657,7 +715,8 @@ static int dell_debugfs_show(struct seq_file *s, void *data) · 35 unmodified lines | ||
| 657 | 715 | seq_printf(s, "Bit 21: WiGig is blocked: %lu\n", |
| 658 | 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 | 720 | seq_printf(s, "Bit 0 : Wifi controlled by switch: %lu\n", |
| 662 | 721 | hwswitch_state & BIT(0)); |
| 663 | 722 | seq_printf(s, "Bit 1 : Bluetooth controlled by switch: %lu\n", |
| @@ -693,25 +752,43 @@ static const struct file_operations dell_debugfs_fops = { · 29 unmodified lines | ||
| 693 | 752 | |
| 694 | 753 | static void dell_update_rfkill(struct work_struct *ignored) |
| 695 | 754 | { |
| 755 | + int hwswitch = 0; | |
| 696 | 756 | int status; |
| 757 | + int ret; | |
| 697 | 758 | |
| 698 | 759 | get_buffer(); |
| 760 | + | |
| 699 | 761 | dell_send_request(buffer, 17, 11); |
| 762 | + ret = buffer->output[0]; | |
| 700 | 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 | 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 | 779 | dell_rfkill_update_sw_state(wifi_rfkill, 1, status); |
| 705 | 780 | } |
| 706 | 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 | 784 | dell_rfkill_update_sw_state(bluetooth_rfkill, 2, status); |
| 709 | 785 | } |
| 710 | 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 | 788 | dell_rfkill_update_sw_state(wwan_rfkill, 3, status); |
| 713 | 789 | } |
| 714 | 790 | |
| 791 | + out: | |
| 715 | 792 | release_buffer(); |
| 716 | 793 | } |
| 717 | 794 | static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); |
| @@ -773,21 +850,17 @@ static int __init dell_setup_rfkill(void) · 55 unmodified lines | ||
| 773 | 850 | |
| 774 | 851 | get_buffer(); |
| 775 | 852 | dell_send_request(buffer, 17, 11); |
| 853 | + ret = buffer->output[0]; | |
| 776 | 854 | status = buffer->output[1]; |
| 777 | − buffer->input[0] = 0x2; | |
| 778 | − dell_send_request(buffer, 17, 11); | |
| 779 | − hwswitch_state = buffer->output[1]; | |
| 780 | 855 | release_buffer(); |
| 781 | 856 | |
| 782 | − if (!(status & BIT(0))) { | |
| 783 | − if (force_rfkill) { | |
| 784 | − /* No hwsitch, clear all hw-controlled bits */ | |
| 785 | − hwswitch_state &= ~7; | |
| 786 | − } else { | |
| 787 | − /* rfkill is only tested on laptops with a hwswitch */ | |
| 788 | − return 0; | |
| 789 | − } | |
| 790 | − } | |
| 857 | + /* dell wireless info smbios call is not supported */ | |
| 858 | + if (ret != 0) | |
| 859 | + return 0; | |
| 860 | + | |
| 861 | + /* rfkill is only tested on laptops with a hwswitch */ | |
| 862 | + if (!(status & BIT(0)) && !force_rfkill) | |
| 863 | + return 0; | |
| 791 | 864 | |
| 792 | 865 | if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { |
| 793 | 866 | wifi_rfkill = rfkill_alloc("dell-wifi", &platform_device->dev, |
| @@ -932,47 +1005,50 @@ static void dell_cleanup_rfkill(void) · 138 unmodified lines | ||
| 932 | 1005 | |
| 933 | 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 | 1015 | get_buffer(); |
| 938 | − buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | |
| 1016 | + buffer->input[0] = token; | |
| 939 | 1017 | buffer->input[1] = bd->props.brightness; |
| 940 | 1018 | |
| 941 | − if (buffer->input[0] == -1) { | |
| 942 | − ret = -ENODEV; | |
| 943 | − goto out; | |
| 944 | − } | |
| 945 | − | |
| 946 | 1019 | if (power_supply_is_system_supplied() > 0) |
| 947 | 1020 | dell_send_request(buffer, 1, 2); |
| 948 | 1021 | else |
| 949 | 1022 | dell_send_request(buffer, 1, 1); |
| 950 | 1023 | |
| 951 | − out: | |
| 1024 | + ret = dell_smi_error(buffer->output[0]); | |
| 1025 | + | |
| 952 | 1026 | release_buffer(); |
| 953 | 1027 | return ret; |
| 954 | 1028 | } |
| 955 | 1029 | |
| 956 | 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(); | |
| 961 | − buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | |
| 1035 | + token = find_token_location(BRIGHTNESS_TOKEN); | |
| 1036 | + if (token == -1) | |
| 1037 | + return -ENODEV; | |
| 962 | 1038 | |
| 963 | − if (buffer->input[0] == -1) { | |
| 964 | − ret = -ENODEV; | |
| 965 | − goto out; | |
| 966 | − } | |
| 1039 | + get_buffer(); | |
| 1040 | + buffer->input[0] = token; | |
| 967 | 1041 | |
| 968 | 1042 | if (power_supply_is_system_supplied() > 0) |
| 969 | 1043 | dell_send_request(buffer, 0, 2); |
| 970 | 1044 | else |
| 971 | 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 | 1052 | release_buffer(); |
| 977 | 1053 | return ret; |
| 978 | 1054 | } |
| @@ -2036,6 +2112,7 @@ static void kbd_led_exit(void) · 1057 unmodified lines | ||
| 2036 | 2112 | static int __init dell_init(void) |
| 2037 | 2113 | { |
| 2038 | 2114 | int max_intensity = 0; |
| 2115 | + int token; | |
| 2039 | 2116 | int ret; |
| 2040 | 2117 | |
| 2041 | 2118 | if (!dmi_check_system(dell_device_table)) |
| @@ -2094,13 +2171,15 @@ static int __init dell_init(void) · 52 unmodified lines | ||
| 2094 | 2171 | if (acpi_video_get_backlight_type() != acpi_backlight_vendor) |
| 2095 | 2172 | return 0; |
| 2096 | 2173 | |
| 2097 | − get_buffer(); | |
| 2098 | − buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | |
| 2099 | − if (buffer->input[0] != -1) { | |
| 2174 | + token = find_token_location(BRIGHTNESS_TOKEN); | |
| 2175 | + if (token != -1) { | |
| 2176 | + get_buffer(); | |
| 2177 | + buffer->input[0] = token; | |
| 2100 | 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 | 2184 | if (max_intensity) { |
| 2106 | 2185 | struct backlight_properties props; |
| @@ -96,18 +96,18 @@ static struct intel_pmc_ipc_dev { · 95 unmodified lines | ||
| 96 | 96 | struct completion cmd_complete; |
| 97 | 97 | |
| 98 | 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 | 100 | int acpi_io_size; |
| 101 | 101 | struct platform_device *tco_dev; |
| 102 | 102 | |
| 103 | 103 | /* gcr */ |
| 104 | − void *gcr_base; | |
| 104 | + resource_size_t gcr_base; | |
| 105 | 105 | int gcr_size; |
| 106 | 106 | |
| 107 | 107 | /* punit */ |
| 108 | − void *punit_base; | |
| 108 | + resource_size_t punit_base; | |
| 109 | 109 | int punit_size; |
| 110 | − void *punit_base2; | |
| 110 | + resource_size_t punit_base2; | |
| 111 | 111 | int punit_size2; |
| 112 | 112 | struct platform_device *punit_dev; |
| 113 | 113 | } ipcdev; |
| @@ -210,10 +210,15 @@ static int intel_pmc_ipc_check_status(void) · 96 unmodified lines | ||
| 210 | 210 | return ret; |
| 211 | 211 | } |
| 212 | 212 | |
| 213 | −/* | |
| 214 | − * intel_pmc_ipc_simple_command | |
| 215 | − * @cmd: command | |
| 216 | − * @sub: sub type | |
| 213 | +/** | |
| 214 | + * intel_pmc_ipc_simple_command() - Simple IPC command | |
| 215 | + * @cmd: IPC command code. | |
| 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 | 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) · 12 unmodified lines | ||
| 232 | 237 | } |
| 233 | 238 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_simple_command); |
| 234 | 239 | |
| 235 | −/* | |
| 236 | − * intel_pmc_ipc_raw_cmd | |
| 237 | − * @cmd: command | |
| 238 | − * @sub: sub type | |
| 239 | − * @in: input data | |
| 240 | − * @inlen: input length in bytes | |
| 241 | − * @out: output data | |
| 242 | − * @outlen: output length in dwords | |
| 243 | − * @sptr: data writing to SPTR register | |
| 244 | − * @dptr: data writing to DPTR register | |
| 240 | +/** | |
| 241 | + * intel_pmc_ipc_raw_cmd() - IPC command with data and pointers | |
| 242 | + * @cmd: IPC command code. | |
| 243 | + * @sub: IPC command sub type. | |
| 244 | + * @in: input data of this IPC command. | |
| 245 | + * @inlen: input data length in bytes. | |
| 246 | + * @out: output data of this IPC command. | |
| 247 | + * @outlen: output data length in dwords. | |
| 248 | + * @sptr: data writing to SPTR 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 | 255 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out, |
| 247 | 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, · 30 unmodified lines | ||
| 278 | 287 | } |
| 279 | 288 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_raw_cmd); |
| 280 | 289 | |
| 281 | −/* | |
| 282 | − * intel_pmc_ipc_command | |
| 283 | − * @cmd: command | |
| 284 | − * @sub: sub type | |
| 285 | − * @in: input data | |
| 286 | − * @inlen: input length in bytes | |
| 287 | − * @out: output data | |
| 288 | − * @outlen: output length in dwords | |
| 290 | +/** | |
| 291 | + * intel_pmc_ipc_command() - IPC command with input/output data | |
| 292 | + * @cmd: IPC command code. | |
| 293 | + * @sub: IPC command sub type. | |
| 294 | + * @in: input data of this IPC command. | |
| 295 | + * @inlen: input data length in bytes. | |
| 296 | + * @out: output data of this IPC command. | |
| 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 | 303 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 291 | 304 | u32 *out, u32 outlen) |
| @@ -480,11 +493,11 @@ static int ipc_create_punit_device(void) · 188 unmodified lines | ||
| 480 | 493 | pdev->dev.parent = ipcdev.dev; |
| 481 | 494 | |
| 482 | 495 | res = punit_res; |
| 483 | − res->start = (resource_size_t)ipcdev.punit_base; | |
| 496 | + res->start = ipcdev.punit_base; | |
| 484 | 497 | res->end = res->start + ipcdev.punit_size - 1; |
| 485 | 498 | |
| 486 | 499 | res = punit_res + PUNIT_RESOURCE_INTER; |
| 487 | − res->start = (resource_size_t)ipcdev.punit_base2; | |
| 500 | + res->start = ipcdev.punit_base2; | |
| 488 | 501 | res->end = res->start + ipcdev.punit_size2 - 1; |
| 489 | 502 | |
| 490 | 503 | ret = platform_device_add_resources(pdev, punit_res, |
| @@ -522,15 +535,15 @@ static int ipc_create_tco_device(void) · 31 unmodified lines | ||
| 522 | 535 | pdev->dev.parent = ipcdev.dev; |
| 523 | 536 | |
| 524 | 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 | 539 | res->end = res->start + TCO_REGS_SIZE - 1; |
| 527 | 540 | |
| 528 | 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 | 543 | res->end = res->start + SMI_EN_SIZE - 1; |
| 531 | 544 | |
| 532 | 545 | res = tco_res + TCO_RESOURCE_GCR_MEM; |
| 533 | − res->start = (resource_size_t)ipcdev.gcr_base; | |
| 546 | + res->start = ipcdev.gcr_base; | |
| 534 | 547 | res->end = res->start + ipcdev.gcr_size - 1; |
| 535 | 548 | |
| 536 | 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) · 52 unmodified lines | ||
| 589 | 602 | return -ENXIO; |
| 590 | 603 | } |
| 591 | 604 | size = resource_size(res); |
| 592 | − ipcdev.acpi_io_base = (void *)res->start; | |
| 605 | + ipcdev.acpi_io_base = res->start; | |
| 593 | 606 | ipcdev.acpi_io_size = size; |
| 594 | 607 | dev_info(&pdev->dev, "io res: %llx %x\n", |
| 595 | 608 | (long long)res->start, (int)resource_size(res)); |
| @@ -601,7 +614,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) · 5 unmodified lines | ||
| 601 | 614 | return -ENXIO; |
| 602 | 615 | } |
| 603 | 616 | size = resource_size(res); |
| 604 | − ipcdev.punit_base = (void *)res->start; | |
| 617 | + ipcdev.punit_base = res->start; | |
| 605 | 618 | ipcdev.punit_size = size; |
| 606 | 619 | dev_info(&pdev->dev, "punit data res: %llx %x\n", |
| 607 | 620 | (long long)res->start, (int)resource_size(res)); |
| @@ -613,7 +626,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) · 5 unmodified lines | ||
| 613 | 626 | return -ENXIO; |
| 614 | 627 | } |
| 615 | 628 | size = resource_size(res); |
| 616 | − ipcdev.punit_base2 = (void *)res->start; | |
| 629 | + ipcdev.punit_base2 = res->start; | |
| 617 | 630 | ipcdev.punit_size2 = size; |
| 618 | 631 | dev_info(&pdev->dev, "punit interface res: %llx %x\n", |
| 619 | 632 | (long long)res->start, (int)resource_size(res)); |
| @@ -637,7 +650,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) · 17 unmodified lines | ||
| 637 | 650 | } |
| 638 | 651 | ipcdev.ipc_base = addr; |
| 639 | 652 | |
| 640 | − ipcdev.gcr_base = (void *)(res->start + size); | |
| 653 | + ipcdev.gcr_base = res->start + size; | |
| 641 | 654 | ipcdev.gcr_size = PLAT_RESOURCE_GCR_SIZE; |
| 642 | 655 | dev_info(&pdev->dev, "ipc res: %llx %x\n", |
| 643 | 656 | (long long)res->start, (int)resource_size(res)); |
| @@ -216,13 +216,13 @@ static int pwr_reg_rdwr(u16 *addr, u8 *data, u32 count, u32 op, u32 id) · 215 unmodified lines | ||
| 216 | 216 | int nc; |
| 217 | 217 | u32 offset = 0; |
| 218 | 218 | int err; |
| 219 | − u8 cbuf[IPC_WWBUF_SIZE] = { }; | |
| 219 | + u8 cbuf[IPC_WWBUF_SIZE]; | |
| 220 | 220 | u32 *wbuf = (u32 *)&cbuf; |
| 221 | 221 | |
| 222 | − mutex_lock(&ipclock); | |
| 223 | − | |
| 224 | 222 | memset(cbuf, 0, sizeof(cbuf)); |
| 225 | 223 | |
| 224 | + mutex_lock(&ipclock); | |
| 225 | + | |
| 226 | 226 | if (ipcdev.pdev == NULL) { |
| 227 | 227 | mutex_unlock(&ipclock); |
| 228 | 228 | return -ENODEV; |
| @@ -88,7 +88,7 @@ static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm) · 87 unmodified lines | ||
| 88 | 88 | { |
| 89 | 89 | struct armada38x_rtc *rtc = dev_get_drvdata(dev); |
| 90 | 90 | int ret = 0; |
| 91 | − unsigned long time, flags; | |
| 91 | + unsigned long time; | |
| 92 | 92 | |
| 93 | 93 | ret = rtc_tm_to_time(tm, &time); |
| 94 | 94 | |
| @@ -343,6 +343,8 @@ static int mtk_rtc_probe(struct platform_device *pdev) · 342 unmodified lines | ||
| 343 | 343 | goto out_dispose_irq; |
| 344 | 344 | } |
| 345 | 345 | |
| 346 | + device_init_wakeup(&pdev->dev, 1); | |
| 347 | + | |
| 346 | 348 | rtc->rtc_dev = rtc_device_register("mt6397-rtc", &pdev->dev, |
| 347 | 349 | &mtk_rtc_ops, THIS_MODULE); |
| 348 | 350 | if (IS_ERR(rtc->rtc_dev)) { |
| @@ -351,8 +353,6 @@ static int mtk_rtc_probe(struct platform_device *pdev) · 2 unmodified lines | ||
| 351 | 353 | goto out_free_irq; |
| 352 | 354 | } |
| 353 | 355 | |
| 354 | − device_init_wakeup(&pdev->dev, 1); | |
| 355 | − | |
| 356 | 356 | return 0; |
| 357 | 357 | |
| 358 | 358 | out_free_irq: |
| @@ -1862,6 +1862,33 @@ static void __dasd_device_check_expire(struct dasd_device *device) · 1861 unmodified lines | ||
| 1862 | 1862 | } |
| 1863 | 1863 | } |
| 1864 | 1864 | |
| 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 | + | |
| 1865 | 1892 | /* |
| 1866 | 1893 | * Take a look at the first request on the ccw queue and check |
| 1867 | 1894 | * if it needs to be started. |
| @@ -1876,13 +1903,8 @@ static void __dasd_device_start_head(struct dasd_device *device) · 8 unmodified lines | ||
| 1876 | 1903 | cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); |
| 1877 | 1904 | if (cqr->status != DASD_CQR_QUEUED) |
| 1878 | 1905 | return; |
| 1879 | − /* when device is stopped, return request to previous layer | |
| 1880 | − * exception: only the disconnect or unresumed bits are set and the | |
| 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))) { | |
| 1906 | + /* if device is not usable return request to upper layer */ | |
| 1907 | + if (__dasd_device_is_unusable(device, cqr)) { | |
| 1886 | 1908 | cqr->intrc = -EAGAIN; |
| 1887 | 1909 | cqr->status = DASD_CQR_CLEARED; |
| 1888 | 1910 | dasd_schedule_device_bh(device); |
| @@ -699,7 +699,8 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device) · 698 unmodified lines | ||
| 699 | 699 | struct dasd_device, alias_list); |
| 700 | 700 | spin_unlock_irqrestore(&lcu->lock, flags); |
| 701 | 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 | 704 | return alias_device; |
| 704 | 705 | else |
| 705 | 706 | return NULL; |
| @@ -7,6 +7,7 @@ · 6 unmodified lines | ||
| 7 | 7 | #define KMSG_COMPONENT "sclp_early" |
| 8 | 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
| 9 | 9 | |
| 10 | +#include <linux/errno.h> | |
| 10 | 11 | #include <asm/ctl_reg.h> |
| 11 | 12 | #include <asm/sclp.h> |
| 12 | 13 | #include <asm/ipl.h> |
| @@ -54,6 +54,10 @@ MODULE_DESCRIPTION("Cryptographic Coprocessor interface, " \ · 53 unmodified lines | ||
| 54 | 54 | "Copyright IBM Corp. 2001, 2012"); |
| 55 | 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 | 61 | static DEFINE_SPINLOCK(zcrypt_device_lock); |
| 58 | 62 | static LIST_HEAD(zcrypt_device_list); |
| 59 | 63 | static int zcrypt_device_count = 0; |
| @@ -1373,6 +1377,7 @@ static int zcrypt_rng_data_read(struct hwrng *rng, u32 *data) · 1313 unmodified lines | ||
| 1373 | 1377 | static struct hwrng zcrypt_rng_dev = { |
| 1374 | 1378 | .name = "zcrypt", |
| 1375 | 1379 | .data_read = zcrypt_rng_data_read, |
| 1380 | + .quality = 990, | |
| 1376 | 1381 | }; |
| 1377 | 1382 | |
| 1378 | 1383 | static int zcrypt_rng_device_add(void) |
| @@ -1387,6 +1392,8 @@ static int zcrypt_rng_device_add(void) · 8 unmodified lines | ||
| 1387 | 1392 | goto out; |
| 1388 | 1393 | } |
| 1389 | 1394 | zcrypt_rng_buffer_index = 0; |
| 1395 | + if (!zcrypt_hwrng_seed) | |
| 1396 | + zcrypt_rng_dev.quality = 0; | |
| 1390 | 1397 | rc = hwrng_register(&zcrypt_rng_dev); |
| 1391 | 1398 | if (rc) |
| 1392 | 1399 | goto out_free; |
| @@ -859,7 +859,7 @@ sdev_store_queue_depth(struct device *dev, struct device_attribute *attr, · 858 unmodified lines | ||
| 859 | 859 | |
| 860 | 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 | 863 | return -EINVAL; |
| 864 | 864 | |
| 865 | 865 | retval = sht->change_queue_depth(sdev, depth); |
| @@ -203,7 +203,7 @@ static ssize_t srp_show_tmo(char *buf, int tmo) · 202 unmodified lines | ||
| 203 | 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 | 208 | int res = 0; |
| 209 | 209 | |
| @@ -214,6 +214,7 @@ static int srp_parse_tmo(int *tmo, const char *buf) · 4 unmodified lines | ||
| 214 | 214 | |
| 215 | 215 | return res; |
| 216 | 216 | } |
| 217 | +EXPORT_SYMBOL(srp_parse_tmo); | |
| 217 | 218 | |
| 218 | 219 | static ssize_t show_reconnect_delay(struct device *dev, |
| 219 | 220 | struct device_attribute *attr, char *buf) |
| @@ -1329,9 +1329,9 @@ static int st_open(struct inode *inode, struct file *filp) · 1328 unmodified lines | ||
| 1329 | 1329 | spin_lock(&st_use_lock); |
| 1330 | 1330 | STp->in_use = 0; |
| 1331 | 1331 | spin_unlock(&st_use_lock); |
| 1332 | − scsi_tape_put(STp); | |
| 1333 | 1332 | if (resumed) |
| 1334 | 1333 | scsi_autopm_put_device(STp->device); |
| 1334 | + scsi_tape_put(STp); | |
| 1335 | 1335 | return retval; |
| 1336 | 1336 | |
| 1337 | 1337 | } |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | config STAGING_BOARD |
| 2 | 2 | bool "Staging Board Support" |
| 3 | − depends on OF_ADDRESS | |
| 3 | + depends on OF_ADDRESS && OF_IRQ && CLKDEV_LOOKUP | |
| 4 | 4 | help |
| 5 | 5 | Select to enable per-board staging support code. |
| 6 | 6 | |
| @@ -31,7 +31,6 @@ · 30 unmodified lines | ||
| 31 | 31 | #define DEBUG_PORTAL_ALLOC |
| 32 | 32 | #define DEBUG_SUBSYSTEM S_LND |
| 33 | 33 | |
| 34 | −#include <asm/irq.h> | |
| 35 | 34 | #include <linux/crc32.h> |
| 36 | 35 | #include <linux/errno.h> |
| 37 | 36 | #include <linux/if.h> |
| @@ -1418,7 +1418,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, · 1417 unmodified lines | ||
| 1418 | 1418 | |
| 1419 | 1419 | priv->current_aid = conf->aid; |
| 1420 | 1420 | |
| 1421 | − if (changed & BSS_CHANGED_BSSID) { | |
| 1421 | + if (changed & BSS_CHANGED_BSSID && conf->bssid) { | |
| 1422 | 1422 | unsigned long flags; |
| 1423 | 1423 | |
| 1424 | 1424 | spin_lock_irqsave(&priv->lock, flags); |
| @@ -701,7 +701,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, · 700 unmodified lines | ||
| 701 | 701 | |
| 702 | 702 | priv->current_aid = conf->aid; |
| 703 | 703 | |
| 704 | − if (changed & BSS_CHANGED_BSSID) | |
| 704 | + if (changed & BSS_CHANGED_BSSID && conf->bssid) | |
| 705 | 705 | vnt_mac_set_bssid_addr(priv, (u8 *)conf->bssid); |
| 706 | 706 | |
| 707 | 707 | |
| @@ -72,17 +72,7 @@ static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg) · 71 unmodified lines | ||
| 72 | 72 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 73 | 73 | |
| 74 | 74 | /* Backup Host regs */ |
| 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 | − } | |
| 75 | + hr = &hsotg->hr_backup; | |
| 86 | 76 | hr->hcfg = readl(hsotg->regs + HCFG); |
| 87 | 77 | hr->haintmsk = readl(hsotg->regs + HAINTMSK); |
| 88 | 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) · 1 unmodified line | ||
| 90 | 80 | |
| 91 | 81 | hr->hprt0 = readl(hsotg->regs + HPRT0); |
| 92 | 82 | hr->hfir = readl(hsotg->regs + HFIR); |
| 83 | + hr->valid = true; | |
| 93 | 84 | |
| 94 | 85 | return 0; |
| 95 | 86 | } |
| @@ -109,12 +100,13 @@ static int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg) · 13 unmodified lines | ||
| 109 | 100 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 110 | 101 | |
| 111 | 102 | /* Restore host regs */ |
| 112 | − hr = hsotg->hr_backup; | |
| 113 | − if (!hr) { | |
| 103 | + hr = &hsotg->hr_backup; | |
| 104 | + if (!hr->valid) { | |
| 114 | 105 | dev_err(hsotg->dev, "%s: no host registers to restore\n", |
| 115 | 106 | __func__); |
| 116 | 107 | return -EINVAL; |
| 117 | 108 | } |
| 109 | + hr->valid = false; | |
| 118 | 110 | |
| 119 | 111 | writel(hr->hcfg, hsotg->regs + HCFG); |
| 120 | 112 | writel(hr->haintmsk, hsotg->regs + HAINTMSK); |
| @@ -152,17 +144,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg) · 31 unmodified lines | ||
| 152 | 144 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 153 | 145 | |
| 154 | 146 | /* Backup dev regs */ |
| 155 | − 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 | − } | |
| 147 | + dr = &hsotg->dr_backup; | |
| 166 | 148 | |
| 167 | 149 | dr->dcfg = readl(hsotg->regs + DCFG); |
| 168 | 150 | dr->dctl = readl(hsotg->regs + DCTL); |
| @@ -195,7 +177,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg) · 26 unmodified lines | ||
| 195 | 177 | dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i)); |
| 196 | 178 | dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i)); |
| 197 | 179 | } |
| 198 | − | |
| 180 | + dr->valid = true; | |
| 199 | 181 | return 0; |
| 200 | 182 | } |
| 201 | 183 | |
| @@ -215,12 +197,13 @@ static int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg) · 13 unmodified lines | ||
| 215 | 197 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 216 | 198 | |
| 217 | 199 | /* Restore dev regs */ |
| 218 | − dr = hsotg->dr_backup; | |
| 219 | − if (!dr) { | |
| 200 | + dr = &hsotg->dr_backup; | |
| 201 | + if (!dr->valid) { | |
| 220 | 202 | dev_err(hsotg->dev, "%s: no device registers to restore\n", |
| 221 | 203 | __func__); |
| 222 | 204 | return -EINVAL; |
| 223 | 205 | } |
| 206 | + dr->valid = false; | |
| 224 | 207 | |
| 225 | 208 | writel(dr->dcfg, hsotg->regs + DCFG); |
| 226 | 209 | writel(dr->dctl, hsotg->regs + DCTL); |
| @@ -268,17 +251,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg) · 41 unmodified lines | ||
| 268 | 251 | int i; |
| 269 | 252 | |
| 270 | 253 | /* Backup global regs */ |
| 271 | − 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 | − } | |
| 254 | + gr = &hsotg->gr_backup; | |
| 282 | 255 | |
| 283 | 256 | gr->gotgctl = readl(hsotg->regs + GOTGCTL); |
| 284 | 257 | gr->gintmsk = readl(hsotg->regs + GINTMSK); |
| @@ -291,6 +264,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg) · 6 unmodified lines | ||
| 291 | 264 | for (i = 0; i < MAX_EPS_CHANNELS; i++) |
| 292 | 265 | gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i)); |
| 293 | 266 | |
| 267 | + gr->valid = true; | |
| 294 | 268 | return 0; |
| 295 | 269 | } |
| 296 | 270 | |
| @@ -309,12 +283,13 @@ static int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg) · 12 unmodified lines | ||
| 309 | 283 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 310 | 284 | |
| 311 | 285 | /* Restore global regs */ |
| 312 | − gr = hsotg->gr_backup; | |
| 313 | − if (!gr) { | |
| 286 | + gr = &hsotg->gr_backup; | |
| 287 | + if (!gr->valid) { | |
| 314 | 288 | dev_err(hsotg->dev, "%s: no global registers to restore\n", |
| 315 | 289 | __func__); |
| 316 | 290 | return -EINVAL; |
| 317 | 291 | } |
| 292 | + gr->valid = false; | |
| 318 | 293 | |
| 319 | 294 | writel(0xffffffff, hsotg->regs + GINTSTS); |
| 320 | 295 | writel(gr->gotgctl, hsotg->regs + GOTGCTL); |
| @@ -492,6 +492,7 @@ struct dwc2_gregs_backup { · 491 unmodified lines | ||
| 492 | 492 | u32 gdfifocfg; |
| 493 | 493 | u32 dtxfsiz[MAX_EPS_CHANNELS]; |
| 494 | 494 | u32 gpwrdn; |
| 495 | + bool valid; | |
| 495 | 496 | }; |
| 496 | 497 | |
| 497 | 498 | /** |
| @@ -521,6 +522,7 @@ struct dwc2_dregs_backup { · 23 unmodified lines | ||
| 521 | 522 | u32 doepctl[MAX_EPS_CHANNELS]; |
| 522 | 523 | u32 doeptsiz[MAX_EPS_CHANNELS]; |
| 523 | 524 | u32 doepdma[MAX_EPS_CHANNELS]; |
| 525 | + bool valid; | |
| 524 | 526 | }; |
| 525 | 527 | |
| 526 | 528 | /** |
| @@ -538,6 +540,7 @@ struct dwc2_hregs_backup { · 11 unmodified lines | ||
| 538 | 540 | u32 hcintmsk[MAX_EPS_CHANNELS]; |
| 539 | 541 | u32 hprt0; |
| 540 | 542 | u32 hfir; |
| 543 | + bool valid; | |
| 541 | 544 | }; |
| 542 | 545 | |
| 543 | 546 | /** |
| @@ -705,9 +708,9 @@ struct dwc2_hsotg { · 161 unmodified lines | ||
| 705 | 708 | struct work_struct wf_otg; |
| 706 | 709 | struct timer_list wkp_timer; |
| 707 | 710 | enum dwc2_lx_state lx_state; |
| 708 | − struct dwc2_gregs_backup *gr_backup; | |
| 709 | − struct dwc2_dregs_backup *dr_backup; | |
| 710 | − struct dwc2_hregs_backup *hr_backup; | |
| 711 | + struct dwc2_gregs_backup gr_backup; | |
| 712 | + struct dwc2_dregs_backup dr_backup; | |
| 713 | + struct dwc2_hregs_backup hr_backup; | |
| 711 | 714 | |
| 712 | 715 | struct dentry *debug_root; |
| 713 | 716 | struct debugfs_regset32 *regset; |
| @@ -359,10 +359,9 @@ void dwc2_hcd_stop(struct dwc2_hsotg *hsotg) · 358 unmodified lines | ||
| 359 | 359 | |
| 360 | 360 | /* Caller must hold driver lock */ |
| 361 | 361 | static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, |
| 362 | − struct dwc2_hcd_urb *urb, void **ep_handle, | |
| 363 | − gfp_t mem_flags) | |
| 362 | + struct dwc2_hcd_urb *urb, struct dwc2_qh *qh, | |
| 363 | + struct dwc2_qtd *qtd) | |
| 364 | 364 | { |
| 365 | − struct dwc2_qtd *qtd; | |
| 366 | 365 | u32 intr_mask; |
| 367 | 366 | int retval; |
| 368 | 367 | int dev_speed; |
| @@ -386,18 +385,15 @@ static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, · 17 unmodified lines | ||
| 386 | 385 | return -ENODEV; |
| 387 | 386 | } |
| 388 | 387 | |
| 389 | − qtd = kzalloc(sizeof(*qtd), mem_flags); | |
| 390 | 388 | if (!qtd) |
| 391 | − return -ENOMEM; | |
| 389 | + return -EINVAL; | |
| 392 | 390 | |
| 393 | 391 | dwc2_hcd_qtd_init(qtd, urb); |
| 394 | − retval = dwc2_hcd_qtd_add(hsotg, qtd, (struct dwc2_qh **)ep_handle, | |
| 395 | − mem_flags); | |
| 392 | + retval = dwc2_hcd_qtd_add(hsotg, qtd, qh); | |
| 396 | 393 | if (retval) { |
| 397 | 394 | dev_err(hsotg->dev, |
| 398 | 395 | "DWC OTG HCD URB Enqueue failed adding QTD. Error status %d\n", |
| 399 | 396 | retval); |
| 400 | − kfree(qtd); | |
| 401 | 397 | return retval; |
| 402 | 398 | } |
| 403 | 399 | |
| @@ -2445,6 +2441,9 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, · 2041 unmodified lines | ||
| 2445 | 2441 | u32 tflags = 0; |
| 2446 | 2442 | void *buf; |
| 2447 | 2443 | unsigned long flags; |
| 2444 | + struct dwc2_qh *qh; | |
| 2445 | + bool qh_allocated = false; | |
| 2446 | + struct dwc2_qtd *qtd; | |
| 2448 | 2447 | |
| 2449 | 2448 | if (dbg_urb(urb)) { |
| 2450 | 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, · 72 unmodified lines | ||
| 2523 | 2522 | urb->iso_frame_desc[i].length); |
| 2524 | 2523 | |
| 2525 | 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 | 2543 | spin_lock_irqsave(&hsotg->lock, flags); |
| 2528 | 2544 | retval = usb_hcd_link_urb_to_ep(hcd, urb); |
| 2529 | 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 | 2549 | if (retval) |
| 2534 | − goto fail2; | |
| 2550 | + goto fail3; | |
| 2535 | 2551 | |
| 2536 | 2552 | if (alloc_bandwidth) { |
| 2537 | 2553 | dwc2_allocate_bus_bandwidth(hcd, |
| @@ -2543,12 +2559,25 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, · 5 unmodified lines | ||
| 2543 | 2559 | |
| 2544 | 2560 | return 0; |
| 2545 | 2561 | |
| 2546 | −fail2: | |
| 2562 | +fail3: | |
| 2547 | 2563 | dwc2_urb->priv = NULL; |
| 2548 | 2564 | usb_hcd_unlink_urb_from_ep(hcd, urb); |
| 2549 | −fail1: | |
| 2565 | +fail2: | |
| 2550 | 2566 | spin_unlock_irqrestore(&hsotg->lock, flags); |
| 2551 | 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 | 2581 | fail0: |
| 2553 | 2582 | kfree(dwc2_urb); |
| 2554 | 2583 | |
| @@ -463,6 +463,9 @@ extern void dwc2_hcd_queue_transactions(struct dwc2_hsotg *hsotg, · 462 unmodified lines | ||
| 463 | 463 | /* Schedule Queue Functions */ |
| 464 | 464 | /* Implemented in hcd_queue.c */ |
| 465 | 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 | 469 | extern void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); |
| 467 | 470 | extern int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); |
| 468 | 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, · 2 unmodified lines | ||
| 471 | 474 | |
| 472 | 475 | extern void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb); |
| 473 | 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 | 479 | /* Unlinks and frees a QTD */ |
| 477 | 480 | static inline void dwc2_hcd_qtd_unlink_and_free(struct dwc2_hsotg *hsotg, |
| @@ -191,7 +191,7 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, · 190 unmodified lines | ||
| 191 | 191 | * |
| 192 | 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 | 195 | struct dwc2_hcd_urb *urb, |
| 196 | 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) · 569 unmodified lines | ||
| 767 | 767 | * |
| 768 | 768 | * @hsotg: The DWC HCD structure |
| 769 | 769 | * @qtd: The QTD to add |
| 770 | − * @qh: Out parameter to return queue head | |
| 771 | − * @atomic_alloc: Flag to do atomic alloc if needed | |
| 770 | + * @qh: Queue head to add qtd to | |
| 772 | 771 | * |
| 773 | 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 | |
| 776 | − * will create a new QH. If the QH to which the QTD is added is not currently | |
| 777 | − * scheduled, it is placed into the proper schedule based on its EP type. | |
| 774 | + * If the QH to which the QTD is added is not currently scheduled, it is placed | |
| 775 | + * into the proper schedule based on its EP type. | |
| 778 | 776 | */ |
| 779 | 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 | 780 | int retval; |
| 785 | 781 | |
| 786 | − /* | |
| 787 | − * Get the QH which holds the QTD-list to insert to. Create QH if it | |
| 788 | − * doesn't exist. | |
| 789 | − */ | |
| 790 | − if (*qh == NULL) { | |
| 791 | − *qh = dwc2_hcd_qh_create(hsotg, urb, mem_flags); | |
| 792 | − if (*qh == NULL) | |
| 793 | − return -ENOMEM; | |
| 794 | − allocated = 1; | |
| 782 | + if (unlikely(!qh)) { | |
| 783 | + dev_err(hsotg->dev, "%s: Invalid QH\n", __func__); | |
| 784 | + retval = -EINVAL; | |
| 785 | + goto fail; | |
| 795 | 786 | } |
| 796 | 787 | |
| 797 | − retval = dwc2_hcd_qh_add(hsotg, *qh); | |
| 788 | + retval = dwc2_hcd_qh_add(hsotg, qh); | |
| 798 | 789 | if (retval) |
| 799 | 790 | goto fail; |
| 800 | 791 | |
| 801 | − qtd->qh = *qh; | |
| 802 | − list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list); | |
| 792 | + qtd->qh = qh; | |
| 793 | + list_add_tail(&qtd->qtd_list_entry, &qh->qtd_list); | |
| 803 | 794 | |
| 804 | 795 | return 0; |
| 805 | − | |
| 806 | 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 | 797 | return retval; |
| 823 | 798 | } |
| @@ -446,10 +446,12 @@ static int dwc3_phy_setup(struct dwc3 *dwc) · 445 unmodified lines | ||
| 446 | 446 | /* Select the HS PHY interface */ |
| 447 | 447 | switch (DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3)) { |
| 448 | 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 | 451 | reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI; |
| 451 | 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 | 455 | reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI; |
| 454 | 456 | dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); |
| 455 | 457 | } else { |
| @@ -1758,10 +1758,13 @@ unknown: · 1757 unmodified lines | ||
| 1758 | 1758 | * take such requests too, if that's ever needed: to work |
| 1759 | 1759 | * in config 0, etc. |
| 1760 | 1760 | */ |
| 1761 | − list_for_each_entry(f, &cdev->config->functions, list) | |
| 1762 | − if (f->req_match && f->req_match(f, ctrl)) | |
| 1763 | − goto try_fun_setup; | |
| 1764 | − f = NULL; | |
| 1761 | + if (cdev->config) { | |
| 1762 | + list_for_each_entry(f, &cdev->config->functions, list) | |
| 1763 | + if (f->req_match && f->req_match(f, ctrl)) | |
| 1764 | + goto try_fun_setup; | |
| 1765 | + f = NULL; | |
| 1766 | + } | |
| 1767 | + | |
| 1765 | 1768 | switch (ctrl->bRequestType & USB_RECIP_MASK) { |
| 1766 | 1769 | case USB_RECIP_INTERFACE: |
| 1767 | 1770 | if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) |
| @@ -571,7 +571,7 @@ static struct config_group *function_make( · 570 unmodified lines | ||
| 571 | 571 | if (IS_ERR(fi)) |
| 572 | 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 | 575 | if (ret) { |
| 576 | 576 | usb_put_function_instance(fi); |
| 577 | 577 | return ERR_PTR(ret); |
| @@ -924,7 +924,8 @@ static ssize_t ffs_epfile_write_iter(struct kiocb *kiocb, struct iov_iter *from) · 923 unmodified lines | ||
| 924 | 924 | |
| 925 | 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 | 930 | res = ffs_epfile_io(kiocb->ki_filp, p); |
| 930 | 931 | if (res == -EIOCBQUEUED) |
| @@ -968,7 +969,8 @@ static ssize_t ffs_epfile_read_iter(struct kiocb *kiocb, struct iov_iter *to) · 37 unmodified lines | ||
| 968 | 969 | |
| 969 | 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 | 975 | res = ffs_epfile_io(kiocb->ki_filp, p); |
| 974 | 976 | if (res == -EIOCBQUEUED) |
| @@ -2786,7 +2786,7 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns) · 2785 unmodified lines | ||
| 2786 | 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 | 2790 | if (unlikely(!curlun)) |
| 2791 | 2791 | return -ENOMEM; |
| 2792 | 2792 | |
| @@ -2796,8 +2796,6 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns) · 3 unmodified lines | ||
| 2796 | 2796 | common->luns = curlun; |
| 2797 | 2797 | common->nluns = nluns; |
| 2798 | 2798 | |
| 2799 | − pr_info("Number of LUNs=%d\n", common->nluns); | |
| 2800 | − | |
| 2801 | 2799 | return 0; |
| 2802 | 2800 | } |
| 2803 | 2801 | EXPORT_SYMBOL_GPL(fsg_common_set_nluns); |
| @@ -3563,14 +3561,26 @@ static struct usb_function *fsg_alloc(struct usb_function_instance *fi) · 759 unmodified lines | ||
| 3563 | 3561 | struct fsg_opts *opts = fsg_opts_from_func_inst(fi); |
| 3564 | 3562 | struct fsg_common *common = opts->common; |
| 3565 | 3563 | struct fsg_dev *fsg; |
| 3564 | + unsigned nluns, i; | |
| 3566 | 3565 | |
| 3567 | 3566 | fsg = kzalloc(sizeof(*fsg), GFP_KERNEL); |
| 3568 | 3567 | if (unlikely(!fsg)) |
| 3569 | 3568 | return ERR_PTR(-ENOMEM); |
| 3570 | 3569 | |
| 3571 | 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 | 3581 | opts->refcnt++; |
| 3573 | 3582 | mutex_unlock(&opts->lock); |
| 3583 | + | |
| 3574 | 3584 | fsg->function.name = FSG_DRIVER_DESC; |
| 3575 | 3585 | fsg->function.bind = fsg_bind; |
| 3576 | 3586 | fsg->function.unbind = fsg_unbind; |
| @@ -1145,7 +1145,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) · 1144 unmodified lines | ||
| 1145 | 1145 | if (opts->id && !midi->id) { |
| 1146 | 1146 | status = -ENOMEM; |
| 1147 | 1147 | mutex_unlock(&opts->lock); |
| 1148 | − goto kstrdup_fail; | |
| 1148 | + goto setup_fail; | |
| 1149 | 1149 | } |
| 1150 | 1150 | midi->in_ports = opts->in_ports; |
| 1151 | 1151 | midi->out_ports = opts->out_ports; |
| @@ -1164,8 +1164,6 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) · 12 unmodified lines | ||
| 1164 | 1164 | |
| 1165 | 1165 | return &midi->func; |
| 1166 | 1166 | |
| 1167 | −kstrdup_fail: | |
| 1168 | − f_midi_unregister_card(midi); | |
| 1169 | 1167 | setup_fail: |
| 1170 | 1168 | for (--i; i >= 0; i--) |
| 1171 | 1169 | kfree(midi->in_port[i]); |
| @@ -1171,7 +1171,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) · 1170 unmodified lines | ||
| 1171 | 1171 | udc_name, fotg210); |
| 1172 | 1172 | if (ret < 0) { |
| 1173 | 1173 | pr_err("request_irq error (%d)\n", ret); |
| 1174 | − goto err_irq; | |
| 1174 | + goto err_req; | |
| 1175 | 1175 | } |
| 1176 | 1176 | |
| 1177 | 1177 | ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); |
| @@ -1183,7 +1183,6 @@ static int fotg210_udc_probe(struct platform_device *pdev) · 5 unmodified lines | ||
| 1183 | 1183 | return 0; |
| 1184 | 1184 | |
| 1185 | 1185 | err_add_udc: |
| 1186 | −err_irq: | |
| 1187 | 1186 | free_irq(ires->start, fotg210); |
| 1188 | 1187 | |
| 1189 | 1188 | err_req: |
| @@ -275,9 +275,7 @@ static int musb_has_gadget(struct musb *musb) · 274 unmodified lines | ||
| 275 | 275 | #ifdef CONFIG_USB_MUSB_HOST |
| 276 | 276 | return 1; |
| 277 | 277 | #else |
| 278 | − if (musb->port_mode == MUSB_PORT_MODE_HOST) | |
| 279 | − return 1; | |
| 280 | − return musb->g.dev.driver != NULL; | |
| 278 | + return musb->port_mode == MUSB_PORT_MODE_HOST; | |
| 281 | 279 | #endif |
| 282 | 280 | } |
| 283 | 281 | |
| @@ -217,6 +217,9 @@ static bool mxs_phy_get_vbus_status(struct mxs_phy *mxs_phy) · 216 unmodified lines | ||
| 217 | 217 | { |
| 218 | 218 | unsigned int vbus_value; |
| 219 | 219 | |
| 220 | + if (!mxs_phy->regmap_anatop) | |
| 221 | + return false; | |
| 222 | + | |
| 220 | 223 | if (mxs_phy->port_id == 0) |
| 221 | 224 | regmap_read(mxs_phy->regmap_anatop, |
| 222 | 225 | ANADIG_USB1_VBUS_DET_STAT, |
| @@ -187,6 +187,7 @@ static const struct usb_device_id id_table[] = { · 186 unmodified lines | ||
| 187 | 187 | { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ |
| 188 | 188 | { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ |
| 189 | 189 | { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ |
| 190 | + { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */ | |
| 190 | 191 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ |
| 191 | 192 | { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ |
| 192 | 193 | { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ |
| @@ -121,26 +121,26 @@ static DEFINE_SPINLOCK(release_lock); · 120 unmodified lines | ||
| 121 | 121 | static const unsigned int dummy; /* for clarity in register access fns */ |
| 122 | 122 | |
| 123 | 123 | enum mos_regs { |
| 124 | − THR, /* serial port regs */ | |
| 125 | − RHR, | |
| 126 | − IER, | |
| 127 | − FCR, | |
| 128 | − ISR, | |
| 129 | − LCR, | |
| 130 | − MCR, | |
| 131 | − LSR, | |
| 132 | − MSR, | |
| 133 | − SPR, | |
| 134 | − DLL, | |
| 135 | − DLM, | |
| 136 | − DPR, /* parallel port regs */ | |
| 137 | − DSR, | |
| 138 | − DCR, | |
| 139 | − ECR, | |
| 140 | − SP1_REG, /* device control regs */ | |
| 141 | − SP2_REG, /* serial port 2 (7720 only) */ | |
| 142 | − PP_REG, | |
| 143 | − SP_CONTROL_REG, | |
| 124 | + MOS7720_THR, /* serial port regs */ | |
| 125 | + MOS7720_RHR, | |
| 126 | + MOS7720_IER, | |
| 127 | + MOS7720_FCR, | |
| 128 | + MOS7720_ISR, | |
| 129 | + MOS7720_LCR, | |
| 130 | + MOS7720_MCR, | |
| 131 | + MOS7720_LSR, | |
| 132 | + MOS7720_MSR, | |
| 133 | + MOS7720_SPR, | |
| 134 | + MOS7720_DLL, | |
| 135 | + MOS7720_DLM, | |
| 136 | + MOS7720_DPR, /* parallel port regs */ | |
| 137 | + MOS7720_DSR, | |
| 138 | + MOS7720_DCR, | |
| 139 | + MOS7720_ECR, | |
| 140 | + MOS7720_SP1_REG, /* device control regs */ | |
| 141 | + MOS7720_SP2_REG, /* serial port 2 (7720 only) */ | |
| 142 | + MOS7720_PP_REG, | |
| 143 | + MOS7720_SP_CONTROL_REG, | |
| 144 | 144 | }; |
| 145 | 145 | |
| 146 | 146 | /* |
| @@ -150,26 +150,26 @@ enum mos_regs { · 3 unmodified lines | ||
| 150 | 150 | static inline __u16 get_reg_index(enum mos_regs reg) |
| 151 | 151 | { |
| 152 | 152 | static const __u16 mos7715_index_lookup_table[] = { |
| 153 | − 0x00, /* THR */ | |
| 154 | − 0x00, /* RHR */ | |
| 155 | − 0x01, /* IER */ | |
| 156 | − 0x02, /* FCR */ | |
| 157 | − 0x02, /* ISR */ | |
| 158 | − 0x03, /* LCR */ | |
| 159 | − 0x04, /* MCR */ | |
| 160 | − 0x05, /* LSR */ | |
| 161 | − 0x06, /* MSR */ | |
| 162 | − 0x07, /* SPR */ | |
| 163 | − 0x00, /* DLL */ | |
| 164 | − 0x01, /* DLM */ | |
| 165 | − 0x00, /* DPR */ | |
| 166 | − 0x01, /* DSR */ | |
| 167 | − 0x02, /* DCR */ | |
| 168 | − 0x0a, /* ECR */ | |
| 169 | − 0x01, /* SP1_REG */ | |
| 170 | − 0x02, /* SP2_REG (7720 only) */ | |
| 171 | − 0x04, /* PP_REG (7715 only) */ | |
| 172 | − 0x08, /* SP_CONTROL_REG */ | |
| 153 | + 0x00, /* MOS7720_THR */ | |
| 154 | + 0x00, /* MOS7720_RHR */ | |
| 155 | + 0x01, /* MOS7720_IER */ | |
| 156 | + 0x02, /* MOS7720_FCR */ | |
| 157 | + 0x02, /* MOS7720_ISR */ | |
| 158 | + 0x03, /* MOS7720_LCR */ | |
| 159 | + 0x04, /* MOS7720_MCR */ | |
| 160 | + 0x05, /* MOS7720_LSR */ | |
| 161 | + 0x06, /* MOS7720_MSR */ | |
| 162 | + 0x07, /* MOS7720_SPR */ | |
| 163 | + 0x00, /* MOS7720_DLL */ | |
| 164 | + 0x01, /* MOS7720_DLM */ | |
| 165 | + 0x00, /* MOS7720_DPR */ | |
| 166 | + 0x01, /* MOS7720_DSR */ | |
| 167 | + 0x02, /* MOS7720_DCR */ | |
| 168 | + 0x0a, /* MOS7720_ECR */ | |
| 169 | + 0x01, /* MOS7720_SP1_REG */ | |
| 170 | + 0x02, /* MOS7720_SP2_REG (7720 only) */ | |
| 171 | + 0x04, /* MOS7720_PP_REG (7715 only) */ | |
| 172 | + 0x08, /* MOS7720_SP_CONTROL_REG */ | |
| 173 | 173 | }; |
| 174 | 174 | return mos7715_index_lookup_table[reg]; |
| 175 | 175 | } |
| @@ -181,10 +181,10 @@ static inline __u16 get_reg_index(enum mos_regs reg) · 5 unmodified lines | ||
| 181 | 181 | static inline __u16 get_reg_value(enum mos_regs reg, |
| 182 | 182 | unsigned int serial_portnum) |
| 183 | 183 | { |
| 184 | − if (reg >= SP1_REG) /* control reg */ | |
| 184 | + if (reg >= MOS7720_SP1_REG) /* control reg */ | |
| 185 | 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 | 188 | return 0x0100; |
| 189 | 189 | |
| 190 | 190 | else /* serial port reg */ |
| @@ -252,7 +252,8 @@ static inline int mos7715_change_mode(struct mos7715_parport *mos_parport, · 61 unmodified lines | ||
| 252 | 252 | enum mos7715_pp_modes mode) |
| 253 | 253 | { |
| 254 | 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 | 257 | return 0; |
| 257 | 258 | } |
| 258 | 259 | |
| @@ -486,7 +487,7 @@ static void parport_mos7715_write_data(struct parport *pp, unsigned char d) · 227 unmodified lines | ||
| 486 | 487 | if (parport_prologue(pp) < 0) |
| 487 | 488 | return; |
| 488 | 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 | 491 | parport_epilogue(pp); |
| 491 | 492 | } |
| 492 | 493 | |
| @@ -497,7 +498,7 @@ static unsigned char parport_mos7715_read_data(struct parport *pp) · 4 unmodified lines | ||
| 497 | 498 | |
| 498 | 499 | if (parport_prologue(pp) < 0) |
| 499 | 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 | 502 | parport_epilogue(pp); |
| 502 | 503 | return d; |
| 503 | 504 | } |
| @@ -510,7 +511,7 @@ static void parport_mos7715_write_control(struct parport *pp, unsigned char d) · 6 unmodified lines | ||
| 510 | 511 | if (parport_prologue(pp) < 0) |
| 511 | 512 | return; |
| 512 | 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 | 515 | mos_parport->shadowDCR = data; |
| 515 | 516 | parport_epilogue(pp); |
| 516 | 517 | } |
| @@ -543,7 +544,8 @@ static unsigned char parport_mos7715_frob_control(struct parport *pp, · 26 unmodified lines | ||
| 543 | 544 | if (parport_prologue(pp) < 0) |
| 544 | 545 | return 0; |
| 545 | 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 | 549 | dcr = mos_parport->shadowDCR & 0x0f; |
| 548 | 550 | parport_epilogue(pp); |
| 549 | 551 | return dcr; |
| @@ -581,7 +583,8 @@ static void parport_mos7715_data_forward(struct parport *pp) · 31 unmodified lines | ||
| 581 | 583 | return; |
| 582 | 584 | mos7715_change_mode(mos_parport, PS2); |
| 583 | 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 | 588 | parport_epilogue(pp); |
| 586 | 589 | } |
| 587 | 590 | |
| @@ -593,7 +596,8 @@ static void parport_mos7715_data_reverse(struct parport *pp) · 5 unmodified lines | ||
| 593 | 596 | return; |
| 594 | 597 | mos7715_change_mode(mos_parport, PS2); |
| 595 | 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 | 601 | parport_epilogue(pp); |
| 598 | 602 | } |
| 599 | 603 | |
| @@ -633,8 +637,10 @@ static void parport_mos7715_restore_state(struct parport *pp, · 33 unmodified lines | ||
| 633 | 637 | spin_unlock(&release_lock); |
| 634 | 638 | return; |
| 635 | 639 | } |
| 636 | − write_parport_reg_nonblock(mos_parport, DCR, mos_parport->shadowDCR); | |
| 637 | − write_parport_reg_nonblock(mos_parport, ECR, mos_parport->shadowECR); | |
| 640 | + write_parport_reg_nonblock(mos_parport, MOS7720_DCR, | |
| 641 | + mos_parport->shadowDCR); | |
| 642 | + write_parport_reg_nonblock(mos_parport, MOS7720_ECR, | |
| 643 | + mos_parport->shadowECR); | |
| 638 | 644 | spin_unlock(&release_lock); |
| 639 | 645 | } |
| 640 | 646 | |
| @@ -714,14 +720,16 @@ static int mos7715_parport_init(struct usb_serial *serial) · 73 unmodified lines | ||
| 714 | 720 | init_completion(&mos_parport->syncmsg_compl); |
| 715 | 721 | |
| 716 | 722 | /* cycle parallel port reset bit */ |
| 717 | − write_mos_reg(mos_parport->serial, dummy, PP_REG, (__u8)0x80); | |
| 718 | − write_mos_reg(mos_parport->serial, dummy, PP_REG, (__u8)0x00); | |
| 723 | + write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80); | |
| 724 | + write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00); | |
| 719 | 725 | |
| 720 | 726 | /* initialize device registers */ |
| 721 | 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 | 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 | 734 | /* register with parport core */ |
| 727 | 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) · 305 unmodified lines | ||
| 1033 | 1041 | /* Initialize MCS7720 -- Write Init values to corresponding Registers |
| 1034 | 1042 | * |
| 1035 | 1043 | * Register Index |
| 1036 | − * 0 : THR/RHR | |
| 1037 | − * 1 : IER | |
| 1038 | − * 2 : FCR | |
| 1039 | − * 3 : LCR | |
| 1040 | − * 4 : MCR | |
| 1041 | − * 5 : LSR | |
| 1042 | − * 6 : MSR | |
| 1043 | − * 7 : SPR | |
| 1044 | + * 0 : MOS7720_THR/MOS7720_RHR | |
| 1045 | + * 1 : MOS7720_IER | |
| 1046 | + * 2 : MOS7720_FCR | |
| 1047 | + * 3 : MOS7720_LCR | |
| 1048 | + * 4 : MOS7720_MCR | |
| 1049 | + * 5 : MOS7720_LSR | |
| 1050 | + * 6 : MOS7720_MSR | |
| 1051 | + * 7 : MOS7720_SPR | |
| 1044 | 1052 | * |
| 1045 | 1053 | * 0x08 : SP1/2 Control Reg |
| 1046 | 1054 | */ |
| 1047 | 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 | 1058 | dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data); |
| 1051 | 1059 | |
| 1052 | − write_mos_reg(serial, dummy, SP1_REG, 0x02); | |
| 1053 | − write_mos_reg(serial, dummy, SP2_REG, 0x02); | |
| 1060 | + write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02); | |
| 1061 | + write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02); | |
| 1054 | 1062 | |
| 1055 | − write_mos_reg(serial, port_number, IER, 0x00); | |
| 1056 | − write_mos_reg(serial, port_number, FCR, 0x00); | |
| 1063 | + write_mos_reg(serial, port_number, MOS7720_IER, 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 | 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 | 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); | |
| 1065 | − read_mos_reg(serial, dummy, SP_CONTROL_REG, &data); | |
| 1074 | + write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00); | |
| 1075 | + read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data); | |
| 1066 | 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 | 1078 | mos7720_port->shadowLCR = 0x83; |
| 1069 | − write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | |
| 1070 | − write_mos_reg(serial, port_number, THR, 0x0c); | |
| 1071 | − write_mos_reg(serial, port_number, IER, 0x00); | |
| 1079 | + write_mos_reg(serial, port_number, MOS7720_LCR, | |
| 1080 | + mos7720_port->shadowLCR); | |
| 1081 | + write_mos_reg(serial, port_number, MOS7720_THR, 0x0c); | |
| 1082 | + write_mos_reg(serial, port_number, MOS7720_IER, 0x00); | |
| 1072 | 1083 | mos7720_port->shadowLCR = 0x03; |
| 1073 | − write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | |
| 1074 | − write_mos_reg(serial, port_number, IER, 0x0c); | |
| 1084 | + write_mos_reg(serial, port_number, MOS7720_LCR, | |
| 1085 | + mos7720_port->shadowLCR); | |
| 1086 | + write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); | |
| 1075 | 1087 | |
| 1076 | 1088 | response = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 1077 | 1089 | if (response) |
| @@ -1144,8 +1156,8 @@ static void mos7720_close(struct usb_serial_port *port) · 66 unmodified lines | ||
| 1144 | 1156 | usb_kill_urb(port->write_urb); |
| 1145 | 1157 | usb_kill_urb(port->read_urb); |
| 1146 | 1158 | |
| 1147 | − write_mos_reg(serial, port->port_number, MCR, 0x00); | |
| 1148 | − write_mos_reg(serial, port->port_number, IER, 0x00); | |
| 1159 | + write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00); | |
| 1160 | + write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00); | |
| 1149 | 1161 | |
| 1150 | 1162 | mos7720_port->open = 0; |
| 1151 | 1163 | } |
| @@ -1169,7 +1181,8 @@ static void mos7720_break(struct tty_struct *tty, int break_state) · 17 unmodified lines | ||
| 1169 | 1181 | data = mos7720_port->shadowLCR & ~UART_LCR_SBC; |
| 1170 | 1182 | |
| 1171 | 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) · 121 unmodified lines | ||
| 1297 | 1310 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1298 | 1311 | if (tty->termios.c_cflag & CRTSCTS) { |
| 1299 | 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 | 1314 | mos7720_port->shadowMCR); |
| 1302 | 1315 | } |
| 1303 | 1316 | } |
| @@ -1327,7 +1340,7 @@ static void mos7720_unthrottle(struct tty_struct *tty) · 23 unmodified lines | ||
| 1327 | 1340 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1328 | 1341 | if (tty->termios.c_cflag & CRTSCTS) { |
| 1329 | 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 | 1344 | mos7720_port->shadowMCR); |
| 1332 | 1345 | } |
| 1333 | 1346 | } |
| @@ -1352,35 +1365,39 @@ static int set_higher_rates(struct moschip_port *mos7720_port, · 18 unmodified lines | ||
| 1352 | 1365 | dev_dbg(&port->dev, "Sending Setting Commands ..........\n"); |
| 1353 | 1366 | port_number = port->port_number; |
| 1354 | 1367 | |
| 1355 | − write_mos_reg(serial, port_number, IER, 0x00); | |
| 1356 | − write_mos_reg(serial, port_number, FCR, 0x00); | |
| 1357 | − write_mos_reg(serial, port_number, FCR, 0xcf); | |
| 1368 | + write_mos_reg(serial, port_number, MOS7720_IER, 0x00); | |
| 1369 | + write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); | |
| 1370 | + write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); | |
| 1358 | 1371 | mos7720_port->shadowMCR = 0x0b; |
| 1359 | − write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | |
| 1360 | − write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x00); | |
| 1372 | + write_mos_reg(serial, port_number, MOS7720_MCR, | |
| 1373 | + mos7720_port->shadowMCR); | |
| 1374 | + write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00); | |
| 1361 | 1375 | |
| 1362 | 1376 | /*********************************************** |
| 1363 | 1377 | * Set for higher rates * |
| 1364 | 1378 | ***********************************************/ |
| 1365 | 1379 | /* writing baud rate verbatum into uart clock field clearly not right */ |
| 1366 | 1380 | if (port_number == 0) |
| 1367 | − sp_reg = SP1_REG; | |
| 1381 | + sp_reg = MOS7720_SP1_REG; | |
| 1368 | 1382 | else |
| 1369 | − sp_reg = SP2_REG; | |
| 1383 | + sp_reg = MOS7720_SP2_REG; | |
| 1370 | 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 | 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 | 1391 | * Set DLL/DLM |
| 1377 | 1392 | ***********************************************/ |
| 1378 | 1393 | mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; |
| 1379 | − write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | |
| 1380 | − write_mos_reg(serial, port_number, DLL, 0x01); | |
| 1381 | − write_mos_reg(serial, port_number, DLM, 0x00); | |
| 1394 | + write_mos_reg(serial, port_number, MOS7720_LCR, | |
| 1395 | + mos7720_port->shadowLCR); | |
| 1396 | + write_mos_reg(serial, port_number, MOS7720_DLL, 0x01); | |
| 1397 | + write_mos_reg(serial, port_number, MOS7720_DLM, 0x00); | |
| 1382 | 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 | 1402 | return 0; |
| 1386 | 1403 | } |
| @@ -1488,15 +1505,16 @@ static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port, · 101 unmodified lines | ||
| 1488 | 1505 | |
| 1489 | 1506 | /* Enable access to divisor latch */ |
| 1490 | 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 | 1510 | /* Write the divisor */ |
| 1494 | − write_mos_reg(serial, number, DLL, (__u8)(divisor & 0xff)); | |
| 1495 | − write_mos_reg(serial, number, DLM, (__u8)((divisor & 0xff00) >> 8)); | |
| 1511 | + write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff)); | |
| 1512 | + write_mos_reg(serial, number, MOS7720_DLM, | |
| 1513 | + (__u8)((divisor & 0xff00) >> 8)); | |
| 1496 | 1514 | |
| 1497 | 1515 | /* Disable access to divisor latch */ |
| 1498 | 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 | 1519 | return status; |
| 1502 | 1520 | } |
| @@ -1600,14 +1618,16 @@ static void change_port_settings(struct tty_struct *tty, · 97 unmodified lines | ||
| 1600 | 1618 | |
| 1601 | 1619 | |
| 1602 | 1620 | /* Disable Interrupts */ |
| 1603 | − write_mos_reg(serial, port_number, IER, 0x00); | |
| 1604 | − write_mos_reg(serial, port_number, FCR, 0x00); | |
| 1605 | − write_mos_reg(serial, port_number, FCR, 0xcf); | |
| 1621 | + write_mos_reg(serial, port_number, MOS7720_IER, 0x00); | |
| 1622 | + write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); | |
| 1623 | + write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); | |
| 1606 | 1624 | |
| 1607 | 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 | 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 | 1632 | /* set up the MCR register and send it to the mos7720 */ |
| 1613 | 1633 | mos7720_port->shadowMCR = UART_MCR_OUT2; |
| @@ -1619,14 +1639,17 @@ static void change_port_settings(struct tty_struct *tty, · 5 unmodified lines | ||
| 1619 | 1639 | /* To set hardware flow control to the specified * |
| 1620 | 1640 | * serial port, in SP1/2_CONTROL_REG */ |
| 1621 | 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 | 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 | 1648 | } else |
| 1627 | 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 | 1654 | /* Determine divisor based on baud rate */ |
| 1632 | 1655 | baud = tty_get_baud_rate(tty); |
| @@ -1639,7 +1662,7 @@ static void change_port_settings(struct tty_struct *tty, · 6 unmodified lines | ||
| 1639 | 1662 | if (baud >= 230400) { |
| 1640 | 1663 | set_higher_rates(mos7720_port, baud); |
| 1641 | 1664 | /* Enable Interrupts */ |
| 1642 | − write_mos_reg(serial, port_number, IER, 0x0c); | |
| 1665 | + write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); | |
| 1643 | 1666 | return; |
| 1644 | 1667 | } |
| 1645 | 1668 | |
| @@ -1650,7 +1673,7 @@ static void change_port_settings(struct tty_struct *tty, · 4 unmodified lines | ||
| 1650 | 1673 | if (cflag & CBAUD) |
| 1651 | 1674 | tty_encode_baud_rate(tty, baud, baud); |
| 1652 | 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 | 1678 | if (port->read_urb->status != -EINPROGRESS) { |
| 1656 | 1679 | status = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| @@ -1725,7 +1748,7 @@ static int get_lsr_info(struct tty_struct *tty, · 68 unmodified lines | ||
| 1725 | 1748 | |
| 1726 | 1749 | count = mos7720_chars_in_buffer(tty); |
| 1727 | 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 | 1752 | if ((data & (UART_LSR_TEMT | UART_LSR_THRE)) |
| 1730 | 1753 | == (UART_LSR_TEMT | UART_LSR_THRE)) { |
| 1731 | 1754 | dev_dbg(&port->dev, "%s -- Empty\n", __func__); |
| @@ -1782,7 +1805,7 @@ static int mos7720_tiocmset(struct tty_struct *tty, · 50 unmodified lines | ||
| 1782 | 1805 | mcr &= ~UART_MCR_LOOP; |
| 1783 | 1806 | |
| 1784 | 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 | 1809 | mos7720_port->shadowMCR); |
| 1787 | 1810 | |
| 1788 | 1811 | return 0; |
| @@ -1827,7 +1850,7 @@ static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd, · 38 unmodified lines | ||
| 1827 | 1850 | } |
| 1828 | 1851 | |
| 1829 | 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 | 1854 | mos7720_port->shadowMCR); |
| 1832 | 1855 | |
| 1833 | 1856 | return 0; |
| @@ -1942,7 +1965,7 @@ static int mos7720_startup(struct usb_serial *serial) · 108 unmodified lines | ||
| 1942 | 1965 | } |
| 1943 | 1966 | #endif |
| 1944 | 1967 | /* LSR For Port 1 */ |
| 1945 | − read_mos_reg(serial, 0, LSR, &data); | |
| 1968 | + read_mos_reg(serial, 0, MOS7720_LSR, &data); | |
| 1946 | 1969 | dev_dbg(&dev->dev, "LSR:%x\n", data); |
| 1947 | 1970 | |
| 1948 | 1971 | return 0; |
| @@ -1765,6 +1765,7 @@ static const struct usb_device_id option_ids[] = { · 1764 unmodified lines | ||
| 1765 | 1765 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, |
| 1766 | 1766 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ |
| 1767 | 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 | 1769 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, |
| 1769 | 1770 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, |
| 1770 | 1771 | { } /* Terminating entry */ |
| @@ -1306,6 +1306,7 @@ static void __exit usb_serial_exit(void) · 1305 unmodified lines | ||
| 1306 | 1306 | tty_unregister_driver(usb_serial_tty_driver); |
| 1307 | 1307 | put_tty_driver(usb_serial_tty_driver); |
| 1308 | 1308 | bus_unregister(&usb_serial_bus_type); |
| 1309 | + idr_destroy(&serial_minors); | |
| 1309 | 1310 | } |
| 1310 | 1311 | |
| 1311 | 1312 | |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Watchdog driver for ARM SP805 watchdog module |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2010 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 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 = { · 292 unmodified lines | ||
| 303 | 303 | |
| 304 | 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 | 307 | MODULE_DESCRIPTION("ARM SP805 Watchdog Driver"); |
| 308 | 308 | MODULE_LICENSE("GPL"); |
| @@ -2296,9 +2296,22 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans, · 2295 unmodified lines | ||
| 2296 | 2296 | static inline struct btrfs_delayed_ref_node * |
| 2297 | 2297 | select_delayed_ref(struct btrfs_delayed_ref_head *head) |
| 2298 | 2298 | { |
| 2299 | + struct btrfs_delayed_ref_node *ref; | |
| 2300 | + | |
| 2299 | 2301 | if (list_empty(&head->ref_list)) |
| 2300 | 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 | 2315 | return list_entry(head->ref_list.next, struct btrfs_delayed_ref_node, |
| 2303 | 2316 | list); |
| 2304 | 2317 | } |
| @@ -4209,7 +4209,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, · 4208 unmodified lines | ||
| 4209 | 4209 | u64 extent_num_bytes = 0; |
| 4210 | 4210 | u64 extent_offset = 0; |
| 4211 | 4211 | u64 item_end = 0; |
| 4212 | − u64 last_size = (u64)-1; | |
| 4212 | + u64 last_size = new_size; | |
| 4213 | 4213 | u32 found_type = (u8)-1; |
| 4214 | 4214 | int found_extent; |
| 4215 | 4215 | int del_item; |
| @@ -4493,8 +4493,7 @@ out: · 277 unmodified lines | ||
| 4493 | 4493 | btrfs_abort_transaction(trans, root, ret); |
| 4494 | 4494 | } |
| 4495 | 4495 | error: |
| 4496 | − if (last_size != (u64)-1 && | |
| 4497 | − root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | |
| 4496 | + if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | |
| 4498 | 4497 | btrfs_ordered_update_i_size(inode, last_size, NULL); |
| 4499 | 4498 | |
| 4500 | 4499 | btrfs_free_path(path); |
| @@ -3090,7 +3090,7 @@ out_unlock: · 3089 unmodified lines | ||
| 3090 | 3090 | static long btrfs_ioctl_file_extent_same(struct file *file, |
| 3091 | 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 | 3094 | struct btrfs_ioctl_same_extent_info *info; |
| 3095 | 3095 | struct inode *src = file_inode(file); |
| 3096 | 3096 | u64 off; |
| @@ -3120,6 +3120,7 @@ static long btrfs_ioctl_file_extent_same(struct file *file, · 23 unmodified lines | ||
| 3120 | 3120 | |
| 3121 | 3121 | if (IS_ERR(same)) { |
| 3122 | 3122 | ret = PTR_ERR(same); |
| 3123 | + same = NULL; | |
| 3123 | 3124 | goto out; |
| 3124 | 3125 | } |
| 3125 | 3126 | |
| @@ -3190,6 +3191,7 @@ static long btrfs_ioctl_file_extent_same(struct file *file, · 64 unmodified lines | ||
| 3190 | 3191 | |
| 3191 | 3192 | out: |
| 3192 | 3193 | mnt_drop_write_file(file); |
| 3194 | + kfree(same); | |
| 3193 | 3195 | return ret; |
| 3194 | 3196 | } |
| 3195 | 3197 | |
| @@ -3586,6 +3588,20 @@ process_slot: · 390 unmodified lines | ||
| 3586 | 3588 | u64 trim = 0; |
| 3587 | 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 | 3605 | if (off > key.offset) { |
| 3590 | 3606 | skip = off - key.offset; |
| 3591 | 3607 | new_key.offset += skip; |
| @@ -761,7 +761,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, · 760 unmodified lines | ||
| 761 | 761 | |
| 762 | 762 | if (!list_empty(&trans->ordered)) { |
| 763 | 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 | 765 | spin_unlock(&info->trans_lock); |
| 766 | 766 | } |
| 767 | 767 | |
| @@ -1866,7 +1866,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, · 1098 unmodified lines | ||
| 1866 | 1866 | } |
| 1867 | 1867 | |
| 1868 | 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 | 1870 | if (cur_trans->state >= TRANS_STATE_COMMIT_START) { |
| 1871 | 1871 | spin_unlock(&root->fs_info->trans_lock); |
| 1872 | 1872 | atomic_inc(&cur_trans->use_count); |
| @@ -115,7 +115,7 @@ void config_item_init_type_name(struct config_item *item, · 114 unmodified lines | ||
| 115 | 115 | const char *name, |
| 116 | 116 | struct config_item_type *type) |
| 117 | 117 | { |
| 118 | − config_item_set_name(item, name); | |
| 118 | + config_item_set_name(item, "%s", name); | |
| 119 | 119 | item->ci_type = type; |
| 120 | 120 | config_item_init(item); |
| 121 | 121 | } |
| @@ -124,7 +124,7 @@ EXPORT_SYMBOL(config_item_init_type_name); · 2 unmodified lines | ||
| 124 | 124 | void config_group_init_type_name(struct config_group *group, const char *name, |
| 125 | 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 | 128 | group->cg_item.ci_type = type; |
| 129 | 129 | config_group_init(group); |
| 130 | 130 | } |
| @@ -76,7 +76,7 @@ static int jfs_open(struct inode *inode, struct file *file) · 75 unmodified lines | ||
| 76 | 76 | if (ji->active_ag == -1) { |
| 77 | 77 | struct jfs_sb_info *jfs_sb = JFS_SBI(inode->i_sb); |
| 78 | 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 | 81 | spin_unlock_irq(&ji->ag_lock); |
| 82 | 82 | } |
| @@ -134,11 +134,11 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc) · 133 unmodified lines | ||
| 134 | 134 | * It has been committed since the last change, but was still |
| 135 | 135 | * on the dirty inode list. |
| 136 | 136 | */ |
| 137 | − if (!test_cflag(COMMIT_Dirty, inode)) { | |
| 137 | + if (!test_cflag(COMMIT_Dirty, inode)) { | |
| 138 | 138 | /* Make sure committed changes hit the disk */ |
| 139 | 139 | jfs_flush_journal(JFS_SBI(inode->i_sb)->log, wait); |
| 140 | 140 | return 0; |
| 141 | − } | |
| 141 | + } | |
| 142 | 142 | |
| 143 | 143 | if (jfs_commit_inode(inode, wait)) { |
| 144 | 144 | jfs_err("jfs_write_inode: jfs_commit_inode failed!"); |
| @@ -1160,7 +1160,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 1159 unmodified lines | ||
| 1160 | 1160 | rc = dtModify(tid, new_dir, &new_dname, &ino, |
| 1161 | 1161 | old_ip->i_ino, JFS_RENAME); |
| 1162 | 1162 | if (rc) |
| 1163 | − goto out4; | |
| 1163 | + goto out_tx; | |
| 1164 | 1164 | drop_nlink(new_ip); |
| 1165 | 1165 | if (S_ISDIR(new_ip->i_mode)) { |
| 1166 | 1166 | drop_nlink(new_ip); |
| @@ -1185,7 +1185,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 18 unmodified lines | ||
| 1185 | 1185 | if ((new_size = commitZeroLink(tid, new_ip)) < 0) { |
| 1186 | 1186 | txAbort(tid, 1); /* Marks FS Dirty */ |
| 1187 | 1187 | rc = new_size; |
| 1188 | − goto out4; | |
| 1188 | + goto out_tx; | |
| 1189 | 1189 | } |
| 1190 | 1190 | tblk = tid_to_tblock(tid); |
| 1191 | 1191 | tblk->xflag |= COMMIT_DELETE; |
| @@ -1203,7 +1203,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 11 unmodified lines | ||
| 1203 | 1203 | if (rc) { |
| 1204 | 1204 | jfs_err("jfs_rename didn't expect dtSearch to fail " |
| 1205 | 1205 | "w/rc = %d", rc); |
| 1206 | − goto out4; | |
| 1206 | + goto out_tx; | |
| 1207 | 1207 | } |
| 1208 | 1208 | |
| 1209 | 1209 | ino = old_ip->i_ino; |
| @@ -1211,7 +1211,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 1 unmodified line | ||
| 1211 | 1211 | if (rc) { |
| 1212 | 1212 | if (rc == -EIO) |
| 1213 | 1213 | jfs_err("jfs_rename: dtInsert returned -EIO"); |
| 1214 | − goto out4; | |
| 1214 | + goto out_tx; | |
| 1215 | 1215 | } |
| 1216 | 1216 | if (S_ISDIR(old_ip->i_mode)) |
| 1217 | 1217 | inc_nlink(new_dir); |
| @@ -1226,7 +1226,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 8 unmodified lines | ||
| 1226 | 1226 | jfs_err("jfs_rename did not expect dtDelete to return rc = %d", |
| 1227 | 1227 | rc); |
| 1228 | 1228 | txAbort(tid, 1); /* Marks Filesystem dirty */ |
| 1229 | − goto out4; | |
| 1229 | + goto out_tx; | |
| 1230 | 1230 | } |
| 1231 | 1231 | if (S_ISDIR(old_ip->i_mode)) { |
| 1232 | 1232 | drop_nlink(old_dir); |
| @@ -1285,7 +1285,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 52 unmodified lines | ||
| 1285 | 1285 | |
| 1286 | 1286 | rc = txCommit(tid, ipcount, iplist, commit_flag); |
| 1287 | 1287 | |
| 1288 | − out4: | |
| 1288 | + out_tx: | |
| 1289 | 1289 | txEnd(tid); |
| 1290 | 1290 | if (new_ip) |
| 1291 | 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, · 16 unmodified lines | ||
| 1308 | 1308 | } |
| 1309 | 1309 | if (new_ip && (new_ip->i_nlink == 0)) |
| 1310 | 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 | 1312 | * Truncating the directory index table is not guaranteed. It |
| 1320 | 1313 | * may need to be done iteratively |
| @@ -1325,7 +1318,13 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, · 4 unmodified lines | ||
| 1325 | 1318 | |
| 1326 | 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 | 1328 | jfs_info("jfs_rename: returning %d", rc); |
| 1330 | 1329 | return rc; |
| 1331 | 1330 | } |
| @@ -862,12 +862,11 @@ static int posix_locks_deadlock(struct file_lock *caller_fl, · 861 unmodified lines | ||
| 862 | 862 | * whether or not a lock was successfully freed by testing the return |
| 863 | 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 | 867 | struct file_lock *new_fl = NULL; |
| 868 | 868 | struct file_lock *fl; |
| 869 | 869 | struct file_lock_context *ctx; |
| 870 | − struct inode *inode = file_inode(filp); | |
| 871 | 870 | int error = 0; |
| 872 | 871 | bool found = false; |
| 873 | 872 | LIST_HEAD(dispose); |
| @@ -890,7 +889,7 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) · 16 unmodified lines | ||
| 890 | 889 | goto find_conflict; |
| 891 | 890 | |
| 892 | 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 | 893 | continue; |
| 895 | 894 | if (request->fl_type == fl->fl_type) |
| 896 | 895 | goto out; |
| @@ -1164,20 +1163,19 @@ int posix_lock_file(struct file *filp, struct file_lock *fl, · 267 unmodified lines | ||
| 1164 | 1163 | EXPORT_SYMBOL(posix_lock_file); |
| 1165 | 1164 | |
| 1166 | 1165 | /** |
| 1167 | − * posix_lock_file_wait - Apply a POSIX-style lock to a file | |
| 1168 | − * @filp: The file to apply the lock to | |
| 1166 | + * posix_lock_inode_wait - Apply a POSIX-style lock to a file | |
| 1167 | + * @inode: inode of file to which lock request should be applied | |
| 1169 | 1168 | * @fl: The lock to be applied |
| 1170 | 1169 | * |
| 1171 | − * Add a POSIX style lock to a file. | |
| 1172 | − * We merge adjacent & overlapping locks whenever possible. | |
| 1173 | − * POSIX locks are sorted by owner task, then by starting address | |
| 1170 | + * Variant of posix_lock_file_wait that does not take a filp, and so can be | |
| 1171 | + * used after the filp has already been torn down. | |
| 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 | 1175 | int error; |
| 1178 | 1176 | might_sleep (); |
| 1179 | 1177 | for (;;) { |
| 1180 | − error = posix_lock_file(filp, fl, NULL); | |
| 1178 | + error = __posix_lock_file(inode, fl, NULL); | |
| 1181 | 1179 | if (error != FILE_LOCK_DEFERRED) |
| 1182 | 1180 | break; |
| 1183 | 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) · 5 unmodified lines | ||
| 1189 | 1187 | } |
| 1190 | 1188 | return error; |
| 1191 | 1189 | } |
| 1192 | −EXPORT_SYMBOL(posix_lock_file_wait); | |
| 1190 | +EXPORT_SYMBOL(posix_lock_inode_wait); | |
| 1193 | 1191 | |
| 1194 | 1192 | /** |
| 1195 | 1193 | * locks_mandatory_locked - Check for an active lock |
| @@ -1851,18 +1849,18 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) · 655 unmodified lines | ||
| 1851 | 1849 | } |
| 1852 | 1850 | |
| 1853 | 1851 | /** |
| 1854 | − * flock_lock_file_wait - Apply a FLOCK-style lock to a file | |
| 1855 | − * @filp: The file to apply the lock to | |
| 1852 | + * flock_lock_inode_wait - Apply a FLOCK-style lock to a file | |
| 1853 | + * @inode: inode of the file to apply to | |
| 1856 | 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 | 1860 | int error; |
| 1863 | 1861 | might_sleep(); |
| 1864 | 1862 | for (;;) { |
| 1865 | − error = flock_lock_file(filp, fl); | |
| 1863 | + error = flock_lock_inode(inode, fl); | |
| 1866 | 1864 | if (error != FILE_LOCK_DEFERRED) |
| 1867 | 1865 | break; |
| 1868 | 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) · 5 unmodified lines | ||
| 1874 | 1872 | } |
| 1875 | 1873 | return error; |
| 1876 | 1874 | } |
| 1877 | − | |
| 1878 | −EXPORT_SYMBOL(flock_lock_file_wait); | |
| 1875 | +EXPORT_SYMBOL(flock_lock_inode_wait); | |
| 1879 | 1876 | |
| 1880 | 1877 | /** |
| 1881 | 1878 | * sys_flock: - flock() system call. |
| @@ -2401,7 +2398,8 @@ locks_remove_flock(struct file *filp) · 519 unmodified lines | ||
| 2401 | 2398 | .fl_type = F_UNLCK, |
| 2402 | 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 | 2404 | if (list_empty(&flctx->flc_flock)) |
| 2407 | 2405 | return; |
| @@ -2409,7 +2407,7 @@ locks_remove_flock(struct file *filp) · 1 unmodified line | ||
| 2409 | 2407 | if (filp->f_op->flock) |
| 2410 | 2408 | filp->f_op->flock(filp, F_SETLKW, &fl); |
| 2411 | 2409 | else |
| 2412 | − flock_lock_file(filp, &fl); | |
| 2410 | + flock_lock_inode(inode, &fl); | |
| 2413 | 2411 | |
| 2414 | 2412 | if (fl.fl_ops && fl.fl_ops->fl_release_private) |
| 2415 | 2413 | fl.fl_ops->fl_release_private(&fl); |
| @@ -5439,15 +5439,15 @@ static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock * · 5438 unmodified lines | ||
| 5439 | 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 | 5444 | int res = 0; |
| 5445 | 5445 | switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { |
| 5446 | 5446 | case FL_POSIX: |
| 5447 | − res = posix_lock_file_wait(file, fl); | |
| 5447 | + res = posix_lock_inode_wait(inode, fl); | |
| 5448 | 5448 | break; |
| 5449 | 5449 | case FL_FLOCK: |
| 5450 | − res = flock_lock_file_wait(file, fl); | |
| 5450 | + res = flock_lock_inode_wait(inode, fl); | |
| 5451 | 5451 | break; |
| 5452 | 5452 | default: |
| 5453 | 5453 | BUG(); |
| @@ -5484,7 +5484,6 @@ static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, · 30 unmodified lines | ||
| 5484 | 5484 | atomic_inc(&lsp->ls_count); |
| 5485 | 5485 | /* Ensure we don't close file until we're done freeing locks! */ |
| 5486 | 5486 | p->ctx = get_nfs_open_context(ctx); |
| 5487 | − get_file(fl->fl_file); | |
| 5488 | 5487 | memcpy(&p->fl, fl, sizeof(p->fl)); |
| 5489 | 5488 | p->server = NFS_SERVER(inode); |
| 5490 | 5489 | return p; |
| @@ -5496,7 +5495,6 @@ static void nfs4_locku_release_calldata(void *data) · 5 unmodified lines | ||
| 5496 | 5495 | nfs_free_seqid(calldata->arg.seqid); |
| 5497 | 5496 | nfs4_put_lock_state(calldata->lsp); |
| 5498 | 5497 | put_nfs_open_context(calldata->ctx); |
| 5499 | − fput(calldata->fl.fl_file); | |
| 5500 | 5498 | kfree(calldata); |
| 5501 | 5499 | } |
| 5502 | 5500 | |
| @@ -5509,7 +5507,7 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) · 6 unmodified lines | ||
| 5509 | 5507 | switch (task->tk_status) { |
| 5510 | 5508 | case 0: |
| 5511 | 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 | 5511 | if (nfs4_update_lock_stateid(calldata->lsp, |
| 5514 | 5512 | &calldata->res.stateid)) |
| 5515 | 5513 | break; |
| @@ -5617,7 +5615,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * · 101 unmodified lines | ||
| 5617 | 5615 | mutex_lock(&sp->so_delegreturn_mutex); |
| 5618 | 5616 | /* Exclude nfs4_reclaim_open_stateid() - note nesting! */ |
| 5619 | 5617 | down_read(&nfsi->rwsem); |
| 5620 | − if (do_vfs_lock(request->fl_file, request) == -ENOENT) { | |
| 5618 | + if (do_vfs_lock(inode, request) == -ENOENT) { | |
| 5621 | 5619 | up_read(&nfsi->rwsem); |
| 5622 | 5620 | mutex_unlock(&sp->so_delegreturn_mutex); |
| 5623 | 5621 | goto out; |
| @@ -5758,7 +5756,7 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata) · 134 unmodified lines | ||
| 5758 | 5756 | data->timestamp); |
| 5759 | 5757 | if (data->arg.new_lock) { |
| 5760 | 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 | 5760 | rpc_restart_call_prepare(task); |
| 5763 | 5761 | break; |
| 5764 | 5762 | } |
| @@ -6000,7 +5998,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock · 235 unmodified lines | ||
| 6000 | 5998 | if (status != 0) |
| 6001 | 5999 | goto out; |
| 6002 | 6000 | request->fl_flags |= FL_ACCESS; |
| 6003 | − status = do_vfs_lock(request->fl_file, request); | |
| 6001 | + status = do_vfs_lock(state->inode, request); | |
| 6004 | 6002 | if (status < 0) |
| 6005 | 6003 | goto out; |
| 6006 | 6004 | down_read(&nfsi->rwsem); |
| @@ -6008,7 +6006,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock · 1 unmodified line | ||
| 6008 | 6006 | /* Yes: cache locks! */ |
| 6009 | 6007 | /* ...but avoid races with delegation recall... */ |
| 6010 | 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 | 6010 | up_read(&nfsi->rwsem); |
| 6013 | 6011 | goto out; |
| 6014 | 6012 | } |
| @@ -75,3 +75,9 @@ config PROC_PAGE_MONITOR · 74 unmodified lines | ||
| 75 | 75 | config PROC_CHILDREN |
| 76 | 76 | bool "Include /proc/<pid>/task/<tid>/children file" |
| 77 | 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. | |
| @@ -243,6 +243,11 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, · 242 unmodified lines | ||
| 243 | 243 | len1 = arg_end - arg_start; |
| 244 | 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 | 252 | * Inherently racy -- command line shares address space |
| 248 | 253 | * with code and data. |
| @@ -92,7 +92,7 @@ static size_t get_kcore_size(int *nphdr, size_t *elf_buflen) · 91 unmodified lines | ||
| 92 | 92 | roundup(sizeof(CORE_STR), 4)) + |
| 93 | 93 | roundup(sizeof(struct elf_prstatus), 4) + |
| 94 | 94 | roundup(sizeof(struct elf_prpsinfo), 4) + |
| 95 | − roundup(sizeof(struct task_struct), 4); | |
| 95 | + roundup(arch_task_struct_size, 4); | |
| 96 | 96 | *elf_buflen = PAGE_ALIGN(*elf_buflen); |
| 97 | 97 | return size + *elf_buflen; |
| 98 | 98 | } |
| @@ -415,7 +415,7 @@ static void elf_kcore_store_hdr(char *bufp, int nphdr, int dataoff) · 316 unmodified lines | ||
| 415 | 415 | /* set up the task structure */ |
| 416 | 416 | notes[2].name = CORE_STR; |
| 417 | 417 | notes[2].type = NT_TASKSTRUCT; |
| 418 | − notes[2].datasz = sizeof(struct task_struct); | |
| 418 | + notes[2].datasz = arch_task_struct_size; | |
| 419 | 419 | notes[2].data = current; |
| 420 | 420 | |
| 421 | 421 | nhdr->p_filesz += notesize(¬es[2]); |
| @@ -1652,17 +1652,9 @@ static int udf_update_inode(struct inode *inode, int do_sync) · 1651 unmodified lines | ||
| 1652 | 1652 | iinfo->i_ext.i_data, inode->i_sb->s_blocksize - |
| 1653 | 1653 | sizeof(struct unallocSpaceEntry)); |
| 1654 | 1654 | use->descTag.tagIdent = cpu_to_le16(TAG_IDENT_USE); |
| 1655 | − use->descTag.tagLocation = | |
| 1656 | − cpu_to_le32(iinfo->i_location.logicalBlockNum); | |
| 1657 | − crclen = sizeof(struct unallocSpaceEntry) + | |
| 1658 | − iinfo->i_lenAlloc - sizeof(struct tag); | |
| 1659 | − use->descTag.descCRCLength = cpu_to_le16(crclen); | |
| 1660 | − use->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)use + | |
| 1661 | − sizeof(struct tag), | |
| 1662 | − crclen)); | |
| 1663 | − use->descTag.tagChecksum = udf_tag_checksum(&use->descTag); | |
| 1655 | + crclen = sizeof(struct unallocSpaceEntry); | |
| 1664 | 1656 | |
| 1665 | − goto out; | |
| 1657 | + goto finish; | |
| 1666 | 1658 | } |
| 1667 | 1659 | |
| 1668 | 1660 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET)) |
| @@ -1782,6 +1774,8 @@ static int udf_update_inode(struct inode *inode, int do_sync) · 113 unmodified lines | ||
| 1782 | 1774 | efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE); |
| 1783 | 1775 | crclen = sizeof(struct extendedFileEntry); |
| 1784 | 1776 | } |
| 1777 | + | |
| 1778 | +finish: | |
| 1785 | 1779 | if (iinfo->i_strat4096) { |
| 1786 | 1780 | fe->icbTag.strategyType = cpu_to_le16(4096); |
| 1787 | 1781 | fe->icbTag.strategyParameter = cpu_to_le16(1); |
| @@ -1791,7 +1785,9 @@ static int udf_update_inode(struct inode *inode, int do_sync) · 3 unmodified lines | ||
| 1791 | 1785 | fe->icbTag.numEntries = cpu_to_le16(1); |
| 1792 | 1786 | } |
| 1793 | 1787 | |
| 1794 | − if (S_ISDIR(inode->i_mode)) | |
| 1788 | + if (iinfo->i_use) | |
| 1789 | + fe->icbTag.fileType = ICBTAG_FILE_TYPE_USE; | |
| 1790 | + else if (S_ISDIR(inode->i_mode)) | |
| 1795 | 1791 | fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY; |
| 1796 | 1792 | else if (S_ISREG(inode->i_mode)) |
| 1797 | 1793 | fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR; |
| @@ -1828,7 +1824,6 @@ static int udf_update_inode(struct inode *inode, int do_sync) · 30 unmodified lines | ||
| 1828 | 1824 | crclen)); |
| 1829 | 1825 | fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag); |
| 1830 | 1826 | |
| 1831 | −out: | |
| 1832 | 1827 | set_buffer_uptodate(bh); |
| 1833 | 1828 | unlock_buffer(bh); |
| 1834 | 1829 | |
| @@ -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 */ | |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | * ARM PrimeXsys System Controller SP810 header file |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 2009 ST Microelectronics |
| 5 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 5 | + * Viresh Kumar <vireshk@kernel.org> | |
| 6 | 6 | * |
| 7 | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -47,6 +47,7 @@ struct blkcg { · 46 unmodified lines | ||
| 47 | 47 | |
| 48 | 48 | struct blkcg_policy_data *pd[BLKCG_MAX_POLS]; |
| 49 | 49 | |
| 50 | + struct list_head all_blkcgs_node; | |
| 50 | 51 | #ifdef CONFIG_CGROUP_WRITEBACK |
| 51 | 52 | struct list_head cgwb_list; |
| 52 | 53 | #endif |
| @@ -88,18 +89,12 @@ struct blkg_policy_data { · 35 unmodified lines | ||
| 88 | 89 | * Policies that need to keep per-blkcg data which is independent |
| 89 | 90 | * from any request_queue associated to it must specify its size |
| 90 | 91 | * with the cpd_size field of the blkcg_policy structure and |
| 91 | − * embed a blkcg_policy_data in it. blkcg core allocates | |
| 92 | − * policy-specific per-blkcg structures lazily the first time | |
| 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. | |
| 92 | + * embed a blkcg_policy_data in it. cpd_init() is invoked to let | |
| 93 | + * each policy handle per-blkcg data. | |
| 96 | 94 | */ |
| 97 | 95 | struct blkcg_policy_data { |
| 98 | 96 | /* the policy id this per-policy data belongs to */ |
| 99 | 97 | int plid; |
| 100 | − | |
| 101 | − /* used during policy activation */ | |
| 102 | − struct list_head alloc_node; | |
| 103 | 98 | }; |
| 104 | 99 | |
| 105 | 100 | /* association between a blk cgroup and a request queue */ |
| @@ -33,18 +33,19 @@ struct clk_lookup { · 32 unmodified lines | ||
| 33 | 33 | } |
| 34 | 34 | |
| 35 | 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 | 38 | void clkdev_add(struct clk_lookup *cl); |
| 39 | 39 | void clkdev_drop(struct clk_lookup *cl); |
| 40 | 40 | |
| 41 | 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 | 44 | void clkdev_add_table(struct clk_lookup *, size_t); |
| 45 | 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 | 49 | int clk_register_clkdevs(struct clk *, struct clk_lookup *, size_t); |
| 49 | 50 | |
| 50 | 51 | #ifdef CONFIG_COMMON_CLK |
| @@ -424,7 +424,7 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, · 423 unmodified lines | ||
| 424 | 424 | |
| 425 | 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 | 428 | extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); |
| 429 | 429 | extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set); |
| 430 | 430 | |
| @@ -64,7 +64,8 @@ struct config_item { · 63 unmodified lines | ||
| 64 | 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 | 70 | static inline char *config_item_name(struct config_item * item) |
| 70 | 71 | { |
| @@ -40,9 +40,10 @@ extern void cpu_remove_dev_attr(struct device_attribute *attr); · 39 unmodified lines | ||
| 40 | 40 | extern int cpu_add_dev_attr_group(struct attribute_group *attrs); |
| 41 | 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, | |
| 44 | − const struct attribute_group **groups, | |
| 45 | − const char *fmt, ...); | |
| 43 | +extern __printf(4, 5) | |
| 44 | +struct device *cpu_device_create(struct device *parent, void *drvdata, | |
| 45 | + const struct attribute_group **groups, | |
| 46 | + const char *fmt, ...); | |
| 46 | 47 | #ifdef CONFIG_HOTPLUG_CPU |
| 47 | 48 | extern void unregister_cpu(struct cpu *cpu); |
| 48 | 49 | extern ssize_t arch_cpu_probe(const char *, size_t); |
| @@ -327,7 +327,8 @@ static inline unsigned d_count(const struct dentry *dentry) · 326 unmodified lines | ||
| 327 | 327 | /* |
| 328 | 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 | 332 | extern char *simple_dname(struct dentry *, char *, int); |
| 332 | 333 | |
| 333 | 334 | extern char *__d_path(const struct path *, const struct path *, char *, int); |
| @@ -637,8 +637,9 @@ extern int devres_release_group(struct device *dev, void *id); · 636 unmodified lines | ||
| 637 | 637 | |
| 638 | 638 | /* managed devm_k.alloc/kfree for device drivers */ |
| 639 | 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, | |
| 641 | − va_list ap); | |
| 640 | +extern __printf(3, 0) | |
| 641 | +char *devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, | |
| 642 | + va_list ap); | |
| 642 | 643 | extern __printf(3, 4) |
| 643 | 644 | char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); |
| 644 | 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); · 366 unmodified lines | ||
| 1011 | 1012 | /* |
| 1012 | 1013 | * Easy functions for dynamically creating devices on the fly |
| 1013 | 1014 | */ |
| 1014 | −extern struct device *device_create_vargs(struct class *cls, | |
| 1015 | − struct device *parent, | |
| 1016 | − dev_t devt, | |
| 1017 | − void *drvdata, | |
| 1018 | − const char *fmt, | |
| 1019 | − va_list vargs); | |
| 1015 | +extern __printf(5, 0) | |
| 1016 | +struct device *device_create_vargs(struct class *cls, struct device *parent, | |
| 1017 | + dev_t devt, void *drvdata, | |
| 1018 | + const char *fmt, va_list vargs); | |
| 1020 | 1019 | extern __printf(5, 6) |
| 1021 | 1020 | struct device *device_create(struct class *cls, struct device *parent, |
| 1022 | 1021 | dev_t devt, void *drvdata, |
| @@ -1046,12 +1046,12 @@ extern void locks_remove_file(struct file *); · 1045 unmodified lines | ||
| 1046 | 1046 | extern void locks_release_private(struct file_lock *); |
| 1047 | 1047 | extern void posix_test_lock(struct file *, struct file_lock *); |
| 1048 | 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 | 1050 | extern int posix_unblock_lock(struct file_lock *); |
| 1051 | 1051 | extern int vfs_test_lock(struct file *, struct file_lock *); |
| 1052 | 1052 | extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *); |
| 1053 | 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 | 1055 | extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type); |
| 1056 | 1056 | extern void lease_get_mtime(struct inode *, struct timespec *time); |
| 1057 | 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, · 79 unmodified lines | ||
| 1137 | 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 | 1143 | return -ENOLCK; |
| 1143 | 1144 | } |
| @@ -1163,8 +1164,8 @@ static inline int vfs_cancel_lock(struct file *filp, struct file_lock *fl) · 19 unmodified lines | ||
| 1163 | 1164 | return 0; |
| 1164 | 1165 | } |
| 1165 | 1166 | |
| 1166 | −static inline int flock_lock_file_wait(struct file *filp, | |
| 1167 | − struct file_lock *request) | |
| 1167 | +static inline int flock_lock_inode_wait(struct inode *inode, | |
| 1168 | + struct file_lock *request) | |
| 1168 | 1169 | { |
| 1169 | 1170 | return -ENOLCK; |
| 1170 | 1171 | } |
| @@ -1202,6 +1203,20 @@ static inline void show_fd_locks(struct seq_file *f, · 31 unmodified lines | ||
| 1202 | 1203 | struct file *filp, struct files_struct *files) {} |
| 1203 | 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 | 1221 | struct fasync_struct { |
| 1207 | 1222 | spinlock_t fa_lock; |
| @@ -2011,11 +2026,6 @@ extern void ihold(struct inode * inode); · 803 unmodified lines | ||
| 2011 | 2026 | extern void iput(struct inode *); |
| 2012 | 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 | 2029 | /* /sys/fs */ |
| 2020 | 2030 | extern struct kobject *fs_kobj; |
| 2021 | 2031 | |
| @@ -45,7 +45,7 @@ struct seq_file; · 44 unmodified lines | ||
| 45 | 45 | * @base: identifies the first GPIO number handled by this chip; |
| 46 | 46 | * or, if negative during registration, requests dynamic ID allocation. |
| 47 | 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 | 49 | * let gpiolib select the chip base in all possible cases. We want to |
| 50 | 50 | * get rid of the static GPIO number space in the long run. |
| 51 | 51 | * @ngpio: the number of GPIOs handled by this controller; the last GPIO |
| @@ -230,6 +230,7 @@ struct hid_sensor_common { · 229 unmodified lines | ||
| 230 | 230 | struct platform_device *pdev; |
| 231 | 231 | unsigned usage_id; |
| 232 | 232 | atomic_t data_ready; |
| 233 | + atomic_t user_requested_state; | |
| 233 | 234 | struct iio_trigger *trigger; |
| 234 | 235 | struct hid_sensor_hub_attribute_info poll; |
| 235 | 236 | struct hid_sensor_hub_attribute_info report_state; |
| @@ -460,15 +460,14 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h, · 459 unmodified lines | ||
| 460 | 460 | return &mm->page_table_lock; |
| 461 | 461 | } |
| 462 | 462 | |
| 463 | −static inline bool hugepages_supported(void) | |
| 464 | −{ | |
| 465 | − /* | |
| 466 | − * Some platform decide whether they support huge pages at boot | |
| 467 | − * time. On these, such as powerpc, HPAGE_SHIFT is set to 0 when | |
| 468 | − * there is no such support | |
| 469 | − */ | |
| 470 | − return HPAGE_SHIFT != 0; | |
| 471 | −} | |
| 463 | +#ifndef hugepages_supported | |
| 464 | +/* | |
| 465 | + * Some platform decide whether they support huge pages at boot | |
| 466 | + * time. Some of them, such as powerpc, set HPAGE_SHIFT to 0 | |
| 467 | + * when there is no such support | |
| 468 | + */ | |
| 469 | +#define hugepages_supported() (HPAGE_SHIFT != 0) | |
| 470 | +#endif | |
| 472 | 471 | |
| 473 | 472 | #else /* CONFIG_HUGETLB_PAGE */ |
| 474 | 473 | struct hstate {}; |
| @@ -282,68 +282,8 @@ void __init parse_early_param(void); · 281 unmodified lines | ||
| 282 | 282 | void __init parse_early_options(char *cmdline); |
| 283 | 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 | 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 | 287 | #define __setup_param(str, unique_id, fn) /* nothing */ |
| 348 | 288 | #define __setup(str, func) /* nothing */ |
| 349 | 289 | #endif |
| @@ -351,24 +291,6 @@ void __init parse_early_options(char *cmdline); · 1 unmodified line | ||
| 351 | 291 | /* Data marked not to be saved by software suspend */ |
| 352 | 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 | 294 | #ifdef MODULE |
| 373 | 295 | #define __exit_p(x) x |
| 374 | 296 | #else |
| @@ -258,7 +258,7 @@ extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr, · 257 unmodified lines | ||
| 258 | 258 | void *data); |
| 259 | 259 | struct device *iommu_device_create(struct device *parent, void *drvdata, |
| 260 | 260 | const struct attribute_group **groups, |
| 261 | − const char *fmt, ...); | |
| 261 | + const char *fmt, ...) __printf(4, 5); | |
| 262 | 262 | void iommu_device_destroy(struct device *dev); |
| 263 | 263 | int iommu_device_link(struct device *dev, struct device *link); |
| 264 | 264 | void iommu_device_unlink(struct device *dev, struct device *link); |
| @@ -411,7 +411,8 @@ extern __printf(3, 0) · 410 unmodified lines | ||
| 411 | 411 | int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); |
| 412 | 412 | extern __printf(2, 3) |
| 413 | 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 | 417 | extern __scanf(2, 3) |
| 417 | 418 | int sscanf(const char *, const char *, ...); |
| @@ -679,10 +680,10 @@ do { \ · 261 unmodified lines | ||
| 679 | 680 | __ftrace_vprintk(_THIS_IP_, fmt, vargs); \ |
| 680 | 681 | } while (0) |
| 681 | 682 | |
| 682 | −extern int | |
| 683 | +extern __printf(2, 0) int | |
| 683 | 684 | __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap); |
| 684 | 685 | |
| 685 | −extern int | |
| 686 | +extern __printf(2, 0) int | |
| 686 | 687 | __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); |
| 687 | 688 | |
| 688 | 689 | extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); |
| @@ -702,7 +703,7 @@ int trace_printk(const char *fmt, ...) · 13 unmodified lines | ||
| 702 | 703 | { |
| 703 | 704 | return 0; |
| 704 | 705 | } |
| 705 | −static inline int | |
| 706 | +static __printf(1, 0) inline int | |
| 706 | 707 | ftrace_vprintk(const char *fmt, va_list ap) |
| 707 | 708 | { |
| 708 | 709 | return 0; |
| @@ -80,8 +80,9 @@ struct kobject { · 79 unmodified lines | ||
| 80 | 80 | |
| 81 | 81 | extern __printf(2, 3) |
| 82 | 82 | int kobject_set_name(struct kobject *kobj, const char *name, ...); |
| 83 | −extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | |
| 84 | − va_list vargs); | |
| 83 | +extern __printf(2, 0) | |
| 84 | +int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | |
| 85 | + va_list vargs); | |
| 85 | 86 | |
| 86 | 87 | static inline const char *kobject_name(const struct kobject *kobj) |
| 87 | 88 | { |
| @@ -734,6 +734,24 @@ static inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm) · 733 unmodified lines | ||
| 734 | 734 | return false; |
| 735 | 735 | } |
| 736 | 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 | 756 | static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu) |
| 739 | 757 | { |
| @@ -106,6 +106,6 @@ extern void enable_mmiotrace(void); · 105 unmodified lines | ||
| 106 | 106 | extern void disable_mmiotrace(void); |
| 107 | 107 | extern void mmio_trace_rw(struct mmiotrace_rw *rw); |
| 108 | 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 | 111 | #endif /* _LINUX_MMIOTRACE_H */ |
| @@ -11,6 +11,7 @@ · 10 unmodified lines | ||
| 11 | 11 | #include <linux/compiler.h> |
| 12 | 12 | #include <linux/cache.h> |
| 13 | 13 | #include <linux/kmod.h> |
| 14 | +#include <linux/init.h> | |
| 14 | 15 | #include <linux/elf.h> |
| 15 | 16 | #include <linux/stringify.h> |
| 16 | 17 | #include <linux/kobject.h> |
| @@ -71,6 +72,89 @@ extern struct module_attribute module_uevent; · 54 unmodified lines | ||
| 71 | 72 | extern int init_module(void); |
| 72 | 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 | 158 | /* Archs provide a method of finding the correct exception table. */ |
| 75 | 159 | struct exception_table_entry; |
| 76 | 160 | |
| @@ -8,6 +8,7 @@ extern struct page_ext_operations page_owner_ops; · 7 unmodified lines | ||
| 8 | 8 | extern void __reset_page_owner(struct page *page, unsigned int order); |
| 9 | 9 | extern void __set_page_owner(struct page *page, |
| 10 | 10 | unsigned int order, gfp_t gfp_mask); |
| 11 | +extern gfp_t __get_page_owner_gfp(struct page *page); | |
| 11 | 12 | |
| 12 | 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, · 11 unmodified lines | ||
| 25 | 26 | |
| 26 | 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 | 37 | #else |
| 29 | 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, · 2 unmodified lines | ||
| 33 | 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 | 50 | #endif /* CONFIG_PAGE_OWNER */ |
| 38 | 51 | #endif /* __LINUX_PAGE_OWNER_H */ |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * Arasan Compact Flash host controller platform data header file |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2011 ST Microelectronics |
| 7 | − * Viresh Kumar <viresh.linux@gmail.com> | |
| 7 | + * Viresh Kumar <vireshk@kernel.org> | |
| 8 | 8 | * |
| 9 | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -122,7 +122,7 @@ static inline __printf(1, 2) __cold · 121 unmodified lines | ||
| 122 | 122 | void early_printk(const char *s, ...) { } |
| 123 | 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 | 127 | #ifdef CONFIG_PRINTK |
| 128 | 128 | asmlinkage __printf(5, 0) |
| @@ -166,7 +166,7 @@ char *log_buf_addr_get(void); · 37 unmodified lines | ||
| 166 | 166 | u32 log_buf_len_get(void); |
| 167 | 167 | void log_buf_kexec_setup(void); |
| 168 | 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 | 170 | void dump_stack_print_info(const char *log_lvl); |
| 171 | 171 | void show_regs_print_info(const char *log_lvl); |
| 172 | 172 | #else |
| @@ -217,7 +217,7 @@ static inline void setup_log_buf(int early) · 44 unmodified lines | ||
| 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 | |
| @@ -1522,8 +1522,6 @@ struct task_struct { · 1521 unmodified lines | ||
| 1522 | 1522 | /* hung task detection */ |
| 1523 | 1523 | unsigned long last_switch_count; |
| 1524 | 1524 | #endif |
| 1525 | −/* CPU-specific state of this task */ | |
| 1526 | − struct thread_struct thread; | |
| 1527 | 1525 | /* filesystem information */ |
| 1528 | 1526 | struct fs_struct *fs; |
| 1529 | 1527 | /* open file information */ |
| @@ -1778,8 +1776,22 @@ struct task_struct { · 248 unmodified lines | ||
| 1778 | 1776 | unsigned long task_state_change; |
| 1779 | 1777 | #endif |
| 1780 | 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 | 1795 | /* Future-safe accessor for struct task_struct's cpus_allowed. */ |
| 1784 | 1796 | #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) |
| 1785 | 1797 | |
| @@ -4868,6 +4868,23 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy, · 4867 unmodified lines | ||
| 4868 | 4868 | struct cfg80211_chan_def *chandef, |
| 4869 | 4869 | enum nl80211_iftype iftype); |
| 4870 | 4870 | |
| 4871 | +/** | |
| 4872 | + * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation | |
| 4873 | + * @wiphy: the wiphy | |
| 4874 | + * @chandef: the channel definition | |
| 4875 | + * @iftype: interface type | |
| 4876 | + * | |
| 4877 | + * Return: %true if there is no secondary channel or the secondary channel(s) | |
| 4878 | + * can be used for beaconing (i.e. is not a radar channel etc.). This version | |
| 4879 | + * also checks if IR-relaxation conditions apply, to allow beaconing under | |
| 4880 | + * more permissive conditions. | |
| 4881 | + * | |
| 4882 | + * Requires the RTNL to be held. | |
| 4883 | + */ | |
| 4884 | +bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, | |
| 4885 | + struct cfg80211_chan_def *chandef, | |
| 4886 | + enum nl80211_iftype iftype); | |
| 4887 | + | |
| 4871 | 4888 | /* |
| 4872 | 4889 | * cfg80211_ch_switch_notify - update wdev channel and notify userspace |
| 4873 | 4890 | * @dev: the device which switched channels |
| @@ -161,6 +161,7 @@ static inline __u8 get_rtconn_flags(struct ipcm_cookie* ipc, struct sock* sk) · 160 unmodified lines | ||
| 161 | 161 | } |
| 162 | 162 | |
| 163 | 163 | /* datagram.c */ |
| 164 | +int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | |
| 164 | 165 | int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
| 165 | 166 | |
| 166 | 167 | void ip4_datagram_release_cb(struct sock *sk); |
| @@ -1745,6 +1745,7 @@ struct ib_device { · 1744 unmodified lines | ||
| 1745 | 1745 | char node_desc[64]; |
| 1746 | 1746 | __be64 node_guid; |
| 1747 | 1747 | u32 local_dma_lkey; |
| 1748 | + u16 is_switch:1; | |
| 1748 | 1749 | u8 node_type; |
| 1749 | 1750 | u8 phys_port_cnt; |
| 1750 | 1751 | |
| @@ -1823,6 +1824,20 @@ int ib_query_port(struct ib_device *device, · 72 unmodified lines | ||
| 1823 | 1824 | enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, |
| 1824 | 1825 | u8 port_num); |
| 1825 | 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 | + | |
| 1826 | 1841 | /** |
| 1827 | 1842 | * rdma_start_port - Return the first valid port number for the device |
| 1828 | 1843 | * specified |
| @@ -1833,7 +1848,7 @@ enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, · 4 unmodified lines | ||
| 1833 | 1848 | */ |
| 1834 | 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) · 6 unmodified lines | ||
| 1846 | 1861 | */ |
| 1847 | 1862 | static inline u8 rdma_end_port(const struct ib_device *device) |
| 1848 | 1863 | { |
| 1849 | − return (device->node_type == RDMA_NODE_IB_SWITCH) ? | |
| 1850 | − 0 : device->phys_port_cnt; | |
| 1864 | + return rdma_cap_ib_switch(device) ? 0 : device->phys_port_cnt; | |
| 1851 | 1865 | } |
| 1852 | 1866 | |
| 1853 | 1867 | static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num) |
| @@ -119,6 +119,7 @@ extern struct srp_rport *srp_rport_add(struct Scsi_Host *, · 118 unmodified lines | ||
| 119 | 119 | extern void srp_rport_del(struct srp_rport *); |
| 120 | 120 | extern int srp_tmo_valid(int reconnect_delay, int fast_io_fail_tmo, |
| 121 | 121 | int dev_loss_tmo); |
| 122 | +int srp_parse_tmo(int *tmo, const char *buf); | |
| 122 | 123 | extern int srp_reconnect_rport(struct srp_rport *rport); |
| 123 | 124 | extern void srp_start_tl_fail_timers(struct srp_rport *rport); |
| 124 | 125 | extern void srp_remove_host(struct Scsi_Host *); |
| @@ -527,18 +527,9 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen) · 526 unmodified lines | ||
| 527 | 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 | 530 | /* Arch-specific enabling code. */ |
| 538 | 531 | ret = __cpu_up(cpu, idle); |
| 539 | 532 | |
| 540 | − irq_unlock_sparse(); | |
| 541 | − | |
| 542 | 533 | if (ret != 0) |
| 543 | 534 | goto out_notify; |
| 544 | 535 | BUG_ON(!cpu_online(cpu)); |
| @@ -287,6 +287,11 @@ static void set_max_threads(unsigned int max_threads_suggested) · 286 unmodified lines | ||
| 287 | 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 | 295 | void __init fork_init(void) |
| 291 | 296 | { |
| 292 | 297 | #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR |
| @@ -295,7 +300,7 @@ void __init fork_init(void) · 2 unmodified lines | ||
| 295 | 300 | #endif |
| 296 | 301 | /* create a slab on which task_structs can be allocated */ |
| 297 | 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 | 304 | ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL); |
| 300 | 305 | #endif |
| 301 | 306 | |
| @@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) · 74 unmodified lines | ||
| 75 | 75 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { |
| 76 | 76 | #ifdef CONFIG_HARDIRQS_SW_RESEND |
| 77 | 77 | /* |
| 78 | − * If the interrupt has a parent irq and runs | |
| 79 | − * in the thread context of the parent irq, | |
| 80 | − * retrigger the parent. | |
| 78 | + * If the interrupt is running in the thread | |
| 79 | + * context of the parent irq we need to be | |
| 80 | + * careful, because we cannot trigger it | |
| 81 | + * directly. | |
| 81 | 82 | */ |
| 82 | − if (desc->parent_irq && | |
| 83 | − irq_settings_is_nested_thread(desc)) | |
| 83 | + if (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 | 91 | irq = desc->parent_irq; |
| 92 | + } | |
| 85 | 93 | /* Set it pending and activate the softirq: */ |
| 86 | 94 | set_bit(irq, irqs_resend); |
| 87 | 95 | tasklet_schedule(&resend_tasklet); |
| @@ -3683,7 +3683,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq) · 3682 unmodified lines | ||
| 3683 | 3683 | cfs_rq->throttled = 1; |
| 3684 | 3684 | cfs_rq->throttled_clock = rq_clock(rq); |
| 3685 | 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 | 3689 | * Add to the _head_ of the list, so that an already-started |
| @@ -839,7 +839,6 @@ out: · 838 unmodified lines | ||
| 839 | 839 | raw_spin_unlock(&tick_broadcast_lock); |
| 840 | 840 | return ret; |
| 841 | 841 | } |
| 842 | −EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control); | |
| 843 | 842 | |
| 844 | 843 | /* |
| 845 | 844 | * Reset the one shot broadcast for a cpu |
| @@ -363,6 +363,7 @@ int tick_broadcast_oneshot_control(enum tick_broadcast_state state) · 362 unmodified lines | ||
| 363 | 363 | |
| 364 | 364 | return __tick_broadcast_oneshot_control(state); |
| 365 | 365 | } |
| 366 | +EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control); | |
| 366 | 367 | |
| 367 | 368 | #ifdef CONFIG_HOTPLUG_CPU |
| 368 | 369 | /* |
| @@ -444,6 +444,7 @@ enum { · 443 unmodified lines | ||
| 444 | 444 | |
| 445 | 445 | TRACE_CONTROL_BIT, |
| 446 | 446 | |
| 447 | + TRACE_BRANCH_BIT, | |
| 447 | 448 | /* |
| 448 | 449 | * Abuse of the trace_recursion. |
| 449 | 450 | * As we need a way to maintain state if we are tracing the function |
| @@ -36,9 +36,12 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) · 35 unmodified lines | ||
| 36 | 36 | struct trace_branch *entry; |
| 37 | 37 | struct ring_buffer *buffer; |
| 38 | 38 | unsigned long flags; |
| 39 | − int cpu, pc; | |
| 39 | + int pc; | |
| 40 | 40 | const char *p; |
| 41 | 41 | |
| 42 | + if (current->trace_recursion & TRACE_BRANCH_BIT) | |
| 43 | + return; | |
| 44 | + | |
| 42 | 45 | /* |
| 43 | 46 | * I would love to save just the ftrace_likely_data pointer, but |
| 44 | 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) · 4 unmodified lines | ||
| 49 | 52 | if (unlikely(!tr)) |
| 50 | 53 | return; |
| 51 | 54 | |
| 52 | − local_irq_save(flags); | |
| 53 | − cpu = raw_smp_processor_id(); | |
| 54 | − data = per_cpu_ptr(tr->trace_buffer.data, cpu); | |
| 55 | − if (atomic_inc_return(&data->disabled) != 1) | |
| 55 | + raw_local_irq_save(flags); | |
| 56 | + current->trace_recursion |= TRACE_BRANCH_BIT; | |
| 57 | + data = this_cpu_ptr(tr->trace_buffer.data); | |
| 58 | + if (atomic_read(&data->disabled)) | |
| 56 | 59 | goto out; |
| 57 | 60 | |
| 58 | 61 | pc = preempt_count(); |
| @@ -81,8 +84,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) · 22 unmodified lines | ||
| 81 | 84 | __buffer_unlock_commit(buffer, event); |
| 82 | 85 | |
| 83 | 86 | out: |
| 84 | − atomic_dec(&data->disabled); | |
| 85 | − local_irq_restore(flags); | |
| 87 | + current->trace_recursion &= ~TRACE_BRANCH_BIT; | |
| 88 | + raw_local_irq_restore(flags); | |
| 86 | 89 | } |
| 87 | 90 | |
| 88 | 91 | static inline |
| @@ -59,8 +59,11 @@ decompress_fn __init decompress_method(const unsigned char *inbuf, long len, · 58 unmodified lines | ||
| 59 | 59 | { |
| 60 | 60 | const struct compress_format *cf; |
| 61 | 61 | |
| 62 | − if (len < 2) | |
| 62 | + if (len < 2) { | |
| 63 | + if (name) | |
| 64 | + *name = NULL; | |
| 63 | 65 | return NULL; /* Need at least this much... */ |
| 66 | + } | |
| 64 | 67 | |
| 65 | 68 | pr_debug("Compressed data magic: %#.2x %#.2x\n", inbuf[0], inbuf[1]); |
| 66 | 69 | |
| @@ -574,6 +574,9 @@ void debug_dma_assert_idle(struct page *page) · 573 unmodified lines | ||
| 574 | 574 | unsigned long flags; |
| 575 | 575 | phys_addr_t cln; |
| 576 | 576 | |
| 577 | + if (dma_debug_disabled()) | |
| 578 | + return; | |
| 579 | + | |
| 577 | 580 | if (!page) |
| 578 | 581 | return; |
| 579 | 582 | |
| @@ -11,6 +11,7 @@ · 10 unmodified lines | ||
| 11 | 11 | #include <linux/ctype.h> |
| 12 | 12 | #include <linux/kernel.h> |
| 13 | 13 | #include <linux/export.h> |
| 14 | +#include <asm/unaligned.h> | |
| 14 | 15 | |
| 15 | 16 | const char hex_asc[] = "0123456789abcdef"; |
| 16 | 17 | EXPORT_SYMBOL(hex_asc); |
| @@ -139,7 +140,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, · 122 unmodified lines | ||
| 139 | 140 | for (j = 0; j < ngroups; j++) { |
| 140 | 141 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 141 | 142 | "%s%16.16llx", j ? " " : "", |
| 142 | − (unsigned long long)*(ptr8 + j)); | |
| 143 | + get_unaligned(ptr8 + j)); | |
| 143 | 144 | if (ret >= linebuflen - lx) |
| 144 | 145 | goto overflow1; |
| 145 | 146 | lx += ret; |
| @@ -150,7 +151,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, · 4 unmodified lines | ||
| 150 | 151 | for (j = 0; j < ngroups; j++) { |
| 151 | 152 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 152 | 153 | "%s%8.8x", j ? " " : "", |
| 153 | − *(ptr4 + j)); | |
| 154 | + get_unaligned(ptr4 + j)); | |
| 154 | 155 | if (ret >= linebuflen - lx) |
| 155 | 156 | goto overflow1; |
| 156 | 157 | lx += ret; |
| @@ -161,7 +162,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, · 4 unmodified lines | ||
| 161 | 162 | for (j = 0; j < ngroups; j++) { |
| 162 | 163 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 163 | 164 | "%s%4.4x", j ? " " : "", |
| 164 | − *(ptr2 + j)); | |
| 165 | + get_unaligned(ptr2 + j)); | |
| 165 | 166 | if (ret >= linebuflen - lx) |
| 166 | 167 | goto overflow1; |
| 167 | 168 | lx += ret; |
| @@ -337,8 +337,9 @@ error: · 336 unmodified lines | ||
| 337 | 337 | } |
| 338 | 338 | EXPORT_SYMBOL(kobject_init); |
| 339 | 339 | |
| 340 | −static int kobject_add_varg(struct kobject *kobj, struct kobject *parent, | |
| 341 | − const char *fmt, va_list vargs) | |
| 340 | +static __printf(3, 0) int kobject_add_varg(struct kobject *kobj, | |
| 341 | + struct kobject *parent, | |
| 342 | + const char *fmt, va_list vargs) | |
| 342 | 343 | { |
| 343 | 344 | int retval; |
| 344 | 345 | |
| @@ -39,7 +39,7 @@ static int cma_used_get(void *data, u64 *val) · 38 unmodified lines | ||
| 39 | 39 | |
| 40 | 40 | mutex_lock(&cma->lock); |
| 41 | 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 | 43 | mutex_unlock(&cma->lock); |
| 44 | 44 | *val = (u64)used << cma->order_per_bit; |
| 45 | 45 | |
| @@ -52,13 +52,14 @@ static int cma_maxchunk_get(void *data, u64 *val) · 6 unmodified lines | ||
| 52 | 52 | struct cma *cma = data; |
| 53 | 53 | unsigned long maxchunk = 0; |
| 54 | 54 | unsigned long start, end = 0; |
| 55 | + unsigned long bitmap_maxno = cma_bitmap_maxno(cma); | |
| 55 | 56 | |
| 56 | 57 | mutex_lock(&cma->lock); |
| 57 | 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 | 60 | if (start >= cma->count) |
| 60 | 61 | break; |
| 61 | − end = find_next_bit(cma->bitmap, cma->count, start); | |
| 62 | + end = find_next_bit(cma->bitmap, bitmap_maxno, start); | |
| 62 | 63 | maxchunk = max(end - start, maxchunk); |
| 63 | 64 | } |
| 64 | 65 | mutex_unlock(&cma->lock); |
| @@ -170,10 +171,10 @@ static void cma_debugfs_add_one(struct cma *cma, int idx) · 105 unmodified lines | ||
| 170 | 171 | |
| 171 | 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 | 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 | 178 | &cma_free_fops); |
| 178 | 179 | |
| 179 | 180 | debugfs_create_file("base_pfn", S_IRUGO, tmp, |
| @@ -246,9 +246,7 @@ static inline void reset_deferred_meminit(pg_data_t *pgdat) · 245 unmodified lines | ||
| 246 | 246 | /* Returns true if the struct page for the pfn is uninitialised */ |
| 247 | 247 | static inline bool __meminit early_page_uninitialised(unsigned long pfn) |
| 248 | 248 | { |
| 249 | − int nid = early_pfn_to_nid(pfn); | |
| 250 | − | |
| 251 | − if (pfn >= NODE_DATA(nid)->first_deferred_pfn) | |
| 249 | + if (pfn >= NODE_DATA(early_pfn_to_nid(pfn))->first_deferred_pfn) | |
| 252 | 250 | return true; |
| 253 | 251 | |
| 254 | 252 | return false; |
| @@ -1950,6 +1948,7 @@ void free_hot_cold_page_list(struct list_head *list, bool cold) · 1695 unmodified lines | ||
| 1950 | 1948 | void split_page(struct page *page, unsigned int order) |
| 1951 | 1949 | { |
| 1952 | 1950 | int i; |
| 1951 | + gfp_t gfp_mask; | |
| 1953 | 1952 | |
| 1954 | 1953 | VM_BUG_ON_PAGE(PageCompound(page), page); |
| 1955 | 1954 | VM_BUG_ON_PAGE(!page_count(page), page); |
| @@ -1963,10 +1962,11 @@ void split_page(struct page *page, unsigned int order) · 7 unmodified lines | ||
| 1963 | 1962 | split_page(virt_to_page(page[0].shadow), order); |
| 1964 | 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 | 1967 | for (i = 1; i < (1 << order); i++) { |
| 1968 | 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 | 1972 | EXPORT_SYMBOL_GPL(split_page); |
| @@ -1996,6 +1996,8 @@ int __isolate_free_page(struct page *page, unsigned int order) · 23 unmodified lines | ||
| 1996 | 1996 | zone->free_area[order].nr_free--; |
| 1997 | 1997 | rmv_page_order(page); |
| 1998 | 1998 | |
| 1999 | + set_page_owner(page, order, __GFP_MOVABLE); | |
| 2000 | + | |
| 1999 | 2001 | /* Set the pageblock if the isolated page is at least a pageblock */ |
| 2000 | 2002 | if (order >= pageblock_order - 1) { |
| 2001 | 2003 | struct page *endpage = page + (1 << order) - 1; |
| @@ -2007,7 +2009,7 @@ int __isolate_free_page(struct page *page, unsigned int order) · 5 unmodified lines | ||
| 2007 | 2009 | } |
| 2008 | 2010 | } |
| 2009 | 2011 | |
| 2010 | − set_page_owner(page, order, 0); | |
| 2012 | + | |
| 2011 | 2013 | return 1UL << order; |
| 2012 | 2014 | } |
| 2013 | 2015 | |
| @@ -76,6 +76,13 @@ void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask) · 75 unmodified lines | ||
| 76 | 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 | 86 | static ssize_t |
| 80 | 87 | print_page_owner(char __user *buf, size_t count, unsigned long pfn, |
| 81 | 88 | struct page *page, struct page_ext *page_ext) |
| @@ -264,6 +264,7 @@ void ax25_disconnect(ax25_cb *ax25, int reason) · 263 unmodified lines | ||
| 264 | 264 | { |
| 265 | 265 | ax25_clear_queues(ax25); |
| 266 | 266 | |
| 267 | + ax25_stop_heartbeat(ax25); | |
| 267 | 268 | ax25_stop_t1timer(ax25); |
| 268 | 269 | ax25_stop_t2timer(ax25); |
| 269 | 270 | ax25_stop_t3timer(ax25); |
| @@ -356,7 +356,6 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, · 355 unmodified lines | ||
| 356 | 356 | if (state == MDB_TEMPORARY) |
| 357 | 357 | mod_timer(&p->timer, now + br->multicast_membership_interval); |
| 358 | 358 | |
| 359 | − br_mdb_notify(br->dev, port, group, RTM_NEWMDB, state); | |
| 360 | 359 | return 0; |
| 361 | 360 | } |
| 362 | 361 | |
| @@ -39,6 +39,16 @@ static void br_multicast_start_querier(struct net_bridge *br, · 38 unmodified lines | ||
| 39 | 39 | struct bridge_mcast_own_query *query); |
| 40 | 40 | static void br_multicast_add_router(struct net_bridge *br, |
| 41 | 41 | struct net_bridge_port *port); |
| 42 | +static void br_ip4_multicast_leave_group(struct net_bridge *br, | |
| 43 | + struct net_bridge_port *port, | |
| 44 | + __be32 group, | |
| 45 | + __u16 vid); | |
| 46 | +#if IS_ENABLED(CONFIG_IPV6) | |
| 47 | +static void br_ip6_multicast_leave_group(struct net_bridge *br, | |
| 48 | + struct net_bridge_port *port, | |
| 49 | + const struct in6_addr *group, | |
| 50 | + __u16 vid); | |
| 51 | +#endif | |
| 42 | 52 | unsigned int br_mdb_rehash_seq; |
| 43 | 53 | |
| 44 | 54 | static inline int br_ip_equal(const struct br_ip *a, const struct br_ip *b) |
| @@ -1022,9 +1032,15 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, · 977 unmodified lines | ||
| 1022 | 1032 | continue; |
| 1023 | 1033 | } |
| 1024 | 1034 | |
| 1025 | − err = br_ip4_multicast_add_group(br, port, group, vid); | |
| 1026 | − if (err) | |
| 1027 | − break; | |
| 1035 | + if ((type == IGMPV3_CHANGE_TO_INCLUDE || | |
| 1036 | + type == IGMPV3_MODE_IS_INCLUDE) && | |
| 1037 | + ntohs(grec->grec_nsrcs) == 0) { | |
| 1038 | + br_ip4_multicast_leave_group(br, port, group, vid); | |
| 1039 | + } else { | |
| 1040 | + err = br_ip4_multicast_add_group(br, port, group, vid); | |
| 1041 | + if (err) | |
| 1042 | + break; | |
| 1043 | + } | |
| 1028 | 1044 | } |
| 1029 | 1045 | |
| 1030 | 1046 | return err; |
| @@ -1083,10 +1099,17 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, · 52 unmodified lines | ||
| 1083 | 1099 | continue; |
| 1084 | 1100 | } |
| 1085 | 1101 | |
| 1086 | − err = br_ip6_multicast_add_group(br, port, &grec->grec_mca, | |
| 1087 | − vid); | |
| 1088 | − if (err) | |
| 1089 | − break; | |
| 1102 | + if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || | |
| 1103 | + grec->grec_type == MLD2_MODE_IS_INCLUDE) && | |
| 1104 | + ntohs(*nsrcs) == 0) { | |
| 1105 | + br_ip6_multicast_leave_group(br, port, &grec->grec_mca, | |
| 1106 | + vid); | |
| 1107 | + } else { | |
| 1108 | + err = br_ip6_multicast_add_group(br, port, | |
| 1109 | + &grec->grec_mca, vid); | |
| 1110 | + if (!err) | |
| 1111 | + break; | |
| 1112 | + } | |
| 1090 | 1113 | } |
| 1091 | 1114 | |
| 1092 | 1115 | return err; |
| @@ -121,12 +121,13 @@ static void caif_flow_ctrl(struct sock *sk, int mode) · 120 unmodified lines | ||
| 121 | 121 | * Copied from sock.c:sock_queue_rcv_skb(), but changed so packets are |
| 122 | 122 | * not dropped, but CAIF is sending flow off instead. |
| 123 | 123 | */ |
| 124 | −static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |
| 124 | +static void caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |
| 125 | 125 | { |
| 126 | 126 | int err; |
| 127 | 127 | unsigned long flags; |
| 128 | 128 | struct sk_buff_head *list = &sk->sk_receive_queue; |
| 129 | 129 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
| 130 | + bool queued = false; | |
| 130 | 131 | |
| 131 | 132 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= |
| 132 | 133 | (unsigned int)sk->sk_rcvbuf && rx_flow_is_on(cf_sk)) { |
| @@ -139,7 +140,8 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) · 6 unmodified lines | ||
| 139 | 140 | |
| 140 | 141 | err = sk_filter(sk, skb); |
| 141 | 142 | if (err) |
| 142 | − return err; | |
| 143 | + goto out; | |
| 144 | + | |
| 143 | 145 | if (!sk_rmem_schedule(sk, skb, skb->truesize) && rx_flow_is_on(cf_sk)) { |
| 144 | 146 | set_rx_flow_off(cf_sk); |
| 145 | 147 | net_dbg_ratelimited("sending flow OFF due to rmem_schedule\n"); |
| @@ -147,21 +149,16 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) · 1 unmodified line | ||
| 147 | 149 | } |
| 148 | 150 | skb->dev = NULL; |
| 149 | 151 | skb_set_owner_r(skb, sk); |
| 150 | − /* Cache the SKB length before we tack it onto the receive | |
| 151 | − * queue. Once it is added it no longer belongs to us and | |
| 152 | − * may be freed by other threads of control pulling packets | |
| 153 | − * from the queue. | |
| 154 | − */ | |
| 155 | 152 | spin_lock_irqsave(&list->lock, flags); |
| 156 | − if (!sock_flag(sk, SOCK_DEAD)) | |
| 153 | + queued = !sock_flag(sk, SOCK_DEAD); | |
| 154 | + if (queued) | |
| 157 | 155 | __skb_queue_tail(list, skb); |
| 158 | 156 | spin_unlock_irqrestore(&list->lock, flags); |
| 159 | − | |
| 160 | − if (!sock_flag(sk, SOCK_DEAD)) | |
| 157 | +out: | |
| 158 | + if (queued) | |
| 161 | 159 | sk->sk_data_ready(sk); |
| 162 | 160 | else |
| 163 | 161 | kfree_skb(skb); |
| 164 | − return 0; | |
| 165 | 162 | } |
| 166 | 163 | |
| 167 | 164 | /* Packet Receive Callback function called from CAIF Stack */ |
| @@ -131,6 +131,35 @@ out_noerr: · 130 unmodified lines | ||
| 131 | 131 | goto out; |
| 132 | 132 | } |
| 133 | 133 | |
| 134 | +static int skb_set_peeked(struct sk_buff *skb) | |
| 135 | +{ | |
| 136 | + struct sk_buff *nskb; | |
| 137 | + | |
| 138 | + if (skb->peeked) | |
| 139 | + return 0; | |
| 140 | + | |
| 141 | + /* We have to unshare an skb before modifying it. */ | |
| 142 | + if (!skb_shared(skb)) | |
| 143 | + goto done; | |
| 144 | + | |
| 145 | + nskb = skb_clone(skb, GFP_ATOMIC); | |
| 146 | + if (!nskb) | |
| 147 | + return -ENOMEM; | |
| 148 | + | |
| 149 | + skb->prev->next = nskb; | |
| 150 | + skb->next->prev = nskb; | |
| 151 | + nskb->prev = skb->prev; | |
| 152 | + nskb->next = skb->next; | |
| 153 | + | |
| 154 | + consume_skb(skb); | |
| 155 | + skb = nskb; | |
| 156 | + | |
| 157 | +done: | |
| 158 | + skb->peeked = 1; | |
| 159 | + | |
| 160 | + return 0; | |
| 161 | +} | |
| 162 | + | |
| 134 | 163 | /** |
| 135 | 164 | * __skb_recv_datagram - Receive a datagram skbuff |
| 136 | 165 | * @sk: socket |
| @@ -165,7 +194,9 @@ out_noerr: · 28 unmodified lines | ||
| 165 | 194 | struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, |
| 166 | 195 | int *peeked, int *off, int *err) |
| 167 | 196 | { |
| 197 | + struct sk_buff_head *queue = &sk->sk_receive_queue; | |
| 168 | 198 | struct sk_buff *skb, *last; |
| 199 | + unsigned long cpu_flags; | |
| 169 | 200 | long timeo; |
| 170 | 201 | /* |
| 171 | 202 | * Caller is allowed not to check sk->sk_err before skb_recv_datagram() |
| @@ -184,8 +215,6 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, · 12 unmodified lines | ||
| 184 | 215 | * Look at current nfs client by the way... |
| 185 | 216 | * However, this function was correct in any case. 8) |
| 186 | 217 | */ |
| 187 | − unsigned long cpu_flags; | |
| 188 | − struct sk_buff_head *queue = &sk->sk_receive_queue; | |
| 189 | 218 | int _off = *off; |
| 190 | 219 | |
| 191 | 220 | last = (struct sk_buff *)queue; |
| @@ -199,7 +228,11 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, · 7 unmodified lines | ||
| 199 | 228 | _off -= skb->len; |
| 200 | 229 | continue; |
| 201 | 230 | } |
| 202 | − skb->peeked = 1; | |
| 231 | + | |
| 232 | + error = skb_set_peeked(skb); | |
| 233 | + if (error) | |
| 234 | + goto unlock_err; | |
| 235 | + | |
| 203 | 236 | atomic_inc(&skb->users); |
| 204 | 237 | } else |
| 205 | 238 | __skb_unlink(skb, queue); |
| @@ -223,6 +256,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, · 17 unmodified lines | ||
| 223 | 256 | |
| 224 | 257 | return NULL; |
| 225 | 258 | |
| 259 | +unlock_err: | |
| 260 | + spin_unlock_irqrestore(&queue->lock, cpu_flags); | |
| 226 | 261 | no_packet: |
| 227 | 262 | *err = error; |
| 228 | 263 | return NULL; |
| @@ -622,7 +657,8 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len) · 393 unmodified lines | ||
| 622 | 657 | !skb->csum_complete_sw) |
| 623 | 658 | netdev_rx_csum_fault(skb->dev); |
| 624 | 659 | } |
| 625 | − skb->csum_valid = !sum; | |
| 660 | + if (!skb_shared(skb)) | |
| 661 | + skb->csum_valid = !sum; | |
| 626 | 662 | return sum; |
| 627 | 663 | } |
| 628 | 664 | EXPORT_SYMBOL(__skb_checksum_complete_head); |
| @@ -642,11 +678,13 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb) · 13 unmodified lines | ||
| 642 | 678 | netdev_rx_csum_fault(skb->dev); |
| 643 | 679 | } |
| 644 | 680 | |
| 645 | − /* Save full packet checksum */ | |
| 646 | − skb->csum = csum; | |
| 647 | − skb->ip_summed = CHECKSUM_COMPLETE; | |
| 648 | − skb->csum_complete_sw = 1; | |
| 649 | − skb->csum_valid = !sum; | |
| 681 | + if (!skb_shared(skb)) { | |
| 682 | + /* Save full packet checksum */ | |
| 683 | + skb->csum = csum; | |
| 684 | + skb->ip_summed = CHECKSUM_COMPLETE; | |
| 685 | + skb->csum_complete_sw = 1; | |
| 686 | + skb->csum_valid = !sum; | |
| 687 | + } | |
| 650 | 688 | |
| 651 | 689 | return sum; |
| 652 | 690 | } |
| @@ -299,7 +299,9 @@ void dst_release(struct dst_entry *dst) · 298 unmodified lines | ||
| 299 | 299 | int newrefcnt; |
| 300 | 300 | |
| 301 | 301 | newrefcnt = atomic_dec_return(&dst->__refcnt); |
| 302 | − WARN_ON(newrefcnt < 0); | |
| 302 | + if (unlikely(newrefcnt < 0)) | |
| 303 | + net_warn_ratelimited("%s: dst:%p refcnt:%d\n", | |
| 304 | + __func__, dst, newrefcnt); | |
| 303 | 305 | if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) |
| 304 | 306 | call_rcu(&dst->rcu_head, dst_destroy_rcu); |
| 305 | 307 | } |
| @@ -1808,10 +1808,13 @@ static int do_setlink(const struct sk_buff *skb, · 1807 unmodified lines | ||
| 1808 | 1808 | goto errout; |
| 1809 | 1809 | |
| 1810 | 1810 | nla_for_each_nested(attr, tb[IFLA_VF_PORTS], rem) { |
| 1811 | − if (nla_type(attr) != IFLA_VF_PORT) | |
| 1812 | − continue; | |
| 1813 | − err = nla_parse_nested(port, IFLA_PORT_MAX, | |
| 1814 | − attr, ifla_port_policy); | |
| 1811 | + if (nla_type(attr) != IFLA_VF_PORT || | |
| 1812 | + nla_len(attr) < NLA_HDRLEN) { | |
| 1813 | + err = -EINVAL; | |
| 1814 | + goto errout; | |
| 1815 | + } | |
| 1816 | + err = nla_parse_nested(port, IFLA_PORT_MAX, attr, | |
| 1817 | + ifla_port_policy); | |
| 1815 | 1818 | if (err < 0) |
| 1816 | 1819 | goto errout; |
| 1817 | 1820 | if (!port[IFLA_PORT_VF]) { |
| @@ -20,7 +20,7 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <net/route.h> |
| 21 | 21 | #include <net/tcp_states.h> |
| 22 | 22 | |
| 23 | −int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 23 | +int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 24 | 24 | { |
| 25 | 25 | struct inet_sock *inet = inet_sk(sk); |
| 26 | 26 | struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; |
| @@ -39,8 +39,6 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) · 12 unmodified lines | ||
| 39 | 39 | |
| 40 | 40 | sk_dst_reset(sk); |
| 41 | 41 | |
| 42 | − lock_sock(sk); | |
| 43 | − | |
| 44 | 42 | oif = sk->sk_bound_dev_if; |
| 45 | 43 | saddr = inet->inet_saddr; |
| 46 | 44 | if (ipv4_is_multicast(usin->sin_addr.s_addr)) { |
| @@ -82,9 +80,19 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) · 35 unmodified lines | ||
| 82 | 80 | sk_dst_set(sk, &rt->dst); |
| 83 | 81 | err = 0; |
| 84 | 82 | out: |
| 85 | − release_sock(sk); | |
| 86 | 83 | return err; |
| 87 | 84 | } |
| 85 | +EXPORT_SYMBOL(__ip4_datagram_connect); | |
| 86 | + | |
| 87 | +int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 88 | +{ | |
| 89 | + int res; | |
| 90 | + | |
| 91 | + lock_sock(sk); | |
| 92 | + res = __ip4_datagram_connect(sk, uaddr, addr_len); | |
| 93 | + release_sock(sk); | |
| 94 | + return res; | |
| 95 | +} | |
| 88 | 96 | EXPORT_SYMBOL(ip4_datagram_connect); |
| 89 | 97 | |
| 90 | 98 | /* Because UDP xmit path can manipulate sk_dst_cache without holding |
| @@ -610,22 +610,21 @@ EXPORT_SYMBOL_GPL(inet_hashinfo_init); · 609 unmodified lines | ||
| 610 | 610 | |
| 611 | 611 | int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo) |
| 612 | 612 | { |
| 613 | + unsigned int locksz = sizeof(spinlock_t); | |
| 613 | 614 | unsigned int i, nblocks = 1; |
| 614 | 615 | |
| 615 | − if (sizeof(spinlock_t) != 0) { | |
| 616 | + if (locksz != 0) { | |
| 616 | 617 | /* allocate 2 cache lines or at least one spinlock per cpu */ |
| 617 | − nblocks = max_t(unsigned int, | |
| 618 | − 2 * L1_CACHE_BYTES / sizeof(spinlock_t), | |
| 619 | − 1); | |
| 618 | + nblocks = max(2U * L1_CACHE_BYTES / locksz, 1U); | |
| 620 | 619 | nblocks = roundup_pow_of_two(nblocks * num_possible_cpus()); |
| 621 | 620 | |
| 622 | 621 | /* no more locks than number of hash buckets */ |
| 623 | 622 | nblocks = min(nblocks, hashinfo->ehash_mask + 1); |
| 624 | 623 | |
| 625 | − hashinfo->ehash_locks = kmalloc_array(nblocks, sizeof(spinlock_t), | |
| 624 | + hashinfo->ehash_locks = kmalloc_array(nblocks, locksz, | |
| 626 | 625 | GFP_KERNEL | __GFP_NOWARN); |
| 627 | 626 | if (!hashinfo->ehash_locks) |
| 628 | − hashinfo->ehash_locks = vmalloc(nblocks * sizeof(spinlock_t)); | |
| 627 | + hashinfo->ehash_locks = vmalloc(nblocks * locksz); | |
| 629 | 628 | |
| 630 | 629 | if (!hashinfo->ehash_locks) |
| 631 | 630 | return -ENOMEM; |
| @@ -351,7 +351,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) · 350 unmodified lines | ||
| 351 | 351 | ihl = ip_hdrlen(skb); |
| 352 | 352 | |
| 353 | 353 | /* Determine the position of this fragment. */ |
| 354 | − end = offset + skb->len - ihl; | |
| 354 | + end = offset + skb->len - skb_network_offset(skb) - ihl; | |
| 355 | 355 | err = -EINVAL; |
| 356 | 356 | |
| 357 | 357 | /* Is this the final fragment? */ |
| @@ -381,7 +381,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) · 23 unmodified lines | ||
| 381 | 381 | goto err; |
| 382 | 382 | |
| 383 | 383 | err = -ENOMEM; |
| 384 | − if (!pskb_pull(skb, ihl)) | |
| 384 | + if (!pskb_pull(skb, skb_network_offset(skb) + ihl)) | |
| 385 | 385 | goto err; |
| 386 | 386 | |
| 387 | 387 | err = pskb_trim_rcsum(skb, end - offset); |
| @@ -627,6 +627,8 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, · 239 unmodified lines | ||
| 627 | 627 | iph->frag_off = 0; |
| 628 | 628 | } |
| 629 | 629 | |
| 630 | + ip_send_check(iph); | |
| 631 | + | |
| 630 | 632 | IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS); |
| 631 | 633 | qp->q.fragments = NULL; |
| 632 | 634 | qp->q.fragments_tail = NULL; |
| @@ -1920,14 +1920,13 @@ void tcp_enter_loss(struct sock *sk) · 1919 unmodified lines | ||
| 1920 | 1920 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 1921 | 1921 | struct tcp_sock *tp = tcp_sk(sk); |
| 1922 | 1922 | struct sk_buff *skb; |
| 1923 | − bool new_recovery = false; | |
| 1923 | + bool new_recovery = icsk->icsk_ca_state < TCP_CA_Recovery; | |
| 1924 | 1924 | bool is_reneg; /* is receiver reneging on SACKs? */ |
| 1925 | 1925 | |
| 1926 | 1926 | /* Reduce ssthresh if it has not yet been made inside this window. */ |
| 1927 | 1927 | if (icsk->icsk_ca_state <= TCP_CA_Disorder || |
| 1928 | 1928 | !after(tp->high_seq, tp->snd_una) || |
| 1929 | 1929 | (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) { |
| 1930 | − new_recovery = true; | |
| 1931 | 1930 | tp->prior_ssthresh = tcp_current_ssthresh(sk); |
| 1932 | 1931 | tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk); |
| 1933 | 1932 | tcp_ca_event(sk, CA_EVENT_LOSS); |
| @@ -40,7 +40,7 @@ static bool ipv6_mapped_addr_any(const struct in6_addr *a) · 39 unmodified lines | ||
| 40 | 40 | return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0); |
| 41 | 41 | } |
| 42 | 42 | |
| 43 | −int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 43 | +static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 44 | 44 | { |
| 45 | 45 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; |
| 46 | 46 | struct inet_sock *inet = inet_sk(sk); |
| @@ -56,7 +56,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) · 9 unmodified lines | ||
| 56 | 56 | if (usin->sin6_family == AF_INET) { |
| 57 | 57 | if (__ipv6_only_sock(sk)) |
| 58 | 58 | return -EAFNOSUPPORT; |
| 59 | − err = ip4_datagram_connect(sk, uaddr, addr_len); | |
| 59 | + err = __ip4_datagram_connect(sk, uaddr, addr_len); | |
| 60 | 60 | goto ipv4_connected; |
| 61 | 61 | } |
| 62 | 62 | |
| @@ -98,9 +98,9 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) · 35 unmodified lines | ||
| 98 | 98 | sin.sin_addr.s_addr = daddr->s6_addr32[3]; |
| 99 | 99 | sin.sin_port = usin->sin6_port; |
| 100 | 100 | |
| 101 | − err = ip4_datagram_connect(sk, | |
| 102 | − (struct sockaddr *) &sin, | |
| 103 | − sizeof(sin)); | |
| 101 | + err = __ip4_datagram_connect(sk, | |
| 102 | + (struct sockaddr *) &sin, | |
| 103 | + sizeof(sin)); | |
| 104 | 104 | |
| 105 | 105 | ipv4_connected: |
| 106 | 106 | if (err) |
| @@ -204,6 +204,16 @@ out: · 97 unmodified lines | ||
| 204 | 204 | fl6_sock_release(flowlabel); |
| 205 | 205 | return err; |
| 206 | 206 | } |
| 207 | + | |
| 208 | +int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |
| 209 | +{ | |
| 210 | + int res; | |
| 211 | + | |
| 212 | + lock_sock(sk); | |
| 213 | + res = __ip6_datagram_connect(sk, uaddr, addr_len); | |
| 214 | + release_sock(sk); | |
| 215 | + return res; | |
| 216 | +} | |
| 207 | 217 | EXPORT_SYMBOL_GPL(ip6_datagram_connect); |
| 208 | 218 | |
| 209 | 219 | int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr, |
| @@ -292,8 +292,6 @@ static struct packet_offload ipv6_packet_offload __read_mostly = { · 291 unmodified lines | ||
| 292 | 292 | static const struct net_offload sit_offload = { |
| 293 | 293 | .callbacks = { |
| 294 | 294 | .gso_segment = ipv6_gso_segment, |
| 295 | − .gro_receive = ipv6_gro_receive, | |
| 296 | − .gro_complete = ipv6_gro_complete, | |
| 297 | 295 | }, |
| 298 | 296 | }; |
| 299 | 297 | |
| @@ -723,6 +723,7 @@ void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata) · 722 unmodified lines | ||
| 723 | 723 | |
| 724 | 724 | debugfs_remove_recursive(sdata->vif.debugfs_dir); |
| 725 | 725 | sdata->vif.debugfs_dir = NULL; |
| 726 | + sdata->debugfs.subdir_stations = NULL; | |
| 726 | 727 | } |
| 727 | 728 | |
| 728 | 729 | void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata) |
| @@ -1863,10 +1863,6 @@ void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) · 1862 unmodified lines | ||
| 1863 | 1863 | ieee80211_teardown_sdata(sdata); |
| 1864 | 1864 | } |
| 1865 | 1865 | |
| 1866 | −/* | |
| 1867 | − * Remove all interfaces, may only be called at hardware unregistration | |
| 1868 | − * time because it doesn't do RCU-safe list removals. | |
| 1869 | − */ | |
| 1870 | 1866 | void ieee80211_remove_interfaces(struct ieee80211_local *local) |
| 1871 | 1867 | { |
| 1872 | 1868 | struct ieee80211_sub_if_data *sdata, *tmp; |
| @@ -1875,14 +1871,21 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local) · 2 unmodified lines | ||
| 1875 | 1871 | |
| 1876 | 1872 | ASSERT_RTNL(); |
| 1877 | 1873 | |
| 1878 | − /* | |
| 1879 | − * Close all AP_VLAN interfaces first, as otherwise they | |
| 1880 | − * might be closed while the AP interface they belong to | |
| 1881 | − * is closed, causing unregister_netdevice_many() to crash. | |
| 1874 | + /* Before destroying the interfaces, make sure they're all stopped so | |
| 1875 | + * that the hardware is stopped. Otherwise, the driver might still be | |
| 1876 | + * iterating the interfaces during the shutdown, e.g. from a worker | |
| 1877 | + * or from RX processing or similar, and if it does so (using atomic | |
| 1878 | + * iteration) while we're manipulating the list, the iteration will | |
| 1879 | + * crash. | |
| 1880 | + * | |
| 1881 | + * After this, the hardware should be stopped and the driver should | |
| 1882 | + * have stopped all of its activities, so that we can do RCU-unaware | |
| 1883 | + * manipulations of the interface list below. | |
| 1882 | 1884 | */ |
| 1883 | − list_for_each_entry(sdata, &local->interfaces, list) | |
| 1884 | − if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | |
| 1885 | − dev_close(sdata->dev); | |
| 1885 | + cfg80211_shutdown_all_interfaces(local->hw.wiphy); | |
| 1886 | + | |
| 1887 | + WARN(local->open_count, "%s: open count remains %d\n", | |
| 1888 | + wiphy_name(local->hw.wiphy), local->open_count); | |
| 1886 | 1889 | |
| 1887 | 1890 | mutex_lock(&local->iflist_mtx); |
| 1888 | 1891 | list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { |
| @@ -306,7 +306,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, · 305 unmodified lines | ||
| 306 | 306 | if (action == WLAN_SP_MESH_PEERING_CONFIRM) { |
| 307 | 307 | /* AID */ |
| 308 | 308 | pos = skb_put(skb, 2); |
| 309 | − put_unaligned_le16(plid, pos + 2); | |
| 309 | + put_unaligned_le16(plid, pos); | |
| 310 | 310 | } |
| 311 | 311 | if (ieee80211_add_srates_ie(sdata, skb, true, band) || |
| 312 | 312 | ieee80211_add_ext_srates_ie(sdata, skb, true, band) || |
| @@ -1122,6 +1122,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, · 809 unmodified lines | ||
| 1122 | 1122 | WLAN_SP_MESH_PEERING_CONFIRM) { |
| 1123 | 1123 | baseaddr += 4; |
| 1124 | 1124 | baselen += 4; |
| 1125 | + | |
| 1126 | + if (baselen > len) | |
| 1127 | + return; | |
| 1125 | 1128 | } |
| 1126 | 1129 | ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems); |
| 1127 | 1130 | mesh_process_plink_frame(sdata, mgmt, &elems); |
| @@ -76,6 +76,22 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) · 75 unmodified lines | ||
| 76 | 76 | if (sdata->vif.type != NL80211_IFTYPE_STATION) |
| 77 | 77 | continue; |
| 78 | 78 | ieee80211_mgd_quiesce(sdata); |
| 79 | + /* If suspended during TX in progress, and wowlan | |
| 80 | + * is enabled (connection will be active) there | |
| 81 | + * can be a race where the driver is put out | |
| 82 | + * of power-save due to TX and during suspend | |
| 83 | + * dynamic_ps_timer is cancelled and TX packet | |
| 84 | + * is flushed, leaving the driver in ACTIVE even | |
| 85 | + * after resuming until dynamic_ps_timer puts | |
| 86 | + * driver back in DOZE. | |
| 87 | + */ | |
| 88 | + if (sdata->u.mgd.associated && | |
| 89 | + sdata->u.mgd.powersave && | |
| 90 | + !(local->hw.conf.flags & IEEE80211_CONF_PS)) { | |
| 91 | + local->hw.conf.flags |= IEEE80211_CONF_PS; | |
| 92 | + ieee80211_hw_config(local, | |
| 93 | + IEEE80211_CONF_CHANGE_PS); | |
| 94 | + } | |
| 79 | 95 | } |
| 80 | 96 | |
| 81 | 97 | err = drv_suspend(local, wowlan); |
| @@ -60,6 +60,7 @@ ieee80211_tdls_add_subband(struct ieee80211_sub_if_data *sdata, · 59 unmodified lines | ||
| 60 | 60 | struct ieee80211_channel *ch; |
| 61 | 61 | struct cfg80211_chan_def chandef; |
| 62 | 62 | int i, subband_start; |
| 63 | + struct wiphy *wiphy = sdata->local->hw.wiphy; | |
| 63 | 64 | |
| 64 | 65 | for (i = start; i <= end; i += spacing) { |
| 65 | 66 | if (!ch_cnt) |
| @@ -70,9 +71,8 @@ ieee80211_tdls_add_subband(struct ieee80211_sub_if_data *sdata, · 4 unmodified lines | ||
| 70 | 71 | /* we will be active on the channel */ |
| 71 | 72 | cfg80211_chandef_create(&chandef, ch, |
| 72 | 73 | NL80211_CHAN_NO_HT); |
| 73 | − if (cfg80211_reg_can_beacon(sdata->local->hw.wiphy, | |
| 74 | − &chandef, | |
| 75 | − sdata->wdev.iftype)) { | |
| 74 | + if (cfg80211_reg_can_beacon_relax(wiphy, &chandef, | |
| 75 | + sdata->wdev.iftype)) { | |
| 76 | 76 | ch_cnt++; |
| 77 | 77 | /* |
| 78 | 78 | * check if the next channel is also part of |
| @@ -1117,7 +1117,9 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx, · 1116 unmodified lines | ||
| 1117 | 1117 | queued = true; |
| 1118 | 1118 | info->control.vif = &tx->sdata->vif; |
| 1119 | 1119 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; |
| 1120 | − info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; | |
| 1120 | + info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS | | |
| 1121 | + IEEE80211_TX_CTL_NO_PS_BUFFER | | |
| 1122 | + IEEE80211_TX_STATUS_EOSP; | |
| 1121 | 1123 | __skb_queue_tail(&tid_tx->pending, skb); |
| 1122 | 1124 | if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) |
| 1123 | 1125 | purge_skb = __skb_dequeue(&tid_tx->pending); |
| @@ -357,25 +357,52 @@ err1: · 356 unmodified lines | ||
| 357 | 357 | return NULL; |
| 358 | 358 | } |
| 359 | 359 | |
| 360 | + | |
| 361 | +static void | |
| 362 | +__netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, bool tx_ring, void **pg_vec, | |
| 363 | + unsigned int order) | |
| 364 | +{ | |
| 365 | + struct netlink_sock *nlk = nlk_sk(sk); | |
| 366 | + struct sk_buff_head *queue; | |
| 367 | + struct netlink_ring *ring; | |
| 368 | + | |
| 369 | + queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; | |
| 370 | + ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; | |
| 371 | + | |
| 372 | + spin_lock_bh(&queue->lock); | |
| 373 | + | |
| 374 | + ring->frame_max = req->nm_frame_nr - 1; | |
| 375 | + ring->head = 0; | |
| 376 | + ring->frame_size = req->nm_frame_size; | |
| 377 | + ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; | |
| 378 | + | |
| 379 | + swap(ring->pg_vec_len, req->nm_block_nr); | |
| 380 | + swap(ring->pg_vec_order, order); | |
| 381 | + swap(ring->pg_vec, pg_vec); | |
| 382 | + | |
| 383 | + __skb_queue_purge(queue); | |
| 384 | + spin_unlock_bh(&queue->lock); | |
| 385 | + | |
| 386 | + WARN_ON(atomic_read(&nlk->mapped)); | |
| 387 | + | |
| 388 | + if (pg_vec) | |
| 389 | + free_pg_vec(pg_vec, order, req->nm_block_nr); | |
| 390 | +} | |
| 391 | + | |
| 360 | 392 | static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, |
| 361 | − bool closing, bool tx_ring) | |
| 393 | + bool tx_ring) | |
| 362 | 394 | { |
| 363 | 395 | struct netlink_sock *nlk = nlk_sk(sk); |
| 364 | 396 | struct netlink_ring *ring; |
| 365 | − struct sk_buff_head *queue; | |
| 366 | 397 | void **pg_vec = NULL; |
| 367 | 398 | unsigned int order = 0; |
| 368 | − int err; | |
| 369 | 399 | |
| 370 | 400 | ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; |
| 371 | − queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; | |
| 372 | 401 | |
| 373 | − if (!closing) { | |
| 374 | − if (atomic_read(&nlk->mapped)) | |
| 375 | − return -EBUSY; | |
| 376 | − if (atomic_read(&ring->pending)) | |
| 377 | − return -EBUSY; | |
| 378 | − } | |
| 402 | + if (atomic_read(&nlk->mapped)) | |
| 403 | + return -EBUSY; | |
| 404 | + if (atomic_read(&ring->pending)) | |
| 405 | + return -EBUSY; | |
| 379 | 406 | |
| 380 | 407 | if (req->nm_block_nr) { |
| 381 | 408 | if (ring->pg_vec != NULL) |
| @@ -407,31 +434,19 @@ static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, · 25 unmodified lines | ||
| 407 | 434 | return -EINVAL; |
| 408 | 435 | } |
| 409 | 436 | |
| 410 | − err = -EBUSY; | |
| 411 | 437 | mutex_lock(&nlk->pg_vec_lock); |
| 412 | − if (closing || atomic_read(&nlk->mapped) == 0) { | |
| 413 | − err = 0; | |
| 414 | − spin_lock_bh(&queue->lock); | |
| 415 | − | |
| 416 | − ring->frame_max = req->nm_frame_nr - 1; | |
| 417 | − ring->head = 0; | |
| 418 | − ring->frame_size = req->nm_frame_size; | |
| 419 | − ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; | |
| 420 | − | |
| 421 | − swap(ring->pg_vec_len, req->nm_block_nr); | |
| 422 | − swap(ring->pg_vec_order, order); | |
| 423 | − swap(ring->pg_vec, pg_vec); | |
| 424 | − | |
| 425 | − __skb_queue_purge(queue); | |
| 426 | − spin_unlock_bh(&queue->lock); | |
| 427 | − | |
| 428 | − WARN_ON(atomic_read(&nlk->mapped)); | |
| 438 | + if (atomic_read(&nlk->mapped) == 0) { | |
| 439 | + __netlink_set_ring(sk, req, tx_ring, pg_vec, order); | |
| 440 | + mutex_unlock(&nlk->pg_vec_lock); | |
| 441 | + return 0; | |
| 429 | 442 | } |
| 443 | + | |
| 430 | 444 | mutex_unlock(&nlk->pg_vec_lock); |
| 431 | 445 | |
| 432 | 446 | if (pg_vec) |
| 433 | 447 | free_pg_vec(pg_vec, order, req->nm_block_nr); |
| 434 | − return err; | |
| 448 | + | |
| 449 | + return -EBUSY; | |
| 435 | 450 | } |
| 436 | 451 | |
| 437 | 452 | static void netlink_mm_open(struct vm_area_struct *vma) |
| @@ -900,10 +915,10 @@ static void netlink_sock_destruct(struct sock *sk) · 462 unmodified lines | ||
| 900 | 915 | |
| 901 | 916 | memset(&req, 0, sizeof(req)); |
| 902 | 917 | if (nlk->rx_ring.pg_vec) |
| 903 | − netlink_set_ring(sk, &req, true, false); | |
| 918 | + __netlink_set_ring(sk, &req, false, NULL, 0); | |
| 904 | 919 | memset(&req, 0, sizeof(req)); |
| 905 | 920 | if (nlk->tx_ring.pg_vec) |
| 906 | − netlink_set_ring(sk, &req, true, true); | |
| 921 | + __netlink_set_ring(sk, &req, true, NULL, 0); | |
| 907 | 922 | } |
| 908 | 923 | #endif /* CONFIG_NETLINK_MMAP */ |
| 909 | 924 | |
| @@ -2223,7 +2238,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, · 1313 unmodified lines | ||
| 2223 | 2238 | return -EINVAL; |
| 2224 | 2239 | if (copy_from_user(&req, optval, sizeof(req))) |
| 2225 | 2240 | return -EFAULT; |
| 2226 | − err = netlink_set_ring(sk, &req, false, | |
| 2241 | + err = netlink_set_ring(sk, &req, | |
| 2227 | 2242 | optname == NETLINK_TX_RING); |
| 2228 | 2243 | break; |
| 2229 | 2244 | } |
| @@ -754,7 +754,7 @@ int ovs_flow_init(void) · 753 unmodified lines | ||
| 754 | 754 | BUILD_BUG_ON(sizeof(struct sw_flow_key) % sizeof(long)); |
| 755 | 755 | |
| 756 | 756 | flow_cache = kmem_cache_create("sw_flow", sizeof(struct sw_flow) |
| 757 | − + (num_possible_nodes() | |
| 757 | + + (nr_node_ids | |
| 758 | 758 | * sizeof(struct flow_stats *)), |
| 759 | 759 | 0, 0, NULL); |
| 760 | 760 | if (flow_cache == NULL) |
| @@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, · 758 unmodified lines | ||
| 759 | 759 | } |
| 760 | 760 | |
| 761 | 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 | 764 | return ibmr; |
| 765 | + } | |
| 764 | 766 | |
| 765 | 767 | ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents); |
| 766 | 768 | if (ret == 0) |
| @@ -339,6 +339,9 @@ static void tcf_bpf_cleanup(struct tc_action *act, int bind) · 338 unmodified lines | ||
| 339 | 339 | bpf_prog_put(prog->filter); |
| 340 | 340 | else |
| 341 | 341 | bpf_prog_destroy(prog->filter); |
| 342 | + | |
| 343 | + kfree(prog->bpf_ops); | |
| 344 | + kfree(prog->bpf_name); | |
| 342 | 345 | } |
| 343 | 346 | |
| 344 | 347 | static struct tc_action_ops act_bpf_ops __read_mostly = { |
| @@ -378,7 +378,7 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, · 377 unmodified lines | ||
| 378 | 378 | goto errout; |
| 379 | 379 | |
| 380 | 380 | if (oldprog) { |
| 381 | − list_replace_rcu(&prog->link, &oldprog->link); | |
| 381 | + list_replace_rcu(&oldprog->link, &prog->link); | |
| 382 | 382 | tcf_unbind_filter(tp, &oldprog->res); |
| 383 | 383 | call_rcu(&oldprog->rcu, __cls_bpf_delete_prog); |
| 384 | 384 | } else { |
| @@ -425,6 +425,8 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, · 424 unmodified lines | ||
| 425 | 425 | if (!fnew) |
| 426 | 426 | goto err2; |
| 427 | 427 | |
| 428 | + tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | |
| 429 | + | |
| 428 | 430 | fold = (struct flow_filter *)*arg; |
| 429 | 431 | if (fold) { |
| 430 | 432 | err = -EINVAL; |
| @@ -486,7 +488,6 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, · 55 unmodified lines | ||
| 486 | 488 | fnew->mask = ~0U; |
| 487 | 489 | fnew->tp = tp; |
| 488 | 490 | get_random_bytes(&fnew->hashrnd, 4); |
| 489 | − tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | |
| 490 | 491 | } |
| 491 | 492 | |
| 492 | 493 | fnew->perturb_timer.function = flow_perturbation; |
| @@ -526,7 +527,7 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, · 33 unmodified lines | ||
| 526 | 527 | if (*arg == 0) |
| 527 | 528 | list_add_tail_rcu(&fnew->list, &head->filters); |
| 528 | 529 | else |
| 529 | − list_replace_rcu(&fnew->list, &fold->list); | |
| 530 | + list_replace_rcu(&fold->list, &fnew->list); | |
| 530 | 531 | |
| 531 | 532 | *arg = (unsigned long)fnew; |
| 532 | 533 | |
| @@ -499,7 +499,7 @@ static int fl_change(struct net *net, struct sk_buff *in_skb, · 498 unmodified lines | ||
| 499 | 499 | *arg = (unsigned long) fnew; |
| 500 | 500 | |
| 501 | 501 | if (fold) { |
| 502 | − list_replace_rcu(&fnew->list, &fold->list); | |
| 502 | + list_replace_rcu(&fold->list, &fnew->list); | |
| 503 | 503 | tcf_unbind_filter(tp, &fold->res); |
| 504 | 504 | call_rcu(&fold->rcu, fl_destroy_filter); |
| 505 | 505 | } else { |
| @@ -155,14 +155,23 @@ static unsigned int fq_codel_drop(struct Qdisc *sch) · 154 unmodified lines | ||
| 155 | 155 | skb = dequeue_head(flow); |
| 156 | 156 | len = qdisc_pkt_len(skb); |
| 157 | 157 | q->backlogs[idx] -= len; |
| 158 | − kfree_skb(skb); | |
| 159 | 158 | sch->q.qlen--; |
| 160 | 159 | qdisc_qstats_drop(sch); |
| 161 | 160 | qdisc_qstats_backlog_dec(sch, skb); |
| 161 | + kfree_skb(skb); | |
| 162 | 162 | flow->dropped++; |
| 163 | 163 | return idx; |
| 164 | 164 | } |
| 165 | 165 | |
| 166 | +static unsigned int fq_codel_qdisc_drop(struct Qdisc *sch) | |
| 167 | +{ | |
| 168 | + unsigned int prev_backlog; | |
| 169 | + | |
| 170 | + prev_backlog = sch->qstats.backlog; | |
| 171 | + fq_codel_drop(sch); | |
| 172 | + return prev_backlog - sch->qstats.backlog; | |
| 173 | +} | |
| 174 | + | |
| 166 | 175 | static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
| 167 | 176 | { |
| 168 | 177 | struct fq_codel_sched_data *q = qdisc_priv(sch); |
| @@ -604,7 +613,7 @@ static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = { · 435 unmodified lines | ||
| 604 | 613 | .enqueue = fq_codel_enqueue, |
| 605 | 614 | .dequeue = fq_codel_dequeue, |
| 606 | 615 | .peek = qdisc_peek_dequeued, |
| 607 | − .drop = fq_codel_drop, | |
| 616 | + .drop = fq_codel_qdisc_drop, | |
| 608 | 617 | .init = fq_codel_init, |
| 609 | 618 | .reset = fq_codel_reset, |
| 610 | 619 | .destroy = fq_codel_destroy, |
| @@ -306,10 +306,10 @@ drop: · 305 unmodified lines | ||
| 306 | 306 | len = qdisc_pkt_len(skb); |
| 307 | 307 | slot->backlog -= len; |
| 308 | 308 | sfq_dec(q, x); |
| 309 | − kfree_skb(skb); | |
| 310 | 309 | sch->q.qlen--; |
| 311 | 310 | qdisc_qstats_drop(sch); |
| 312 | 311 | qdisc_qstats_backlog_dec(sch, skb); |
| 312 | + kfree_skb(skb); | |
| 313 | 313 | return len; |
| 314 | 314 | } |
| 315 | 315 | |
| @@ -797,23 +797,18 @@ static bool cfg80211_ir_permissive_chan(struct wiphy *wiphy, · 796 unmodified lines | ||
| 797 | 797 | return false; |
| 798 | 798 | } |
| 799 | 799 | |
| 800 | −bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | |
| 801 | − struct cfg80211_chan_def *chandef, | |
| 802 | − enum nl80211_iftype iftype) | |
| 800 | +static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy, | |
| 801 | + struct cfg80211_chan_def *chandef, | |
| 802 | + enum nl80211_iftype iftype, | |
| 803 | + bool check_no_ir) | |
| 803 | 804 | { |
| 804 | 805 | bool res; |
| 805 | 806 | u32 prohibited_flags = IEEE80211_CHAN_DISABLED | |
| 806 | 807 | IEEE80211_CHAN_RADAR; |
| 807 | 808 | |
| 808 | − trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype); | |
| 809 | + trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); | |
| 809 | 810 | |
| 810 | − /* | |
| 811 | − * Under certain conditions suggested by some regulatory bodies a | |
| 812 | − * GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag | |
| 813 | − * only if such relaxations are not enabled and the conditions are not | |
| 814 | − * met. | |
| 815 | − */ | |
| 816 | − if (!cfg80211_ir_permissive_chan(wiphy, iftype, chandef->chan)) | |
| 811 | + if (check_no_ir) | |
| 817 | 812 | prohibited_flags |= IEEE80211_CHAN_NO_IR; |
| 818 | 813 | |
| 819 | 814 | if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 && |
| @@ -827,8 +822,36 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy, · 7 unmodified lines | ||
| 827 | 822 | trace_cfg80211_return_bool(res); |
| 828 | 823 | return res; |
| 829 | 824 | } |
| 825 | + | |
| 826 | +bool cfg80211_reg_can_beacon(struct wiphy *wiphy, | |
| 827 | + struct cfg80211_chan_def *chandef, | |
| 828 | + enum nl80211_iftype iftype) | |
| 829 | +{ | |
| 830 | + return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, true); | |
| 831 | +} | |
| 830 | 832 | EXPORT_SYMBOL(cfg80211_reg_can_beacon); |
| 831 | 833 | |
| 834 | +bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, | |
| 835 | + struct cfg80211_chan_def *chandef, | |
| 836 | + enum nl80211_iftype iftype) | |
| 837 | +{ | |
| 838 | + bool check_no_ir; | |
| 839 | + | |
| 840 | + ASSERT_RTNL(); | |
| 841 | + | |
| 842 | + /* | |
| 843 | + * Under certain conditions suggested by some regulatory bodies a | |
| 844 | + * GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag | |
| 845 | + * only if such relaxations are not enabled and the conditions are not | |
| 846 | + * met. | |
| 847 | + */ | |
| 848 | + check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype, | |
| 849 | + chandef->chan); | |
| 850 | + | |
| 851 | + return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); | |
| 852 | +} | |
| 853 | +EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax); | |
| 854 | + | |
| 832 | 855 | int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, |
| 833 | 856 | struct cfg80211_chan_def *chandef) |
| 834 | 857 | { |
| @@ -2003,7 +2003,8 @@ static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, · 2002 unmodified lines | ||
| 2003 | 2003 | switch (iftype) { |
| 2004 | 2004 | case NL80211_IFTYPE_AP: |
| 2005 | 2005 | case NL80211_IFTYPE_P2P_GO: |
| 2006 | − if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, iftype)) { | |
| 2006 | + if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, | |
| 2007 | + iftype)) { | |
| 2007 | 2008 | result = -EINVAL; |
| 2008 | 2009 | break; |
| 2009 | 2010 | } |
| @@ -3403,8 +3404,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) · 1393 unmodified lines | ||
| 3403 | 3404 | } else if (!nl80211_get_ap_channel(rdev, ¶ms)) |
| 3404 | 3405 | return -EINVAL; |
| 3405 | 3406 | |
| 3406 | − if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef, | |
| 3407 | − wdev->iftype)) | |
| 3407 | + if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, | |
| 3408 | + wdev->iftype)) | |
| 3408 | 3409 | return -EINVAL; |
| 3409 | 3410 | |
| 3410 | 3411 | if (info->attrs[NL80211_ATTR_ACL_POLICY]) { |
| @@ -6492,8 +6493,8 @@ skip_beacons: · 3081 unmodified lines | ||
| 6492 | 6493 | if (err) |
| 6493 | 6494 | return err; |
| 6494 | 6495 | |
| 6495 | − if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef, | |
| 6496 | − wdev->iftype)) | |
| 6496 | + if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, | |
| 6497 | + wdev->iftype)) | |
| 6497 | 6498 | return -EINVAL; |
| 6498 | 6499 | |
| 6499 | 6500 | err = cfg80211_chandef_dfs_required(wdev->wiphy, |
| @@ -10170,7 +10171,8 @@ static int nl80211_tdls_channel_switch(struct sk_buff *skb, · 3670 unmodified lines | ||
| 10170 | 10171 | return -EINVAL; |
| 10171 | 10172 | |
| 10172 | 10173 | /* we will be active on the TDLS link */ |
| 10173 | − if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, wdev->iftype)) | |
| 10174 | + if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, | |
| 10175 | + wdev->iftype)) | |
| 10174 | 10176 | return -EINVAL; |
| 10175 | 10177 | |
| 10176 | 10178 | /* don't allow switching to DFS channels */ |
| @@ -544,15 +544,15 @@ static int call_crda(const char *alpha2) · 543 unmodified lines | ||
| 544 | 544 | reg_regdb_query(alpha2); |
| 545 | 545 | |
| 546 | 546 | if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) { |
| 547 | − pr_info("Exceeded CRDA call max attempts. Not calling CRDA\n"); | |
| 547 | + pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n"); | |
| 548 | 548 | return -EINVAL; |
| 549 | 549 | } |
| 550 | 550 | |
| 551 | 551 | if (!is_world_regdom((char *) alpha2)) |
| 552 | − pr_info("Calling CRDA for country: %c%c\n", | |
| 552 | + pr_debug("Calling CRDA for country: %c%c\n", | |
| 553 | 553 | alpha2[0], alpha2[1]); |
| 554 | 554 | else |
| 555 | − pr_info("Calling CRDA to update world regulatory domain\n"); | |
| 555 | + pr_debug("Calling CRDA to update world regulatory domain\n"); | |
| 556 | 556 | |
| 557 | 557 | return kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, env); |
| 558 | 558 | } |
| @@ -1589,7 +1589,7 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) · 1030 unmodified lines | ||
| 1589 | 1589 | case NL80211_IFTYPE_AP: |
| 1590 | 1590 | case NL80211_IFTYPE_P2P_GO: |
| 1591 | 1591 | case NL80211_IFTYPE_ADHOC: |
| 1592 | − return cfg80211_reg_can_beacon(wiphy, &chandef, iftype); | |
| 1592 | + return cfg80211_reg_can_beacon_relax(wiphy, &chandef, iftype); | |
| 1593 | 1593 | case NL80211_IFTYPE_STATION: |
| 1594 | 1594 | case NL80211_IFTYPE_P2P_CLIENT: |
| 1595 | 1595 | return cfg80211_chandef_usable(wiphy, &chandef, |
| @@ -2358,20 +2358,23 @@ TRACE_EVENT(cfg80211_cqm_rssi_notify, · 2357 unmodified lines | ||
| 2358 | 2358 | |
| 2359 | 2359 | TRACE_EVENT(cfg80211_reg_can_beacon, |
| 2360 | 2360 | TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, |
| 2361 | − enum nl80211_iftype iftype), | |
| 2362 | − TP_ARGS(wiphy, chandef, iftype), | |
| 2361 | + enum nl80211_iftype iftype, bool check_no_ir), | |
| 2362 | + TP_ARGS(wiphy, chandef, iftype, check_no_ir), | |
| 2363 | 2363 | TP_STRUCT__entry( |
| 2364 | 2364 | WIPHY_ENTRY |
| 2365 | 2365 | CHAN_DEF_ENTRY |
| 2366 | 2366 | __field(enum nl80211_iftype, iftype) |
| 2367 | + __field(bool, check_no_ir) | |
| 2367 | 2368 | ), |
| 2368 | 2369 | TP_fast_assign( |
| 2369 | 2370 | WIPHY_ASSIGN; |
| 2370 | 2371 | CHAN_DEF_ASSIGN(chandef); |
| 2371 | 2372 | __entry->iftype = iftype; |
| 2373 | + __entry->check_no_ir = check_no_ir; | |
| 2372 | 2374 | ), |
| 2373 | − TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", iftype=%d", | |
| 2374 | − WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->iftype) | |
| 2375 | + TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", iftype=%d check_no_ir=%s", | |
| 2376 | + WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->iftype, | |
| 2377 | + BOOL_TO_STR(__entry->check_no_ir)) | |
| 2375 | 2378 | ); |
| 2376 | 2379 | |
| 2377 | 2380 | TRACE_EVENT(cfg80211_chandef_dfs_required, |
| @@ -168,7 +168,10 @@ · 167 unmodified lines | ||
| 168 | 168 | * |
| 169 | 169 | * For __dynamic_array(int, foo, bar) use __get_dynamic_array(foo) |
| 170 | 170 | * Use __get_dynamic_array_len(foo) to get the length of the array |
| 171 | − * saved. | |
| 171 | + * saved. Note, __get_dynamic_array_len() returns the total allocated | |
| 172 | + * length of the dynamic array; __print_array() expects the second | |
| 173 | + * parameter to be the number of elements. To get that, the array length | |
| 174 | + * needs to be divided by the element size. | |
| 172 | 175 | * |
| 173 | 176 | * For __string(foo, bar) use __get_str(foo) |
| 174 | 177 | * |
| @@ -288,7 +291,7 @@ TRACE_EVENT(foo_bar, · 113 unmodified lines | ||
| 288 | 291 | * This prints out the array that is defined by __array in a nice format. |
| 289 | 292 | */ |
| 290 | 293 | __print_array(__get_dynamic_array(list), |
| 291 | − __get_dynamic_array_len(list), | |
| 294 | + __get_dynamic_array_len(list) / sizeof(int), | |
| 292 | 295 | sizeof(int)), |
| 293 | 296 | __get_str(str), __get_bitmask(cpus)) |
| 294 | 297 | ); |
| @@ -2599,7 +2599,7 @@ sub process { · 2598 unmodified lines | ||
| 2599 | 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 | 2603 | my $msg_type = "LONG_LINE"; |
| 2604 | 2604 | |
| 2605 | 2605 | # Check the allowed long line types first |
| @@ -5175,7 +5175,7 @@ static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo, · 5174 unmodified lines | ||
| 5175 | 5175 | int err = 0; |
| 5176 | 5176 | |
| 5177 | 5177 | mutex_lock(&spec->pcm_mutex); |
| 5178 | − if (!spec->indep_hp_enabled) | |
| 5178 | + if (spec->indep_hp && !spec->indep_hp_enabled) | |
| 5179 | 5179 | err = -EBUSY; |
| 5180 | 5180 | else |
| 5181 | 5181 | spec->active_streams |= 1 << STREAM_INDEP_HP; |
| @@ -3527,6 +3527,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { · 3526 unmodified lines | ||
| 3527 | 3527 | { .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi }, |
| 3528 | 3528 | { .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi }, |
| 3529 | 3529 | { .id = 0x80862809, .name = "Skylake HDMI", .patch = patch_generic_hdmi }, |
| 3530 | +{ .id = 0x8086280a, .name = "Broxton HDMI", .patch = patch_generic_hdmi }, | |
| 3530 | 3531 | { .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi }, |
| 3531 | 3532 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, |
| 3532 | 3533 | { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, |
| @@ -3591,6 +3592,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862806"); · 58 unmodified lines | ||
| 3591 | 3592 | MODULE_ALIAS("snd-hda-codec-id:80862807"); |
| 3592 | 3593 | MODULE_ALIAS("snd-hda-codec-id:80862808"); |
| 3593 | 3594 | MODULE_ALIAS("snd-hda-codec-id:80862809"); |
| 3595 | +MODULE_ALIAS("snd-hda-codec-id:8086280a"); | |
| 3594 | 3596 | MODULE_ALIAS("snd-hda-codec-id:80862880"); |
| 3595 | 3597 | MODULE_ALIAS("snd-hda-codec-id:80862882"); |
| 3596 | 3598 | MODULE_ALIAS("snd-hda-codec-id:80862883"); |
| @@ -4441,6 +4441,55 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec, · 4440 unmodified lines | ||
| 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 | 4493 | /* for hda_fixup_thinkpad_acpi() */ |
| 4445 | 4494 | #include "thinkpad_helper.c" |
| 4446 | 4495 | |
| @@ -4521,6 +4570,7 @@ enum { · 74 unmodified lines | ||
| 4521 | 4570 | ALC286_FIXUP_HP_GPIO_LED, |
| 4522 | 4571 | ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, |
| 4523 | 4572 | ALC280_FIXUP_HP_DOCK_PINS, |
| 4573 | + ALC280_FIXUP_HP_9480M, | |
| 4524 | 4574 | ALC288_FIXUP_DELL_HEADSET_MODE, |
| 4525 | 4575 | ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, |
| 4526 | 4576 | ALC288_FIXUP_DELL_XPS_13_GPIO6, |
| @@ -5043,6 +5093,10 @@ static const struct hda_fixup alc269_fixups[] = { · 516 unmodified lines | ||
| 5043 | 5093 | .chained = true, |
| 5044 | 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 | 5100 | [ALC288_FIXUP_DELL_HEADSET_MODE] = { |
| 5047 | 5101 | .type = HDA_FIXUP_FUNC, |
| 5048 | 5102 | .v.func = alc_fixup_headset_mode_dell_alc288, |
| @@ -5161,6 +5215,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { · 112 unmodified lines | ||
| 5161 | 5215 | SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 5162 | 5216 | SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 5163 | 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 | 5219 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
| 5165 | 5220 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
| 5166 | 5221 | /* ALC290 */ |
| @@ -186,12 +186,8 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction, · 185 unmodified lines | ||
| 186 | 186 | int ret = 0; |
| 187 | 187 | |
| 188 | 188 | spin_lock_irqsave(&pstr->lock, flags); |
| 189 | − if (!test_and_set_bit(type, &pstr->running)) { | |
| 190 | − if (pstr->active_urbs || pstr->unlink_urbs) { | |
| 191 | − ret = -EBUSY; | |
| 192 | − goto error; | |
| 193 | − } | |
| 194 | − | |
| 189 | + if (!test_and_set_bit(type, &pstr->running) && | |
| 190 | + !(pstr->active_urbs || pstr->unlink_urbs)) { | |
| 195 | 191 | pstr->count = 0; |
| 196 | 192 | /* Submit all currently available URBs */ |
| 197 | 193 | if (direction == SNDRV_PCM_STREAM_PLAYBACK) |
| @@ -199,7 +195,6 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction, · 1 unmodified line | ||
| 199 | 195 | else |
| 200 | 196 | ret = line6_submit_audio_in_all_urbs(line6pcm); |
| 201 | 197 | } |
| 202 | − error: | |
| 203 | 198 | if (ret < 0) |
| 204 | 199 | clear_bit(type, &pstr->running); |
| 205 | 200 | spin_unlock_irqrestore(&pstr->lock, flags); |
| @@ -2512,6 +2512,74 @@ YAMAHA_DEVICE(0x7010, "UB99"), · 2511 unmodified lines | ||
| 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 | 2583 | /* TerraTec devices */ |
| 2516 | 2584 | { |
| 2517 | 2585 | USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012), |
| @@ -36,7 +36,7 @@ $(LIBFILE): $(API_IN) · 35 unmodified lines | ||
| 36 | 36 | |
| 37 | 37 | clean: |
| 38 | 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 | 41 | FORCE: |
| 42 | 42 | |
| @@ -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 | +} | |
| @@ -268,7 +268,7 @@ install: install_lib · 267 unmodified lines | ||
| 268 | 268 | |
| 269 | 269 | clean: |
| 270 | 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 | 272 | $(RM) TRACEEVENT-CFLAGS tags TAGS |
| 273 | 273 | |
| 274 | 274 | PHONY += force plugins |
| @@ -18,6 +18,7 @@ tools/arch/x86/include/asm/atomic.h · 17 unmodified lines | ||
| 18 | 18 | tools/arch/x86/include/asm/rmwcc.h |
| 19 | 19 | tools/lib/traceevent |
| 20 | 20 | tools/lib/api |
| 21 | +tools/lib/hweight.c | |
| 21 | 22 | tools/lib/rbtree.c |
| 22 | 23 | tools/lib/symbol/kallsyms.c |
| 23 | 24 | tools/lib/symbol/kallsyms.h |
| @@ -57,7 +58,6 @@ include/linux/perf_event.h · 33 unmodified lines | ||
| 57 | 58 | include/linux/list.h |
| 58 | 59 | include/linux/hash.h |
| 59 | 60 | include/linux/stringify.h |
| 60 | −lib/hweight.c | |
| 61 | 61 | include/linux/swab.h |
| 62 | 62 | arch/*/include/asm/unistd*.h |
| 63 | 63 | arch/*/include/uapi/asm/unistd*.h |
| @@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD · 108 unmodified lines | ||
| 109 | 109 | $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) |
| 110 | 110 | $(Q)touch $(OUTPUT)PERF-VERSION-FILE |
| 111 | 111 | |
| 112 | −CC = $(CROSS_COMPILE)gcc | |
| 113 | −LD ?= $(CROSS_COMPILE)ld | |
| 114 | −AR = $(CROSS_COMPILE)ar | |
| 112 | +# Makefiles suck: This macro sets a default value of $(2) for the | |
| 113 | +# variable named by $(1), unless the variable has been set by | |
| 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 | 128 | PKG_CONFIG = $(CROSS_COMPILE)pkg-config |
| 116 | 129 | |
| 117 | 130 | RM = rm -f |
| @@ -343,7 +343,7 @@ static int read_counter(struct perf_evsel *counter) · 342 unmodified lines | ||
| 343 | 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 | 348 | struct perf_evsel *counter; |
| 349 | 349 | |
| @@ -354,7 +354,7 @@ static void read_counters(bool close) · 4 unmodified lines | ||
| 354 | 354 | if (process_counter(counter)) |
| 355 | 355 | pr_warning("failed to process counter %s\n", counter->name); |
| 356 | 356 | |
| 357 | − if (close) { | |
| 357 | + if (close_counters) { | |
| 358 | 358 | perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), |
| 359 | 359 | thread_map__nr(evsel_list->threads)); |
| 360 | 360 | } |
| @@ -48,7 +48,7 @@ static struct rb_node *hists__filter_entries(struct rb_node *nd, · 47 unmodified lines | ||
| 48 | 48 | |
| 49 | 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 | 54 | static int hist_browser__get_folding(struct hist_browser *browser) |
| @@ -143,6 +143,6 @@ $(OUTPUT)util/rbtree.o: ../lib/rbtree.c FORCE · 142 unmodified lines | ||
| 143 | 143 | $(call rule_mkdir) |
| 144 | 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 | 147 | $(call rule_mkdir) |
| 148 | 148 | $(call if_changed_dep,cc_o_c) |
| @@ -53,11 +53,6 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, · 52 unmodified lines | ||
| 53 | 53 | { |
| 54 | 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 | 56 | WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n"); |
| 62 | 57 | |
| 63 | 58 | mm->userpg = userpg; |
| @@ -73,6 +68,11 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, · 9 unmodified lines | ||
| 73 | 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 | 76 | pc->aux_offset = mp->offset; |
| 77 | 77 | pc->aux_size = mp->len; |
| 78 | 78 | |
| @@ -10,7 +10,7 @@ util/ctype.c · 9 unmodified lines | ||
| 10 | 10 | util/evlist.c |
| 11 | 11 | util/evsel.c |
| 12 | 12 | util/cpumap.c |
| 13 | −../../lib/hweight.c | |
| 13 | +../lib/hweight.c | |
| 14 | 14 | util/thread_map.c |
| 15 | 15 | util/util.c |
| 16 | 16 | util/xyarray.c |
| @@ -19,5 +19,5 @@ util/rblist.c · 2 unmodified lines | ||
| 19 | 19 | util/stat.c |
| 20 | 20 | util/strlist.c |
| 21 | 21 | util/trace-event.c |
| 22 | −../../lib/rbtree.c | |
| 22 | +../lib/rbtree.c | |
| 23 | 23 | util/string.c |
| @@ -1911,6 +1911,8 @@ int setup_list(struct strlist **list, const char *list_str, · 1910 unmodified lines | ||
| 1911 | 1911 | pr_err("problems parsing %s list\n", list_name); |
| 1912 | 1912 | return -1; |
| 1913 | 1913 | } |
| 1914 | + | |
| 1915 | + symbol_conf.has_filter = true; | |
| 1914 | 1916 | return 0; |
| 1915 | 1917 | } |
| 1916 | 1918 | |
| @@ -105,7 +105,8 @@ struct symbol_conf { · 104 unmodified lines | ||
| 105 | 105 | demangle_kernel, |
| 106 | 106 | filter_relative, |
| 107 | 107 | show_hist_headers, |
| 108 | − branch_callstack; | |
| 108 | + branch_callstack, | |
| 109 | + has_filter; | |
| 109 | 110 | const char *vmlinux_name, |
| 110 | 111 | *kallsyms_name, |
| 111 | 112 | *source_prefix, |
| @@ -136,8 +136,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) · 135 unmodified lines | ||
| 136 | 136 | if (grow) { |
| 137 | 137 | struct thread_map *tmp; |
| 138 | 138 | |
| 139 | − tmp = realloc(threads, (sizeof(*threads) + | |
| 140 | − max_threads * sizeof(pid_t))); | |
| 139 | + tmp = thread_map__realloc(threads, max_threads); | |
| 141 | 140 | if (tmp == NULL) |
| 142 | 141 | goto out_free_namelist; |
| 143 | 142 | |
| @@ -236,18 +236,16 @@ static struct dso *__machine__findnew_compat(struct machine *machine, · 235 unmodified lines | ||
| 236 | 236 | const char *file_name; |
| 237 | 237 | struct dso *dso; |
| 238 | 238 | |
| 239 | − pthread_rwlock_wrlock(&machine->dsos.lock); | |
| 240 | 239 | dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true); |
| 241 | 240 | if (dso) |
| 242 | − goto out_unlock; | |
| 241 | + goto out; | |
| 243 | 242 | |
| 244 | 243 | file_name = vdso__get_compat_file(vdso_file); |
| 245 | 244 | if (!file_name) |
| 246 | − goto out_unlock; | |
| 245 | + goto out; | |
| 247 | 246 | |
| 248 | 247 | dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name); |
| 249 | −out_unlock: | |
| 250 | − pthread_rwlock_unlock(&machine->dsos.lock); | |
| 248 | +out: | |
| 251 | 249 | return dso; |
| 252 | 250 | } |
| 253 | 251 | |
| @@ -155,6 +155,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) · 154 unmodified lines | ||
| 155 | 155 | list_add_tail(&kvg->node, &kv->group_list); |
| 156 | 156 | kvg->vfio_group = vfio_group; |
| 157 | 157 | |
| 158 | + kvm_arch_start_assignment(dev->kvm); | |
| 159 | + | |
| 158 | 160 | mutex_unlock(&kv->lock); |
| 159 | 161 | |
| 160 | 162 | kvm_vfio_update_coherency(dev); |
| @@ -190,6 +192,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) · 29 unmodified lines | ||
| 190 | 192 | break; |
| 191 | 193 | } |
| 192 | 194 | |
| 195 | + kvm_arch_end_assignment(dev->kvm); | |
| 196 | + | |
| 193 | 197 | mutex_unlock(&kv->lock); |
| 194 | 198 | |
| 195 | 199 | kvm_vfio_group_put_external_user(vfio_group); |
| @@ -239,6 +243,7 @@ static void kvm_vfio_destroy(struct kvm_device *dev) · 43 unmodified lines | ||
| 239 | 243 | kvm_vfio_group_put_external_user(kvg->vfio_group); |
| 240 | 244 | list_del(&kvg->node); |
| 241 | 245 | kfree(kvg); |
| 246 | + kvm_arch_end_assignment(dev->kvm); | |
| 242 | 247 | } |
| 243 | 248 | |
| 244 | 249 | kvm_vfio_update_coherency(dev); |