diff options
-rw-r--r-- | Documentation/DocBook/device-drivers.tmpl | 5 | ||||
-rw-r--r-- | Documentation/DocBook/deviceiobook.tmpl | 2 | ||||
-rw-r--r-- | MAINTAINERS | 11 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | arch/arm/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/configs/imx_v6_v7_defconfig (renamed from arch/arm/configs/mx5_defconfig) | 61 | ||||
-rw-r--r-- | arch/arm/configs/mx3_defconfig | 144 | ||||
-rw-r--r-- | arch/arm/mach-imx/Kconfig | 239 | ||||
-rw-r--r-- | arch/arm/mach-imx/Makefile | 21 | ||||
-rw-r--r-- | arch/arm/mach-imx/Makefile.boot | 12 | ||||
-rw-r--r-- | arch/arm/mach-imx/clock-mx51-mx53.c (renamed from arch/arm/mach-mx5/clock-mx51-mx53.c) | 2 | ||||
-rw-r--r-- | arch/arm/mach-imx/cpu-imx5.c (renamed from arch/arm/mach-mx5/cpu.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/cpu_op-mx51.c (renamed from arch/arm/mach-mx5/cpu_op-mx51.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/cpu_op-mx51.h (renamed from arch/arm/mach-mx5/cpu_op-mx51.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/crm-regs-imx5.h (renamed from arch/arm/mach-mx5/crm_regs.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/devices-imx50.h (renamed from arch/arm/mach-mx5/devices-imx50.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/devices-imx51.h (renamed from arch/arm/mach-mx5/devices-imx51.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/devices-imx53.h (renamed from arch/arm/mach-mx5/devices-imx53.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/efika.h (renamed from arch/arm/mach-mx5/efika.h) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/ehci-imx5.c (renamed from arch/arm/mach-mx5/ehci.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/eukrea_mbimx51-baseboard.c (renamed from arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c (renamed from arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/imx51-dt.c (renamed from arch/arm/mach-mx5/imx51-dt.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/imx53-dt.c (renamed from arch/arm/mach-mx5/imx53-dt.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-cpuimx51.c (renamed from arch/arm/mach-mx5/board-cpuimx51.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-cpuimx51sd.c (renamed from arch/arm/mach-mx5/board-cpuimx51sd.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx50_rdp.c (renamed from arch/arm/mach-mx5/board-mx50_rdp.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx51_3ds.c (renamed from arch/arm/mach-mx5/board-mx51_3ds.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx51_babbage.c (renamed from arch/arm/mach-mx5/board-mx51_babbage.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx51_efikamx.c (renamed from arch/arm/mach-mx5/board-mx51_efikamx.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx51_efikasb.c (renamed from arch/arm/mach-mx5/board-mx51_efikasb.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx53_ard.c (renamed from arch/arm/mach-mx5/board-mx53_ard.c) | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx53_evk.c (renamed from arch/arm/mach-mx5/board-mx53_evk.c) | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx53_loco.c (renamed from arch/arm/mach-mx5/board-mx53_loco.c) | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-mx53_smd.c (renamed from arch/arm/mach-mx5/board-mx53_smd.c) | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/mm-imx5.c (renamed from arch/arm/mach-mx5/mm.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/mx51_efika.c (renamed from arch/arm/mach-mx5/mx51_efika.c) | 0 | ||||
-rw-r--r-- | arch/arm/mach-imx/pm-imx5.c (renamed from arch/arm/mach-mx5/system.c) | 89 | ||||
-rw-r--r-- | arch/arm/mach-mx5/Kconfig | 244 | ||||
-rw-r--r-- | arch/arm/mach-mx5/Makefile | 26 | ||||
-rw-r--r-- | arch/arm/mach-mx5/Makefile.boot | 9 | ||||
-rw-r--r-- | arch/arm/mach-mx5/pm-imx5.c | 83 | ||||
-rw-r--r-- | arch/arm/plat-mxc/Kconfig | 15 | ||||
-rw-r--r-- | arch/s390/include/asm/kexec.h | 18 | ||||
-rw-r--r-- | arch/score/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/x86/.gitignore | 1 | ||||
-rw-r--r-- | arch/x86/Kconfig | 20 | ||||
-rw-r--r-- | arch/x86/include/asm/unistd.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/uv/uv_bau.h | 107 | ||||
-rw-r--r-- | arch/x86/kernel/tsc.c | 14 | ||||
-rw-r--r-- | arch/x86/lib/x86-opcode-map.txt | 8 | ||||
-rw-r--r-- | arch/x86/platform/uv/tlb_uv.c | 388 | ||||
-rw-r--r-- | drivers/base/bus.c | 9 | ||||
-rw-r--r-- | drivers/gpio/Kconfig | 1 | ||||
-rw-r--r-- | drivers/gpio/gpio-ml-ioh.c | 8 | ||||
-rw-r--r-- | drivers/gpio/gpio-pch.c | 4 | ||||
-rw-r--r-- | drivers/gpio/gpio-tps65910.c | 2 | ||||
-rw-r--r-- | drivers/leds/Kconfig | 7 | ||||
-rw-r--r-- | drivers/leds/Makefile | 1 | ||||
-rw-r--r-- | drivers/leds/leds-ot200.c | 171 | ||||
-rw-r--r-- | drivers/pci/pci.c | 6 | ||||
-rw-r--r-- | drivers/regulator/core.c | 1 | ||||
-rw-r--r-- | drivers/video/backlight/adp8860_bl.c | 2 | ||||
-rw-r--r-- | drivers/video/backlight/adp8870_bl.c | 2 | ||||
-rw-r--r-- | drivers/video/backlight/l4f00242t03.c | 2 | ||||
-rw-r--r-- | fs/cifs/Kconfig | 3 | ||||
-rw-r--r-- | fs/cifs/cifs_debug.c | 11 | ||||
-rw-r--r-- | fs/cifs/cifs_spnego.c | 10 | ||||
-rw-r--r-- | fs/cifs/cifs_unicode.c | 41 | ||||
-rw-r--r-- | fs/cifs/cifs_unicode.h | 20 | ||||
-rw-r--r-- | fs/cifs/cifsacl.c | 2 | ||||
-rw-r--r-- | fs/cifs/cifsencrypt.c | 21 | ||||
-rw-r--r-- | fs/cifs/cifsglob.h | 2 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 162 | ||||
-rw-r--r-- | fs/cifs/connect.c | 305 | ||||
-rw-r--r-- | fs/cifs/readdir.c | 9 | ||||
-rw-r--r-- | fs/cifs/sess.c | 34 | ||||
-rw-r--r-- | fs/cifs/smbencrypt.c | 2 | ||||
-rw-r--r-- | fs/debugfs/file.c | 2 | ||||
-rw-r--r-- | fs/inode.c | 3 | ||||
-rw-r--r-- | fs/proc/stat.c | 2 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 3 | ||||
-rw-r--r-- | fs/qnx4/inode.c | 62 | ||||
-rw-r--r-- | fs/super.c | 2 | ||||
-rw-r--r-- | include/keys/user-type.h | 3 | ||||
-rw-r--r-- | include/linux/device.h | 15 | ||||
-rw-r--r-- | include/linux/fs.h | 2 | ||||
-rw-r--r-- | include/linux/kexec.h | 2 | ||||
-rw-r--r-- | include/linux/key.h | 2 | ||||
-rw-r--r-- | include/linux/migrate.h | 14 | ||||
-rw-r--r-- | include/linux/migrate_mode.h | 16 | ||||
-rw-r--r-- | include/linux/sched.h | 2 | ||||
-rw-r--r-- | include/linux/shmem_fs.h | 1 | ||||
-rw-r--r-- | include/linux/swap.h | 2 | ||||
-rw-r--r-- | include/linux/usb.h | 1 | ||||
-rw-r--r-- | include/net/cfg80211.h | 6 | ||||
-rw-r--r-- | ipc/mqueue.c | 3 | ||||
-rw-r--r-- | ipc/shm.c | 37 | ||||
-rw-r--r-- | kernel/auditsc.c | 5 | ||||
-rw-r--r-- | kernel/kprobes.c | 2 | ||||
-rw-r--r-- | kernel/sched/cpupri.c | 3 | ||||
-rw-r--r-- | kernel/tracepoint.c | 7 | ||||
-rw-r--r-- | lib/mpi/mpicoder.c | 2 | ||||
-rw-r--r-- | mm/hugetlb.c | 9 | ||||
-rw-r--r-- | mm/memcontrol.c | 2 | ||||
-rw-r--r-- | mm/memory.c | 37 | ||||
-rw-r--r-- | mm/page_alloc.c | 20 | ||||
-rw-r--r-- | mm/shmem.c | 53 | ||||
-rw-r--r-- | mm/vmscan.c | 124 | ||||
-rwxr-xr-x | scripts/kernel-doc | 3 | ||||
-rw-r--r-- | security/integrity/ima/ima_policy.c | 3 | ||||
-rw-r--r-- | security/keys/internal.h | 1 | ||||
-rw-r--r-- | security/keys/key.c | 1 | ||||
-rw-r--r-- | security/keys/user_defined.c | 43 |
114 files changed, 1779 insertions, 1085 deletions
diff --git a/Documentation/DocBook/device-drivers.tmpl b/Documentation/DocBook/device-drivers.tmpl index b638e50cf8f6..2f7fd4360848 100644 --- a/Documentation/DocBook/device-drivers.tmpl +++ b/Documentation/DocBook/device-drivers.tmpl | |||
@@ -50,7 +50,9 @@ | |||
50 | 50 | ||
51 | <sect1><title>Delaying, scheduling, and timer routines</title> | 51 | <sect1><title>Delaying, scheduling, and timer routines</title> |
52 | !Iinclude/linux/sched.h | 52 | !Iinclude/linux/sched.h |
53 | !Ekernel/sched.c | 53 | !Ekernel/sched/core.c |
54 | !Ikernel/sched/cpupri.c | ||
55 | !Ikernel/sched/fair.c | ||
54 | !Iinclude/linux/completion.h | 56 | !Iinclude/linux/completion.h |
55 | !Ekernel/timer.c | 57 | !Ekernel/timer.c |
56 | </sect1> | 58 | </sect1> |
@@ -216,7 +218,6 @@ X!Isound/sound_firmware.c | |||
216 | 218 | ||
217 | <chapter id="uart16x50"> | 219 | <chapter id="uart16x50"> |
218 | <title>16x50 UART Driver</title> | 220 | <title>16x50 UART Driver</title> |
219 | !Iinclude/linux/serial_core.h | ||
220 | !Edrivers/tty/serial/serial_core.c | 221 | !Edrivers/tty/serial/serial_core.c |
221 | !Edrivers/tty/serial/8250.c | 222 | !Edrivers/tty/serial/8250.c |
222 | </chapter> | 223 | </chapter> |
diff --git a/Documentation/DocBook/deviceiobook.tmpl b/Documentation/DocBook/deviceiobook.tmpl index c1ed6a49e598..54199a0dcf9a 100644 --- a/Documentation/DocBook/deviceiobook.tmpl +++ b/Documentation/DocBook/deviceiobook.tmpl | |||
@@ -317,7 +317,7 @@ CPU B: spin_unlock_irqrestore(&dev_lock, flags) | |||
317 | <chapter id="pubfunctions"> | 317 | <chapter id="pubfunctions"> |
318 | <title>Public Functions Provided</title> | 318 | <title>Public Functions Provided</title> |
319 | !Iarch/x86/include/asm/io.h | 319 | !Iarch/x86/include/asm/io.h |
320 | !Elib/iomap.c | 320 | !Elib/pci_iomap.c |
321 | </chapter> | 321 | </chapter> |
322 | 322 | ||
323 | </book> | 323 | </book> |
diff --git a/MAINTAINERS b/MAINTAINERS index 89b70df91f4f..93c68d5f1cf4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2246,6 +2246,17 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm.git | |||
2246 | S: Supported | 2246 | S: Supported |
2247 | F: fs/dlm/ | 2247 | F: fs/dlm/ |
2248 | 2248 | ||
2249 | DMA BUFFER SHARING FRAMEWORK | ||
2250 | M: Sumit Semwal <sumit.semwal@linaro.org> | ||
2251 | S: Maintained | ||
2252 | L: linux-media@vger.kernel.org | ||
2253 | L: dri-devel@lists.freedesktop.org | ||
2254 | L: linaro-mm-sig@lists.linaro.org | ||
2255 | F: drivers/base/dma-buf* | ||
2256 | F: include/linux/dma-buf* | ||
2257 | F: Documentation/dma-buf-sharing.txt | ||
2258 | T: git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git | ||
2259 | |||
2249 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM | 2260 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM |
2250 | M: Vinod Koul <vinod.koul@intel.com> | 2261 | M: Vinod Koul <vinod.koul@intel.com> |
2251 | M: Dan Williams <dan.j.williams@intel.com> | 2262 | M: Dan Williams <dan.j.williams@intel.com> |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 2 | 2 | PATCHLEVEL = 3 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = -rc1 |
5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 40319d91bb7f..1683bfb9166f 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -160,7 +160,6 @@ machine-$(CONFIG_ARCH_MSM) := msm | |||
160 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 | 160 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 |
161 | machine-$(CONFIG_ARCH_IMX_V4_V5) := imx | 161 | machine-$(CONFIG_ARCH_IMX_V4_V5) := imx |
162 | machine-$(CONFIG_ARCH_IMX_V6_V7) := imx | 162 | machine-$(CONFIG_ARCH_IMX_V6_V7) := imx |
163 | machine-$(CONFIG_ARCH_MX5) := mx5 | ||
164 | machine-$(CONFIG_ARCH_MXS) := mxs | 163 | machine-$(CONFIG_ARCH_MXS) := mxs |
165 | machine-$(CONFIG_ARCH_NETX) := netx | 164 | machine-$(CONFIG_ARCH_NETX) := netx |
166 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik | 165 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik |
diff --git a/arch/arm/configs/mx5_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index d0d8dfece37e..3a4fb2e5fc68 100644 --- a/arch/arm/configs/mx5_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig | |||
@@ -3,6 +3,7 @@ CONFIG_EXPERIMENTAL=y | |||
3 | CONFIG_KERNEL_LZO=y | 3 | CONFIG_KERNEL_LZO=y |
4 | CONFIG_SYSVIPC=y | 4 | CONFIG_SYSVIPC=y |
5 | CONFIG_LOG_BUF_SHIFT=18 | 5 | CONFIG_LOG_BUF_SHIFT=18 |
6 | CONFIG_CGROUPS=y | ||
6 | CONFIG_RELAY=y | 7 | CONFIG_RELAY=y |
7 | CONFIG_EXPERT=y | 8 | CONFIG_EXPERT=y |
8 | # CONFIG_SLUB_DEBUG is not set | 9 | # CONFIG_SLUB_DEBUG is not set |
@@ -14,20 +15,31 @@ CONFIG_MODULE_SRCVERSION_ALL=y | |||
14 | # CONFIG_LBDAF is not set | 15 | # CONFIG_LBDAF is not set |
15 | # CONFIG_BLK_DEV_BSG is not set | 16 | # CONFIG_BLK_DEV_BSG is not set |
16 | CONFIG_ARCH_MXC=y | 17 | CONFIG_ARCH_MXC=y |
17 | CONFIG_ARCH_MX5=y | 18 | CONFIG_MACH_MX31LILLY=y |
18 | CONFIG_MACH_MX51_BABBAGE=y | 19 | CONFIG_MACH_MX31LITE=y |
20 | CONFIG_MACH_PCM037=y | ||
21 | CONFIG_MACH_PCM037_EET=y | ||
22 | CONFIG_MACH_MX31_3DS=y | ||
23 | CONFIG_MACH_MX31MOBOARD=y | ||
24 | CONFIG_MACH_QONG=y | ||
25 | CONFIG_MACH_ARMADILLO5X0=y | ||
26 | CONFIG_MACH_KZM_ARM11_01=y | ||
27 | CONFIG_MACH_PCM043=y | ||
28 | CONFIG_MACH_MX35_3DS=y | ||
29 | CONFIG_MACH_EUKREA_CPUIMX35=y | ||
30 | CONFIG_MACH_VPR200=y | ||
31 | CONFIG_MACH_IMX51_DT=y | ||
19 | CONFIG_MACH_MX51_3DS=y | 32 | CONFIG_MACH_MX51_3DS=y |
20 | CONFIG_MACH_EUKREA_CPUIMX51=y | 33 | CONFIG_MACH_EUKREA_CPUIMX51=y |
21 | CONFIG_MACH_EUKREA_CPUIMX51SD=y | 34 | CONFIG_MACH_EUKREA_CPUIMX51SD=y |
22 | CONFIG_MACH_MX51_EFIKAMX=y | 35 | CONFIG_MACH_MX51_EFIKAMX=y |
23 | CONFIG_MACH_MX51_EFIKASB=y | 36 | CONFIG_MACH_MX51_EFIKASB=y |
24 | CONFIG_MACH_MX53_EVK=y | 37 | CONFIG_MACH_IMX53_DT=y |
25 | CONFIG_MACH_MX53_SMD=y | 38 | CONFIG_SOC_IMX6Q=y |
26 | CONFIG_MACH_MX53_LOCO=y | ||
27 | CONFIG_MACH_MX53_ARD=y | ||
28 | CONFIG_MXC_PWM=y | 39 | CONFIG_MXC_PWM=y |
29 | CONFIG_NO_HZ=y | 40 | CONFIG_NO_HZ=y |
30 | CONFIG_HIGH_RES_TIMERS=y | 41 | CONFIG_HIGH_RES_TIMERS=y |
42 | CONFIG_SMP=y | ||
31 | CONFIG_VMSPLIT_2G=y | 43 | CONFIG_VMSPLIT_2G=y |
32 | CONFIG_PREEMPT_VOLUNTARY=y | 44 | CONFIG_PREEMPT_VOLUNTARY=y |
33 | CONFIG_AEABI=y | 45 | CONFIG_AEABI=y |
@@ -49,7 +61,7 @@ CONFIG_IP_PNP_DHCP=y | |||
49 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 61 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
50 | # CONFIG_INET_XFRM_MODE_BEET is not set | 62 | # CONFIG_INET_XFRM_MODE_BEET is not set |
51 | # CONFIG_INET_LRO is not set | 63 | # CONFIG_INET_LRO is not set |
52 | # CONFIG_IPV6 is not set | 64 | CONFIG_IPV6=y |
53 | # CONFIG_WIRELESS is not set | 65 | # CONFIG_WIRELESS is not set |
54 | CONFIG_DEVTMPFS=y | 66 | CONFIG_DEVTMPFS=y |
55 | CONFIG_DEVTMPFS_MOUNT=y | 67 | CONFIG_DEVTMPFS_MOUNT=y |
@@ -68,24 +80,20 @@ CONFIG_SCSI_SCAN_ASYNC=y | |||
68 | CONFIG_ATA=y | 80 | CONFIG_ATA=y |
69 | CONFIG_PATA_IMX=y | 81 | CONFIG_PATA_IMX=y |
70 | CONFIG_NETDEVICES=y | 82 | CONFIG_NETDEVICES=y |
71 | CONFIG_MII=m | 83 | # CONFIG_NET_VENDOR_BROADCOM is not set |
72 | CONFIG_MARVELL_PHY=y | 84 | # CONFIG_NET_VENDOR_CHELSIO is not set |
73 | CONFIG_DAVICOM_PHY=y | 85 | # CONFIG_NET_VENDOR_FARADAY is not set |
74 | CONFIG_QSEMI_PHY=y | 86 | CONFIG_FEC=y |
75 | CONFIG_LXT_PHY=y | 87 | # CONFIG_NET_VENDOR_INTEL is not set |
76 | CONFIG_CICADA_PHY=y | 88 | # CONFIG_NET_VENDOR_MARVELL is not set |
77 | CONFIG_VITESSE_PHY=y | 89 | # CONFIG_NET_VENDOR_MICREL is not set |
78 | CONFIG_SMSC_PHY=y | 90 | # CONFIG_NET_VENDOR_MICROCHIP is not set |
79 | CONFIG_BROADCOM_PHY=y | 91 | # CONFIG_NET_VENDOR_NATSEMI is not set |
80 | CONFIG_ICPLUS_PHY=y | 92 | # CONFIG_NET_VENDOR_SEEQ is not set |
81 | CONFIG_REALTEK_PHY=y | 93 | CONFIG_SMC91X=y |
82 | CONFIG_NATIONAL_PHY=y | 94 | CONFIG_SMC911X=y |
83 | CONFIG_STE10XP=y | 95 | CONFIG_SMSC911X=y |
84 | CONFIG_LSI_ET1011C_PHY=y | 96 | # CONFIG_NET_VENDOR_STMICRO is not set |
85 | CONFIG_MICREL_PHY=y | ||
86 | CONFIG_NET_ETHERNET=y | ||
87 | # CONFIG_NETDEV_1000 is not set | ||
88 | # CONFIG_NETDEV_10000 is not set | ||
89 | # CONFIG_WLAN is not set | 97 | # CONFIG_WLAN is not set |
90 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 98 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
91 | CONFIG_INPUT_EVDEV=y | 99 | CONFIG_INPUT_EVDEV=y |
@@ -124,7 +132,6 @@ CONFIG_USB_EHCI_HCD=y | |||
124 | CONFIG_USB_EHCI_MXC=y | 132 | CONFIG_USB_EHCI_MXC=y |
125 | CONFIG_USB_STORAGE=y | 133 | CONFIG_USB_STORAGE=y |
126 | CONFIG_MMC=y | 134 | CONFIG_MMC=y |
127 | CONFIG_MMC_BLOCK=m | ||
128 | CONFIG_MMC_SDHCI=y | 135 | CONFIG_MMC_SDHCI=y |
129 | CONFIG_MMC_SDHCI_PLTFM=y | 136 | CONFIG_MMC_SDHCI_PLTFM=y |
130 | CONFIG_MMC_SDHCI_ESDHC_IMX=y | 137 | CONFIG_MMC_SDHCI_ESDHC_IMX=y |
@@ -133,6 +140,8 @@ CONFIG_LEDS_CLASS=y | |||
133 | CONFIG_RTC_CLASS=y | 140 | CONFIG_RTC_CLASS=y |
134 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | 141 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y |
135 | CONFIG_RTC_MXC=y | 142 | CONFIG_RTC_MXC=y |
143 | CONFIG_DMADEVICES=y | ||
144 | CONFIG_IMX_SDMA=y | ||
136 | CONFIG_EXT2_FS=y | 145 | CONFIG_EXT2_FS=y |
137 | CONFIG_EXT2_FS_XATTR=y | 146 | CONFIG_EXT2_FS_XATTR=y |
138 | CONFIG_EXT2_FS_POSIX_ACL=y | 147 | CONFIG_EXT2_FS_POSIX_ACL=y |
diff --git a/arch/arm/configs/mx3_defconfig b/arch/arm/configs/mx3_defconfig deleted file mode 100644 index cb0717fbb03d..000000000000 --- a/arch/arm/configs/mx3_defconfig +++ /dev/null | |||
@@ -1,144 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSVIPC=y | ||
3 | CONFIG_IKCONFIG=y | ||
4 | CONFIG_IKCONFIG_PROC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | ||
6 | CONFIG_EXPERT=y | ||
7 | CONFIG_SLAB=y | ||
8 | CONFIG_MODULES=y | ||
9 | CONFIG_MODULE_UNLOAD=y | ||
10 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
11 | CONFIG_MODVERSIONS=y | ||
12 | # CONFIG_BLK_DEV_BSG is not set | ||
13 | CONFIG_ARCH_MXC=y | ||
14 | CONFIG_MACH_MX31ADS_WM1133_EV1=y | ||
15 | CONFIG_MACH_MX31LILLY=y | ||
16 | CONFIG_MACH_MX31LITE=y | ||
17 | CONFIG_MACH_PCM037=y | ||
18 | CONFIG_MACH_PCM037_EET=y | ||
19 | CONFIG_MACH_MX31_3DS=y | ||
20 | CONFIG_MACH_MX31MOBOARD=y | ||
21 | CONFIG_MACH_QONG=y | ||
22 | CONFIG_MACH_ARMADILLO5X0=y | ||
23 | CONFIG_MACH_KZM_ARM11_01=y | ||
24 | CONFIG_MACH_PCM043=y | ||
25 | CONFIG_MACH_MX35_3DS=y | ||
26 | CONFIG_MACH_EUKREA_CPUIMX35=y | ||
27 | CONFIG_MXC_IRQ_PRIOR=y | ||
28 | CONFIG_MXC_PWM=y | ||
29 | CONFIG_ARM_ERRATA_411920=y | ||
30 | CONFIG_NO_HZ=y | ||
31 | CONFIG_HIGH_RES_TIMERS=y | ||
32 | CONFIG_PREEMPT=y | ||
33 | CONFIG_AEABI=y | ||
34 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
35 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
36 | CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw ip=off" | ||
37 | CONFIG_VFP=y | ||
38 | CONFIG_PM_DEBUG=y | ||
39 | CONFIG_NET=y | ||
40 | CONFIG_PACKET=y | ||
41 | CONFIG_UNIX=y | ||
42 | CONFIG_INET=y | ||
43 | CONFIG_IP_PNP=y | ||
44 | CONFIG_IP_PNP_DHCP=y | ||
45 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
46 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
47 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
48 | # CONFIG_INET_LRO is not set | ||
49 | # CONFIG_INET_DIAG is not set | ||
50 | # CONFIG_IPV6 is not set | ||
51 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
52 | CONFIG_FW_LOADER=m | ||
53 | CONFIG_MTD=y | ||
54 | CONFIG_MTD_CMDLINE_PARTS=y | ||
55 | CONFIG_MTD_CHAR=y | ||
56 | CONFIG_MTD_BLOCK=y | ||
57 | CONFIG_MTD_CFI=y | ||
58 | CONFIG_MTD_PHYSMAP=y | ||
59 | CONFIG_MTD_NAND=y | ||
60 | CONFIG_MTD_NAND_MXC=y | ||
61 | CONFIG_MTD_UBI=y | ||
62 | # CONFIG_BLK_DEV is not set | ||
63 | CONFIG_MISC_DEVICES=y | ||
64 | CONFIG_EEPROM_AT24=y | ||
65 | CONFIG_NETDEVICES=y | ||
66 | CONFIG_SMSC_PHY=y | ||
67 | CONFIG_NET_ETHERNET=y | ||
68 | CONFIG_SMSC911X=y | ||
69 | CONFIG_DNET=y | ||
70 | # CONFIG_NETDEV_1000 is not set | ||
71 | # CONFIG_NETDEV_10000 is not set | ||
72 | # CONFIG_INPUT_MOUSEDEV is not set | ||
73 | # CONFIG_KEYBOARD_ATKBD is not set | ||
74 | CONFIG_KEYBOARD_IMX=y | ||
75 | # CONFIG_INPUT_MOUSE is not set | ||
76 | # CONFIG_SERIO is not set | ||
77 | # CONFIG_VT is not set | ||
78 | # CONFIG_LEGACY_PTYS is not set | ||
79 | CONFIG_SERIAL_8250=m | ||
80 | CONFIG_SERIAL_8250_EXTENDED=y | ||
81 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
82 | CONFIG_SERIAL_IMX=y | ||
83 | CONFIG_SERIAL_IMX_CONSOLE=y | ||
84 | # CONFIG_HW_RANDOM is not set | ||
85 | CONFIG_I2C=y | ||
86 | CONFIG_I2C_CHARDEV=y | ||
87 | CONFIG_I2C_IMX=y | ||
88 | CONFIG_SPI=y | ||
89 | CONFIG_W1=y | ||
90 | CONFIG_W1_MASTER_MXC=y | ||
91 | CONFIG_W1_SLAVE_THERM=y | ||
92 | # CONFIG_HWMON is not set | ||
93 | CONFIG_WATCHDOG=y | ||
94 | CONFIG_IMX2_WDT=y | ||
95 | CONFIG_MFD_WM8350_I2C=y | ||
96 | CONFIG_REGULATOR=y | ||
97 | CONFIG_REGULATOR_WM8350=y | ||
98 | CONFIG_MEDIA_SUPPORT=y | ||
99 | CONFIG_VIDEO_DEV=y | ||
100 | # CONFIG_RC_CORE is not set | ||
101 | # CONFIG_MEDIA_TUNER_CUSTOMISE is not set | ||
102 | CONFIG_SOC_CAMERA=y | ||
103 | CONFIG_SOC_CAMERA_MT9M001=y | ||
104 | CONFIG_SOC_CAMERA_MT9M111=y | ||
105 | CONFIG_SOC_CAMERA_MT9T031=y | ||
106 | CONFIG_SOC_CAMERA_MT9V022=y | ||
107 | CONFIG_SOC_CAMERA_TW9910=y | ||
108 | CONFIG_SOC_CAMERA_OV772X=y | ||
109 | CONFIG_VIDEO_MX3=y | ||
110 | # CONFIG_RADIO_ADAPTERS is not set | ||
111 | CONFIG_FB=y | ||
112 | CONFIG_SOUND=y | ||
113 | CONFIG_SND=y | ||
114 | # CONFIG_SND_ARM is not set | ||
115 | # CONFIG_SND_SPI is not set | ||
116 | CONFIG_SND_SOC=y | ||
117 | CONFIG_SND_IMX_SOC=y | ||
118 | CONFIG_SND_MXC_SOC_WM1133_EV1=y | ||
119 | CONFIG_SND_SOC_PHYCORE_AC97=y | ||
120 | CONFIG_SND_SOC_EUKREA_TLV320=y | ||
121 | CONFIG_USB=y | ||
122 | CONFIG_USB_EHCI_HCD=y | ||
123 | CONFIG_USB_EHCI_MXC=y | ||
124 | CONFIG_USB_GADGET=m | ||
125 | CONFIG_USB_FSL_USB2=m | ||
126 | CONFIG_USB_G_SERIAL=m | ||
127 | CONFIG_USB_ULPI=y | ||
128 | CONFIG_MMC=y | ||
129 | CONFIG_MMC_MXC=y | ||
130 | CONFIG_RTC_CLASS=y | ||
131 | CONFIG_RTC_MXC=y | ||
132 | CONFIG_DMADEVICES=y | ||
133 | # CONFIG_DNOTIFY is not set | ||
134 | CONFIG_TMPFS=y | ||
135 | CONFIG_JFFS2_FS=y | ||
136 | CONFIG_UBIFS_FS=y | ||
137 | CONFIG_NFS_FS=y | ||
138 | CONFIG_NFS_V3=y | ||
139 | CONFIG_NFS_V4=y | ||
140 | CONFIG_ROOT_NFS=y | ||
141 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
142 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
143 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
144 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0e6de366c648..09f357bcecde 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -22,6 +22,18 @@ config ARCH_MX25 | |||
22 | config MACH_MX27 | 22 | config MACH_MX27 |
23 | bool | 23 | bool |
24 | 24 | ||
25 | config ARCH_MX5 | ||
26 | bool | ||
27 | |||
28 | config ARCH_MX50 | ||
29 | bool | ||
30 | |||
31 | config ARCH_MX51 | ||
32 | bool | ||
33 | |||
34 | config ARCH_MX53 | ||
35 | bool | ||
36 | |||
25 | config SOC_IMX1 | 37 | config SOC_IMX1 |
26 | bool | 38 | bool |
27 | select ARCH_MX1 | 39 | select ARCH_MX1 |
@@ -73,6 +85,32 @@ config SOC_IMX35 | |||
73 | select MXC_AVIC | 85 | select MXC_AVIC |
74 | select SMP_ON_UP if SMP | 86 | select SMP_ON_UP if SMP |
75 | 87 | ||
88 | config SOC_IMX5 | ||
89 | select CPU_V7 | ||
90 | select ARM_L1_CACHE_SHIFT_6 | ||
91 | select MXC_TZIC | ||
92 | select ARCH_MXC_IOMUX_V3 | ||
93 | select ARCH_MXC_AUDMUX_V2 | ||
94 | select ARCH_HAS_CPUFREQ | ||
95 | select ARCH_MX5 | ||
96 | bool | ||
97 | |||
98 | config SOC_IMX50 | ||
99 | bool | ||
100 | select SOC_IMX5 | ||
101 | select ARCH_MX50 | ||
102 | |||
103 | config SOC_IMX51 | ||
104 | bool | ||
105 | select SOC_IMX5 | ||
106 | select ARCH_MX5 | ||
107 | select ARCH_MX51 | ||
108 | |||
109 | config SOC_IMX53 | ||
110 | bool | ||
111 | select SOC_IMX5 | ||
112 | select ARCH_MX5 | ||
113 | select ARCH_MX53 | ||
76 | 114 | ||
77 | if ARCH_IMX_V4_V5 | 115 | if ARCH_IMX_V4_V5 |
78 | 116 | ||
@@ -592,6 +630,207 @@ config MACH_VPR200 | |||
592 | Include support for VPR200 platform. This includes specific | 630 | Include support for VPR200 platform. This includes specific |
593 | configurations for the board and its peripherals. | 631 | configurations for the board and its peripherals. |
594 | 632 | ||
633 | comment "i.MX5 platforms:" | ||
634 | |||
635 | config MACH_MX50_RDP | ||
636 | bool "Support MX50 reference design platform" | ||
637 | depends on BROKEN | ||
638 | select SOC_IMX50 | ||
639 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
640 | select IMX_HAVE_PLATFORM_IMX_UART | ||
641 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
642 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
643 | help | ||
644 | Include support for MX50 reference design platform (RDP) board. This | ||
645 | includes specific configurations for the board and its peripherals. | ||
646 | |||
647 | comment "i.MX51 machines:" | ||
648 | |||
649 | config MACH_IMX51_DT | ||
650 | bool "Support i.MX51 platforms from device tree" | ||
651 | select SOC_IMX51 | ||
652 | select USE_OF | ||
653 | select MACH_MX51_BABBAGE | ||
654 | help | ||
655 | Include support for Freescale i.MX51 based platforms | ||
656 | using the device tree for discovery | ||
657 | |||
658 | config MACH_MX51_BABBAGE | ||
659 | bool "Support MX51 BABBAGE platforms" | ||
660 | select SOC_IMX51 | ||
661 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
662 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
663 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
664 | select IMX_HAVE_PLATFORM_IMX_UART | ||
665 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
666 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
667 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
668 | help | ||
669 | Include support for MX51 Babbage platform, also known as MX51EVK in | ||
670 | u-boot. This includes specific configurations for the board and its | ||
671 | peripherals. | ||
672 | |||
673 | config MACH_MX51_3DS | ||
674 | bool "Support MX51PDK (3DS)" | ||
675 | select SOC_IMX51 | ||
676 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
677 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
678 | select IMX_HAVE_PLATFORM_IMX_UART | ||
679 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
680 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
681 | select MXC_DEBUG_BOARD | ||
682 | help | ||
683 | Include support for MX51PDK (3DS) platform. This includes specific | ||
684 | configurations for the board and its peripherals. | ||
685 | |||
686 | config MACH_EUKREA_CPUIMX51 | ||
687 | bool "Support Eukrea CPUIMX51 module" | ||
688 | select SOC_IMX51 | ||
689 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
690 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
691 | select IMX_HAVE_PLATFORM_IMX_UART | ||
692 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
693 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
694 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
695 | help | ||
696 | Include support for Eukrea CPUIMX51 platform. This includes | ||
697 | specific configurations for the module and its peripherals. | ||
698 | |||
699 | choice | ||
700 | prompt "Baseboard" | ||
701 | depends on MACH_EUKREA_CPUIMX51 | ||
702 | default MACH_EUKREA_MBIMX51_BASEBOARD | ||
703 | |||
704 | config MACH_EUKREA_MBIMX51_BASEBOARD | ||
705 | prompt "Eukrea MBIMX51 development board" | ||
706 | bool | ||
707 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
708 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
709 | select LEDS_GPIO_REGISTER | ||
710 | help | ||
711 | This adds board specific devices that can be found on Eukrea's | ||
712 | MBIMX51 evaluation board. | ||
713 | |||
714 | endchoice | ||
715 | |||
716 | config MACH_EUKREA_CPUIMX51SD | ||
717 | bool "Support Eukrea CPUIMX51SD module" | ||
718 | select SOC_IMX51 | ||
719 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
720 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
721 | select IMX_HAVE_PLATFORM_IMX_UART | ||
722 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
723 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
724 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
725 | help | ||
726 | Include support for Eukrea CPUIMX51SD platform. This includes | ||
727 | specific configurations for the module and its peripherals. | ||
728 | |||
729 | choice | ||
730 | prompt "Baseboard" | ||
731 | depends on MACH_EUKREA_CPUIMX51SD | ||
732 | default MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
733 | |||
734 | config MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
735 | prompt "Eukrea MBIMXSD development board" | ||
736 | bool | ||
737 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
738 | select LEDS_GPIO_REGISTER | ||
739 | help | ||
740 | This adds board specific devices that can be found on Eukrea's | ||
741 | MBIMXSD evaluation board. | ||
742 | |||
743 | endchoice | ||
744 | |||
745 | config MX51_EFIKA_COMMON | ||
746 | bool | ||
747 | select SOC_IMX51 | ||
748 | select IMX_HAVE_PLATFORM_IMX_UART | ||
749 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
750 | select IMX_HAVE_PLATFORM_PATA_IMX | ||
751 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
752 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
753 | select MXC_ULPI if USB_ULPI | ||
754 | |||
755 | config MACH_MX51_EFIKAMX | ||
756 | bool "Support MX51 Genesi Efika MX nettop" | ||
757 | select LEDS_GPIO_REGISTER | ||
758 | select MX51_EFIKA_COMMON | ||
759 | help | ||
760 | Include support for Genesi Efika MX nettop. This includes specific | ||
761 | configurations for the board and its peripherals. | ||
762 | |||
763 | config MACH_MX51_EFIKASB | ||
764 | bool "Support MX51 Genesi Efika Smartbook" | ||
765 | select LEDS_GPIO_REGISTER | ||
766 | select MX51_EFIKA_COMMON | ||
767 | help | ||
768 | Include support for Genesi Efika Smartbook. This includes specific | ||
769 | configurations for the board and its peripherals. | ||
770 | |||
771 | comment "i.MX53 machines:" | ||
772 | |||
773 | config MACH_IMX53_DT | ||
774 | bool "Support i.MX53 platforms from device tree" | ||
775 | select SOC_IMX53 | ||
776 | select USE_OF | ||
777 | select MACH_MX53_ARD | ||
778 | select MACH_MX53_EVK | ||
779 | select MACH_MX53_LOCO | ||
780 | select MACH_MX53_SMD | ||
781 | help | ||
782 | Include support for Freescale i.MX53 based platforms | ||
783 | using the device tree for discovery | ||
784 | |||
785 | config MACH_MX53_EVK | ||
786 | bool "Support MX53 EVK platforms" | ||
787 | select SOC_IMX53 | ||
788 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
789 | select IMX_HAVE_PLATFORM_IMX_UART | ||
790 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
791 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
792 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
793 | select LEDS_GPIO_REGISTER | ||
794 | help | ||
795 | Include support for MX53 EVK platform. This includes specific | ||
796 | configurations for the board and its peripherals. | ||
797 | |||
798 | config MACH_MX53_SMD | ||
799 | bool "Support MX53 SMD platforms" | ||
800 | select SOC_IMX53 | ||
801 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
802 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
803 | select IMX_HAVE_PLATFORM_IMX_UART | ||
804 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
805 | help | ||
806 | Include support for MX53 SMD platform. This includes specific | ||
807 | configurations for the board and its peripherals. | ||
808 | |||
809 | config MACH_MX53_LOCO | ||
810 | bool "Support MX53 LOCO platforms" | ||
811 | select SOC_IMX53 | ||
812 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
813 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
814 | select IMX_HAVE_PLATFORM_IMX_UART | ||
815 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
816 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
817 | select LEDS_GPIO_REGISTER | ||
818 | help | ||
819 | Include support for MX53 LOCO platform. This includes specific | ||
820 | configurations for the board and its peripherals. | ||
821 | |||
822 | config MACH_MX53_ARD | ||
823 | bool "Support MX53 ARD platforms" | ||
824 | select SOC_IMX53 | ||
825 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
826 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
827 | select IMX_HAVE_PLATFORM_IMX_UART | ||
828 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
829 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
830 | help | ||
831 | Include support for MX53 ARD platform. This includes specific | ||
832 | configurations for the board and its peripherals. | ||
833 | |||
595 | comment "i.MX6 family:" | 834 | comment "i.MX6 family:" |
596 | 835 | ||
597 | config SOC_IMX6Q | 836 | config SOC_IMX6Q |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index f5920c24f7d7..55db9c488f2b 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -11,6 +11,8 @@ obj-$(CONFIG_SOC_IMX27) += clock-imx27.o mm-imx27.o ehci-imx27.o | |||
11 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o | 11 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o |
12 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o | 12 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o |
13 | 13 | ||
14 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clock-mx51-mx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o | ||
15 | |||
14 | # Support for CMOS sensor interface | 16 | # Support for CMOS sensor interface |
15 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o | 17 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o |
16 | 18 | ||
@@ -75,3 +77,22 @@ obj-$(CONFIG_SOC_IMX6Q) += clock-imx6q.o mach-imx6q.o | |||
75 | ifeq ($(CONFIG_PM),y) | 77 | ifeq ($(CONFIG_PM),y) |
76 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o | 78 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o |
77 | endif | 79 | endif |
80 | |||
81 | # i.MX5 based machines | ||
82 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | ||
83 | obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o | ||
84 | obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o | ||
85 | obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o | ||
86 | obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o | ||
87 | obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o | ||
88 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += mach-cpuimx51.o | ||
89 | obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o | ||
90 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o | ||
91 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o | ||
92 | obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o | ||
93 | obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o | ||
94 | obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o | ||
95 | obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o | ||
96 | |||
97 | obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o | ||
98 | obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o | ||
diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index 5f4d06af4912..6dfdbcc83afd 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot | |||
@@ -22,6 +22,18 @@ zreladdr-$(CONFIG_SOC_IMX35) += 0x80008000 | |||
22 | params_phys-$(CONFIG_SOC_IMX35) := 0x80000100 | 22 | params_phys-$(CONFIG_SOC_IMX35) := 0x80000100 |
23 | initrd_phys-$(CONFIG_SOC_IMX35) := 0x80800000 | 23 | initrd_phys-$(CONFIG_SOC_IMX35) := 0x80800000 |
24 | 24 | ||
25 | zreladdr-$(CONFIG_SOC_IMX50) += 0x70008000 | ||
26 | params_phys-$(CONFIG_SOC_IMX50) := 0x70000100 | ||
27 | initrd_phys-$(CONFIG_SOC_IMX50) := 0x70800000 | ||
28 | |||
29 | zreladdr-$(CONFIG_SOC_IMX51) += 0x90008000 | ||
30 | params_phys-$(CONFIG_SOC_IMX51) := 0x90000100 | ||
31 | initrd_phys-$(CONFIG_SOC_IMX51) := 0x90800000 | ||
32 | |||
33 | zreladdr-$(CONFIG_SOC_IMX53) += 0x70008000 | ||
34 | params_phys-$(CONFIG_SOC_IMX53) := 0x70000100 | ||
35 | initrd_phys-$(CONFIG_SOC_IMX53) := 0x70800000 | ||
36 | |||
25 | zreladdr-$(CONFIG_SOC_IMX6Q) += 0x10008000 | 37 | zreladdr-$(CONFIG_SOC_IMX6Q) += 0x10008000 |
26 | params_phys-$(CONFIG_SOC_IMX6Q) := 0x10000100 | 38 | params_phys-$(CONFIG_SOC_IMX6Q) := 0x10000100 |
27 | initrd_phys-$(CONFIG_SOC_IMX6Q) := 0x10800000 | 39 | initrd_phys-$(CONFIG_SOC_IMX6Q) := 0x10800000 |
diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-imx/clock-mx51-mx53.c index 4cb276977190..08470504a088 100644 --- a/arch/arm/mach-mx5/clock-mx51-mx53.c +++ b/arch/arm/mach-imx/clock-mx51-mx53.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <mach/common.h> | 23 | #include <mach/common.h> |
24 | #include <mach/clock.h> | 24 | #include <mach/clock.h> |
25 | 25 | ||
26 | #include "crm_regs.h" | 26 | #include "crm-regs-imx5.h" |
27 | 27 | ||
28 | /* External clock values passed-in by the board code */ | 28 | /* External clock values passed-in by the board code */ |
29 | static unsigned long external_high_reference, external_low_reference; | 29 | static unsigned long external_high_reference, external_low_reference; |
diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-imx/cpu-imx5.c index 5e2e7a843860..5e2e7a843860 100644 --- a/arch/arm/mach-mx5/cpu.c +++ b/arch/arm/mach-imx/cpu-imx5.c | |||
diff --git a/arch/arm/mach-mx5/cpu_op-mx51.c b/arch/arm/mach-imx/cpu_op-mx51.c index 9d34c3d4c024..9d34c3d4c024 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.c +++ b/arch/arm/mach-imx/cpu_op-mx51.c | |||
diff --git a/arch/arm/mach-mx5/cpu_op-mx51.h b/arch/arm/mach-imx/cpu_op-mx51.h index 97477fecb469..97477fecb469 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.h +++ b/arch/arm/mach-imx/cpu_op-mx51.h | |||
diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-imx/crm-regs-imx5.h index 5e11ba7daee2..5e11ba7daee2 100644 --- a/arch/arm/mach-mx5/crm_regs.h +++ b/arch/arm/mach-imx/crm-regs-imx5.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx50.h b/arch/arm/mach-imx/devices-imx50.h index 7216667eaafc..7216667eaafc 100644 --- a/arch/arm/mach-mx5/devices-imx50.h +++ b/arch/arm/mach-imx/devices-imx50.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx51.h b/arch/arm/mach-imx/devices-imx51.h index af488bc0e225..af488bc0e225 100644 --- a/arch/arm/mach-mx5/devices-imx51.h +++ b/arch/arm/mach-imx/devices-imx51.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx53.h b/arch/arm/mach-imx/devices-imx53.h index 6e1e5d1f8c3a..6e1e5d1f8c3a 100644 --- a/arch/arm/mach-mx5/devices-imx53.h +++ b/arch/arm/mach-imx/devices-imx53.h | |||
diff --git a/arch/arm/mach-mx5/efika.h b/arch/arm/mach-imx/efika.h index 014aa985faae..014aa985faae 100644 --- a/arch/arm/mach-mx5/efika.h +++ b/arch/arm/mach-imx/efika.h | |||
diff --git a/arch/arm/mach-mx5/ehci.c b/arch/arm/mach-imx/ehci-imx5.c index c17fa131728b..c17fa131728b 100644 --- a/arch/arm/mach-mx5/ehci.c +++ b/arch/arm/mach-imx/ehci-imx5.c | |||
diff --git a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c index a6a3ab8f1b1c..a6a3ab8f1b1c 100644 --- a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c | |||
diff --git a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c index d817fc80b986..d817fc80b986 100644 --- a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c | |||
diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index e6bad17b908c..e6bad17b908c 100644 --- a/arch/arm/mach-mx5/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c | |||
diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index 05ebb3e68679..05ebb3e68679 100644 --- a/arch/arm/mach-mx5/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c | |||
diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-imx/mach-cpuimx51.c index 944025da8333..944025da8333 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-imx/mach-cpuimx51.c | |||
diff --git a/arch/arm/mach-mx5/board-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index 9fbe923c8b08..9fbe923c8b08 100644 --- a/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c | |||
diff --git a/arch/arm/mach-mx5/board-mx50_rdp.c b/arch/arm/mach-imx/mach-mx50_rdp.c index 42b66e8d9615..42b66e8d9615 100644 --- a/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/arch/arm/mach-imx/mach-mx50_rdp.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c index 83eab4176ca4..83eab4176ca4 100644 --- a/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/arch/arm/mach-imx/mach-mx51_3ds.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c index e4b822e9f719..e4b822e9f719 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-imx/mach-mx51_babbage.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c index 3a5ed2dd885a..3a5ed2dd885a 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-imx/mach-mx51_efikamx.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c index ea5f65b0381a..ea5f65b0381a 100644 --- a/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/arch/arm/mach-imx/mach-mx51_efikasb.c | |||
diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 5f224f1c3eb6..08dfb7628d2d 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | 34 | ||
35 | #include "crm_regs.h" | ||
36 | #include "devices-imx53.h" | 35 | #include "devices-imx53.h" |
37 | 36 | ||
38 | #define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31) | 37 | #define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31) |
diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c index d6ce137896d6..5a72188b9cdb 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-imx/mach-mx53_evk.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19) | 37 | #define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19) |
38 | #define MX53EVK_LED IMX_GPIO_NR(7, 7) | 38 | #define MX53EVK_LED IMX_GPIO_NR(7, 7) |
39 | 39 | ||
40 | #include "crm_regs.h" | ||
41 | #include "devices-imx53.h" | 40 | #include "devices-imx53.h" |
42 | 41 | ||
43 | static iomux_v3_cfg_t mx53_evk_pads[] = { | 42 | static iomux_v3_cfg_t mx53_evk_pads[] = { |
diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c index fd8b524e1c58..37f67cac15a4 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-imx/mach-mx53_loco.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | 34 | ||
35 | #include "crm_regs.h" | ||
36 | #include "devices-imx53.h" | 35 | #include "devices-imx53.h" |
37 | 36 | ||
38 | #define MX53_LOCO_POWER IMX_GPIO_NR(1, 8) | 37 | #define MX53_LOCO_POWER IMX_GPIO_NR(1, 8) |
diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c index 22c53c9b18aa..8e972c5c3e13 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-imx/mach-mx53_smd.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/time.h> | 32 | #include <asm/mach/time.h> |
33 | 33 | ||
34 | #include "crm_regs.h" | ||
35 | #include "devices-imx53.h" | 34 | #include "devices-imx53.h" |
36 | 35 | ||
37 | #define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6) | 36 | #define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6) |
diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-imx/mm-imx5.c index bc17dfea3817..bc17dfea3817 100644 --- a/arch/arm/mach-mx5/mm.c +++ b/arch/arm/mach-imx/mm-imx5.c | |||
diff --git a/arch/arm/mach-mx5/mx51_efika.c b/arch/arm/mach-imx/mx51_efika.c index ec6ca91b299b..ec6ca91b299b 100644 --- a/arch/arm/mach-mx5/mx51_efika.c +++ b/arch/arm/mach-imx/mx51_efika.c | |||
diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-imx/pm-imx5.c index 5eebfaad1226..6dc093448057 100644 --- a/arch/arm/mach-mx5/system.c +++ b/arch/arm/mach-imx/pm-imx5.c | |||
@@ -1,8 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. | 2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. |
3 | */ | 3 | * |
4 | |||
5 | /* | ||
6 | * The code contained herein is licensed under the GNU General Public | 4 | * The code contained herein is licensed under the GNU General Public |
7 | * License. You may obtain a copy of the GNU General Public License | 5 | * License. You may obtain a copy of the GNU General Public License |
8 | * Version 2 or later at the following locations: | 6 | * Version 2 or later at the following locations: |
@@ -10,14 +8,22 @@ | |||
10 | * http://www.opensource.org/licenses/gpl-license.html | 8 | * http://www.opensource.org/licenses/gpl-license.html |
11 | * http://www.gnu.org/copyleft/gpl.html | 9 | * http://www.gnu.org/copyleft/gpl.html |
12 | */ | 10 | */ |
13 | #include <linux/platform_device.h> | 11 | #include <linux/suspend.h> |
12 | #include <linux/clk.h> | ||
14 | #include <linux/io.h> | 13 | #include <linux/io.h> |
15 | #include <mach/hardware.h> | 14 | #include <linux/err.h> |
15 | #include <asm/cacheflush.h> | ||
16 | #include <asm/tlbflush.h> | ||
16 | #include <mach/common.h> | 17 | #include <mach/common.h> |
17 | #include "crm_regs.h" | 18 | #include <mach/hardware.h> |
19 | #include "crm-regs-imx5.h" | ||
20 | |||
21 | static struct clk *gpc_dvfs_clk; | ||
18 | 22 | ||
19 | /* set cpu low power mode before WFI instruction. This function is called | 23 | /* |
20 | * mx5 because it can be used for mx50, mx51, and mx53.*/ | 24 | * set cpu low power mode before WFI instruction. This function is called |
25 | * mx5 because it can be used for mx50, mx51, and mx53. | ||
26 | */ | ||
21 | void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) | 27 | void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) |
22 | { | 28 | { |
23 | u32 plat_lpc, arm_srpgcr, ccm_clpcr; | 29 | u32 plat_lpc, arm_srpgcr, ccm_clpcr; |
@@ -80,3 +86,68 @@ void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) | |||
80 | __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR); | 86 | __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR); |
81 | } | 87 | } |
82 | } | 88 | } |
89 | |||
90 | static int mx5_suspend_prepare(void) | ||
91 | { | ||
92 | return clk_enable(gpc_dvfs_clk); | ||
93 | } | ||
94 | |||
95 | static int mx5_suspend_enter(suspend_state_t state) | ||
96 | { | ||
97 | switch (state) { | ||
98 | case PM_SUSPEND_MEM: | ||
99 | mx5_cpu_lp_set(STOP_POWER_OFF); | ||
100 | break; | ||
101 | case PM_SUSPEND_STANDBY: | ||
102 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
103 | break; | ||
104 | default: | ||
105 | return -EINVAL; | ||
106 | } | ||
107 | |||
108 | if (state == PM_SUSPEND_MEM) { | ||
109 | local_flush_tlb_all(); | ||
110 | flush_cache_all(); | ||
111 | |||
112 | /*clear the EMPGC0/1 bits */ | ||
113 | __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); | ||
114 | __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); | ||
115 | } | ||
116 | cpu_do_idle(); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static void mx5_suspend_finish(void) | ||
121 | { | ||
122 | clk_disable(gpc_dvfs_clk); | ||
123 | } | ||
124 | |||
125 | static int mx5_pm_valid(suspend_state_t state) | ||
126 | { | ||
127 | return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); | ||
128 | } | ||
129 | |||
130 | static const struct platform_suspend_ops mx5_suspend_ops = { | ||
131 | .valid = mx5_pm_valid, | ||
132 | .prepare = mx5_suspend_prepare, | ||
133 | .enter = mx5_suspend_enter, | ||
134 | .finish = mx5_suspend_finish, | ||
135 | }; | ||
136 | |||
137 | static int __init mx5_pm_init(void) | ||
138 | { | ||
139 | if (!cpu_is_mx51() && !cpu_is_mx53()) | ||
140 | return 0; | ||
141 | |||
142 | if (gpc_dvfs_clk == NULL) | ||
143 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); | ||
144 | |||
145 | if (!IS_ERR(gpc_dvfs_clk)) { | ||
146 | if (cpu_is_mx51()) | ||
147 | suspend_set_ops(&mx5_suspend_ops); | ||
148 | } else | ||
149 | return -EPERM; | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | device_initcall(mx5_pm_init); | ||
diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig deleted file mode 100644 index af0c212e3c7b..000000000000 --- a/arch/arm/mach-mx5/Kconfig +++ /dev/null | |||
@@ -1,244 +0,0 @@ | |||
1 | if ARCH_MX5 | ||
2 | |||
3 | # ARCH_MX5/50/53 are left to mark places where prevent multi-soc in single | ||
4 | # image. So for most time, SOC_IMX50/51/53 should be used. | ||
5 | |||
6 | config ARCH_MX51 | ||
7 | bool | ||
8 | |||
9 | config ARCH_MX50 | ||
10 | bool | ||
11 | |||
12 | config ARCH_MX53 | ||
13 | bool | ||
14 | |||
15 | config SOC_IMX50 | ||
16 | bool | ||
17 | select CPU_V7 | ||
18 | select ARM_L1_CACHE_SHIFT_6 | ||
19 | select MXC_TZIC | ||
20 | select ARCH_MXC_IOMUX_V3 | ||
21 | select ARCH_MXC_AUDMUX_V2 | ||
22 | select ARCH_HAS_CPUFREQ | ||
23 | select ARCH_MX50 | ||
24 | |||
25 | config SOC_IMX51 | ||
26 | bool | ||
27 | select CPU_V7 | ||
28 | select ARM_L1_CACHE_SHIFT_6 | ||
29 | select MXC_TZIC | ||
30 | select ARCH_MXC_IOMUX_V3 | ||
31 | select ARCH_MXC_AUDMUX_V2 | ||
32 | select ARCH_HAS_CPUFREQ | ||
33 | select ARCH_MX51 | ||
34 | |||
35 | config SOC_IMX53 | ||
36 | bool | ||
37 | select CPU_V7 | ||
38 | select ARM_L1_CACHE_SHIFT_6 | ||
39 | select MXC_TZIC | ||
40 | select ARCH_MXC_IOMUX_V3 | ||
41 | select ARCH_MX53 | ||
42 | |||
43 | #comment "i.MX50 machines:" | ||
44 | |||
45 | config MACH_MX50_RDP | ||
46 | bool "Support MX50 reference design platform" | ||
47 | depends on BROKEN | ||
48 | select SOC_IMX50 | ||
49 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
50 | select IMX_HAVE_PLATFORM_IMX_UART | ||
51 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
52 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
53 | help | ||
54 | Include support for MX50 reference design platform (RDP) board. This | ||
55 | includes specific configurations for the board and its peripherals. | ||
56 | |||
57 | comment "i.MX51 machines:" | ||
58 | |||
59 | config MACH_IMX51_DT | ||
60 | bool "Support i.MX51 platforms from device tree" | ||
61 | select SOC_IMX51 | ||
62 | select USE_OF | ||
63 | select MACH_MX51_BABBAGE | ||
64 | help | ||
65 | Include support for Freescale i.MX51 based platforms | ||
66 | using the device tree for discovery | ||
67 | |||
68 | config MACH_MX51_BABBAGE | ||
69 | bool "Support MX51 BABBAGE platforms" | ||
70 | select SOC_IMX51 | ||
71 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
72 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
73 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
74 | select IMX_HAVE_PLATFORM_IMX_UART | ||
75 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
76 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
77 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
78 | help | ||
79 | Include support for MX51 Babbage platform, also known as MX51EVK in | ||
80 | u-boot. This includes specific configurations for the board and its | ||
81 | peripherals. | ||
82 | |||
83 | config MACH_MX51_3DS | ||
84 | bool "Support MX51PDK (3DS)" | ||
85 | select SOC_IMX51 | ||
86 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
87 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
88 | select IMX_HAVE_PLATFORM_IMX_UART | ||
89 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
90 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
91 | select MXC_DEBUG_BOARD | ||
92 | help | ||
93 | Include support for MX51PDK (3DS) platform. This includes specific | ||
94 | configurations for the board and its peripherals. | ||
95 | |||
96 | config MACH_EUKREA_CPUIMX51 | ||
97 | bool "Support Eukrea CPUIMX51 module" | ||
98 | select SOC_IMX51 | ||
99 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
100 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
101 | select IMX_HAVE_PLATFORM_IMX_UART | ||
102 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
103 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
104 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
105 | help | ||
106 | Include support for Eukrea CPUIMX51 platform. This includes | ||
107 | specific configurations for the module and its peripherals. | ||
108 | |||
109 | choice | ||
110 | prompt "Baseboard" | ||
111 | depends on MACH_EUKREA_CPUIMX51 | ||
112 | default MACH_EUKREA_MBIMX51_BASEBOARD | ||
113 | |||
114 | config MACH_EUKREA_MBIMX51_BASEBOARD | ||
115 | prompt "Eukrea MBIMX51 development board" | ||
116 | bool | ||
117 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
118 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
119 | select LEDS_GPIO_REGISTER | ||
120 | help | ||
121 | This adds board specific devices that can be found on Eukrea's | ||
122 | MBIMX51 evaluation board. | ||
123 | |||
124 | endchoice | ||
125 | |||
126 | config MACH_EUKREA_CPUIMX51SD | ||
127 | bool "Support Eukrea CPUIMX51SD module" | ||
128 | select SOC_IMX51 | ||
129 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
130 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
131 | select IMX_HAVE_PLATFORM_IMX_UART | ||
132 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
133 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
134 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
135 | help | ||
136 | Include support for Eukrea CPUIMX51SD platform. This includes | ||
137 | specific configurations for the module and its peripherals. | ||
138 | |||
139 | choice | ||
140 | prompt "Baseboard" | ||
141 | depends on MACH_EUKREA_CPUIMX51SD | ||
142 | default MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
143 | |||
144 | config MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
145 | prompt "Eukrea MBIMXSD development board" | ||
146 | bool | ||
147 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
148 | select LEDS_GPIO_REGISTER | ||
149 | help | ||
150 | This adds board specific devices that can be found on Eukrea's | ||
151 | MBIMXSD evaluation board. | ||
152 | |||
153 | endchoice | ||
154 | |||
155 | config MX51_EFIKA_COMMON | ||
156 | bool | ||
157 | select SOC_IMX51 | ||
158 | select IMX_HAVE_PLATFORM_IMX_UART | ||
159 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
160 | select IMX_HAVE_PLATFORM_PATA_IMX | ||
161 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
162 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
163 | select MXC_ULPI if USB_ULPI | ||
164 | |||
165 | config MACH_MX51_EFIKAMX | ||
166 | bool "Support MX51 Genesi Efika MX nettop" | ||
167 | select LEDS_GPIO_REGISTER | ||
168 | select MX51_EFIKA_COMMON | ||
169 | help | ||
170 | Include support for Genesi Efika MX nettop. This includes specific | ||
171 | configurations for the board and its peripherals. | ||
172 | |||
173 | config MACH_MX51_EFIKASB | ||
174 | bool "Support MX51 Genesi Efika Smartbook" | ||
175 | select LEDS_GPIO_REGISTER | ||
176 | select MX51_EFIKA_COMMON | ||
177 | help | ||
178 | Include support for Genesi Efika Smartbook. This includes specific | ||
179 | configurations for the board and its peripherals. | ||
180 | |||
181 | comment "i.MX53 machines:" | ||
182 | |||
183 | config MACH_IMX53_DT | ||
184 | bool "Support i.MX53 platforms from device tree" | ||
185 | select SOC_IMX53 | ||
186 | select USE_OF | ||
187 | select MACH_MX53_ARD | ||
188 | select MACH_MX53_EVK | ||
189 | select MACH_MX53_LOCO | ||
190 | select MACH_MX53_SMD | ||
191 | help | ||
192 | Include support for Freescale i.MX53 based platforms | ||
193 | using the device tree for discovery | ||
194 | |||
195 | config MACH_MX53_EVK | ||
196 | bool "Support MX53 EVK platforms" | ||
197 | select SOC_IMX53 | ||
198 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
199 | select IMX_HAVE_PLATFORM_IMX_UART | ||
200 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
201 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
202 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
203 | select LEDS_GPIO_REGISTER | ||
204 | help | ||
205 | Include support for MX53 EVK platform. This includes specific | ||
206 | configurations for the board and its peripherals. | ||
207 | |||
208 | config MACH_MX53_SMD | ||
209 | bool "Support MX53 SMD platforms" | ||
210 | select SOC_IMX53 | ||
211 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
212 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
213 | select IMX_HAVE_PLATFORM_IMX_UART | ||
214 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
215 | help | ||
216 | Include support for MX53 SMD platform. This includes specific | ||
217 | configurations for the board and its peripherals. | ||
218 | |||
219 | config MACH_MX53_LOCO | ||
220 | bool "Support MX53 LOCO platforms" | ||
221 | select SOC_IMX53 | ||
222 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
223 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
224 | select IMX_HAVE_PLATFORM_IMX_UART | ||
225 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
226 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
227 | select LEDS_GPIO_REGISTER | ||
228 | help | ||
229 | Include support for MX53 LOCO platform. This includes specific | ||
230 | configurations for the board and its peripherals. | ||
231 | |||
232 | config MACH_MX53_ARD | ||
233 | bool "Support MX53 ARD platforms" | ||
234 | select SOC_IMX53 | ||
235 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
236 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
237 | select IMX_HAVE_PLATFORM_IMX_UART | ||
238 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
239 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
240 | help | ||
241 | Include support for MX53 ARD platform. This includes specific | ||
242 | configurations for the board and its peripherals. | ||
243 | |||
244 | endif | ||
diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile deleted file mode 100644 index 0fc60807fa2b..000000000000 --- a/arch/arm/mach-mx5/Makefile +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the linux kernel. | ||
3 | # | ||
4 | |||
5 | # Object file lists. | ||
6 | obj-y := cpu.o mm.o clock-mx51-mx53.o ehci.o system.o | ||
7 | |||
8 | obj-$(CONFIG_PM) += pm-imx5.o | ||
9 | obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o | ||
10 | obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o | ||
11 | obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o | ||
12 | obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o | ||
13 | obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o | ||
14 | obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.o | ||
15 | obj-$(CONFIG_MACH_MX53_ARD) += board-mx53_ard.o | ||
16 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += board-cpuimx51.o | ||
17 | obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o | ||
18 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o | ||
19 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o | ||
20 | obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o | ||
21 | obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o | ||
22 | obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o | ||
23 | obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o | ||
24 | |||
25 | obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o | ||
26 | obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o | ||
diff --git a/arch/arm/mach-mx5/Makefile.boot b/arch/arm/mach-mx5/Makefile.boot deleted file mode 100644 index ca207ca305ec..000000000000 --- a/arch/arm/mach-mx5/Makefile.boot +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | zreladdr-$(CONFIG_ARCH_MX50) += 0x70008000 | ||
2 | params_phys-$(CONFIG_ARCH_MX50) := 0x70000100 | ||
3 | initrd_phys-$(CONFIG_ARCH_MX50) := 0x70800000 | ||
4 | zreladdr-$(CONFIG_ARCH_MX51) += 0x90008000 | ||
5 | params_phys-$(CONFIG_ARCH_MX51) := 0x90000100 | ||
6 | initrd_phys-$(CONFIG_ARCH_MX51) := 0x90800000 | ||
7 | zreladdr-$(CONFIG_ARCH_MX53) += 0x70008000 | ||
8 | params_phys-$(CONFIG_ARCH_MX53) := 0x70000100 | ||
9 | initrd_phys-$(CONFIG_ARCH_MX53) := 0x70800000 | ||
diff --git a/arch/arm/mach-mx5/pm-imx5.c b/arch/arm/mach-mx5/pm-imx5.c deleted file mode 100644 index 98052fc852c7..000000000000 --- a/arch/arm/mach-mx5/pm-imx5.c +++ /dev/null | |||
@@ -1,83 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | #include <linux/suspend.h> | ||
12 | #include <linux/clk.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <asm/cacheflush.h> | ||
16 | #include <asm/tlbflush.h> | ||
17 | #include <mach/common.h> | ||
18 | #include <mach/hardware.h> | ||
19 | #include "crm_regs.h" | ||
20 | |||
21 | static struct clk *gpc_dvfs_clk; | ||
22 | |||
23 | static int mx5_suspend_prepare(void) | ||
24 | { | ||
25 | return clk_enable(gpc_dvfs_clk); | ||
26 | } | ||
27 | |||
28 | static int mx5_suspend_enter(suspend_state_t state) | ||
29 | { | ||
30 | switch (state) { | ||
31 | case PM_SUSPEND_MEM: | ||
32 | mx5_cpu_lp_set(STOP_POWER_OFF); | ||
33 | break; | ||
34 | case PM_SUSPEND_STANDBY: | ||
35 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
36 | break; | ||
37 | default: | ||
38 | return -EINVAL; | ||
39 | } | ||
40 | |||
41 | if (state == PM_SUSPEND_MEM) { | ||
42 | local_flush_tlb_all(); | ||
43 | flush_cache_all(); | ||
44 | |||
45 | /*clear the EMPGC0/1 bits */ | ||
46 | __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); | ||
47 | __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); | ||
48 | } | ||
49 | cpu_do_idle(); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static void mx5_suspend_finish(void) | ||
54 | { | ||
55 | clk_disable(gpc_dvfs_clk); | ||
56 | } | ||
57 | |||
58 | static int mx5_pm_valid(suspend_state_t state) | ||
59 | { | ||
60 | return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); | ||
61 | } | ||
62 | |||
63 | static const struct platform_suspend_ops mx5_suspend_ops = { | ||
64 | .valid = mx5_pm_valid, | ||
65 | .prepare = mx5_suspend_prepare, | ||
66 | .enter = mx5_suspend_enter, | ||
67 | .finish = mx5_suspend_finish, | ||
68 | }; | ||
69 | |||
70 | static int __init mx5_pm_init(void) | ||
71 | { | ||
72 | if (gpc_dvfs_clk == NULL) | ||
73 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); | ||
74 | |||
75 | if (!IS_ERR(gpc_dvfs_clk)) { | ||
76 | if (cpu_is_mx51()) | ||
77 | suspend_set_ops(&mx5_suspend_ops); | ||
78 | } else | ||
79 | return -EPERM; | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | device_initcall(mx5_pm_init); | ||
diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index b30708e28c1d..dcebb1230f7f 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig | |||
@@ -17,26 +17,17 @@ config ARCH_IMX_V4_V5 | |||
17 | and ARMv5 SoCs | 17 | and ARMv5 SoCs |
18 | 18 | ||
19 | config ARCH_IMX_V6_V7 | 19 | config ARCH_IMX_V6_V7 |
20 | bool "i.MX3, i.MX6" | 20 | bool "i.MX3, i.MX5, i.MX6" |
21 | select AUTO_ZRELADDR if !ZBOOT_ROM | 21 | select AUTO_ZRELADDR if !ZBOOT_ROM |
22 | select ARM_PATCH_PHYS_VIRT | 22 | select ARM_PATCH_PHYS_VIRT |
23 | select MIGHT_HAVE_CACHE_L2X0 | 23 | select MIGHT_HAVE_CACHE_L2X0 |
24 | help | 24 | help |
25 | This enables support for systems based on the Freescale i.MX3 and i.MX6 | 25 | This enables support for systems based on the Freescale i.MX3, i.MX5 |
26 | family. | 26 | and i.MX6 family. |
27 | |||
28 | config ARCH_MX5 | ||
29 | bool "i.MX50, i.MX51, i.MX53" | ||
30 | select AUTO_ZRELADDR if !ZBOOT_ROM | ||
31 | select ARM_PATCH_PHYS_VIRT | ||
32 | help | ||
33 | This enables support for machines using Freescale's i.MX50 and i.MX53 | ||
34 | processors. | ||
35 | 27 | ||
36 | endchoice | 28 | endchoice |
37 | 29 | ||
38 | source "arch/arm/mach-imx/Kconfig" | 30 | source "arch/arm/mach-imx/Kconfig" |
39 | source "arch/arm/mach-mx5/Kconfig" | ||
40 | 31 | ||
41 | endmenu | 32 | endmenu |
42 | 33 | ||
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index cf4e47b0948c..3f30dac804ea 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
@@ -42,6 +42,24 @@ | |||
42 | /* The native architecture */ | 42 | /* The native architecture */ |
43 | #define KEXEC_ARCH KEXEC_ARCH_S390 | 43 | #define KEXEC_ARCH KEXEC_ARCH_S390 |
44 | 44 | ||
45 | /* | ||
46 | * Size for s390x ELF notes per CPU | ||
47 | * | ||
48 | * Seven notes plus zero note at the end: prstatus, fpregset, timer, | ||
49 | * tod_cmp, tod_reg, control regs, and prefix | ||
50 | */ | ||
51 | #define KEXEC_NOTE_BYTES \ | ||
52 | (ALIGN(sizeof(struct elf_note), 4) * 8 + \ | ||
53 | ALIGN(sizeof("CORE"), 4) * 7 + \ | ||
54 | ALIGN(sizeof(struct elf_prstatus), 4) + \ | ||
55 | ALIGN(sizeof(elf_fpregset_t), 4) + \ | ||
56 | ALIGN(sizeof(u64), 4) + \ | ||
57 | ALIGN(sizeof(u64), 4) + \ | ||
58 | ALIGN(sizeof(u32), 4) + \ | ||
59 | ALIGN(sizeof(u64) * 16, 4) + \ | ||
60 | ALIGN(sizeof(u32), 4) \ | ||
61 | ) | ||
62 | |||
45 | /* Provide a dummy definition to avoid build failures. */ | 63 | /* Provide a dummy definition to avoid build failures. */ |
46 | static inline void crash_setup_regs(struct pt_regs *newregs, | 64 | static inline void crash_setup_regs(struct pt_regs *newregs, |
47 | struct pt_regs *oldregs) { } | 65 | struct pt_regs *oldregs) { } |
diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 577abba3fac6..83bb96079c43 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S | |||
@@ -408,7 +408,7 @@ ENTRY(handle_sys) | |||
408 | sw r9, [r0, PT_EPC] | 408 | sw r9, [r0, PT_EPC] |
409 | 409 | ||
410 | cmpi.c r27, __NR_syscalls # check syscall number | 410 | cmpi.c r27, __NR_syscalls # check syscall number |
411 | bgtu illegal_syscall | 411 | bgeu illegal_syscall |
412 | 412 | ||
413 | slli r8, r27, 2 # get syscall routine | 413 | slli r8, r27, 2 # get syscall routine |
414 | la r11, sys_call_table | 414 | la r11, sys_call_table |
diff --git a/arch/x86/.gitignore b/arch/x86/.gitignore index 028079065af6..7cab8c08e6d1 100644 --- a/arch/x86/.gitignore +++ b/arch/x86/.gitignore | |||
@@ -1,3 +1,4 @@ | |||
1 | boot/compressed/vmlinux | 1 | boot/compressed/vmlinux |
2 | tools/test_get_len | 2 | tools/test_get_len |
3 | tools/insn_sanity | ||
3 | 4 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 6c14ecd851d0..864cc6e6ac8e 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -125,16 +125,6 @@ config HAVE_LATENCYTOP_SUPPORT | |||
125 | config MMU | 125 | config MMU |
126 | def_bool y | 126 | def_bool y |
127 | 127 | ||
128 | config ZONE_DMA | ||
129 | bool "DMA memory allocation support" if EXPERT | ||
130 | default y | ||
131 | help | ||
132 | DMA memory allocation support allows devices with less than 32-bit | ||
133 | addressing to allocate within the first 16MB of address space. | ||
134 | Disable if no such devices will be used. | ||
135 | |||
136 | If unsure, say Y. | ||
137 | |||
138 | config SBUS | 128 | config SBUS |
139 | bool | 129 | bool |
140 | 130 | ||
@@ -255,6 +245,16 @@ source "kernel/Kconfig.freezer" | |||
255 | 245 | ||
256 | menu "Processor type and features" | 246 | menu "Processor type and features" |
257 | 247 | ||
248 | config ZONE_DMA | ||
249 | bool "DMA memory allocation support" if EXPERT | ||
250 | default y | ||
251 | help | ||
252 | DMA memory allocation support allows devices with less than 32-bit | ||
253 | addressing to allocate within the first 16MB of address space. | ||
254 | Disable if no such devices will be used. | ||
255 | |||
256 | If unsure, say Y. | ||
257 | |||
258 | source "kernel/time/Kconfig" | 258 | source "kernel/time/Kconfig" |
259 | 259 | ||
260 | config SMP | 260 | config SMP |
diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index b4a3db7ce140..21f77b89e47a 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h | |||
@@ -7,6 +7,7 @@ | |||
7 | # include <asm/unistd_32.h> | 7 | # include <asm/unistd_32.h> |
8 | # define __ARCH_WANT_IPC_PARSE_VERSION | 8 | # define __ARCH_WANT_IPC_PARSE_VERSION |
9 | # define __ARCH_WANT_STAT64 | 9 | # define __ARCH_WANT_STAT64 |
10 | # define __ARCH_WANT_SYS_IPC | ||
10 | # define __ARCH_WANT_SYS_OLD_MMAP | 11 | # define __ARCH_WANT_SYS_OLD_MMAP |
11 | # define __ARCH_WANT_SYS_OLD_SELECT | 12 | # define __ARCH_WANT_SYS_OLD_SELECT |
12 | 13 | ||
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index 8e862aaf0d90..becf47b81735 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -65,7 +65,7 @@ | |||
65 | * UV2: Bit 19 selects between | 65 | * UV2: Bit 19 selects between |
66 | * (0): 10 microsecond timebase and | 66 | * (0): 10 microsecond timebase and |
67 | * (1): 80 microseconds | 67 | * (1): 80 microseconds |
68 | * we're using 655us, similar to UV1: 65 units of 10us | 68 | * we're using 560us, similar to UV1: 65 units of 10us |
69 | */ | 69 | */ |
70 | #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL) | 70 | #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL) |
71 | #define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL) | 71 | #define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL) |
@@ -167,6 +167,7 @@ | |||
167 | #define FLUSH_RETRY_TIMEOUT 2 | 167 | #define FLUSH_RETRY_TIMEOUT 2 |
168 | #define FLUSH_GIVEUP 3 | 168 | #define FLUSH_GIVEUP 3 |
169 | #define FLUSH_COMPLETE 4 | 169 | #define FLUSH_COMPLETE 4 |
170 | #define FLUSH_RETRY_BUSYBUG 5 | ||
170 | 171 | ||
171 | /* | 172 | /* |
172 | * tuning the action when the numalink network is extremely delayed | 173 | * tuning the action when the numalink network is extremely delayed |
@@ -235,10 +236,10 @@ struct bau_msg_payload { | |||
235 | 236 | ||
236 | 237 | ||
237 | /* | 238 | /* |
238 | * Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) | 239 | * UV1 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) |
239 | * see table 4.2.3.0.1 in broacast_assist spec. | 240 | * see table 4.2.3.0.1 in broacast_assist spec. |
240 | */ | 241 | */ |
241 | struct bau_msg_header { | 242 | struct uv1_bau_msg_header { |
242 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ | 243 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ |
243 | /* bits 5:0 */ | 244 | /* bits 5:0 */ |
244 | unsigned int base_dest_nasid:15; /* nasid of the first bit */ | 245 | unsigned int base_dest_nasid:15; /* nasid of the first bit */ |
@@ -318,19 +319,87 @@ struct bau_msg_header { | |||
318 | }; | 319 | }; |
319 | 320 | ||
320 | /* | 321 | /* |
322 | * UV2 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) | ||
323 | * see figure 9-2 of harp_sys.pdf | ||
324 | */ | ||
325 | struct uv2_bau_msg_header { | ||
326 | unsigned int base_dest_nasid:15; /* nasid of the first bit */ | ||
327 | /* bits 14:0 */ /* in uvhub map */ | ||
328 | unsigned int dest_subnodeid:5; /* must be 0x10, for the LB */ | ||
329 | /* bits 19:15 */ | ||
330 | unsigned int rsvd_1:1; /* must be zero */ | ||
331 | /* bit 20 */ | ||
332 | /* Address bits 59:21 */ | ||
333 | /* bits 25:2 of address (44:21) are payload */ | ||
334 | /* these next 24 bits become bytes 12-14 of msg */ | ||
335 | /* bits 28:21 land in byte 12 */ | ||
336 | unsigned int replied_to:1; /* sent as 0 by the source to | ||
337 | byte 12 */ | ||
338 | /* bit 21 */ | ||
339 | unsigned int msg_type:3; /* software type of the | ||
340 | message */ | ||
341 | /* bits 24:22 */ | ||
342 | unsigned int canceled:1; /* message canceled, resource | ||
343 | is to be freed*/ | ||
344 | /* bit 25 */ | ||
345 | unsigned int payload_1:3; /* not currently used */ | ||
346 | /* bits 28:26 */ | ||
347 | |||
348 | /* bits 36:29 land in byte 13 */ | ||
349 | unsigned int payload_2a:3; /* not currently used */ | ||
350 | unsigned int payload_2b:5; /* not currently used */ | ||
351 | /* bits 36:29 */ | ||
352 | |||
353 | /* bits 44:37 land in byte 14 */ | ||
354 | unsigned int payload_3:8; /* not currently used */ | ||
355 | /* bits 44:37 */ | ||
356 | |||
357 | unsigned int rsvd_2:7; /* reserved */ | ||
358 | /* bits 51:45 */ | ||
359 | unsigned int swack_flag:1; /* software acknowledge flag */ | ||
360 | /* bit 52 */ | ||
361 | unsigned int rsvd_3a:3; /* must be zero */ | ||
362 | unsigned int rsvd_3b:8; /* must be zero */ | ||
363 | unsigned int rsvd_3c:8; /* must be zero */ | ||
364 | unsigned int rsvd_3d:3; /* must be zero */ | ||
365 | /* bits 74:53 */ | ||
366 | unsigned int fairness:3; /* usually zero */ | ||
367 | /* bits 77:75 */ | ||
368 | |||
369 | unsigned int sequence:16; /* message sequence number */ | ||
370 | /* bits 93:78 Suppl_A */ | ||
371 | unsigned int chaining:1; /* next descriptor is part of | ||
372 | this activation*/ | ||
373 | /* bit 94 */ | ||
374 | unsigned int multilevel:1; /* multi-level multicast | ||
375 | format */ | ||
376 | /* bit 95 */ | ||
377 | unsigned int rsvd_4:24; /* ordered / source node / | ||
378 | source subnode / aging | ||
379 | must be zero */ | ||
380 | /* bits 119:96 */ | ||
381 | unsigned int command:8; /* message type */ | ||
382 | /* bits 127:120 */ | ||
383 | }; | ||
384 | |||
385 | /* | ||
321 | * The activation descriptor: | 386 | * The activation descriptor: |
322 | * The format of the message to send, plus all accompanying control | 387 | * The format of the message to send, plus all accompanying control |
323 | * Should be 64 bytes | 388 | * Should be 64 bytes |
324 | */ | 389 | */ |
325 | struct bau_desc { | 390 | struct bau_desc { |
326 | struct pnmask distribution; | 391 | struct pnmask distribution; |
327 | /* | 392 | /* |
328 | * message template, consisting of header and payload: | 393 | * message template, consisting of header and payload: |
329 | */ | 394 | */ |
330 | struct bau_msg_header header; | 395 | union bau_msg_header { |
331 | struct bau_msg_payload payload; | 396 | struct uv1_bau_msg_header uv1_hdr; |
397 | struct uv2_bau_msg_header uv2_hdr; | ||
398 | } header; | ||
399 | |||
400 | struct bau_msg_payload payload; | ||
332 | }; | 401 | }; |
333 | /* | 402 | /* UV1: |
334 | * -payload-- ---------header------ | 403 | * -payload-- ---------header------ |
335 | * bytes 0-11 bits 41-56 bits 58-81 | 404 | * bytes 0-11 bits 41-56 bits 58-81 |
336 | * A B (2) C (3) | 405 | * A B (2) C (3) |
@@ -340,6 +409,16 @@ struct bau_desc { | |||
340 | * bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) | 409 | * bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) |
341 | * ------------payload queue----------- | 410 | * ------------payload queue----------- |
342 | */ | 411 | */ |
412 | /* UV2: | ||
413 | * -payload-- ---------header------ | ||
414 | * bytes 0-11 bits 70-78 bits 21-44 | ||
415 | * A B (2) C (3) | ||
416 | * | ||
417 | * A/B/C are moved to: | ||
418 | * A C B | ||
419 | * bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) | ||
420 | * ------------payload queue----------- | ||
421 | */ | ||
343 | 422 | ||
344 | /* | 423 | /* |
345 | * The payload queue on the destination side is an array of these. | 424 | * The payload queue on the destination side is an array of these. |
@@ -385,7 +464,6 @@ struct bau_pq_entry { | |||
385 | struct msg_desc { | 464 | struct msg_desc { |
386 | struct bau_pq_entry *msg; | 465 | struct bau_pq_entry *msg; |
387 | int msg_slot; | 466 | int msg_slot; |
388 | int swack_slot; | ||
389 | struct bau_pq_entry *queue_first; | 467 | struct bau_pq_entry *queue_first; |
390 | struct bau_pq_entry *queue_last; | 468 | struct bau_pq_entry *queue_last; |
391 | }; | 469 | }; |
@@ -405,6 +483,7 @@ struct ptc_stats { | |||
405 | requests */ | 483 | requests */ |
406 | unsigned long s_stimeout; /* source side timeouts */ | 484 | unsigned long s_stimeout; /* source side timeouts */ |
407 | unsigned long s_dtimeout; /* destination side timeouts */ | 485 | unsigned long s_dtimeout; /* destination side timeouts */ |
486 | unsigned long s_strongnacks; /* number of strong nack's */ | ||
408 | unsigned long s_time; /* time spent in sending side */ | 487 | unsigned long s_time; /* time spent in sending side */ |
409 | unsigned long s_retriesok; /* successful retries */ | 488 | unsigned long s_retriesok; /* successful retries */ |
410 | unsigned long s_ntargcpu; /* total number of cpu's | 489 | unsigned long s_ntargcpu; /* total number of cpu's |
@@ -439,6 +518,9 @@ struct ptc_stats { | |||
439 | unsigned long s_retry_messages; /* retry broadcasts */ | 518 | unsigned long s_retry_messages; /* retry broadcasts */ |
440 | unsigned long s_bau_reenabled; /* for bau enable/disable */ | 519 | unsigned long s_bau_reenabled; /* for bau enable/disable */ |
441 | unsigned long s_bau_disabled; /* for bau enable/disable */ | 520 | unsigned long s_bau_disabled; /* for bau enable/disable */ |
521 | unsigned long s_uv2_wars; /* uv2 workaround, perm. busy */ | ||
522 | unsigned long s_uv2_wars_hw; /* uv2 workaround, hiwater */ | ||
523 | unsigned long s_uv2_war_waits; /* uv2 workaround, long waits */ | ||
442 | /* destination statistics */ | 524 | /* destination statistics */ |
443 | unsigned long d_alltlb; /* times all tlb's on this | 525 | unsigned long d_alltlb; /* times all tlb's on this |
444 | cpu were flushed */ | 526 | cpu were flushed */ |
@@ -511,9 +593,12 @@ struct bau_control { | |||
511 | short osnode; | 593 | short osnode; |
512 | short uvhub_cpu; | 594 | short uvhub_cpu; |
513 | short uvhub; | 595 | short uvhub; |
596 | short uvhub_version; | ||
514 | short cpus_in_socket; | 597 | short cpus_in_socket; |
515 | short cpus_in_uvhub; | 598 | short cpus_in_uvhub; |
516 | short partition_base_pnode; | 599 | short partition_base_pnode; |
600 | short using_desc; /* an index, like uvhub_cpu */ | ||
601 | unsigned int inuse_map; | ||
517 | unsigned short message_number; | 602 | unsigned short message_number; |
518 | unsigned short uvhub_quiesce; | 603 | unsigned short uvhub_quiesce; |
519 | short socket_acknowledge_count[DEST_Q_SIZE]; | 604 | short socket_acknowledge_count[DEST_Q_SIZE]; |
@@ -531,6 +616,7 @@ struct bau_control { | |||
531 | int cong_response_us; | 616 | int cong_response_us; |
532 | int cong_reps; | 617 | int cong_reps; |
533 | int cong_period; | 618 | int cong_period; |
619 | unsigned long clocks_per_100_usec; | ||
534 | cycles_t period_time; | 620 | cycles_t period_time; |
535 | long period_requests; | 621 | long period_requests; |
536 | struct hub_and_pnode *thp; | 622 | struct hub_and_pnode *thp; |
@@ -591,6 +677,11 @@ static inline void write_mmr_sw_ack(unsigned long mr) | |||
591 | uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr); | 677 | uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr); |
592 | } | 678 | } |
593 | 679 | ||
680 | static inline void write_gmmr_sw_ack(int pnode, unsigned long mr) | ||
681 | { | ||
682 | write_gmmr(pnode, UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr); | ||
683 | } | ||
684 | |||
594 | static inline unsigned long read_mmr_sw_ack(void) | 685 | static inline unsigned long read_mmr_sw_ack(void) |
595 | { | 686 | { |
596 | return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); | 687 | return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index c0dd5b603749..a62c201c97ec 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -290,14 +290,15 @@ static inline int pit_verify_msb(unsigned char val) | |||
290 | static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap) | 290 | static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap) |
291 | { | 291 | { |
292 | int count; | 292 | int count; |
293 | u64 tsc = 0; | 293 | u64 tsc = 0, prev_tsc = 0; |
294 | 294 | ||
295 | for (count = 0; count < 50000; count++) { | 295 | for (count = 0; count < 50000; count++) { |
296 | if (!pit_verify_msb(val)) | 296 | if (!pit_verify_msb(val)) |
297 | break; | 297 | break; |
298 | prev_tsc = tsc; | ||
298 | tsc = get_cycles(); | 299 | tsc = get_cycles(); |
299 | } | 300 | } |
300 | *deltap = get_cycles() - tsc; | 301 | *deltap = get_cycles() - prev_tsc; |
301 | *tscp = tsc; | 302 | *tscp = tsc; |
302 | 303 | ||
303 | /* | 304 | /* |
@@ -311,9 +312,9 @@ static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *de | |||
311 | * How many MSB values do we want to see? We aim for | 312 | * How many MSB values do we want to see? We aim for |
312 | * a maximum error rate of 500ppm (in practice the | 313 | * a maximum error rate of 500ppm (in practice the |
313 | * real error is much smaller), but refuse to spend | 314 | * real error is much smaller), but refuse to spend |
314 | * more than 25ms on it. | 315 | * more than 50ms on it. |
315 | */ | 316 | */ |
316 | #define MAX_QUICK_PIT_MS 25 | 317 | #define MAX_QUICK_PIT_MS 50 |
317 | #define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256) | 318 | #define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256) |
318 | 319 | ||
319 | static unsigned long quick_pit_calibrate(void) | 320 | static unsigned long quick_pit_calibrate(void) |
@@ -383,15 +384,12 @@ success: | |||
383 | * | 384 | * |
384 | * As a result, we can depend on there not being | 385 | * As a result, we can depend on there not being |
385 | * any odd delays anywhere, and the TSC reads are | 386 | * any odd delays anywhere, and the TSC reads are |
386 | * reliable (within the error). We also adjust the | 387 | * reliable (within the error). |
387 | * delta to the middle of the error bars, just | ||
388 | * because it looks nicer. | ||
389 | * | 388 | * |
390 | * kHz = ticks / time-in-seconds / 1000; | 389 | * kHz = ticks / time-in-seconds / 1000; |
391 | * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000 | 390 | * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000 |
392 | * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000) | 391 | * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000) |
393 | */ | 392 | */ |
394 | delta += (long)(d2 - d1)/2; | ||
395 | delta *= PIT_TICK_RATE; | 393 | delta *= PIT_TICK_RATE; |
396 | do_div(delta, i*256*1000); | 394 | do_div(delta, i*256*1000); |
397 | printk("Fast TSC calibration using PIT\n"); | 395 | printk("Fast TSC calibration using PIT\n"); |
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt index 5b83c51c12e0..819137904428 100644 --- a/arch/x86/lib/x86-opcode-map.txt +++ b/arch/x86/lib/x86-opcode-map.txt | |||
@@ -219,7 +219,9 @@ ab: STOS/W/D/Q Yv,rAX | |||
219 | ac: LODS/B AL,Xb | 219 | ac: LODS/B AL,Xb |
220 | ad: LODS/W/D/Q rAX,Xv | 220 | ad: LODS/W/D/Q rAX,Xv |
221 | ae: SCAS/B AL,Yb | 221 | ae: SCAS/B AL,Yb |
222 | af: SCAS/W/D/Q rAX,Xv | 222 | # Note: The May 2011 Intel manual shows Xv for the second parameter of the |
223 | # next instruction but Yv is correct | ||
224 | af: SCAS/W/D/Q rAX,Yv | ||
223 | # 0xb0 - 0xbf | 225 | # 0xb0 - 0xbf |
224 | b0: MOV AL/R8L,Ib | 226 | b0: MOV AL/R8L,Ib |
225 | b1: MOV CL/R9L,Ib | 227 | b1: MOV CL/R9L,Ib |
@@ -729,8 +731,8 @@ de: VAESDEC Vdq,Hdq,Wdq (66),(v1) | |||
729 | df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1) | 731 | df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1) |
730 | f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) | 732 | f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) |
731 | f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) | 733 | f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) |
732 | f3: ANDN Gy,By,Ey (v) | 734 | f2: ANDN Gy,By,Ey (v) |
733 | f4: Grp17 (1A) | 735 | f3: Grp17 (1A) |
734 | f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) | 736 | f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) |
735 | f6: MULX By,Gy,rDX,Ey (F2),(v) | 737 | f6: MULX By,Gy,rDX,Ey (F2),(v) |
736 | f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) | 738 | f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) |
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index 5b552198f774..9be4cff00a2d 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
@@ -157,13 +157,14 @@ static int __init uvhub_to_first_apicid(int uvhub) | |||
157 | * clear of the Timeout bit (as well) will free the resource. No reply will | 157 | * clear of the Timeout bit (as well) will free the resource. No reply will |
158 | * be sent (the hardware will only do one reply per message). | 158 | * be sent (the hardware will only do one reply per message). |
159 | */ | 159 | */ |
160 | static void reply_to_message(struct msg_desc *mdp, struct bau_control *bcp) | 160 | static void reply_to_message(struct msg_desc *mdp, struct bau_control *bcp, |
161 | int do_acknowledge) | ||
161 | { | 162 | { |
162 | unsigned long dw; | 163 | unsigned long dw; |
163 | struct bau_pq_entry *msg; | 164 | struct bau_pq_entry *msg; |
164 | 165 | ||
165 | msg = mdp->msg; | 166 | msg = mdp->msg; |
166 | if (!msg->canceled) { | 167 | if (!msg->canceled && do_acknowledge) { |
167 | dw = (msg->swack_vec << UV_SW_ACK_NPENDING) | msg->swack_vec; | 168 | dw = (msg->swack_vec << UV_SW_ACK_NPENDING) | msg->swack_vec; |
168 | write_mmr_sw_ack(dw); | 169 | write_mmr_sw_ack(dw); |
169 | } | 170 | } |
@@ -212,8 +213,8 @@ static void bau_process_retry_msg(struct msg_desc *mdp, | |||
212 | if (mmr & (msg_res << UV_SW_ACK_NPENDING)) { | 213 | if (mmr & (msg_res << UV_SW_ACK_NPENDING)) { |
213 | unsigned long mr; | 214 | unsigned long mr; |
214 | /* | 215 | /* |
215 | * is the resource timed out? | 216 | * Is the resource timed out? |
216 | * make everyone ignore the cancelled message. | 217 | * Make everyone ignore the cancelled message. |
217 | */ | 218 | */ |
218 | msg2->canceled = 1; | 219 | msg2->canceled = 1; |
219 | stat->d_canceled++; | 220 | stat->d_canceled++; |
@@ -231,8 +232,8 @@ static void bau_process_retry_msg(struct msg_desc *mdp, | |||
231 | * Do all the things a cpu should do for a TLB shootdown message. | 232 | * Do all the things a cpu should do for a TLB shootdown message. |
232 | * Other cpu's may come here at the same time for this message. | 233 | * Other cpu's may come here at the same time for this message. |
233 | */ | 234 | */ |
234 | static void bau_process_message(struct msg_desc *mdp, | 235 | static void bau_process_message(struct msg_desc *mdp, struct bau_control *bcp, |
235 | struct bau_control *bcp) | 236 | int do_acknowledge) |
236 | { | 237 | { |
237 | short socket_ack_count = 0; | 238 | short socket_ack_count = 0; |
238 | short *sp; | 239 | short *sp; |
@@ -284,8 +285,9 @@ static void bau_process_message(struct msg_desc *mdp, | |||
284 | if (msg_ack_count == bcp->cpus_in_uvhub) { | 285 | if (msg_ack_count == bcp->cpus_in_uvhub) { |
285 | /* | 286 | /* |
286 | * All cpus in uvhub saw it; reply | 287 | * All cpus in uvhub saw it; reply |
288 | * (unless we are in the UV2 workaround) | ||
287 | */ | 289 | */ |
288 | reply_to_message(mdp, bcp); | 290 | reply_to_message(mdp, bcp, do_acknowledge); |
289 | } | 291 | } |
290 | } | 292 | } |
291 | 293 | ||
@@ -491,27 +493,138 @@ static int uv1_wait_completion(struct bau_desc *bau_desc, | |||
491 | /* | 493 | /* |
492 | * UV2 has an extra bit of status in the ACTIVATION_STATUS_2 register. | 494 | * UV2 has an extra bit of status in the ACTIVATION_STATUS_2 register. |
493 | */ | 495 | */ |
494 | static unsigned long uv2_read_status(unsigned long offset, int rshft, int cpu) | 496 | static unsigned long uv2_read_status(unsigned long offset, int rshft, int desc) |
495 | { | 497 | { |
496 | unsigned long descriptor_status; | 498 | unsigned long descriptor_status; |
497 | unsigned long descriptor_status2; | 499 | unsigned long descriptor_status2; |
498 | 500 | ||
499 | descriptor_status = ((read_lmmr(offset) >> rshft) & UV_ACT_STATUS_MASK); | 501 | descriptor_status = ((read_lmmr(offset) >> rshft) & UV_ACT_STATUS_MASK); |
500 | descriptor_status2 = (read_mmr_uv2_status() >> cpu) & 0x1UL; | 502 | descriptor_status2 = (read_mmr_uv2_status() >> desc) & 0x1UL; |
501 | descriptor_status = (descriptor_status << 1) | descriptor_status2; | 503 | descriptor_status = (descriptor_status << 1) | descriptor_status2; |
502 | return descriptor_status; | 504 | return descriptor_status; |
503 | } | 505 | } |
504 | 506 | ||
507 | /* | ||
508 | * Return whether the status of the descriptor that is normally used for this | ||
509 | * cpu (the one indexed by its hub-relative cpu number) is busy. | ||
510 | * The status of the original 32 descriptors is always reflected in the 64 | ||
511 | * bits of UVH_LB_BAU_SB_ACTIVATION_STATUS_0. | ||
512 | * The bit provided by the activation_status_2 register is irrelevant to | ||
513 | * the status if it is only being tested for busy or not busy. | ||
514 | */ | ||
515 | int normal_busy(struct bau_control *bcp) | ||
516 | { | ||
517 | int cpu = bcp->uvhub_cpu; | ||
518 | int mmr_offset; | ||
519 | int right_shift; | ||
520 | |||
521 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0; | ||
522 | right_shift = cpu * UV_ACT_STATUS_SIZE; | ||
523 | return (((((read_lmmr(mmr_offset) >> right_shift) & | ||
524 | UV_ACT_STATUS_MASK)) << 1) == UV2H_DESC_BUSY); | ||
525 | } | ||
526 | |||
527 | /* | ||
528 | * Entered when a bau descriptor has gone into a permanent busy wait because | ||
529 | * of a hardware bug. | ||
530 | * Workaround the bug. | ||
531 | */ | ||
532 | int handle_uv2_busy(struct bau_control *bcp) | ||
533 | { | ||
534 | int busy_one = bcp->using_desc; | ||
535 | int normal = bcp->uvhub_cpu; | ||
536 | int selected = -1; | ||
537 | int i; | ||
538 | unsigned long descriptor_status; | ||
539 | unsigned long status; | ||
540 | int mmr_offset; | ||
541 | struct bau_desc *bau_desc_old; | ||
542 | struct bau_desc *bau_desc_new; | ||
543 | struct bau_control *hmaster = bcp->uvhub_master; | ||
544 | struct ptc_stats *stat = bcp->statp; | ||
545 | cycles_t ttm; | ||
546 | |||
547 | stat->s_uv2_wars++; | ||
548 | spin_lock(&hmaster->uvhub_lock); | ||
549 | /* try for the original first */ | ||
550 | if (busy_one != normal) { | ||
551 | if (!normal_busy(bcp)) | ||
552 | selected = normal; | ||
553 | } | ||
554 | if (selected < 0) { | ||
555 | /* can't use the normal, select an alternate */ | ||
556 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1; | ||
557 | descriptor_status = read_lmmr(mmr_offset); | ||
558 | |||
559 | /* scan available descriptors 32-63 */ | ||
560 | for (i = 0; i < UV_CPUS_PER_AS; i++) { | ||
561 | if ((hmaster->inuse_map & (1 << i)) == 0) { | ||
562 | status = ((descriptor_status >> | ||
563 | (i * UV_ACT_STATUS_SIZE)) & | ||
564 | UV_ACT_STATUS_MASK) << 1; | ||
565 | if (status != UV2H_DESC_BUSY) { | ||
566 | selected = i + UV_CPUS_PER_AS; | ||
567 | break; | ||
568 | } | ||
569 | } | ||
570 | } | ||
571 | } | ||
572 | |||
573 | if (busy_one != normal) | ||
574 | /* mark the busy alternate as not in-use */ | ||
575 | hmaster->inuse_map &= ~(1 << (busy_one - UV_CPUS_PER_AS)); | ||
576 | |||
577 | if (selected >= 0) { | ||
578 | /* switch to the selected descriptor */ | ||
579 | if (selected != normal) { | ||
580 | /* set the selected alternate as in-use */ | ||
581 | hmaster->inuse_map |= | ||
582 | (1 << (selected - UV_CPUS_PER_AS)); | ||
583 | if (selected > stat->s_uv2_wars_hw) | ||
584 | stat->s_uv2_wars_hw = selected; | ||
585 | } | ||
586 | bau_desc_old = bcp->descriptor_base; | ||
587 | bau_desc_old += (ITEMS_PER_DESC * busy_one); | ||
588 | bcp->using_desc = selected; | ||
589 | bau_desc_new = bcp->descriptor_base; | ||
590 | bau_desc_new += (ITEMS_PER_DESC * selected); | ||
591 | *bau_desc_new = *bau_desc_old; | ||
592 | } else { | ||
593 | /* | ||
594 | * All are busy. Wait for the normal one for this cpu to | ||
595 | * free up. | ||
596 | */ | ||
597 | stat->s_uv2_war_waits++; | ||
598 | spin_unlock(&hmaster->uvhub_lock); | ||
599 | ttm = get_cycles(); | ||
600 | do { | ||
601 | cpu_relax(); | ||
602 | } while (normal_busy(bcp)); | ||
603 | spin_lock(&hmaster->uvhub_lock); | ||
604 | /* switch to the original descriptor */ | ||
605 | bcp->using_desc = normal; | ||
606 | bau_desc_old = bcp->descriptor_base; | ||
607 | bau_desc_old += (ITEMS_PER_DESC * bcp->using_desc); | ||
608 | bcp->using_desc = (ITEMS_PER_DESC * normal); | ||
609 | bau_desc_new = bcp->descriptor_base; | ||
610 | bau_desc_new += (ITEMS_PER_DESC * normal); | ||
611 | *bau_desc_new = *bau_desc_old; /* copy the entire descriptor */ | ||
612 | } | ||
613 | spin_unlock(&hmaster->uvhub_lock); | ||
614 | return FLUSH_RETRY_BUSYBUG; | ||
615 | } | ||
616 | |||
505 | static int uv2_wait_completion(struct bau_desc *bau_desc, | 617 | static int uv2_wait_completion(struct bau_desc *bau_desc, |
506 | unsigned long mmr_offset, int right_shift, | 618 | unsigned long mmr_offset, int right_shift, |
507 | struct bau_control *bcp, long try) | 619 | struct bau_control *bcp, long try) |
508 | { | 620 | { |
509 | unsigned long descriptor_stat; | 621 | unsigned long descriptor_stat; |
510 | cycles_t ttm; | 622 | cycles_t ttm; |
511 | int cpu = bcp->uvhub_cpu; | 623 | int desc = bcp->using_desc; |
624 | long busy_reps = 0; | ||
512 | struct ptc_stats *stat = bcp->statp; | 625 | struct ptc_stats *stat = bcp->statp; |
513 | 626 | ||
514 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu); | 627 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, desc); |
515 | 628 | ||
516 | /* spin on the status MMR, waiting for it to go idle */ | 629 | /* spin on the status MMR, waiting for it to go idle */ |
517 | while (descriptor_stat != UV2H_DESC_IDLE) { | 630 | while (descriptor_stat != UV2H_DESC_IDLE) { |
@@ -522,32 +635,35 @@ static int uv2_wait_completion(struct bau_desc *bau_desc, | |||
522 | * our message and its state will stay IDLE. | 635 | * our message and its state will stay IDLE. |
523 | */ | 636 | */ |
524 | if ((descriptor_stat == UV2H_DESC_SOURCE_TIMEOUT) || | 637 | if ((descriptor_stat == UV2H_DESC_SOURCE_TIMEOUT) || |
525 | (descriptor_stat == UV2H_DESC_DEST_STRONG_NACK) || | ||
526 | (descriptor_stat == UV2H_DESC_DEST_PUT_ERR)) { | 638 | (descriptor_stat == UV2H_DESC_DEST_PUT_ERR)) { |
527 | stat->s_stimeout++; | 639 | stat->s_stimeout++; |
528 | return FLUSH_GIVEUP; | 640 | return FLUSH_GIVEUP; |
641 | } else if (descriptor_stat == UV2H_DESC_DEST_STRONG_NACK) { | ||
642 | stat->s_strongnacks++; | ||
643 | bcp->conseccompletes = 0; | ||
644 | return FLUSH_GIVEUP; | ||
529 | } else if (descriptor_stat == UV2H_DESC_DEST_TIMEOUT) { | 645 | } else if (descriptor_stat == UV2H_DESC_DEST_TIMEOUT) { |
530 | stat->s_dtimeout++; | 646 | stat->s_dtimeout++; |
531 | ttm = get_cycles(); | ||
532 | /* | ||
533 | * Our retries may be blocked by all destination | ||
534 | * swack resources being consumed, and a timeout | ||
535 | * pending. In that case hardware returns the | ||
536 | * ERROR that looks like a destination timeout. | ||
537 | */ | ||
538 | if (cycles_2_us(ttm - bcp->send_message) < timeout_us) { | ||
539 | bcp->conseccompletes = 0; | ||
540 | return FLUSH_RETRY_PLUGGED; | ||
541 | } | ||
542 | bcp->conseccompletes = 0; | 647 | bcp->conseccompletes = 0; |
543 | return FLUSH_RETRY_TIMEOUT; | 648 | return FLUSH_RETRY_TIMEOUT; |
544 | } else { | 649 | } else { |
650 | busy_reps++; | ||
651 | if (busy_reps > 1000000) { | ||
652 | /* not to hammer on the clock */ | ||
653 | busy_reps = 0; | ||
654 | ttm = get_cycles(); | ||
655 | if ((ttm - bcp->send_message) > | ||
656 | (bcp->clocks_per_100_usec)) { | ||
657 | return handle_uv2_busy(bcp); | ||
658 | } | ||
659 | } | ||
545 | /* | 660 | /* |
546 | * descriptor_stat is still BUSY | 661 | * descriptor_stat is still BUSY |
547 | */ | 662 | */ |
548 | cpu_relax(); | 663 | cpu_relax(); |
549 | } | 664 | } |
550 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu); | 665 | descriptor_stat = uv2_read_status(mmr_offset, right_shift, |
666 | desc); | ||
551 | } | 667 | } |
552 | bcp->conseccompletes++; | 668 | bcp->conseccompletes++; |
553 | return FLUSH_COMPLETE; | 669 | return FLUSH_COMPLETE; |
@@ -563,17 +679,17 @@ static int wait_completion(struct bau_desc *bau_desc, | |||
563 | { | 679 | { |
564 | int right_shift; | 680 | int right_shift; |
565 | unsigned long mmr_offset; | 681 | unsigned long mmr_offset; |
566 | int cpu = bcp->uvhub_cpu; | 682 | int desc = bcp->using_desc; |
567 | 683 | ||
568 | if (cpu < UV_CPUS_PER_AS) { | 684 | if (desc < UV_CPUS_PER_AS) { |
569 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0; | 685 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0; |
570 | right_shift = cpu * UV_ACT_STATUS_SIZE; | 686 | right_shift = desc * UV_ACT_STATUS_SIZE; |
571 | } else { | 687 | } else { |
572 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1; | 688 | mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1; |
573 | right_shift = ((cpu - UV_CPUS_PER_AS) * UV_ACT_STATUS_SIZE); | 689 | right_shift = ((desc - UV_CPUS_PER_AS) * UV_ACT_STATUS_SIZE); |
574 | } | 690 | } |
575 | 691 | ||
576 | if (is_uv1_hub()) | 692 | if (bcp->uvhub_version == 1) |
577 | return uv1_wait_completion(bau_desc, mmr_offset, right_shift, | 693 | return uv1_wait_completion(bau_desc, mmr_offset, right_shift, |
578 | bcp, try); | 694 | bcp, try); |
579 | else | 695 | else |
@@ -752,19 +868,22 @@ static void handle_cmplt(int completion_status, struct bau_desc *bau_desc, | |||
752 | * Returns 1 if it gives up entirely and the original cpu mask is to be | 868 | * Returns 1 if it gives up entirely and the original cpu mask is to be |
753 | * returned to the kernel. | 869 | * returned to the kernel. |
754 | */ | 870 | */ |
755 | int uv_flush_send_and_wait(struct bau_desc *bau_desc, | 871 | int uv_flush_send_and_wait(struct cpumask *flush_mask, struct bau_control *bcp) |
756 | struct cpumask *flush_mask, struct bau_control *bcp) | ||
757 | { | 872 | { |
758 | int seq_number = 0; | 873 | int seq_number = 0; |
759 | int completion_stat = 0; | 874 | int completion_stat = 0; |
875 | int uv1 = 0; | ||
760 | long try = 0; | 876 | long try = 0; |
761 | unsigned long index; | 877 | unsigned long index; |
762 | cycles_t time1; | 878 | cycles_t time1; |
763 | cycles_t time2; | 879 | cycles_t time2; |
764 | struct ptc_stats *stat = bcp->statp; | 880 | struct ptc_stats *stat = bcp->statp; |
765 | struct bau_control *hmaster = bcp->uvhub_master; | 881 | struct bau_control *hmaster = bcp->uvhub_master; |
882 | struct uv1_bau_msg_header *uv1_hdr = NULL; | ||
883 | struct uv2_bau_msg_header *uv2_hdr = NULL; | ||
884 | struct bau_desc *bau_desc; | ||
766 | 885 | ||
767 | if (is_uv1_hub()) | 886 | if (bcp->uvhub_version == 1) |
768 | uv1_throttle(hmaster, stat); | 887 | uv1_throttle(hmaster, stat); |
769 | 888 | ||
770 | while (hmaster->uvhub_quiesce) | 889 | while (hmaster->uvhub_quiesce) |
@@ -772,22 +891,39 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc, | |||
772 | 891 | ||
773 | time1 = get_cycles(); | 892 | time1 = get_cycles(); |
774 | do { | 893 | do { |
775 | if (try == 0) { | 894 | bau_desc = bcp->descriptor_base; |
776 | bau_desc->header.msg_type = MSG_REGULAR; | 895 | bau_desc += (ITEMS_PER_DESC * bcp->using_desc); |
896 | if (bcp->uvhub_version == 1) { | ||
897 | uv1 = 1; | ||
898 | uv1_hdr = &bau_desc->header.uv1_hdr; | ||
899 | } else | ||
900 | uv2_hdr = &bau_desc->header.uv2_hdr; | ||
901 | if ((try == 0) || (completion_stat == FLUSH_RETRY_BUSYBUG)) { | ||
902 | if (uv1) | ||
903 | uv1_hdr->msg_type = MSG_REGULAR; | ||
904 | else | ||
905 | uv2_hdr->msg_type = MSG_REGULAR; | ||
777 | seq_number = bcp->message_number++; | 906 | seq_number = bcp->message_number++; |
778 | } else { | 907 | } else { |
779 | bau_desc->header.msg_type = MSG_RETRY; | 908 | if (uv1) |
909 | uv1_hdr->msg_type = MSG_RETRY; | ||
910 | else | ||
911 | uv2_hdr->msg_type = MSG_RETRY; | ||
780 | stat->s_retry_messages++; | 912 | stat->s_retry_messages++; |
781 | } | 913 | } |
782 | 914 | ||
783 | bau_desc->header.sequence = seq_number; | 915 | if (uv1) |
784 | index = (1UL << AS_PUSH_SHIFT) | bcp->uvhub_cpu; | 916 | uv1_hdr->sequence = seq_number; |
917 | else | ||
918 | uv2_hdr->sequence = seq_number; | ||
919 | index = (1UL << AS_PUSH_SHIFT) | bcp->using_desc; | ||
785 | bcp->send_message = get_cycles(); | 920 | bcp->send_message = get_cycles(); |
786 | 921 | ||
787 | write_mmr_activation(index); | 922 | write_mmr_activation(index); |
788 | 923 | ||
789 | try++; | 924 | try++; |
790 | completion_stat = wait_completion(bau_desc, bcp, try); | 925 | completion_stat = wait_completion(bau_desc, bcp, try); |
926 | /* UV2: wait_completion() may change the bcp->using_desc */ | ||
791 | 927 | ||
792 | handle_cmplt(completion_stat, bau_desc, bcp, hmaster, stat); | 928 | handle_cmplt(completion_stat, bau_desc, bcp, hmaster, stat); |
793 | 929 | ||
@@ -798,6 +934,7 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc, | |||
798 | } | 934 | } |
799 | cpu_relax(); | 935 | cpu_relax(); |
800 | } while ((completion_stat == FLUSH_RETRY_PLUGGED) || | 936 | } while ((completion_stat == FLUSH_RETRY_PLUGGED) || |
937 | (completion_stat == FLUSH_RETRY_BUSYBUG) || | ||
801 | (completion_stat == FLUSH_RETRY_TIMEOUT)); | 938 | (completion_stat == FLUSH_RETRY_TIMEOUT)); |
802 | 939 | ||
803 | time2 = get_cycles(); | 940 | time2 = get_cycles(); |
@@ -812,6 +949,7 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc, | |||
812 | record_send_stats(time1, time2, bcp, stat, completion_stat, try); | 949 | record_send_stats(time1, time2, bcp, stat, completion_stat, try); |
813 | 950 | ||
814 | if (completion_stat == FLUSH_GIVEUP) | 951 | if (completion_stat == FLUSH_GIVEUP) |
952 | /* FLUSH_GIVEUP will fall back to using IPI's for tlb flush */ | ||
815 | return 1; | 953 | return 1; |
816 | return 0; | 954 | return 0; |
817 | } | 955 | } |
@@ -967,7 +1105,7 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
967 | stat->s_ntargself++; | 1105 | stat->s_ntargself++; |
968 | 1106 | ||
969 | bau_desc = bcp->descriptor_base; | 1107 | bau_desc = bcp->descriptor_base; |
970 | bau_desc += ITEMS_PER_DESC * bcp->uvhub_cpu; | 1108 | bau_desc += (ITEMS_PER_DESC * bcp->using_desc); |
971 | bau_uvhubs_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); | 1109 | bau_uvhubs_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); |
972 | if (set_distrib_bits(flush_mask, bcp, bau_desc, &locals, &remotes)) | 1110 | if (set_distrib_bits(flush_mask, bcp, bau_desc, &locals, &remotes)) |
973 | return NULL; | 1111 | return NULL; |
@@ -980,13 +1118,86 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
980 | * uv_flush_send_and_wait returns 0 if all cpu's were messaged, | 1118 | * uv_flush_send_and_wait returns 0 if all cpu's were messaged, |
981 | * or 1 if it gave up and the original cpumask should be returned. | 1119 | * or 1 if it gave up and the original cpumask should be returned. |
982 | */ | 1120 | */ |
983 | if (!uv_flush_send_and_wait(bau_desc, flush_mask, bcp)) | 1121 | if (!uv_flush_send_and_wait(flush_mask, bcp)) |
984 | return NULL; | 1122 | return NULL; |
985 | else | 1123 | else |
986 | return cpumask; | 1124 | return cpumask; |
987 | } | 1125 | } |
988 | 1126 | ||
989 | /* | 1127 | /* |
1128 | * Search the message queue for any 'other' message with the same software | ||
1129 | * acknowledge resource bit vector. | ||
1130 | */ | ||
1131 | struct bau_pq_entry *find_another_by_swack(struct bau_pq_entry *msg, | ||
1132 | struct bau_control *bcp, unsigned char swack_vec) | ||
1133 | { | ||
1134 | struct bau_pq_entry *msg_next = msg + 1; | ||
1135 | |||
1136 | if (msg_next > bcp->queue_last) | ||
1137 | msg_next = bcp->queue_first; | ||
1138 | while ((msg_next->swack_vec != 0) && (msg_next != msg)) { | ||
1139 | if (msg_next->swack_vec == swack_vec) | ||
1140 | return msg_next; | ||
1141 | msg_next++; | ||
1142 | if (msg_next > bcp->queue_last) | ||
1143 | msg_next = bcp->queue_first; | ||
1144 | } | ||
1145 | return NULL; | ||
1146 | } | ||
1147 | |||
1148 | /* | ||
1149 | * UV2 needs to work around a bug in which an arriving message has not | ||
1150 | * set a bit in the UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE register. | ||
1151 | * Such a message must be ignored. | ||
1152 | */ | ||
1153 | void process_uv2_message(struct msg_desc *mdp, struct bau_control *bcp) | ||
1154 | { | ||
1155 | unsigned long mmr_image; | ||
1156 | unsigned char swack_vec; | ||
1157 | struct bau_pq_entry *msg = mdp->msg; | ||
1158 | struct bau_pq_entry *other_msg; | ||
1159 | |||
1160 | mmr_image = read_mmr_sw_ack(); | ||
1161 | swack_vec = msg->swack_vec; | ||
1162 | |||
1163 | if ((swack_vec & mmr_image) == 0) { | ||
1164 | /* | ||
1165 | * This message was assigned a swack resource, but no | ||
1166 | * reserved acknowlegment is pending. | ||
1167 | * The bug has prevented this message from setting the MMR. | ||
1168 | * And no other message has used the same sw_ack resource. | ||
1169 | * Do the requested shootdown but do not reply to the msg. | ||
1170 | * (the 0 means make no acknowledge) | ||
1171 | */ | ||
1172 | bau_process_message(mdp, bcp, 0); | ||
1173 | return; | ||
1174 | } | ||
1175 | |||
1176 | /* | ||
1177 | * Some message has set the MMR 'pending' bit; it might have been | ||
1178 | * another message. Look for that message. | ||
1179 | */ | ||
1180 | other_msg = find_another_by_swack(msg, bcp, msg->swack_vec); | ||
1181 | if (other_msg) { | ||
1182 | /* There is another. Do not ack the current one. */ | ||
1183 | bau_process_message(mdp, bcp, 0); | ||
1184 | /* | ||
1185 | * Let the natural processing of that message acknowledge | ||
1186 | * it. Don't get the processing of sw_ack's out of order. | ||
1187 | */ | ||
1188 | return; | ||
1189 | } | ||
1190 | |||
1191 | /* | ||
1192 | * There is no other message using this sw_ack, so it is safe to | ||
1193 | * acknowledge it. | ||
1194 | */ | ||
1195 | bau_process_message(mdp, bcp, 1); | ||
1196 | |||
1197 | return; | ||
1198 | } | ||
1199 | |||
1200 | /* | ||
990 | * The BAU message interrupt comes here. (registered by set_intr_gate) | 1201 | * The BAU message interrupt comes here. (registered by set_intr_gate) |
991 | * See entry_64.S | 1202 | * See entry_64.S |
992 | * | 1203 | * |
@@ -1009,6 +1220,7 @@ void uv_bau_message_interrupt(struct pt_regs *regs) | |||
1009 | struct ptc_stats *stat; | 1220 | struct ptc_stats *stat; |
1010 | struct msg_desc msgdesc; | 1221 | struct msg_desc msgdesc; |
1011 | 1222 | ||
1223 | ack_APIC_irq(); | ||
1012 | time_start = get_cycles(); | 1224 | time_start = get_cycles(); |
1013 | 1225 | ||
1014 | bcp = &per_cpu(bau_control, smp_processor_id()); | 1226 | bcp = &per_cpu(bau_control, smp_processor_id()); |
@@ -1022,9 +1234,11 @@ void uv_bau_message_interrupt(struct pt_regs *regs) | |||
1022 | count++; | 1234 | count++; |
1023 | 1235 | ||
1024 | msgdesc.msg_slot = msg - msgdesc.queue_first; | 1236 | msgdesc.msg_slot = msg - msgdesc.queue_first; |
1025 | msgdesc.swack_slot = ffs(msg->swack_vec) - 1; | ||
1026 | msgdesc.msg = msg; | 1237 | msgdesc.msg = msg; |
1027 | bau_process_message(&msgdesc, bcp); | 1238 | if (bcp->uvhub_version == 2) |
1239 | process_uv2_message(&msgdesc, bcp); | ||
1240 | else | ||
1241 | bau_process_message(&msgdesc, bcp, 1); | ||
1028 | 1242 | ||
1029 | msg++; | 1243 | msg++; |
1030 | if (msg > msgdesc.queue_last) | 1244 | if (msg > msgdesc.queue_last) |
@@ -1036,8 +1250,6 @@ void uv_bau_message_interrupt(struct pt_regs *regs) | |||
1036 | stat->d_nomsg++; | 1250 | stat->d_nomsg++; |
1037 | else if (count > 1) | 1251 | else if (count > 1) |
1038 | stat->d_multmsg++; | 1252 | stat->d_multmsg++; |
1039 | |||
1040 | ack_APIC_irq(); | ||
1041 | } | 1253 | } |
1042 | 1254 | ||
1043 | /* | 1255 | /* |
@@ -1083,7 +1295,7 @@ static void __init enable_timeouts(void) | |||
1083 | */ | 1295 | */ |
1084 | mmr_image |= (1L << SOFTACK_MSHIFT); | 1296 | mmr_image |= (1L << SOFTACK_MSHIFT); |
1085 | if (is_uv2_hub()) { | 1297 | if (is_uv2_hub()) { |
1086 | mmr_image |= (1L << UV2_LEG_SHFT); | 1298 | mmr_image &= ~(1L << UV2_LEG_SHFT); |
1087 | mmr_image |= (1L << UV2_EXT_SHFT); | 1299 | mmr_image |= (1L << UV2_EXT_SHFT); |
1088 | } | 1300 | } |
1089 | write_mmr_misc_control(pnode, mmr_image); | 1301 | write_mmr_misc_control(pnode, mmr_image); |
@@ -1136,13 +1348,13 @@ static int ptc_seq_show(struct seq_file *file, void *data) | |||
1136 | seq_printf(file, | 1348 | seq_printf(file, |
1137 | "remotehub numuvhubs numuvhubs16 numuvhubs8 "); | 1349 | "remotehub numuvhubs numuvhubs16 numuvhubs8 "); |
1138 | seq_printf(file, | 1350 | seq_printf(file, |
1139 | "numuvhubs4 numuvhubs2 numuvhubs1 dto retries rok "); | 1351 | "numuvhubs4 numuvhubs2 numuvhubs1 dto snacks retries rok "); |
1140 | seq_printf(file, | 1352 | seq_printf(file, |
1141 | "resetp resett giveup sto bz throt swack recv rtime "); | 1353 | "resetp resett giveup sto bz throt swack recv rtime "); |
1142 | seq_printf(file, | 1354 | seq_printf(file, |
1143 | "all one mult none retry canc nocan reset rcan "); | 1355 | "all one mult none retry canc nocan reset rcan "); |
1144 | seq_printf(file, | 1356 | seq_printf(file, |
1145 | "disable enable\n"); | 1357 | "disable enable wars warshw warwaits\n"); |
1146 | } | 1358 | } |
1147 | if (cpu < num_possible_cpus() && cpu_online(cpu)) { | 1359 | if (cpu < num_possible_cpus() && cpu_online(cpu)) { |
1148 | stat = &per_cpu(ptcstats, cpu); | 1360 | stat = &per_cpu(ptcstats, cpu); |
@@ -1154,10 +1366,10 @@ static int ptc_seq_show(struct seq_file *file, void *data) | |||
1154 | stat->s_ntargremotes, stat->s_ntargcpu, | 1366 | stat->s_ntargremotes, stat->s_ntargcpu, |
1155 | stat->s_ntarglocaluvhub, stat->s_ntargremoteuvhub, | 1367 | stat->s_ntarglocaluvhub, stat->s_ntargremoteuvhub, |
1156 | stat->s_ntarguvhub, stat->s_ntarguvhub16); | 1368 | stat->s_ntarguvhub, stat->s_ntarguvhub16); |
1157 | seq_printf(file, "%ld %ld %ld %ld %ld ", | 1369 | seq_printf(file, "%ld %ld %ld %ld %ld %ld ", |
1158 | stat->s_ntarguvhub8, stat->s_ntarguvhub4, | 1370 | stat->s_ntarguvhub8, stat->s_ntarguvhub4, |
1159 | stat->s_ntarguvhub2, stat->s_ntarguvhub1, | 1371 | stat->s_ntarguvhub2, stat->s_ntarguvhub1, |
1160 | stat->s_dtimeout); | 1372 | stat->s_dtimeout, stat->s_strongnacks); |
1161 | seq_printf(file, "%ld %ld %ld %ld %ld %ld %ld %ld ", | 1373 | seq_printf(file, "%ld %ld %ld %ld %ld %ld %ld %ld ", |
1162 | stat->s_retry_messages, stat->s_retriesok, | 1374 | stat->s_retry_messages, stat->s_retriesok, |
1163 | stat->s_resets_plug, stat->s_resets_timeout, | 1375 | stat->s_resets_plug, stat->s_resets_timeout, |
@@ -1173,8 +1385,10 @@ static int ptc_seq_show(struct seq_file *file, void *data) | |||
1173 | stat->d_nomsg, stat->d_retries, stat->d_canceled, | 1385 | stat->d_nomsg, stat->d_retries, stat->d_canceled, |
1174 | stat->d_nocanceled, stat->d_resets, | 1386 | stat->d_nocanceled, stat->d_resets, |
1175 | stat->d_rcanceled); | 1387 | stat->d_rcanceled); |
1176 | seq_printf(file, "%ld %ld\n", | 1388 | seq_printf(file, "%ld %ld %ld %ld %ld\n", |
1177 | stat->s_bau_disabled, stat->s_bau_reenabled); | 1389 | stat->s_bau_disabled, stat->s_bau_reenabled, |
1390 | stat->s_uv2_wars, stat->s_uv2_wars_hw, | ||
1391 | stat->s_uv2_war_waits); | ||
1178 | } | 1392 | } |
1179 | return 0; | 1393 | return 0; |
1180 | } | 1394 | } |
@@ -1432,12 +1646,15 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode) | |||
1432 | { | 1646 | { |
1433 | int i; | 1647 | int i; |
1434 | int cpu; | 1648 | int cpu; |
1649 | int uv1 = 0; | ||
1435 | unsigned long gpa; | 1650 | unsigned long gpa; |
1436 | unsigned long m; | 1651 | unsigned long m; |
1437 | unsigned long n; | 1652 | unsigned long n; |
1438 | size_t dsize; | 1653 | size_t dsize; |
1439 | struct bau_desc *bau_desc; | 1654 | struct bau_desc *bau_desc; |
1440 | struct bau_desc *bd2; | 1655 | struct bau_desc *bd2; |
1656 | struct uv1_bau_msg_header *uv1_hdr; | ||
1657 | struct uv2_bau_msg_header *uv2_hdr; | ||
1441 | struct bau_control *bcp; | 1658 | struct bau_control *bcp; |
1442 | 1659 | ||
1443 | /* | 1660 | /* |
@@ -1451,6 +1668,8 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode) | |||
1451 | gpa = uv_gpa(bau_desc); | 1668 | gpa = uv_gpa(bau_desc); |
1452 | n = uv_gpa_to_gnode(gpa); | 1669 | n = uv_gpa_to_gnode(gpa); |
1453 | m = uv_gpa_to_offset(gpa); | 1670 | m = uv_gpa_to_offset(gpa); |
1671 | if (is_uv1_hub()) | ||
1672 | uv1 = 1; | ||
1454 | 1673 | ||
1455 | /* the 14-bit pnode */ | 1674 | /* the 14-bit pnode */ |
1456 | write_mmr_descriptor_base(pnode, (n << UV_DESC_PSHIFT | m)); | 1675 | write_mmr_descriptor_base(pnode, (n << UV_DESC_PSHIFT | m)); |
@@ -1461,21 +1680,33 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode) | |||
1461 | */ | 1680 | */ |
1462 | for (i = 0, bd2 = bau_desc; i < (ADP_SZ * ITEMS_PER_DESC); i++, bd2++) { | 1681 | for (i = 0, bd2 = bau_desc; i < (ADP_SZ * ITEMS_PER_DESC); i++, bd2++) { |
1463 | memset(bd2, 0, sizeof(struct bau_desc)); | 1682 | memset(bd2, 0, sizeof(struct bau_desc)); |
1464 | bd2->header.swack_flag = 1; | 1683 | if (uv1) { |
1465 | /* | 1684 | uv1_hdr = &bd2->header.uv1_hdr; |
1466 | * The base_dest_nasid set in the message header is the nasid | 1685 | uv1_hdr->swack_flag = 1; |
1467 | * of the first uvhub in the partition. The bit map will | 1686 | /* |
1468 | * indicate destination pnode numbers relative to that base. | 1687 | * The base_dest_nasid set in the message header |
1469 | * They may not be consecutive if nasid striding is being used. | 1688 | * is the nasid of the first uvhub in the partition. |
1470 | */ | 1689 | * The bit map will indicate destination pnode numbers |
1471 | bd2->header.base_dest_nasid = UV_PNODE_TO_NASID(base_pnode); | 1690 | * relative to that base. They may not be consecutive |
1472 | bd2->header.dest_subnodeid = UV_LB_SUBNODEID; | 1691 | * if nasid striding is being used. |
1473 | bd2->header.command = UV_NET_ENDPOINT_INTD; | 1692 | */ |
1474 | bd2->header.int_both = 1; | 1693 | uv1_hdr->base_dest_nasid = |
1475 | /* | 1694 | UV_PNODE_TO_NASID(base_pnode); |
1476 | * all others need to be set to zero: | 1695 | uv1_hdr->dest_subnodeid = UV_LB_SUBNODEID; |
1477 | * fairness chaining multilevel count replied_to | 1696 | uv1_hdr->command = UV_NET_ENDPOINT_INTD; |
1478 | */ | 1697 | uv1_hdr->int_both = 1; |
1698 | /* | ||
1699 | * all others need to be set to zero: | ||
1700 | * fairness chaining multilevel count replied_to | ||
1701 | */ | ||
1702 | } else { | ||
1703 | uv2_hdr = &bd2->header.uv2_hdr; | ||
1704 | uv2_hdr->swack_flag = 1; | ||
1705 | uv2_hdr->base_dest_nasid = | ||
1706 | UV_PNODE_TO_NASID(base_pnode); | ||
1707 | uv2_hdr->dest_subnodeid = UV_LB_SUBNODEID; | ||
1708 | uv2_hdr->command = UV_NET_ENDPOINT_INTD; | ||
1709 | } | ||
1479 | } | 1710 | } |
1480 | for_each_present_cpu(cpu) { | 1711 | for_each_present_cpu(cpu) { |
1481 | if (pnode != uv_blade_to_pnode(uv_cpu_to_blade_id(cpu))) | 1712 | if (pnode != uv_blade_to_pnode(uv_cpu_to_blade_id(cpu))) |
@@ -1531,6 +1762,7 @@ static void pq_init(int node, int pnode) | |||
1531 | write_mmr_payload_first(pnode, pn_first); | 1762 | write_mmr_payload_first(pnode, pn_first); |
1532 | write_mmr_payload_tail(pnode, first); | 1763 | write_mmr_payload_tail(pnode, first); |
1533 | write_mmr_payload_last(pnode, last); | 1764 | write_mmr_payload_last(pnode, last); |
1765 | write_gmmr_sw_ack(pnode, 0xffffUL); | ||
1534 | 1766 | ||
1535 | /* in effect, all msg_type's are set to MSG_NOOP */ | 1767 | /* in effect, all msg_type's are set to MSG_NOOP */ |
1536 | memset(pqp, 0, sizeof(struct bau_pq_entry) * DEST_Q_SIZE); | 1768 | memset(pqp, 0, sizeof(struct bau_pq_entry) * DEST_Q_SIZE); |
@@ -1584,14 +1816,14 @@ static int calculate_destination_timeout(void) | |||
1584 | ts_ns = base * mult1 * mult2; | 1816 | ts_ns = base * mult1 * mult2; |
1585 | ret = ts_ns / 1000; | 1817 | ret = ts_ns / 1000; |
1586 | } else { | 1818 | } else { |
1587 | /* 4 bits 0/1 for 10/80us, 3 bits of multiplier */ | 1819 | /* 4 bits 0/1 for 10/80us base, 3 bits of multiplier */ |
1588 | mmr_image = uv_read_local_mmr(UVH_AGING_PRESCALE_SEL); | 1820 | mmr_image = uv_read_local_mmr(UVH_LB_BAU_MISC_CONTROL); |
1589 | mmr_image = (mmr_image & UV_SA_MASK) >> UV_SA_SHFT; | 1821 | mmr_image = (mmr_image & UV_SA_MASK) >> UV_SA_SHFT; |
1590 | if (mmr_image & (1L << UV2_ACK_UNITS_SHFT)) | 1822 | if (mmr_image & (1L << UV2_ACK_UNITS_SHFT)) |
1591 | mult1 = 80; | 1823 | base = 80; |
1592 | else | 1824 | else |
1593 | mult1 = 10; | 1825 | base = 10; |
1594 | base = mmr_image & UV2_ACK_MASK; | 1826 | mult1 = mmr_image & UV2_ACK_MASK; |
1595 | ret = mult1 * base; | 1827 | ret = mult1 * base; |
1596 | } | 1828 | } |
1597 | return ret; | 1829 | return ret; |
@@ -1618,6 +1850,7 @@ static void __init init_per_cpu_tunables(void) | |||
1618 | bcp->cong_response_us = congested_respns_us; | 1850 | bcp->cong_response_us = congested_respns_us; |
1619 | bcp->cong_reps = congested_reps; | 1851 | bcp->cong_reps = congested_reps; |
1620 | bcp->cong_period = congested_period; | 1852 | bcp->cong_period = congested_period; |
1853 | bcp->clocks_per_100_usec = usec_2_cycles(100); | ||
1621 | } | 1854 | } |
1622 | } | 1855 | } |
1623 | 1856 | ||
@@ -1728,8 +1961,17 @@ static int scan_sock(struct socket_desc *sdp, struct uvhub_desc *bdp, | |||
1728 | bcp->cpus_in_socket = sdp->num_cpus; | 1961 | bcp->cpus_in_socket = sdp->num_cpus; |
1729 | bcp->socket_master = *smasterp; | 1962 | bcp->socket_master = *smasterp; |
1730 | bcp->uvhub = bdp->uvhub; | 1963 | bcp->uvhub = bdp->uvhub; |
1964 | if (is_uv1_hub()) | ||
1965 | bcp->uvhub_version = 1; | ||
1966 | else if (is_uv2_hub()) | ||
1967 | bcp->uvhub_version = 2; | ||
1968 | else { | ||
1969 | printk(KERN_EMERG "uvhub version not 1 or 2\n"); | ||
1970 | return 1; | ||
1971 | } | ||
1731 | bcp->uvhub_master = *hmasterp; | 1972 | bcp->uvhub_master = *hmasterp; |
1732 | bcp->uvhub_cpu = uv_cpu_hub_info(cpu)->blade_processor_id; | 1973 | bcp->uvhub_cpu = uv_cpu_hub_info(cpu)->blade_processor_id; |
1974 | bcp->using_desc = bcp->uvhub_cpu; | ||
1733 | if (bcp->uvhub_cpu >= MAX_CPUS_PER_UVHUB) { | 1975 | if (bcp->uvhub_cpu >= MAX_CPUS_PER_UVHUB) { |
1734 | printk(KERN_EMERG "%d cpus per uvhub invalid\n", | 1976 | printk(KERN_EMERG "%d cpus per uvhub invalid\n", |
1735 | bcp->uvhub_cpu); | 1977 | bcp->uvhub_cpu); |
@@ -1845,6 +2087,8 @@ static int __init uv_bau_init(void) | |||
1845 | uv_base_pnode = uv_blade_to_pnode(uvhub); | 2087 | uv_base_pnode = uv_blade_to_pnode(uvhub); |
1846 | } | 2088 | } |
1847 | 2089 | ||
2090 | enable_timeouts(); | ||
2091 | |||
1848 | if (init_per_cpu(nuvhubs, uv_base_pnode)) { | 2092 | if (init_per_cpu(nuvhubs, uv_base_pnode)) { |
1849 | nobau = 1; | 2093 | nobau = 1; |
1850 | return 0; | 2094 | return 0; |
@@ -1855,7 +2099,6 @@ static int __init uv_bau_init(void) | |||
1855 | if (uv_blade_nr_possible_cpus(uvhub)) | 2099 | if (uv_blade_nr_possible_cpus(uvhub)) |
1856 | init_uvhub(uvhub, vector, uv_base_pnode); | 2100 | init_uvhub(uvhub, vector, uv_base_pnode); |
1857 | 2101 | ||
1858 | enable_timeouts(); | ||
1859 | alloc_intr_gate(vector, uv_bau_message_intr1); | 2102 | alloc_intr_gate(vector, uv_bau_message_intr1); |
1860 | 2103 | ||
1861 | for_each_possible_blade(uvhub) { | 2104 | for_each_possible_blade(uvhub) { |
@@ -1867,7 +2110,8 @@ static int __init uv_bau_init(void) | |||
1867 | val = 1L << 63; | 2110 | val = 1L << 63; |
1868 | write_gmmr_activation(pnode, val); | 2111 | write_gmmr_activation(pnode, val); |
1869 | mmr = 1; /* should be 1 to broadcast to both sockets */ | 2112 | mmr = 1; /* should be 1 to broadcast to both sockets */ |
1870 | write_mmr_data_broadcast(pnode, mmr); | 2113 | if (!is_uv1_hub()) |
2114 | write_mmr_data_broadcast(pnode, mmr); | ||
1871 | } | 2115 | } |
1872 | } | 2116 | } |
1873 | 2117 | ||
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 99dc5921e1dd..40fb12288ce2 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -915,9 +915,10 @@ static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store); | |||
915 | 915 | ||
916 | /** | 916 | /** |
917 | * __bus_register - register a driver-core subsystem | 917 | * __bus_register - register a driver-core subsystem |
918 | * @bus: bus. | 918 | * @bus: bus to register |
919 | * @key: lockdep class key | ||
919 | * | 920 | * |
920 | * Once we have that, we registered the bus with the kobject | 921 | * Once we have that, we register the bus with the kobject |
921 | * infrastructure, then register the children subsystems it has: | 922 | * infrastructure, then register the children subsystems it has: |
922 | * the devices and drivers that belong to the subsystem. | 923 | * the devices and drivers that belong to the subsystem. |
923 | */ | 924 | */ |
@@ -1220,8 +1221,8 @@ static void system_root_device_release(struct device *dev) | |||
1220 | } | 1221 | } |
1221 | /** | 1222 | /** |
1222 | * subsys_system_register - register a subsystem at /sys/devices/system/ | 1223 | * subsys_system_register - register a subsystem at /sys/devices/system/ |
1223 | * @subsys - system subsystem | 1224 | * @subsys: system subsystem |
1224 | * @groups - default attributes for the root device | 1225 | * @groups: default attributes for the root device |
1225 | * | 1226 | * |
1226 | * All 'system' subsystems have a /sys/devices/system/<name> root device | 1227 | * All 'system' subsystems have a /sys/devices/system/<name> root device |
1227 | * with the name of the subsystem. The root device can carry subsystem- | 1228 | * with the name of the subsystem. The root device can carry subsystem- |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 37c4bd1cacd5..d0c41188d4e5 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -87,6 +87,7 @@ config GPIO_GENERIC_PLATFORM | |||
87 | 87 | ||
88 | config GPIO_IT8761E | 88 | config GPIO_IT8761E |
89 | tristate "IT8761E GPIO support" | 89 | tristate "IT8761E GPIO support" |
90 | depends on X86 # unconditional access to IO space. | ||
90 | help | 91 | help |
91 | Say yes here to support GPIO functionality of IT8761E super I/O chip. | 92 | Say yes here to support GPIO functionality of IT8761E super I/O chip. |
92 | 93 | ||
diff --git a/drivers/gpio/gpio-ml-ioh.c b/drivers/gpio/gpio-ml-ioh.c index 461958fc2264..03d6dd5dcb77 100644 --- a/drivers/gpio/gpio-ml-ioh.c +++ b/drivers/gpio/gpio-ml-ioh.c | |||
@@ -248,7 +248,7 @@ static void ioh_gpio_setup(struct ioh_gpio *chip, int num_port) | |||
248 | static int ioh_irq_type(struct irq_data *d, unsigned int type) | 248 | static int ioh_irq_type(struct irq_data *d, unsigned int type) |
249 | { | 249 | { |
250 | u32 im; | 250 | u32 im; |
251 | u32 *im_reg; | 251 | void __iomem *im_reg; |
252 | u32 ien; | 252 | u32 ien; |
253 | u32 im_pos; | 253 | u32 im_pos; |
254 | int ch; | 254 | int ch; |
@@ -412,7 +412,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, | |||
412 | int i, j; | 412 | int i, j; |
413 | struct ioh_gpio *chip; | 413 | struct ioh_gpio *chip; |
414 | void __iomem *base; | 414 | void __iomem *base; |
415 | void __iomem *chip_save; | 415 | void *chip_save; |
416 | int irq_base; | 416 | int irq_base; |
417 | 417 | ||
418 | ret = pci_enable_device(pdev); | 418 | ret = pci_enable_device(pdev); |
@@ -428,7 +428,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, | |||
428 | } | 428 | } |
429 | 429 | ||
430 | base = pci_iomap(pdev, 1, 0); | 430 | base = pci_iomap(pdev, 1, 0); |
431 | if (base == 0) { | 431 | if (!base) { |
432 | dev_err(&pdev->dev, "%s : pci_iomap failed", __func__); | 432 | dev_err(&pdev->dev, "%s : pci_iomap failed", __func__); |
433 | ret = -ENOMEM; | 433 | ret = -ENOMEM; |
434 | goto err_iomap; | 434 | goto err_iomap; |
@@ -521,7 +521,7 @@ static void __devexit ioh_gpio_remove(struct pci_dev *pdev) | |||
521 | int err; | 521 | int err; |
522 | int i; | 522 | int i; |
523 | struct ioh_gpio *chip = pci_get_drvdata(pdev); | 523 | struct ioh_gpio *chip = pci_get_drvdata(pdev); |
524 | void __iomem *chip_save; | 524 | void *chip_save; |
525 | 525 | ||
526 | chip_save = chip; | 526 | chip_save = chip; |
527 | 527 | ||
diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index f0603297f829..68fa55e86eb1 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c | |||
@@ -231,7 +231,7 @@ static void pch_gpio_setup(struct pch_gpio *chip) | |||
231 | static int pch_irq_type(struct irq_data *d, unsigned int type) | 231 | static int pch_irq_type(struct irq_data *d, unsigned int type) |
232 | { | 232 | { |
233 | u32 im; | 233 | u32 im; |
234 | u32 *im_reg; | 234 | u32 __iomem *im_reg; |
235 | u32 ien; | 235 | u32 ien; |
236 | u32 im_pos; | 236 | u32 im_pos; |
237 | int ch; | 237 | int ch; |
@@ -376,7 +376,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | |||
376 | } | 376 | } |
377 | 377 | ||
378 | chip->base = pci_iomap(pdev, 1, 0); | 378 | chip->base = pci_iomap(pdev, 1, 0); |
379 | if (chip->base == 0) { | 379 | if (!chip->base) { |
380 | dev_err(&pdev->dev, "%s : pci_iomap FAILED", __func__); | 380 | dev_err(&pdev->dev, "%s : pci_iomap FAILED", __func__); |
381 | ret = -ENOMEM; | 381 | ret = -ENOMEM; |
382 | goto err_iomap; | 382 | goto err_iomap; |
diff --git a/drivers/gpio/gpio-tps65910.c b/drivers/gpio/gpio-tps65910.c index b9c1c297669e..91f45b965d1e 100644 --- a/drivers/gpio/gpio-tps65910.c +++ b/drivers/gpio/gpio-tps65910.c | |||
@@ -52,7 +52,7 @@ static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset, | |||
52 | struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); | 52 | struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); |
53 | 53 | ||
54 | /* Set the initial value */ | 54 | /* Set the initial value */ |
55 | tps65910_gpio_set(gc, 0, value); | 55 | tps65910_gpio_set(gc, offset, value); |
56 | 56 | ||
57 | return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, | 57 | return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, |
58 | GPIO_CFG_MASK); | 58 | GPIO_CFG_MASK); |
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index c957c344233f..9ca28fced2b9 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig | |||
@@ -403,6 +403,13 @@ config LEDS_MAX8997 | |||
403 | This option enables support for on-chip LED drivers on | 403 | This option enables support for on-chip LED drivers on |
404 | MAXIM MAX8997 PMIC. | 404 | MAXIM MAX8997 PMIC. |
405 | 405 | ||
406 | config LEDS_OT200 | ||
407 | tristate "LED support for the Bachmann OT200" | ||
408 | depends on LEDS_CLASS && HAS_IOMEM | ||
409 | help | ||
410 | This option enables support for the LEDs on the Bachmann OT200. | ||
411 | Say Y to enable LEDs on the Bachmann OT200. | ||
412 | |||
406 | config LEDS_TRIGGERS | 413 | config LEDS_TRIGGERS |
407 | bool "LED Trigger support" | 414 | bool "LED Trigger support" |
408 | depends on LEDS_CLASS | 415 | depends on LEDS_CLASS |
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index b8a9723477f0..1fc6875a8b20 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile | |||
@@ -28,6 +28,7 @@ obj-$(CONFIG_LEDS_LP5523) += leds-lp5523.o | |||
28 | obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o | 28 | obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o |
29 | obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o | 29 | obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o |
30 | obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o | 30 | obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o |
31 | obj-$(CONFIG_LEDS_OT200) += leds-ot200.o | ||
31 | obj-$(CONFIG_LEDS_FSG) += leds-fsg.o | 32 | obj-$(CONFIG_LEDS_FSG) += leds-fsg.o |
32 | obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o | 33 | obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o |
33 | obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o | 34 | obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o |
diff --git a/drivers/leds/leds-ot200.c b/drivers/leds/leds-ot200.c new file mode 100644 index 000000000000..c4646825a620 --- /dev/null +++ b/drivers/leds/leds-ot200.c | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * Bachmann ot200 leds driver. | ||
3 | * | ||
4 | * Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | ||
5 | * Christian Gmeiner <christian.gmeiner@gmail.com> | ||
6 | * | ||
7 | * License: GPL as published by the FSF. | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/leds.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/module.h> | ||
17 | |||
18 | |||
19 | struct ot200_led { | ||
20 | struct led_classdev cdev; | ||
21 | const char *name; | ||
22 | unsigned long port; | ||
23 | u8 mask; | ||
24 | }; | ||
25 | |||
26 | /* | ||
27 | * The device has three leds on the back panel (led_err, led_init and led_run) | ||
28 | * and can handle up to seven leds on the front panel. | ||
29 | */ | ||
30 | |||
31 | static struct ot200_led leds[] = { | ||
32 | { | ||
33 | .name = "led_run", | ||
34 | .port = 0x5a, | ||
35 | .mask = BIT(0), | ||
36 | }, | ||
37 | { | ||
38 | .name = "led_init", | ||
39 | .port = 0x5a, | ||
40 | .mask = BIT(1), | ||
41 | }, | ||
42 | { | ||
43 | .name = "led_err", | ||
44 | .port = 0x5a, | ||
45 | .mask = BIT(2), | ||
46 | }, | ||
47 | { | ||
48 | .name = "led_1", | ||
49 | .port = 0x49, | ||
50 | .mask = BIT(7), | ||
51 | }, | ||
52 | { | ||
53 | .name = "led_2", | ||
54 | .port = 0x49, | ||
55 | .mask = BIT(6), | ||
56 | }, | ||
57 | { | ||
58 | .name = "led_3", | ||
59 | .port = 0x49, | ||
60 | .mask = BIT(5), | ||
61 | }, | ||
62 | { | ||
63 | .name = "led_4", | ||
64 | .port = 0x49, | ||
65 | .mask = BIT(4), | ||
66 | }, | ||
67 | { | ||
68 | .name = "led_5", | ||
69 | .port = 0x49, | ||
70 | .mask = BIT(3), | ||
71 | }, | ||
72 | { | ||
73 | .name = "led_6", | ||
74 | .port = 0x49, | ||
75 | .mask = BIT(2), | ||
76 | }, | ||
77 | { | ||
78 | .name = "led_7", | ||
79 | .port = 0x49, | ||
80 | .mask = BIT(1), | ||
81 | } | ||
82 | }; | ||
83 | |||
84 | static DEFINE_SPINLOCK(value_lock); | ||
85 | |||
86 | /* | ||
87 | * we need to store the current led states, as it is not | ||
88 | * possible to read the current led state via inb(). | ||
89 | */ | ||
90 | static u8 leds_back; | ||
91 | static u8 leds_front; | ||
92 | |||
93 | static void ot200_led_brightness_set(struct led_classdev *led_cdev, | ||
94 | enum led_brightness value) | ||
95 | { | ||
96 | struct ot200_led *led = container_of(led_cdev, struct ot200_led, cdev); | ||
97 | u8 *val; | ||
98 | unsigned long flags; | ||
99 | |||
100 | spin_lock_irqsave(&value_lock, flags); | ||
101 | |||
102 | if (led->port == 0x49) | ||
103 | val = &leds_front; | ||
104 | else if (led->port == 0x5a) | ||
105 | val = &leds_back; | ||
106 | else | ||
107 | BUG(); | ||
108 | |||
109 | if (value == LED_OFF) | ||
110 | *val &= ~led->mask; | ||
111 | else | ||
112 | *val |= led->mask; | ||
113 | |||
114 | outb(*val, led->port); | ||
115 | spin_unlock_irqrestore(&value_lock, flags); | ||
116 | } | ||
117 | |||
118 | static int __devinit ot200_led_probe(struct platform_device *pdev) | ||
119 | { | ||
120 | int i; | ||
121 | int ret; | ||
122 | |||
123 | for (i = 0; i < ARRAY_SIZE(leds); i++) { | ||
124 | |||
125 | leds[i].cdev.name = leds[i].name; | ||
126 | leds[i].cdev.brightness_set = ot200_led_brightness_set; | ||
127 | |||
128 | ret = led_classdev_register(&pdev->dev, &leds[i].cdev); | ||
129 | if (ret < 0) | ||
130 | goto err; | ||
131 | } | ||
132 | |||
133 | leds_front = 0; /* turn off all front leds */ | ||
134 | leds_back = BIT(1); /* turn on init led */ | ||
135 | outb(leds_front, 0x49); | ||
136 | outb(leds_back, 0x5a); | ||
137 | |||
138 | return 0; | ||
139 | |||
140 | err: | ||
141 | for (i = i - 1; i >= 0; i--) | ||
142 | led_classdev_unregister(&leds[i].cdev); | ||
143 | |||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | static int __devexit ot200_led_remove(struct platform_device *pdev) | ||
148 | { | ||
149 | int i; | ||
150 | |||
151 | for (i = 0; i < ARRAY_SIZE(leds); i++) | ||
152 | led_classdev_unregister(&leds[i].cdev); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static struct platform_driver ot200_led_driver = { | ||
158 | .probe = ot200_led_probe, | ||
159 | .remove = __devexit_p(ot200_led_remove), | ||
160 | .driver = { | ||
161 | .name = "leds-ot200", | ||
162 | .owner = THIS_MODULE, | ||
163 | }, | ||
164 | }; | ||
165 | |||
166 | module_platform_driver(ot200_led_driver); | ||
167 | |||
168 | MODULE_AUTHOR("Sebastian A. Siewior <bigeasy@linutronix.de>"); | ||
169 | MODULE_DESCRIPTION("ot200 LED driver"); | ||
170 | MODULE_LICENSE("GPL"); | ||
171 | MODULE_ALIAS("platform:leds-ot200"); | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 97fff785e97e..af295bb21d62 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -2802,7 +2802,7 @@ pci_intx(struct pci_dev *pdev, int enable) | |||
2802 | 2802 | ||
2803 | /** | 2803 | /** |
2804 | * pci_intx_mask_supported - probe for INTx masking support | 2804 | * pci_intx_mask_supported - probe for INTx masking support |
2805 | * @pdev: the PCI device to operate on | 2805 | * @dev: the PCI device to operate on |
2806 | * | 2806 | * |
2807 | * Check if the device dev support INTx masking via the config space | 2807 | * Check if the device dev support INTx masking via the config space |
2808 | * command word. | 2808 | * command word. |
@@ -2884,7 +2884,7 @@ done: | |||
2884 | 2884 | ||
2885 | /** | 2885 | /** |
2886 | * pci_check_and_mask_intx - mask INTx on pending interrupt | 2886 | * pci_check_and_mask_intx - mask INTx on pending interrupt |
2887 | * @pdev: the PCI device to operate on | 2887 | * @dev: the PCI device to operate on |
2888 | * | 2888 | * |
2889 | * Check if the device dev has its INTx line asserted, mask it and | 2889 | * Check if the device dev has its INTx line asserted, mask it and |
2890 | * return true in that case. False is returned if not interrupt was | 2890 | * return true in that case. False is returned if not interrupt was |
@@ -2898,7 +2898,7 @@ EXPORT_SYMBOL_GPL(pci_check_and_mask_intx); | |||
2898 | 2898 | ||
2899 | /** | 2899 | /** |
2900 | * pci_check_and_mask_intx - unmask INTx of no interrupt is pending | 2900 | * pci_check_and_mask_intx - unmask INTx of no interrupt is pending |
2901 | * @pdev: the PCI device to operate on | 2901 | * @dev: the PCI device to operate on |
2902 | * | 2902 | * |
2903 | * Check if the device dev has its INTx line asserted, unmask it if not | 2903 | * Check if the device dev has its INTx line asserted, unmask it if not |
2904 | * and return true. False is returned and the mask remains active if | 2904 | * and return true. False is returned and the mask remains active if |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index ca86f39a0fdc..b1fa25d6583a 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -2731,6 +2731,7 @@ static void rdev_init_debugfs(struct regulator_dev *rdev) | |||
2731 | * @dev: struct device for the regulator | 2731 | * @dev: struct device for the regulator |
2732 | * @init_data: platform provided init data, passed through by driver | 2732 | * @init_data: platform provided init data, passed through by driver |
2733 | * @driver_data: private regulator data | 2733 | * @driver_data: private regulator data |
2734 | * @of_node: target open firmware device structure (may be NULL) | ||
2734 | * | 2735 | * |
2735 | * Called by regulator drivers to register a regulator. | 2736 | * Called by regulator drivers to register a regulator. |
2736 | * Returns 0 on success. | 2737 | * Returns 0 on success. |
diff --git a/drivers/video/backlight/adp8860_bl.c b/drivers/video/backlight/adp8860_bl.c index 66bc74d9ce2a..378276c9d3cf 100644 --- a/drivers/video/backlight/adp8860_bl.c +++ b/drivers/video/backlight/adp8860_bl.c | |||
@@ -146,7 +146,7 @@ static int adp8860_set_bits(struct i2c_client *client, int reg, uint8_t bit_mask | |||
146 | 146 | ||
147 | ret = adp8860_read(client, reg, ®_val); | 147 | ret = adp8860_read(client, reg, ®_val); |
148 | 148 | ||
149 | if (!ret && ((reg_val & bit_mask) == 0)) { | 149 | if (!ret && ((reg_val & bit_mask) != bit_mask)) { |
150 | reg_val |= bit_mask; | 150 | reg_val |= bit_mask; |
151 | ret = adp8860_write(client, reg, reg_val); | 151 | ret = adp8860_write(client, reg, reg_val); |
152 | } | 152 | } |
diff --git a/drivers/video/backlight/adp8870_bl.c b/drivers/video/backlight/adp8870_bl.c index 6c68a6899e87..6735059376d6 100644 --- a/drivers/video/backlight/adp8870_bl.c +++ b/drivers/video/backlight/adp8870_bl.c | |||
@@ -160,7 +160,7 @@ static int adp8870_set_bits(struct i2c_client *client, int reg, uint8_t bit_mask | |||
160 | 160 | ||
161 | ret = adp8870_read(client, reg, ®_val); | 161 | ret = adp8870_read(client, reg, ®_val); |
162 | 162 | ||
163 | if (!ret && ((reg_val & bit_mask) == 0)) { | 163 | if (!ret && ((reg_val & bit_mask) != bit_mask)) { |
164 | reg_val |= bit_mask; | 164 | reg_val |= bit_mask; |
165 | ret = adp8870_write(client, reg, reg_val); | 165 | ret = adp8870_write(client, reg, reg_val); |
166 | } | 166 | } |
diff --git a/drivers/video/backlight/l4f00242t03.c b/drivers/video/backlight/l4f00242t03.c index 4f5d1c4cb6ab..27d1d7a29c77 100644 --- a/drivers/video/backlight/l4f00242t03.c +++ b/drivers/video/backlight/l4f00242t03.c | |||
@@ -190,6 +190,7 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi) | |||
190 | 190 | ||
191 | priv->io_reg = regulator_get(&spi->dev, "vdd"); | 191 | priv->io_reg = regulator_get(&spi->dev, "vdd"); |
192 | if (IS_ERR(priv->io_reg)) { | 192 | if (IS_ERR(priv->io_reg)) { |
193 | ret = PTR_ERR(priv->io_reg); | ||
193 | dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", | 194 | dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", |
194 | __func__); | 195 | __func__); |
195 | goto err3; | 196 | goto err3; |
@@ -197,6 +198,7 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi) | |||
197 | 198 | ||
198 | priv->core_reg = regulator_get(&spi->dev, "vcore"); | 199 | priv->core_reg = regulator_get(&spi->dev, "vcore"); |
199 | if (IS_ERR(priv->core_reg)) { | 200 | if (IS_ERR(priv->core_reg)) { |
201 | ret = PTR_ERR(priv->core_reg); | ||
200 | dev_err(&spi->dev, "%s: Unable to get the core regulator\n", | 202 | dev_err(&spi->dev, "%s: Unable to get the core regulator\n", |
201 | __func__); | 203 | __func__); |
202 | goto err4; | 204 | goto err4; |
diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig index f66cc1625150..0554b00a7b33 100644 --- a/fs/cifs/Kconfig +++ b/fs/cifs/Kconfig | |||
@@ -140,7 +140,6 @@ config CIFS_DFS_UPCALL | |||
140 | 140 | ||
141 | config CIFS_FSCACHE | 141 | config CIFS_FSCACHE |
142 | bool "Provide CIFS client caching support (EXPERIMENTAL)" | 142 | bool "Provide CIFS client caching support (EXPERIMENTAL)" |
143 | depends on EXPERIMENTAL | ||
144 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y | 143 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y |
145 | help | 144 | help |
146 | Makes CIFS FS-Cache capable. Say Y here if you want your CIFS data | 145 | Makes CIFS FS-Cache capable. Say Y here if you want your CIFS data |
@@ -149,7 +148,7 @@ config CIFS_FSCACHE | |||
149 | 148 | ||
150 | config CIFS_ACL | 149 | config CIFS_ACL |
151 | bool "Provide CIFS ACL support (EXPERIMENTAL)" | 150 | bool "Provide CIFS ACL support (EXPERIMENTAL)" |
152 | depends on EXPERIMENTAL && CIFS_XATTR && KEYS | 151 | depends on CIFS_XATTR && KEYS |
153 | help | 152 | help |
154 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob | 153 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob |
155 | is handed over to the application/caller. | 154 | is handed over to the application/caller. |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 84e8c0724704..24b3dfc05282 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -676,14 +676,23 @@ static ssize_t cifs_multiuser_mount_proc_write(struct file *file, | |||
676 | { | 676 | { |
677 | char c; | 677 | char c; |
678 | int rc; | 678 | int rc; |
679 | static bool warned; | ||
679 | 680 | ||
680 | rc = get_user(c, buffer); | 681 | rc = get_user(c, buffer); |
681 | if (rc) | 682 | if (rc) |
682 | return rc; | 683 | return rc; |
683 | if (c == '0' || c == 'n' || c == 'N') | 684 | if (c == '0' || c == 'n' || c == 'N') |
684 | multiuser_mount = 0; | 685 | multiuser_mount = 0; |
685 | else if (c == '1' || c == 'y' || c == 'Y') | 686 | else if (c == '1' || c == 'y' || c == 'Y') { |
686 | multiuser_mount = 1; | 687 | multiuser_mount = 1; |
688 | if (!warned) { | ||
689 | warned = true; | ||
690 | printk(KERN_WARNING "CIFS VFS: The legacy multiuser " | ||
691 | "mount code is scheduled to be deprecated in " | ||
692 | "3.5. Please switch to using the multiuser " | ||
693 | "mount option."); | ||
694 | } | ||
695 | } | ||
687 | 696 | ||
688 | return count; | 697 | return count; |
689 | } | 698 | } |
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index 2272fd5fe5b7..e622863b292f 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
@@ -113,9 +113,11 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo) | |||
113 | MAX_MECH_STR_LEN + | 113 | MAX_MECH_STR_LEN + |
114 | UID_KEY_LEN + (sizeof(uid_t) * 2) + | 114 | UID_KEY_LEN + (sizeof(uid_t) * 2) + |
115 | CREDUID_KEY_LEN + (sizeof(uid_t) * 2) + | 115 | CREDUID_KEY_LEN + (sizeof(uid_t) * 2) + |
116 | USER_KEY_LEN + strlen(sesInfo->user_name) + | ||
117 | PID_KEY_LEN + (sizeof(pid_t) * 2) + 1; | 116 | PID_KEY_LEN + (sizeof(pid_t) * 2) + 1; |
118 | 117 | ||
118 | if (sesInfo->user_name) | ||
119 | desc_len += USER_KEY_LEN + strlen(sesInfo->user_name); | ||
120 | |||
119 | spnego_key = ERR_PTR(-ENOMEM); | 121 | spnego_key = ERR_PTR(-ENOMEM); |
120 | description = kzalloc(desc_len, GFP_KERNEL); | 122 | description = kzalloc(desc_len, GFP_KERNEL); |
121 | if (description == NULL) | 123 | if (description == NULL) |
@@ -152,8 +154,10 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo) | |||
152 | dp = description + strlen(description); | 154 | dp = description + strlen(description); |
153 | sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid); | 155 | sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid); |
154 | 156 | ||
155 | dp = description + strlen(description); | 157 | if (sesInfo->user_name) { |
156 | sprintf(dp, ";user=%s", sesInfo->user_name); | 158 | dp = description + strlen(description); |
159 | sprintf(dp, ";user=%s", sesInfo->user_name); | ||
160 | } | ||
157 | 161 | ||
158 | dp = description + strlen(description); | 162 | dp = description + strlen(description); |
159 | sprintf(dp, ";pid=0x%x", current->pid); | 163 | sprintf(dp, ";pid=0x%x", current->pid); |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 1b2e180b018d..fbb9da951843 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
@@ -27,17 +27,17 @@ | |||
27 | #include "cifs_debug.h" | 27 | #include "cifs_debug.h" |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * cifs_ucs2_bytes - how long will a string be after conversion? | 30 | * cifs_utf16_bytes - how long will a string be after conversion? |
31 | * @ucs - pointer to input string | 31 | * @utf16 - pointer to input string |
32 | * @maxbytes - don't go past this many bytes of input string | 32 | * @maxbytes - don't go past this many bytes of input string |
33 | * @codepage - destination codepage | 33 | * @codepage - destination codepage |
34 | * | 34 | * |
35 | * Walk a ucs2le string and return the number of bytes that the string will | 35 | * Walk a utf16le string and return the number of bytes that the string will |
36 | * be after being converted to the given charset, not including any null | 36 | * be after being converted to the given charset, not including any null |
37 | * termination required. Don't walk past maxbytes in the source buffer. | 37 | * termination required. Don't walk past maxbytes in the source buffer. |
38 | */ | 38 | */ |
39 | int | 39 | int |
40 | cifs_ucs2_bytes(const __le16 *from, int maxbytes, | 40 | cifs_utf16_bytes(const __le16 *from, int maxbytes, |
41 | const struct nls_table *codepage) | 41 | const struct nls_table *codepage) |
42 | { | 42 | { |
43 | int i; | 43 | int i; |
@@ -122,7 +122,7 @@ cp_convert: | |||
122 | } | 122 | } |
123 | 123 | ||
124 | /* | 124 | /* |
125 | * cifs_from_ucs2 - convert utf16le string to local charset | 125 | * cifs_from_utf16 - convert utf16le string to local charset |
126 | * @to - destination buffer | 126 | * @to - destination buffer |
127 | * @from - source buffer | 127 | * @from - source buffer |
128 | * @tolen - destination buffer size (in bytes) | 128 | * @tolen - destination buffer size (in bytes) |
@@ -130,7 +130,7 @@ cp_convert: | |||
130 | * @codepage - codepage to which characters should be converted | 130 | * @codepage - codepage to which characters should be converted |
131 | * @mapchar - should characters be remapped according to the mapchars option? | 131 | * @mapchar - should characters be remapped according to the mapchars option? |
132 | * | 132 | * |
133 | * Convert a little-endian ucs2le string (as sent by the server) to a string | 133 | * Convert a little-endian utf16le string (as sent by the server) to a string |
134 | * in the provided codepage. The tolen and fromlen parameters are to ensure | 134 | * in the provided codepage. The tolen and fromlen parameters are to ensure |
135 | * that the code doesn't walk off of the end of the buffer (which is always | 135 | * that the code doesn't walk off of the end of the buffer (which is always |
136 | * a danger if the alignment of the source buffer is off). The destination | 136 | * a danger if the alignment of the source buffer is off). The destination |
@@ -139,12 +139,12 @@ cp_convert: | |||
139 | * null terminator). | 139 | * null terminator). |
140 | * | 140 | * |
141 | * Note that some windows versions actually send multiword UTF-16 characters | 141 | * Note that some windows versions actually send multiword UTF-16 characters |
142 | * instead of straight UCS-2. The linux nls routines however aren't able to | 142 | * instead of straight UTF16-2. The linux nls routines however aren't able to |
143 | * deal with those characters properly. In the event that we get some of | 143 | * deal with those characters properly. In the event that we get some of |
144 | * those characters, they won't be translated properly. | 144 | * those characters, they won't be translated properly. |
145 | */ | 145 | */ |
146 | int | 146 | int |
147 | cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | 147 | cifs_from_utf16(char *to, const __le16 *from, int tolen, int fromlen, |
148 | const struct nls_table *codepage, bool mapchar) | 148 | const struct nls_table *codepage, bool mapchar) |
149 | { | 149 | { |
150 | int i, charlen, safelen; | 150 | int i, charlen, safelen; |
@@ -190,13 +190,13 @@ cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | |||
190 | } | 190 | } |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * NAME: cifs_strtoUCS() | 193 | * NAME: cifs_strtoUTF16() |
194 | * | 194 | * |
195 | * FUNCTION: Convert character string to unicode string | 195 | * FUNCTION: Convert character string to unicode string |
196 | * | 196 | * |
197 | */ | 197 | */ |
198 | int | 198 | int |
199 | cifs_strtoUCS(__le16 *to, const char *from, int len, | 199 | cifs_strtoUTF16(__le16 *to, const char *from, int len, |
200 | const struct nls_table *codepage) | 200 | const struct nls_table *codepage) |
201 | { | 201 | { |
202 | int charlen; | 202 | int charlen; |
@@ -206,7 +206,7 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
206 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { | 206 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { |
207 | charlen = codepage->char2uni(from, len, &wchar_to); | 207 | charlen = codepage->char2uni(from, len, &wchar_to); |
208 | if (charlen < 1) { | 208 | if (charlen < 1) { |
209 | cERROR(1, "strtoUCS: char2uni of 0x%x returned %d", | 209 | cERROR(1, "strtoUTF16: char2uni of 0x%x returned %d", |
210 | *from, charlen); | 210 | *from, charlen); |
211 | /* A question mark */ | 211 | /* A question mark */ |
212 | wchar_to = 0x003f; | 212 | wchar_to = 0x003f; |
@@ -220,7 +220,8 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
220 | } | 220 | } |
221 | 221 | ||
222 | /* | 222 | /* |
223 | * cifs_strndup_from_ucs - copy a string from wire format to the local codepage | 223 | * cifs_strndup_from_utf16 - copy a string from wire format to the local |
224 | * codepage | ||
224 | * @src - source string | 225 | * @src - source string |
225 | * @maxlen - don't walk past this many bytes in the source string | 226 | * @maxlen - don't walk past this many bytes in the source string |
226 | * @is_unicode - is this a unicode string? | 227 | * @is_unicode - is this a unicode string? |
@@ -231,19 +232,19 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
231 | * error. | 232 | * error. |
232 | */ | 233 | */ |
233 | char * | 234 | char * |
234 | cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode, | 235 | cifs_strndup_from_utf16(const char *src, const int maxlen, |
235 | const struct nls_table *codepage) | 236 | const bool is_unicode, const struct nls_table *codepage) |
236 | { | 237 | { |
237 | int len; | 238 | int len; |
238 | char *dst; | 239 | char *dst; |
239 | 240 | ||
240 | if (is_unicode) { | 241 | if (is_unicode) { |
241 | len = cifs_ucs2_bytes((__le16 *) src, maxlen, codepage); | 242 | len = cifs_utf16_bytes((__le16 *) src, maxlen, codepage); |
242 | len += nls_nullsize(codepage); | 243 | len += nls_nullsize(codepage); |
243 | dst = kmalloc(len, GFP_KERNEL); | 244 | dst = kmalloc(len, GFP_KERNEL); |
244 | if (!dst) | 245 | if (!dst) |
245 | return NULL; | 246 | return NULL; |
246 | cifs_from_ucs2(dst, (__le16 *) src, len, maxlen, codepage, | 247 | cifs_from_utf16(dst, (__le16 *) src, len, maxlen, codepage, |
247 | false); | 248 | false); |
248 | } else { | 249 | } else { |
249 | len = strnlen(src, maxlen); | 250 | len = strnlen(src, maxlen); |
@@ -264,7 +265,7 @@ cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode, | |||
264 | * names are little endian 16 bit Unicode on the wire | 265 | * names are little endian 16 bit Unicode on the wire |
265 | */ | 266 | */ |
266 | int | 267 | int |
267 | cifsConvertToUCS(__le16 *target, const char *source, int srclen, | 268 | cifsConvertToUTF16(__le16 *target, const char *source, int srclen, |
268 | const struct nls_table *cp, int mapChars) | 269 | const struct nls_table *cp, int mapChars) |
269 | { | 270 | { |
270 | int i, j, charlen; | 271 | int i, j, charlen; |
@@ -273,7 +274,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
273 | wchar_t tmp; | 274 | wchar_t tmp; |
274 | 275 | ||
275 | if (!mapChars) | 276 | if (!mapChars) |
276 | return cifs_strtoUCS(target, source, PATH_MAX, cp); | 277 | return cifs_strtoUTF16(target, source, PATH_MAX, cp); |
277 | 278 | ||
278 | for (i = 0, j = 0; i < srclen; j++) { | 279 | for (i = 0, j = 0; i < srclen; j++) { |
279 | src_char = source[i]; | 280 | src_char = source[i]; |
@@ -281,7 +282,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
281 | switch (src_char) { | 282 | switch (src_char) { |
282 | case 0: | 283 | case 0: |
283 | put_unaligned(0, &target[j]); | 284 | put_unaligned(0, &target[j]); |
284 | goto ctoUCS_out; | 285 | goto ctoUTF16_out; |
285 | case ':': | 286 | case ':': |
286 | dst_char = cpu_to_le16(UNI_COLON); | 287 | dst_char = cpu_to_le16(UNI_COLON); |
287 | break; | 288 | break; |
@@ -326,7 +327,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
326 | put_unaligned(dst_char, &target[j]); | 327 | put_unaligned(dst_char, &target[j]); |
327 | } | 328 | } |
328 | 329 | ||
329 | ctoUCS_out: | 330 | ctoUTF16_out: |
330 | return i; | 331 | return i; |
331 | } | 332 | } |
332 | 333 | ||
diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h index 6d02fd560566..a513a546700b 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h | |||
@@ -74,16 +74,16 @@ extern const struct UniCaseRange CifsUniLowerRange[]; | |||
74 | #endif /* UNIUPR_NOLOWER */ | 74 | #endif /* UNIUPR_NOLOWER */ |
75 | 75 | ||
76 | #ifdef __KERNEL__ | 76 | #ifdef __KERNEL__ |
77 | int cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | 77 | int cifs_from_utf16(char *to, const __le16 *from, int tolen, int fromlen, |
78 | const struct nls_table *codepage, bool mapchar); | 78 | const struct nls_table *codepage, bool mapchar); |
79 | int cifs_ucs2_bytes(const __le16 *from, int maxbytes, | 79 | int cifs_utf16_bytes(const __le16 *from, int maxbytes, |
80 | const struct nls_table *codepage); | 80 | const struct nls_table *codepage); |
81 | int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *); | 81 | int cifs_strtoUTF16(__le16 *, const char *, int, const struct nls_table *); |
82 | char *cifs_strndup_from_ucs(const char *src, const int maxlen, | 82 | char *cifs_strndup_from_utf16(const char *src, const int maxlen, |
83 | const bool is_unicode, | 83 | const bool is_unicode, |
84 | const struct nls_table *codepage); | 84 | const struct nls_table *codepage); |
85 | extern int cifsConvertToUCS(__le16 *target, const char *source, int maxlen, | 85 | extern int cifsConvertToUTF16(__le16 *target, const char *source, int maxlen, |
86 | const struct nls_table *cp, int mapChars); | 86 | const struct nls_table *cp, int mapChars); |
87 | 87 | ||
88 | #endif | 88 | #endif |
89 | 89 | ||
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 72ddf23ef6f7..c1b254487388 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -909,6 +909,8 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, | |||
909 | umode_t group_mask = S_IRWXG; | 909 | umode_t group_mask = S_IRWXG; |
910 | umode_t other_mask = S_IRWXU | S_IRWXG | S_IRWXO; | 910 | umode_t other_mask = S_IRWXU | S_IRWXG | S_IRWXO; |
911 | 911 | ||
912 | if (num_aces > ULONG_MAX / sizeof(struct cifs_ace *)) | ||
913 | return; | ||
912 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), | 914 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), |
913 | GFP_KERNEL); | 915 | GFP_KERNEL); |
914 | if (!ppace) { | 916 | if (!ppace) { |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index 5d9b9acc5fce..63c460e503b6 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
@@ -327,7 +327,7 @@ build_avpair_blob(struct cifs_ses *ses, const struct nls_table *nls_cp) | |||
327 | attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_DOMAIN_NAME); | 327 | attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_DOMAIN_NAME); |
328 | attrptr->length = cpu_to_le16(2 * dlen); | 328 | attrptr->length = cpu_to_le16(2 * dlen); |
329 | blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name); | 329 | blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name); |
330 | cifs_strtoUCS((__le16 *)blobptr, ses->domainName, dlen, nls_cp); | 330 | cifs_strtoUTF16((__le16 *)blobptr, ses->domainName, dlen, nls_cp); |
331 | 331 | ||
332 | return 0; | 332 | return 0; |
333 | } | 333 | } |
@@ -376,7 +376,7 @@ find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp) | |||
376 | kmalloc(attrsize + 1, GFP_KERNEL); | 376 | kmalloc(attrsize + 1, GFP_KERNEL); |
377 | if (!ses->domainName) | 377 | if (!ses->domainName) |
378 | return -ENOMEM; | 378 | return -ENOMEM; |
379 | cifs_from_ucs2(ses->domainName, | 379 | cifs_from_utf16(ses->domainName, |
380 | (__le16 *)blobptr, attrsize, attrsize, | 380 | (__le16 *)blobptr, attrsize, attrsize, |
381 | nls_cp, false); | 381 | nls_cp, false); |
382 | break; | 382 | break; |
@@ -420,15 +420,20 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
420 | } | 420 | } |
421 | 421 | ||
422 | /* convert ses->user_name to unicode and uppercase */ | 422 | /* convert ses->user_name to unicode and uppercase */ |
423 | len = strlen(ses->user_name); | 423 | len = ses->user_name ? strlen(ses->user_name) : 0; |
424 | user = kmalloc(2 + (len * 2), GFP_KERNEL); | 424 | user = kmalloc(2 + (len * 2), GFP_KERNEL); |
425 | if (user == NULL) { | 425 | if (user == NULL) { |
426 | cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n"); | 426 | cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n"); |
427 | rc = -ENOMEM; | 427 | rc = -ENOMEM; |
428 | return rc; | 428 | return rc; |
429 | } | 429 | } |
430 | len = cifs_strtoUCS((__le16 *)user, ses->user_name, len, nls_cp); | 430 | |
431 | UniStrupr(user); | 431 | if (len) { |
432 | len = cifs_strtoUTF16((__le16 *)user, ses->user_name, len, nls_cp); | ||
433 | UniStrupr(user); | ||
434 | } else { | ||
435 | memset(user, '\0', 2); | ||
436 | } | ||
432 | 437 | ||
433 | rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 438 | rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
434 | (char *)user, 2 * len); | 439 | (char *)user, 2 * len); |
@@ -448,8 +453,8 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
448 | rc = -ENOMEM; | 453 | rc = -ENOMEM; |
449 | return rc; | 454 | return rc; |
450 | } | 455 | } |
451 | len = cifs_strtoUCS((__le16 *)domain, ses->domainName, len, | 456 | len = cifs_strtoUTF16((__le16 *)domain, ses->domainName, len, |
452 | nls_cp); | 457 | nls_cp); |
453 | rc = | 458 | rc = |
454 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 459 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
455 | (char *)domain, 2 * len); | 460 | (char *)domain, 2 * len); |
@@ -468,7 +473,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
468 | rc = -ENOMEM; | 473 | rc = -ENOMEM; |
469 | return rc; | 474 | return rc; |
470 | } | 475 | } |
471 | len = cifs_strtoUCS((__le16 *)server, ses->serverName, len, | 476 | len = cifs_strtoUTF16((__le16 *)server, ses->serverName, len, |
472 | nls_cp); | 477 | nls_cp); |
473 | rc = | 478 | rc = |
474 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 479 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index ba53c1c6c6cc..76e7d8b6da17 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -879,6 +879,8 @@ require use of the stronger protocol */ | |||
879 | #define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ | 879 | #define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ |
880 | #endif /* UPCALL */ | 880 | #endif /* UPCALL */ |
881 | #else /* do not allow weak pw hash */ | 881 | #else /* do not allow weak pw hash */ |
882 | #define CIFSSEC_MUST_LANMAN 0 | ||
883 | #define CIFSSEC_MUST_PLNTXT 0 | ||
882 | #ifdef CONFIG_CIFS_UPCALL | 884 | #ifdef CONFIG_CIFS_UPCALL |
883 | #define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */ | 885 | #define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */ |
884 | #else | 886 | #else |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 6600aa2d2ef3..8b7794c31591 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -821,8 +821,8 @@ PsxDelete: | |||
821 | 821 | ||
822 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 822 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
823 | name_len = | 823 | name_len = |
824 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 824 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
825 | PATH_MAX, nls_codepage, remap); | 825 | PATH_MAX, nls_codepage, remap); |
826 | name_len++; /* trailing null */ | 826 | name_len++; /* trailing null */ |
827 | name_len *= 2; | 827 | name_len *= 2; |
828 | } else { /* BB add path length overrun check */ | 828 | } else { /* BB add path length overrun check */ |
@@ -893,8 +893,8 @@ DelFileRetry: | |||
893 | 893 | ||
894 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 894 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
895 | name_len = | 895 | name_len = |
896 | cifsConvertToUCS((__le16 *) pSMB->fileName, fileName, | 896 | cifsConvertToUTF16((__le16 *) pSMB->fileName, fileName, |
897 | PATH_MAX, nls_codepage, remap); | 897 | PATH_MAX, nls_codepage, remap); |
898 | name_len++; /* trailing null */ | 898 | name_len++; /* trailing null */ |
899 | name_len *= 2; | 899 | name_len *= 2; |
900 | } else { /* BB improve check for buffer overruns BB */ | 900 | } else { /* BB improve check for buffer overruns BB */ |
@@ -938,8 +938,8 @@ RmDirRetry: | |||
938 | return rc; | 938 | return rc; |
939 | 939 | ||
940 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 940 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
941 | name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, dirName, | 941 | name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, dirName, |
942 | PATH_MAX, nls_codepage, remap); | 942 | PATH_MAX, nls_codepage, remap); |
943 | name_len++; /* trailing null */ | 943 | name_len++; /* trailing null */ |
944 | name_len *= 2; | 944 | name_len *= 2; |
945 | } else { /* BB improve check for buffer overruns BB */ | 945 | } else { /* BB improve check for buffer overruns BB */ |
@@ -981,8 +981,8 @@ MkDirRetry: | |||
981 | return rc; | 981 | return rc; |
982 | 982 | ||
983 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 983 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
984 | name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, name, | 984 | name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, |
985 | PATH_MAX, nls_codepage, remap); | 985 | PATH_MAX, nls_codepage, remap); |
986 | name_len++; /* trailing null */ | 986 | name_len++; /* trailing null */ |
987 | name_len *= 2; | 987 | name_len *= 2; |
988 | } else { /* BB improve check for buffer overruns BB */ | 988 | } else { /* BB improve check for buffer overruns BB */ |
@@ -1030,8 +1030,8 @@ PsxCreat: | |||
1030 | 1030 | ||
1031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1032 | name_len = | 1032 | name_len = |
1033 | cifsConvertToUCS((__le16 *) pSMB->FileName, name, | 1033 | cifsConvertToUTF16((__le16 *) pSMB->FileName, name, |
1034 | PATH_MAX, nls_codepage, remap); | 1034 | PATH_MAX, nls_codepage, remap); |
1035 | name_len++; /* trailing null */ | 1035 | name_len++; /* trailing null */ |
1036 | name_len *= 2; | 1036 | name_len *= 2; |
1037 | } else { /* BB improve the check for buffer overruns BB */ | 1037 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -1197,8 +1197,8 @@ OldOpenRetry: | |||
1197 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1197 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1198 | count = 1; /* account for one byte pad to word boundary */ | 1198 | count = 1; /* account for one byte pad to word boundary */ |
1199 | name_len = | 1199 | name_len = |
1200 | cifsConvertToUCS((__le16 *) (pSMB->fileName + 1), | 1200 | cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), |
1201 | fileName, PATH_MAX, nls_codepage, remap); | 1201 | fileName, PATH_MAX, nls_codepage, remap); |
1202 | name_len++; /* trailing null */ | 1202 | name_len++; /* trailing null */ |
1203 | name_len *= 2; | 1203 | name_len *= 2; |
1204 | } else { /* BB improve check for buffer overruns BB */ | 1204 | } else { /* BB improve check for buffer overruns BB */ |
@@ -1304,8 +1304,8 @@ openRetry: | |||
1304 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1304 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1305 | count = 1; /* account for one byte pad to word boundary */ | 1305 | count = 1; /* account for one byte pad to word boundary */ |
1306 | name_len = | 1306 | name_len = |
1307 | cifsConvertToUCS((__le16 *) (pSMB->fileName + 1), | 1307 | cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), |
1308 | fileName, PATH_MAX, nls_codepage, remap); | 1308 | fileName, PATH_MAX, nls_codepage, remap); |
1309 | name_len++; /* trailing null */ | 1309 | name_len++; /* trailing null */ |
1310 | name_len *= 2; | 1310 | name_len *= 2; |
1311 | pSMB->NameLength = cpu_to_le16(name_len); | 1311 | pSMB->NameLength = cpu_to_le16(name_len); |
@@ -2649,16 +2649,16 @@ renameRetry: | |||
2649 | 2649 | ||
2650 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2650 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2651 | name_len = | 2651 | name_len = |
2652 | cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName, | 2652 | cifsConvertToUTF16((__le16 *) pSMB->OldFileName, fromName, |
2653 | PATH_MAX, nls_codepage, remap); | 2653 | PATH_MAX, nls_codepage, remap); |
2654 | name_len++; /* trailing null */ | 2654 | name_len++; /* trailing null */ |
2655 | name_len *= 2; | 2655 | name_len *= 2; |
2656 | pSMB->OldFileName[name_len] = 0x04; /* pad */ | 2656 | pSMB->OldFileName[name_len] = 0x04; /* pad */ |
2657 | /* protocol requires ASCII signature byte on Unicode string */ | 2657 | /* protocol requires ASCII signature byte on Unicode string */ |
2658 | pSMB->OldFileName[name_len + 1] = 0x00; | 2658 | pSMB->OldFileName[name_len + 1] = 0x00; |
2659 | name_len2 = | 2659 | name_len2 = |
2660 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 2660 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
2661 | toName, PATH_MAX, nls_codepage, remap); | 2661 | toName, PATH_MAX, nls_codepage, remap); |
2662 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 2662 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
2663 | name_len2 *= 2; /* convert to bytes */ | 2663 | name_len2 *= 2; /* convert to bytes */ |
2664 | } else { /* BB improve the check for buffer overruns BB */ | 2664 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2738,10 +2738,12 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifs_tcon *pTcon, | |||
2738 | /* unicode only call */ | 2738 | /* unicode only call */ |
2739 | if (target_name == NULL) { | 2739 | if (target_name == NULL) { |
2740 | sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); | 2740 | sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); |
2741 | len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, | 2741 | len_of_str = |
2742 | cifsConvertToUTF16((__le16 *)rename_info->target_name, | ||
2742 | dummy_string, 24, nls_codepage, remap); | 2743 | dummy_string, 24, nls_codepage, remap); |
2743 | } else { | 2744 | } else { |
2744 | len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, | 2745 | len_of_str = |
2746 | cifsConvertToUTF16((__le16 *)rename_info->target_name, | ||
2745 | target_name, PATH_MAX, nls_codepage, | 2747 | target_name, PATH_MAX, nls_codepage, |
2746 | remap); | 2748 | remap); |
2747 | } | 2749 | } |
@@ -2795,17 +2797,17 @@ copyRetry: | |||
2795 | pSMB->Flags = cpu_to_le16(flags & COPY_TREE); | 2797 | pSMB->Flags = cpu_to_le16(flags & COPY_TREE); |
2796 | 2798 | ||
2797 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2799 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2798 | name_len = cifsConvertToUCS((__le16 *) pSMB->OldFileName, | 2800 | name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, |
2799 | fromName, PATH_MAX, nls_codepage, | 2801 | fromName, PATH_MAX, nls_codepage, |
2800 | remap); | 2802 | remap); |
2801 | name_len++; /* trailing null */ | 2803 | name_len++; /* trailing null */ |
2802 | name_len *= 2; | 2804 | name_len *= 2; |
2803 | pSMB->OldFileName[name_len] = 0x04; /* pad */ | 2805 | pSMB->OldFileName[name_len] = 0x04; /* pad */ |
2804 | /* protocol requires ASCII signature byte on Unicode string */ | 2806 | /* protocol requires ASCII signature byte on Unicode string */ |
2805 | pSMB->OldFileName[name_len + 1] = 0x00; | 2807 | pSMB->OldFileName[name_len + 1] = 0x00; |
2806 | name_len2 = | 2808 | name_len2 = |
2807 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 2809 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
2808 | toName, PATH_MAX, nls_codepage, remap); | 2810 | toName, PATH_MAX, nls_codepage, remap); |
2809 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 2811 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
2810 | name_len2 *= 2; /* convert to bytes */ | 2812 | name_len2 *= 2; /* convert to bytes */ |
2811 | } else { /* BB improve the check for buffer overruns BB */ | 2813 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2861,9 +2863,9 @@ createSymLinkRetry: | |||
2861 | 2863 | ||
2862 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2864 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2863 | name_len = | 2865 | name_len = |
2864 | cifs_strtoUCS((__le16 *) pSMB->FileName, fromName, PATH_MAX | 2866 | cifs_strtoUTF16((__le16 *) pSMB->FileName, fromName, |
2865 | /* find define for this maxpathcomponent */ | 2867 | /* find define for this maxpathcomponent */ |
2866 | , nls_codepage); | 2868 | PATH_MAX, nls_codepage); |
2867 | name_len++; /* trailing null */ | 2869 | name_len++; /* trailing null */ |
2868 | name_len *= 2; | 2870 | name_len *= 2; |
2869 | 2871 | ||
@@ -2885,9 +2887,9 @@ createSymLinkRetry: | |||
2885 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2887 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2886 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2888 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2887 | name_len_target = | 2889 | name_len_target = |
2888 | cifs_strtoUCS((__le16 *) data_offset, toName, PATH_MAX | 2890 | cifs_strtoUTF16((__le16 *) data_offset, toName, PATH_MAX |
2889 | /* find define for this maxpathcomponent */ | 2891 | /* find define for this maxpathcomponent */ |
2890 | , nls_codepage); | 2892 | , nls_codepage); |
2891 | name_len_target++; /* trailing null */ | 2893 | name_len_target++; /* trailing null */ |
2892 | name_len_target *= 2; | 2894 | name_len_target *= 2; |
2893 | } else { /* BB improve the check for buffer overruns BB */ | 2895 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2949,8 +2951,8 @@ createHardLinkRetry: | |||
2949 | return rc; | 2951 | return rc; |
2950 | 2952 | ||
2951 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2953 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2952 | name_len = cifsConvertToUCS((__le16 *) pSMB->FileName, toName, | 2954 | name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, |
2953 | PATH_MAX, nls_codepage, remap); | 2955 | PATH_MAX, nls_codepage, remap); |
2954 | name_len++; /* trailing null */ | 2956 | name_len++; /* trailing null */ |
2955 | name_len *= 2; | 2957 | name_len *= 2; |
2956 | 2958 | ||
@@ -2972,8 +2974,8 @@ createHardLinkRetry: | |||
2972 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2974 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2973 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2975 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2974 | name_len_target = | 2976 | name_len_target = |
2975 | cifsConvertToUCS((__le16 *) data_offset, fromName, PATH_MAX, | 2977 | cifsConvertToUTF16((__le16 *) data_offset, fromName, |
2976 | nls_codepage, remap); | 2978 | PATH_MAX, nls_codepage, remap); |
2977 | name_len_target++; /* trailing null */ | 2979 | name_len_target++; /* trailing null */ |
2978 | name_len_target *= 2; | 2980 | name_len_target *= 2; |
2979 | } else { /* BB improve the check for buffer overruns BB */ | 2981 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3042,8 +3044,8 @@ winCreateHardLinkRetry: | |||
3042 | 3044 | ||
3043 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3045 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3044 | name_len = | 3046 | name_len = |
3045 | cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName, | 3047 | cifsConvertToUTF16((__le16 *) pSMB->OldFileName, fromName, |
3046 | PATH_MAX, nls_codepage, remap); | 3048 | PATH_MAX, nls_codepage, remap); |
3047 | name_len++; /* trailing null */ | 3049 | name_len++; /* trailing null */ |
3048 | name_len *= 2; | 3050 | name_len *= 2; |
3049 | 3051 | ||
@@ -3051,8 +3053,8 @@ winCreateHardLinkRetry: | |||
3051 | pSMB->OldFileName[name_len] = 0x04; | 3053 | pSMB->OldFileName[name_len] = 0x04; |
3052 | pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ | 3054 | pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ |
3053 | name_len2 = | 3055 | name_len2 = |
3054 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 3056 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
3055 | toName, PATH_MAX, nls_codepage, remap); | 3057 | toName, PATH_MAX, nls_codepage, remap); |
3056 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 3058 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
3057 | name_len2 *= 2; /* convert to bytes */ | 3059 | name_len2 *= 2; /* convert to bytes */ |
3058 | } else { /* BB improve the check for buffer overruns BB */ | 3060 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3108,8 +3110,8 @@ querySymLinkRetry: | |||
3108 | 3110 | ||
3109 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3111 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3110 | name_len = | 3112 | name_len = |
3111 | cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, | 3113 | cifs_strtoUTF16((__le16 *) pSMB->FileName, searchName, |
3112 | PATH_MAX, nls_codepage); | 3114 | PATH_MAX, nls_codepage); |
3113 | name_len++; /* trailing null */ | 3115 | name_len++; /* trailing null */ |
3114 | name_len *= 2; | 3116 | name_len *= 2; |
3115 | } else { /* BB improve the check for buffer overruns BB */ | 3117 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3166,8 +3168,8 @@ querySymLinkRetry: | |||
3166 | is_unicode = false; | 3168 | is_unicode = false; |
3167 | 3169 | ||
3168 | /* BB FIXME investigate remapping reserved chars here */ | 3170 | /* BB FIXME investigate remapping reserved chars here */ |
3169 | *symlinkinfo = cifs_strndup_from_ucs(data_start, count, | 3171 | *symlinkinfo = cifs_strndup_from_utf16(data_start, |
3170 | is_unicode, nls_codepage); | 3172 | count, is_unicode, nls_codepage); |
3171 | if (!*symlinkinfo) | 3173 | if (!*symlinkinfo) |
3172 | rc = -ENOMEM; | 3174 | rc = -ENOMEM; |
3173 | } | 3175 | } |
@@ -3450,8 +3452,9 @@ queryAclRetry: | |||
3450 | 3452 | ||
3451 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3453 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3452 | name_len = | 3454 | name_len = |
3453 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 3455 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
3454 | PATH_MAX, nls_codepage, remap); | 3456 | searchName, PATH_MAX, nls_codepage, |
3457 | remap); | ||
3455 | name_len++; /* trailing null */ | 3458 | name_len++; /* trailing null */ |
3456 | name_len *= 2; | 3459 | name_len *= 2; |
3457 | pSMB->FileName[name_len] = 0; | 3460 | pSMB->FileName[name_len] = 0; |
@@ -3537,8 +3540,8 @@ setAclRetry: | |||
3537 | return rc; | 3540 | return rc; |
3538 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3541 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3539 | name_len = | 3542 | name_len = |
3540 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 3543 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
3541 | PATH_MAX, nls_codepage, remap); | 3544 | PATH_MAX, nls_codepage, remap); |
3542 | name_len++; /* trailing null */ | 3545 | name_len++; /* trailing null */ |
3543 | name_len *= 2; | 3546 | name_len *= 2; |
3544 | } else { /* BB improve the check for buffer overruns BB */ | 3547 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3948,8 +3951,9 @@ QInfRetry: | |||
3948 | 3951 | ||
3949 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3952 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3950 | name_len = | 3953 | name_len = |
3951 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 3954 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
3952 | PATH_MAX, nls_codepage, remap); | 3955 | searchName, PATH_MAX, nls_codepage, |
3956 | remap); | ||
3953 | name_len++; /* trailing null */ | 3957 | name_len++; /* trailing null */ |
3954 | name_len *= 2; | 3958 | name_len *= 2; |
3955 | } else { | 3959 | } else { |
@@ -4086,8 +4090,8 @@ QPathInfoRetry: | |||
4086 | 4090 | ||
4087 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4091 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4088 | name_len = | 4092 | name_len = |
4089 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4093 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4090 | PATH_MAX, nls_codepage, remap); | 4094 | PATH_MAX, nls_codepage, remap); |
4091 | name_len++; /* trailing null */ | 4095 | name_len++; /* trailing null */ |
4092 | name_len *= 2; | 4096 | name_len *= 2; |
4093 | } else { /* BB improve the check for buffer overruns BB */ | 4097 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4255,8 +4259,8 @@ UnixQPathInfoRetry: | |||
4255 | 4259 | ||
4256 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4260 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4257 | name_len = | 4261 | name_len = |
4258 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4262 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4259 | PATH_MAX, nls_codepage, remap); | 4263 | PATH_MAX, nls_codepage, remap); |
4260 | name_len++; /* trailing null */ | 4264 | name_len++; /* trailing null */ |
4261 | name_len *= 2; | 4265 | name_len *= 2; |
4262 | } else { /* BB improve the check for buffer overruns BB */ | 4266 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4344,8 +4348,8 @@ findFirstRetry: | |||
4344 | 4348 | ||
4345 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4349 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4346 | name_len = | 4350 | name_len = |
4347 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4351 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4348 | PATH_MAX, nls_codepage, remap); | 4352 | PATH_MAX, nls_codepage, remap); |
4349 | /* We can not add the asterik earlier in case | 4353 | /* We can not add the asterik earlier in case |
4350 | it got remapped to 0xF03A as if it were part of the | 4354 | it got remapped to 0xF03A as if it were part of the |
4351 | directory name instead of a wildcard */ | 4355 | directory name instead of a wildcard */ |
@@ -4656,8 +4660,9 @@ GetInodeNumberRetry: | |||
4656 | 4660 | ||
4657 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4661 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4658 | name_len = | 4662 | name_len = |
4659 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4663 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
4660 | PATH_MAX, nls_codepage, remap); | 4664 | searchName, PATH_MAX, nls_codepage, |
4665 | remap); | ||
4661 | name_len++; /* trailing null */ | 4666 | name_len++; /* trailing null */ |
4662 | name_len *= 2; | 4667 | name_len *= 2; |
4663 | } else { /* BB improve the check for buffer overruns BB */ | 4668 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4794,9 +4799,9 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4794 | rc = -ENOMEM; | 4799 | rc = -ENOMEM; |
4795 | goto parse_DFS_referrals_exit; | 4800 | goto parse_DFS_referrals_exit; |
4796 | } | 4801 | } |
4797 | cifsConvertToUCS((__le16 *) tmp, searchName, | 4802 | cifsConvertToUTF16((__le16 *) tmp, searchName, |
4798 | PATH_MAX, nls_codepage, remap); | 4803 | PATH_MAX, nls_codepage, remap); |
4799 | node->path_consumed = cifs_ucs2_bytes(tmp, | 4804 | node->path_consumed = cifs_utf16_bytes(tmp, |
4800 | le16_to_cpu(pSMBr->PathConsumed), | 4805 | le16_to_cpu(pSMBr->PathConsumed), |
4801 | nls_codepage); | 4806 | nls_codepage); |
4802 | kfree(tmp); | 4807 | kfree(tmp); |
@@ -4809,8 +4814,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4809 | /* copy DfsPath */ | 4814 | /* copy DfsPath */ |
4810 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); | 4815 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); |
4811 | max_len = data_end - temp; | 4816 | max_len = data_end - temp; |
4812 | node->path_name = cifs_strndup_from_ucs(temp, max_len, | 4817 | node->path_name = cifs_strndup_from_utf16(temp, max_len, |
4813 | is_unicode, nls_codepage); | 4818 | is_unicode, nls_codepage); |
4814 | if (!node->path_name) { | 4819 | if (!node->path_name) { |
4815 | rc = -ENOMEM; | 4820 | rc = -ENOMEM; |
4816 | goto parse_DFS_referrals_exit; | 4821 | goto parse_DFS_referrals_exit; |
@@ -4819,8 +4824,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4819 | /* copy link target UNC */ | 4824 | /* copy link target UNC */ |
4820 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); | 4825 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); |
4821 | max_len = data_end - temp; | 4826 | max_len = data_end - temp; |
4822 | node->node_name = cifs_strndup_from_ucs(temp, max_len, | 4827 | node->node_name = cifs_strndup_from_utf16(temp, max_len, |
4823 | is_unicode, nls_codepage); | 4828 | is_unicode, nls_codepage); |
4824 | if (!node->node_name) | 4829 | if (!node->node_name) |
4825 | rc = -ENOMEM; | 4830 | rc = -ENOMEM; |
4826 | } | 4831 | } |
@@ -4873,8 +4878,9 @@ getDFSRetry: | |||
4873 | if (ses->capabilities & CAP_UNICODE) { | 4878 | if (ses->capabilities & CAP_UNICODE) { |
4874 | pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; | 4879 | pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; |
4875 | name_len = | 4880 | name_len = |
4876 | cifsConvertToUCS((__le16 *) pSMB->RequestFileName, | 4881 | cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, |
4877 | searchName, PATH_MAX, nls_codepage, remap); | 4882 | searchName, PATH_MAX, nls_codepage, |
4883 | remap); | ||
4878 | name_len++; /* trailing null */ | 4884 | name_len++; /* trailing null */ |
4879 | name_len *= 2; | 4885 | name_len *= 2; |
4880 | } else { /* BB improve the check for buffer overruns BB */ | 4886 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5506,8 +5512,8 @@ SetEOFRetry: | |||
5506 | 5512 | ||
5507 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5513 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5508 | name_len = | 5514 | name_len = |
5509 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 5515 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
5510 | PATH_MAX, nls_codepage, remap); | 5516 | PATH_MAX, nls_codepage, remap); |
5511 | name_len++; /* trailing null */ | 5517 | name_len++; /* trailing null */ |
5512 | name_len *= 2; | 5518 | name_len *= 2; |
5513 | } else { /* BB improve the check for buffer overruns BB */ | 5519 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5796,8 +5802,8 @@ SetTimesRetry: | |||
5796 | 5802 | ||
5797 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5803 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5798 | name_len = | 5804 | name_len = |
5799 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 5805 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
5800 | PATH_MAX, nls_codepage, remap); | 5806 | PATH_MAX, nls_codepage, remap); |
5801 | name_len++; /* trailing null */ | 5807 | name_len++; /* trailing null */ |
5802 | name_len *= 2; | 5808 | name_len *= 2; |
5803 | } else { /* BB improve the check for buffer overruns BB */ | 5809 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5877,8 +5883,8 @@ SetAttrLgcyRetry: | |||
5877 | 5883 | ||
5878 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5884 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5879 | name_len = | 5885 | name_len = |
5880 | ConvertToUCS((__le16 *) pSMB->fileName, fileName, | 5886 | ConvertToUTF16((__le16 *) pSMB->fileName, fileName, |
5881 | PATH_MAX, nls_codepage); | 5887 | PATH_MAX, nls_codepage); |
5882 | name_len++; /* trailing null */ | 5888 | name_len++; /* trailing null */ |
5883 | name_len *= 2; | 5889 | name_len *= 2; |
5884 | } else { /* BB improve the check for buffer overruns BB */ | 5890 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6030,8 +6036,8 @@ setPermsRetry: | |||
6030 | 6036 | ||
6031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6037 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6032 | name_len = | 6038 | name_len = |
6033 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 6039 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
6034 | PATH_MAX, nls_codepage, remap); | 6040 | PATH_MAX, nls_codepage, remap); |
6035 | name_len++; /* trailing null */ | 6041 | name_len++; /* trailing null */ |
6036 | name_len *= 2; | 6042 | name_len *= 2; |
6037 | } else { /* BB improve the check for buffer overruns BB */ | 6043 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6123,8 +6129,8 @@ QAllEAsRetry: | |||
6123 | 6129 | ||
6124 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6130 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6125 | list_len = | 6131 | list_len = |
6126 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 6132 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
6127 | PATH_MAX, nls_codepage, remap); | 6133 | PATH_MAX, nls_codepage, remap); |
6128 | list_len++; /* trailing null */ | 6134 | list_len++; /* trailing null */ |
6129 | list_len *= 2; | 6135 | list_len *= 2; |
6130 | } else { /* BB improve the check for buffer overruns BB */ | 6136 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6301,8 +6307,8 @@ SetEARetry: | |||
6301 | 6307 | ||
6302 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6308 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6303 | name_len = | 6309 | name_len = |
6304 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 6310 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
6305 | PATH_MAX, nls_codepage, remap); | 6311 | PATH_MAX, nls_codepage, remap); |
6306 | name_len++; /* trailing null */ | 6312 | name_len++; /* trailing null */ |
6307 | name_len *= 2; | 6313 | name_len *= 2; |
6308 | } else { /* BB improve the check for buffer overruns BB */ | 6314 | } else { /* BB improve the check for buffer overruns BB */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 4666780f315d..986709a8d903 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/processor.h> | 38 | #include <asm/processor.h> |
39 | #include <linux/inet.h> | 39 | #include <linux/inet.h> |
40 | #include <linux/module.h> | 40 | #include <linux/module.h> |
41 | #include <keys/user-type.h> | ||
41 | #include <net/ipv6.h> | 42 | #include <net/ipv6.h> |
42 | #include "cifspdu.h" | 43 | #include "cifspdu.h" |
43 | #include "cifsglob.h" | 44 | #include "cifsglob.h" |
@@ -225,74 +226,90 @@ static int check2ndT2(struct smb_hdr *pSMB) | |||
225 | 226 | ||
226 | static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) | 227 | static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) |
227 | { | 228 | { |
228 | struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond; | 229 | struct smb_t2_rsp *pSMBs = (struct smb_t2_rsp *)psecond; |
229 | struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB; | 230 | struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB; |
230 | char *data_area_of_target; | 231 | char *data_area_of_tgt; |
231 | char *data_area_of_buf2; | 232 | char *data_area_of_src; |
232 | int remaining; | 233 | int remaining; |
233 | unsigned int byte_count, total_in_buf; | 234 | unsigned int byte_count, total_in_tgt; |
234 | __u16 total_data_size, total_in_buf2; | 235 | __u16 tgt_total_cnt, src_total_cnt, total_in_src; |
235 | 236 | ||
236 | total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); | 237 | src_total_cnt = get_unaligned_le16(&pSMBs->t2_rsp.TotalDataCount); |
238 | tgt_total_cnt = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); | ||
237 | 239 | ||
238 | if (total_data_size != | 240 | if (tgt_total_cnt != src_total_cnt) |
239 | get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount)) | 241 | cFYI(1, "total data count of primary and secondary t2 differ " |
240 | cFYI(1, "total data size of primary and secondary t2 differ"); | 242 | "source=%hu target=%hu", src_total_cnt, tgt_total_cnt); |
241 | 243 | ||
242 | total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); | 244 | total_in_tgt = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); |
243 | 245 | ||
244 | remaining = total_data_size - total_in_buf; | 246 | remaining = tgt_total_cnt - total_in_tgt; |
245 | 247 | ||
246 | if (remaining < 0) | 248 | if (remaining < 0) { |
249 | cFYI(1, "Server sent too much data. tgt_total_cnt=%hu " | ||
250 | "total_in_tgt=%hu", tgt_total_cnt, total_in_tgt); | ||
247 | return -EPROTO; | 251 | return -EPROTO; |
252 | } | ||
248 | 253 | ||
249 | if (remaining == 0) /* nothing to do, ignore */ | 254 | if (remaining == 0) { |
255 | /* nothing to do, ignore */ | ||
256 | cFYI(1, "no more data remains"); | ||
250 | return 0; | 257 | return 0; |
258 | } | ||
251 | 259 | ||
252 | total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount); | 260 | total_in_src = get_unaligned_le16(&pSMBs->t2_rsp.DataCount); |
253 | if (remaining < total_in_buf2) { | 261 | if (remaining < total_in_src) |
254 | cFYI(1, "transact2 2nd response contains too much data"); | 262 | cFYI(1, "transact2 2nd response contains too much data"); |
255 | } | ||
256 | 263 | ||
257 | /* find end of first SMB data area */ | 264 | /* find end of first SMB data area */ |
258 | data_area_of_target = (char *)&pSMBt->hdr.Protocol + | 265 | data_area_of_tgt = (char *)&pSMBt->hdr.Protocol + |
259 | get_unaligned_le16(&pSMBt->t2_rsp.DataOffset); | 266 | get_unaligned_le16(&pSMBt->t2_rsp.DataOffset); |
260 | /* validate target area */ | ||
261 | 267 | ||
262 | data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol + | 268 | /* validate target area */ |
263 | get_unaligned_le16(&pSMB2->t2_rsp.DataOffset); | 269 | data_area_of_src = (char *)&pSMBs->hdr.Protocol + |
270 | get_unaligned_le16(&pSMBs->t2_rsp.DataOffset); | ||
264 | 271 | ||
265 | data_area_of_target += total_in_buf; | 272 | data_area_of_tgt += total_in_tgt; |
266 | 273 | ||
267 | /* copy second buffer into end of first buffer */ | 274 | total_in_tgt += total_in_src; |
268 | total_in_buf += total_in_buf2; | ||
269 | /* is the result too big for the field? */ | 275 | /* is the result too big for the field? */ |
270 | if (total_in_buf > USHRT_MAX) | 276 | if (total_in_tgt > USHRT_MAX) { |
277 | cFYI(1, "coalesced DataCount too large (%u)", total_in_tgt); | ||
271 | return -EPROTO; | 278 | return -EPROTO; |
272 | put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount); | 279 | } |
280 | put_unaligned_le16(total_in_tgt, &pSMBt->t2_rsp.DataCount); | ||
273 | 281 | ||
274 | /* fix up the BCC */ | 282 | /* fix up the BCC */ |
275 | byte_count = get_bcc(pTargetSMB); | 283 | byte_count = get_bcc(pTargetSMB); |
276 | byte_count += total_in_buf2; | 284 | byte_count += total_in_src; |
277 | /* is the result too big for the field? */ | 285 | /* is the result too big for the field? */ |
278 | if (byte_count > USHRT_MAX) | 286 | if (byte_count > USHRT_MAX) { |
287 | cFYI(1, "coalesced BCC too large (%u)", byte_count); | ||
279 | return -EPROTO; | 288 | return -EPROTO; |
289 | } | ||
280 | put_bcc(byte_count, pTargetSMB); | 290 | put_bcc(byte_count, pTargetSMB); |
281 | 291 | ||
282 | byte_count = be32_to_cpu(pTargetSMB->smb_buf_length); | 292 | byte_count = be32_to_cpu(pTargetSMB->smb_buf_length); |
283 | byte_count += total_in_buf2; | 293 | byte_count += total_in_src; |
284 | /* don't allow buffer to overflow */ | 294 | /* don't allow buffer to overflow */ |
285 | if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) | 295 | if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
296 | cFYI(1, "coalesced BCC exceeds buffer size (%u)", byte_count); | ||
286 | return -ENOBUFS; | 297 | return -ENOBUFS; |
298 | } | ||
287 | pTargetSMB->smb_buf_length = cpu_to_be32(byte_count); | 299 | pTargetSMB->smb_buf_length = cpu_to_be32(byte_count); |
288 | 300 | ||
289 | memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2); | 301 | /* copy second buffer into end of first buffer */ |
302 | memcpy(data_area_of_tgt, data_area_of_src, total_in_src); | ||
290 | 303 | ||
291 | if (remaining == total_in_buf2) { | 304 | if (remaining != total_in_src) { |
292 | cFYI(1, "found the last secondary response"); | 305 | /* more responses to go */ |
293 | return 0; /* we are done */ | 306 | cFYI(1, "waiting for more secondary responses"); |
294 | } else /* more responses to go */ | ||
295 | return 1; | 307 | return 1; |
308 | } | ||
309 | |||
310 | /* we are done */ | ||
311 | cFYI(1, "found the last secondary response"); | ||
312 | return 0; | ||
296 | } | 313 | } |
297 | 314 | ||
298 | static void | 315 | static void |
@@ -1578,11 +1595,14 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1578 | } | 1595 | } |
1579 | } | 1596 | } |
1580 | 1597 | ||
1581 | if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) { | 1598 | #ifndef CONFIG_KEYS |
1582 | cERROR(1, "Multiuser mounts currently require krb5 " | 1599 | /* Muliuser mounts require CONFIG_KEYS support */ |
1583 | "authentication!"); | 1600 | if (vol->multiuser) { |
1601 | cERROR(1, "Multiuser mounts require kernels with " | ||
1602 | "CONFIG_KEYS enabled."); | ||
1584 | goto cifs_parse_mount_err; | 1603 | goto cifs_parse_mount_err; |
1585 | } | 1604 | } |
1605 | #endif | ||
1586 | 1606 | ||
1587 | if (vol->UNCip == NULL) | 1607 | if (vol->UNCip == NULL) |
1588 | vol->UNCip = &vol->UNC[2]; | 1608 | vol->UNCip = &vol->UNC[2]; |
@@ -1981,10 +2001,16 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol) | |||
1981 | return 0; | 2001 | return 0; |
1982 | break; | 2002 | break; |
1983 | default: | 2003 | default: |
2004 | /* NULL username means anonymous session */ | ||
2005 | if (ses->user_name == NULL) { | ||
2006 | if (!vol->nullauth) | ||
2007 | return 0; | ||
2008 | break; | ||
2009 | } | ||
2010 | |||
1984 | /* anything else takes username/password */ | 2011 | /* anything else takes username/password */ |
1985 | if (ses->user_name == NULL) | 2012 | if (strncmp(ses->user_name, |
1986 | return 0; | 2013 | vol->username ? vol->username : "", |
1987 | if (strncmp(ses->user_name, vol->username, | ||
1988 | MAX_USERNAME_SIZE)) | 2014 | MAX_USERNAME_SIZE)) |
1989 | return 0; | 2015 | return 0; |
1990 | if (strlen(vol->username) != 0 && | 2016 | if (strlen(vol->username) != 0 && |
@@ -2039,6 +2065,132 @@ cifs_put_smb_ses(struct cifs_ses *ses) | |||
2039 | cifs_put_tcp_session(server); | 2065 | cifs_put_tcp_session(server); |
2040 | } | 2066 | } |
2041 | 2067 | ||
2068 | #ifdef CONFIG_KEYS | ||
2069 | |||
2070 | /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */ | ||
2071 | #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1) | ||
2072 | |||
2073 | /* Populate username and pw fields from keyring if possible */ | ||
2074 | static int | ||
2075 | cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | ||
2076 | { | ||
2077 | int rc = 0; | ||
2078 | char *desc, *delim, *payload; | ||
2079 | ssize_t len; | ||
2080 | struct key *key; | ||
2081 | struct TCP_Server_Info *server = ses->server; | ||
2082 | struct sockaddr_in *sa; | ||
2083 | struct sockaddr_in6 *sa6; | ||
2084 | struct user_key_payload *upayload; | ||
2085 | |||
2086 | desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL); | ||
2087 | if (!desc) | ||
2088 | return -ENOMEM; | ||
2089 | |||
2090 | /* try to find an address key first */ | ||
2091 | switch (server->dstaddr.ss_family) { | ||
2092 | case AF_INET: | ||
2093 | sa = (struct sockaddr_in *)&server->dstaddr; | ||
2094 | sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr); | ||
2095 | break; | ||
2096 | case AF_INET6: | ||
2097 | sa6 = (struct sockaddr_in6 *)&server->dstaddr; | ||
2098 | sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr); | ||
2099 | break; | ||
2100 | default: | ||
2101 | cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family); | ||
2102 | rc = -EINVAL; | ||
2103 | goto out_err; | ||
2104 | } | ||
2105 | |||
2106 | cFYI(1, "%s: desc=%s", __func__, desc); | ||
2107 | key = request_key(&key_type_logon, desc, ""); | ||
2108 | if (IS_ERR(key)) { | ||
2109 | if (!ses->domainName) { | ||
2110 | cFYI(1, "domainName is NULL"); | ||
2111 | rc = PTR_ERR(key); | ||
2112 | goto out_err; | ||
2113 | } | ||
2114 | |||
2115 | /* didn't work, try to find a domain key */ | ||
2116 | sprintf(desc, "cifs:d:%s", ses->domainName); | ||
2117 | cFYI(1, "%s: desc=%s", __func__, desc); | ||
2118 | key = request_key(&key_type_logon, desc, ""); | ||
2119 | if (IS_ERR(key)) { | ||
2120 | rc = PTR_ERR(key); | ||
2121 | goto out_err; | ||
2122 | } | ||
2123 | } | ||
2124 | |||
2125 | down_read(&key->sem); | ||
2126 | upayload = key->payload.data; | ||
2127 | if (IS_ERR_OR_NULL(upayload)) { | ||
2128 | rc = PTR_ERR(key); | ||
2129 | goto out_key_put; | ||
2130 | } | ||
2131 | |||
2132 | /* find first : in payload */ | ||
2133 | payload = (char *)upayload->data; | ||
2134 | delim = strnchr(payload, upayload->datalen, ':'); | ||
2135 | cFYI(1, "payload=%s", payload); | ||
2136 | if (!delim) { | ||
2137 | cFYI(1, "Unable to find ':' in payload (datalen=%d)", | ||
2138 | upayload->datalen); | ||
2139 | rc = -EINVAL; | ||
2140 | goto out_key_put; | ||
2141 | } | ||
2142 | |||
2143 | len = delim - payload; | ||
2144 | if (len > MAX_USERNAME_SIZE || len <= 0) { | ||
2145 | cFYI(1, "Bad value from username search (len=%ld)", len); | ||
2146 | rc = -EINVAL; | ||
2147 | goto out_key_put; | ||
2148 | } | ||
2149 | |||
2150 | vol->username = kstrndup(payload, len, GFP_KERNEL); | ||
2151 | if (!vol->username) { | ||
2152 | cFYI(1, "Unable to allocate %ld bytes for username", len); | ||
2153 | rc = -ENOMEM; | ||
2154 | goto out_key_put; | ||
2155 | } | ||
2156 | cFYI(1, "%s: username=%s", __func__, vol->username); | ||
2157 | |||
2158 | len = key->datalen - (len + 1); | ||
2159 | if (len > MAX_PASSWORD_SIZE || len <= 0) { | ||
2160 | cFYI(1, "Bad len for password search (len=%ld)", len); | ||
2161 | rc = -EINVAL; | ||
2162 | kfree(vol->username); | ||
2163 | vol->username = NULL; | ||
2164 | goto out_key_put; | ||
2165 | } | ||
2166 | |||
2167 | ++delim; | ||
2168 | vol->password = kstrndup(delim, len, GFP_KERNEL); | ||
2169 | if (!vol->password) { | ||
2170 | cFYI(1, "Unable to allocate %ld bytes for password", len); | ||
2171 | rc = -ENOMEM; | ||
2172 | kfree(vol->username); | ||
2173 | vol->username = NULL; | ||
2174 | goto out_key_put; | ||
2175 | } | ||
2176 | |||
2177 | out_key_put: | ||
2178 | up_read(&key->sem); | ||
2179 | key_put(key); | ||
2180 | out_err: | ||
2181 | kfree(desc); | ||
2182 | cFYI(1, "%s: returning %d", __func__, rc); | ||
2183 | return rc; | ||
2184 | } | ||
2185 | #else /* ! CONFIG_KEYS */ | ||
2186 | static inline int | ||
2187 | cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)), | ||
2188 | struct cifs_ses *ses __attribute__((unused))) | ||
2189 | { | ||
2190 | return -ENOSYS; | ||
2191 | } | ||
2192 | #endif /* CONFIG_KEYS */ | ||
2193 | |||
2042 | static bool warned_on_ntlm; /* globals init to false automatically */ | 2194 | static bool warned_on_ntlm; /* globals init to false automatically */ |
2043 | 2195 | ||
2044 | static struct cifs_ses * | 2196 | static struct cifs_ses * |
@@ -2914,18 +3066,33 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, | |||
2914 | #define CIFS_DEFAULT_IOSIZE (1024 * 1024) | 3066 | #define CIFS_DEFAULT_IOSIZE (1024 * 1024) |
2915 | 3067 | ||
2916 | /* | 3068 | /* |
2917 | * Windows only supports a max of 60k reads. Default to that when posix | 3069 | * Windows only supports a max of 60kb reads and 65535 byte writes. Default to |
2918 | * extensions aren't in force. | 3070 | * those values when posix extensions aren't in force. In actuality here, we |
3071 | * use 65536 to allow for a write that is a multiple of 4k. Most servers seem | ||
3072 | * to be ok with the extra byte even though Windows doesn't send writes that | ||
3073 | * are that large. | ||
3074 | * | ||
3075 | * Citation: | ||
3076 | * | ||
3077 | * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx | ||
2919 | */ | 3078 | */ |
2920 | #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024) | 3079 | #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024) |
3080 | #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536) | ||
2921 | 3081 | ||
2922 | static unsigned int | 3082 | static unsigned int |
2923 | cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) | 3083 | cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) |
2924 | { | 3084 | { |
2925 | __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); | 3085 | __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); |
2926 | struct TCP_Server_Info *server = tcon->ses->server; | 3086 | struct TCP_Server_Info *server = tcon->ses->server; |
2927 | unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize : | 3087 | unsigned int wsize; |
2928 | CIFS_DEFAULT_IOSIZE; | 3088 | |
3089 | /* start with specified wsize, or default */ | ||
3090 | if (pvolume_info->wsize) | ||
3091 | wsize = pvolume_info->wsize; | ||
3092 | else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) | ||
3093 | wsize = CIFS_DEFAULT_IOSIZE; | ||
3094 | else | ||
3095 | wsize = CIFS_DEFAULT_NON_POSIX_WSIZE; | ||
2929 | 3096 | ||
2930 | /* can server support 24-bit write sizes? (via UNIX extensions) */ | 3097 | /* can server support 24-bit write sizes? (via UNIX extensions) */ |
2931 | if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) | 3098 | if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) |
@@ -3136,10 +3303,9 @@ cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data, | |||
3136 | return -EINVAL; | 3303 | return -EINVAL; |
3137 | 3304 | ||
3138 | if (volume_info->nullauth) { | 3305 | if (volume_info->nullauth) { |
3139 | cFYI(1, "null user"); | 3306 | cFYI(1, "Anonymous login"); |
3140 | volume_info->username = kzalloc(1, GFP_KERNEL); | 3307 | kfree(volume_info->username); |
3141 | if (volume_info->username == NULL) | 3308 | volume_info->username = NULL; |
3142 | return -ENOMEM; | ||
3143 | } else if (volume_info->username) { | 3309 | } else if (volume_info->username) { |
3144 | /* BB fixme parse for domain name here */ | 3310 | /* BB fixme parse for domain name here */ |
3145 | cFYI(1, "Username: %s", volume_info->username); | 3311 | cFYI(1, "Username: %s", volume_info->username); |
@@ -3478,7 +3644,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses, | |||
3478 | if (ses->capabilities & CAP_UNICODE) { | 3644 | if (ses->capabilities & CAP_UNICODE) { |
3479 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; | 3645 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; |
3480 | length = | 3646 | length = |
3481 | cifs_strtoUCS((__le16 *) bcc_ptr, tree, | 3647 | cifs_strtoUTF16((__le16 *) bcc_ptr, tree, |
3482 | 6 /* max utf8 char length in bytes */ * | 3648 | 6 /* max utf8 char length in bytes */ * |
3483 | (/* server len*/ + 256 /* share len */), nls_codepage); | 3649 | (/* server len*/ + 256 /* share len */), nls_codepage); |
3484 | bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */ | 3650 | bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */ |
@@ -3533,7 +3699,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses, | |||
3533 | 3699 | ||
3534 | /* mostly informational -- no need to fail on error here */ | 3700 | /* mostly informational -- no need to fail on error here */ |
3535 | kfree(tcon->nativeFileSystem); | 3701 | kfree(tcon->nativeFileSystem); |
3536 | tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr, | 3702 | tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr, |
3537 | bytes_left, is_unicode, | 3703 | bytes_left, is_unicode, |
3538 | nls_codepage); | 3704 | nls_codepage); |
3539 | 3705 | ||
@@ -3657,16 +3823,38 @@ int cifs_setup_session(unsigned int xid, struct cifs_ses *ses, | |||
3657 | return rc; | 3823 | return rc; |
3658 | } | 3824 | } |
3659 | 3825 | ||
3826 | static int | ||
3827 | cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses) | ||
3828 | { | ||
3829 | switch (ses->server->secType) { | ||
3830 | case Kerberos: | ||
3831 | vol->secFlg = CIFSSEC_MUST_KRB5; | ||
3832 | return 0; | ||
3833 | case NTLMv2: | ||
3834 | vol->secFlg = CIFSSEC_MUST_NTLMV2; | ||
3835 | break; | ||
3836 | case NTLM: | ||
3837 | vol->secFlg = CIFSSEC_MUST_NTLM; | ||
3838 | break; | ||
3839 | case RawNTLMSSP: | ||
3840 | vol->secFlg = CIFSSEC_MUST_NTLMSSP; | ||
3841 | break; | ||
3842 | case LANMAN: | ||
3843 | vol->secFlg = CIFSSEC_MUST_LANMAN; | ||
3844 | break; | ||
3845 | } | ||
3846 | |||
3847 | return cifs_set_cifscreds(vol, ses); | ||
3848 | } | ||
3849 | |||
3660 | static struct cifs_tcon * | 3850 | static struct cifs_tcon * |
3661 | cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | 3851 | cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) |
3662 | { | 3852 | { |
3853 | int rc; | ||
3663 | struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); | 3854 | struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); |
3664 | struct cifs_ses *ses; | 3855 | struct cifs_ses *ses; |
3665 | struct cifs_tcon *tcon = NULL; | 3856 | struct cifs_tcon *tcon = NULL; |
3666 | struct smb_vol *vol_info; | 3857 | struct smb_vol *vol_info; |
3667 | char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */ | ||
3668 | /* We used to have this as MAX_USERNAME which is */ | ||
3669 | /* way too big now (256 instead of 32) */ | ||
3670 | 3858 | ||
3671 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); | 3859 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); |
3672 | if (vol_info == NULL) { | 3860 | if (vol_info == NULL) { |
@@ -3674,8 +3862,6 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3674 | goto out; | 3862 | goto out; |
3675 | } | 3863 | } |
3676 | 3864 | ||
3677 | snprintf(username, sizeof(username), "krb50x%x", fsuid); | ||
3678 | vol_info->username = username; | ||
3679 | vol_info->local_nls = cifs_sb->local_nls; | 3865 | vol_info->local_nls = cifs_sb->local_nls; |
3680 | vol_info->linux_uid = fsuid; | 3866 | vol_info->linux_uid = fsuid; |
3681 | vol_info->cred_uid = fsuid; | 3867 | vol_info->cred_uid = fsuid; |
@@ -3685,8 +3871,11 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3685 | vol_info->local_lease = master_tcon->local_lease; | 3871 | vol_info->local_lease = master_tcon->local_lease; |
3686 | vol_info->no_linux_ext = !master_tcon->unix_ext; | 3872 | vol_info->no_linux_ext = !master_tcon->unix_ext; |
3687 | 3873 | ||
3688 | /* FIXME: allow for other secFlg settings */ | 3874 | rc = cifs_set_vol_auth(vol_info, master_tcon->ses); |
3689 | vol_info->secFlg = CIFSSEC_MUST_KRB5; | 3875 | if (rc) { |
3876 | tcon = ERR_PTR(rc); | ||
3877 | goto out; | ||
3878 | } | ||
3690 | 3879 | ||
3691 | /* get a reference for the same TCP session */ | 3880 | /* get a reference for the same TCP session */ |
3692 | spin_lock(&cifs_tcp_ses_lock); | 3881 | spin_lock(&cifs_tcp_ses_lock); |
@@ -3709,6 +3898,8 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3709 | if (ses->capabilities & CAP_UNIX) | 3898 | if (ses->capabilities & CAP_UNIX) |
3710 | reset_cifs_unix_caps(0, tcon, NULL, vol_info); | 3899 | reset_cifs_unix_caps(0, tcon, NULL, vol_info); |
3711 | out: | 3900 | out: |
3901 | kfree(vol_info->username); | ||
3902 | kfree(vol_info->password); | ||
3712 | kfree(vol_info); | 3903 | kfree(vol_info); |
3713 | 3904 | ||
3714 | return tcon; | 3905 | return tcon; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index a090bbe6ee29..e2bbc683e018 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -647,10 +647,11 @@ static int cifs_filldir(char *find_entry, struct file *file, filldir_t filldir, | |||
647 | 647 | ||
648 | name.name = scratch_buf; | 648 | name.name = scratch_buf; |
649 | name.len = | 649 | name.len = |
650 | cifs_from_ucs2((char *)name.name, (__le16 *)de.name, | 650 | cifs_from_utf16((char *)name.name, (__le16 *)de.name, |
651 | UNICODE_NAME_MAX, | 651 | UNICODE_NAME_MAX, |
652 | min(de.namelen, (size_t)max_len), nlt, | 652 | min_t(size_t, de.namelen, |
653 | cifs_sb->mnt_cifs_flags & | 653 | (size_t)max_len), nlt, |
654 | cifs_sb->mnt_cifs_flags & | ||
654 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 655 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
655 | name.len -= nls_nullsize(nlt); | 656 | name.len -= nls_nullsize(nlt); |
656 | } else { | 657 | } else { |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 4ec3ee9d72cc..d85efad5765f 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -167,16 +167,16 @@ unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp) | |||
167 | int bytes_ret = 0; | 167 | int bytes_ret = 0; |
168 | 168 | ||
169 | /* Copy OS version */ | 169 | /* Copy OS version */ |
170 | bytes_ret = cifs_strtoUCS((__le16 *)bcc_ptr, "Linux version ", 32, | 170 | bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32, |
171 | nls_cp); | 171 | nls_cp); |
172 | bcc_ptr += 2 * bytes_ret; | 172 | bcc_ptr += 2 * bytes_ret; |
173 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, init_utsname()->release, | 173 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release, |
174 | 32, nls_cp); | 174 | 32, nls_cp); |
175 | bcc_ptr += 2 * bytes_ret; | 175 | bcc_ptr += 2 * bytes_ret; |
176 | bcc_ptr += 2; /* trailing null */ | 176 | bcc_ptr += 2; /* trailing null */ |
177 | 177 | ||
178 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, | 178 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
179 | 32, nls_cp); | 179 | 32, nls_cp); |
180 | bcc_ptr += 2 * bytes_ret; | 180 | bcc_ptr += 2 * bytes_ret; |
181 | bcc_ptr += 2; /* trailing null */ | 181 | bcc_ptr += 2; /* trailing null */ |
182 | 182 | ||
@@ -197,8 +197,8 @@ static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses, | |||
197 | *(bcc_ptr+1) = 0; | 197 | *(bcc_ptr+1) = 0; |
198 | bytes_ret = 0; | 198 | bytes_ret = 0; |
199 | } else | 199 | } else |
200 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->domainName, | 200 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName, |
201 | 256, nls_cp); | 201 | 256, nls_cp); |
202 | bcc_ptr += 2 * bytes_ret; | 202 | bcc_ptr += 2 * bytes_ret; |
203 | bcc_ptr += 2; /* account for null terminator */ | 203 | bcc_ptr += 2; /* account for null terminator */ |
204 | 204 | ||
@@ -226,8 +226,8 @@ static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses, | |||
226 | *bcc_ptr = 0; | 226 | *bcc_ptr = 0; |
227 | *(bcc_ptr+1) = 0; | 227 | *(bcc_ptr+1) = 0; |
228 | } else { | 228 | } else { |
229 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->user_name, | 229 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name, |
230 | MAX_USERNAME_SIZE, nls_cp); | 230 | MAX_USERNAME_SIZE, nls_cp); |
231 | } | 231 | } |
232 | bcc_ptr += 2 * bytes_ret; | 232 | bcc_ptr += 2 * bytes_ret; |
233 | bcc_ptr += 2; /* account for null termination */ | 233 | bcc_ptr += 2; /* account for null termination */ |
@@ -287,7 +287,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
287 | cFYI(1, "bleft %d", bleft); | 287 | cFYI(1, "bleft %d", bleft); |
288 | 288 | ||
289 | kfree(ses->serverOS); | 289 | kfree(ses->serverOS); |
290 | ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 290 | ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
291 | cFYI(1, "serverOS=%s", ses->serverOS); | 291 | cFYI(1, "serverOS=%s", ses->serverOS); |
292 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 292 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
293 | data += len; | 293 | data += len; |
@@ -296,7 +296,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
296 | return; | 296 | return; |
297 | 297 | ||
298 | kfree(ses->serverNOS); | 298 | kfree(ses->serverNOS); |
299 | ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 299 | ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
300 | cFYI(1, "serverNOS=%s", ses->serverNOS); | 300 | cFYI(1, "serverNOS=%s", ses->serverNOS); |
301 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 301 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
302 | data += len; | 302 | data += len; |
@@ -305,7 +305,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
305 | return; | 305 | return; |
306 | 306 | ||
307 | kfree(ses->serverDomain); | 307 | kfree(ses->serverDomain); |
308 | ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 308 | ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
309 | cFYI(1, "serverDomain=%s", ses->serverDomain); | 309 | cFYI(1, "serverDomain=%s", ses->serverDomain); |
310 | 310 | ||
311 | return; | 311 | return; |
@@ -502,8 +502,8 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer, | |||
502 | tmp += 2; | 502 | tmp += 2; |
503 | } else { | 503 | } else { |
504 | int len; | 504 | int len; |
505 | len = cifs_strtoUCS((__le16 *)tmp, ses->domainName, | 505 | len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName, |
506 | MAX_USERNAME_SIZE, nls_cp); | 506 | MAX_USERNAME_SIZE, nls_cp); |
507 | len *= 2; /* unicode is 2 bytes each */ | 507 | len *= 2; /* unicode is 2 bytes each */ |
508 | sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer); | 508 | sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer); |
509 | sec_blob->DomainName.Length = cpu_to_le16(len); | 509 | sec_blob->DomainName.Length = cpu_to_le16(len); |
@@ -518,8 +518,8 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer, | |||
518 | tmp += 2; | 518 | tmp += 2; |
519 | } else { | 519 | } else { |
520 | int len; | 520 | int len; |
521 | len = cifs_strtoUCS((__le16 *)tmp, ses->user_name, | 521 | len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name, |
522 | MAX_USERNAME_SIZE, nls_cp); | 522 | MAX_USERNAME_SIZE, nls_cp); |
523 | len *= 2; /* unicode is 2 bytes each */ | 523 | len *= 2; /* unicode is 2 bytes each */ |
524 | sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer); | 524 | sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer); |
525 | sec_blob->UserName.Length = cpu_to_le16(len); | 525 | sec_blob->UserName.Length = cpu_to_le16(len); |
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 80d850881938..d5cd9aa7eacc 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
@@ -213,7 +213,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
213 | 213 | ||
214 | /* Password cannot be longer than 128 characters */ | 214 | /* Password cannot be longer than 128 characters */ |
215 | if (passwd) /* Password must be converted to NT unicode */ | 215 | if (passwd) /* Password must be converted to NT unicode */ |
216 | len = cifs_strtoUCS(wpwd, passwd, 128, codepage); | 216 | len = cifs_strtoUTF16(wpwd, passwd, 128, codepage); |
217 | else { | 217 | else { |
218 | len = 0; | 218 | len = 0; |
219 | *wpwd = 0; /* Ensure string is null terminated */ | 219 | *wpwd = 0; /* Ensure string is null terminated */ |
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index f65d4455c5e5..ef023eef0464 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -540,7 +540,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_blob); | |||
540 | * debugfs_print_regs32 - use seq_print to describe a set of registers | 540 | * debugfs_print_regs32 - use seq_print to describe a set of registers |
541 | * @s: the seq_file structure being used to generate output | 541 | * @s: the seq_file structure being used to generate output |
542 | * @regs: an array if struct debugfs_reg32 structures | 542 | * @regs: an array if struct debugfs_reg32 structures |
543 | * @mregs: the length of the above array | 543 | * @nregs: the length of the above array |
544 | * @base: the base address to be used in reading the registers | 544 | * @base: the base address to be used in reading the registers |
545 | * @prefix: a string to be prefixed to every output line | 545 | * @prefix: a string to be prefixed to every output line |
546 | * | 546 | * |
diff --git a/fs/inode.c b/fs/inode.c index 4fa4f0916af9..fb10d86ffad7 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -322,9 +322,6 @@ EXPORT_SYMBOL(clear_nlink); | |||
322 | void set_nlink(struct inode *inode, unsigned int nlink) | 322 | void set_nlink(struct inode *inode, unsigned int nlink) |
323 | { | 323 | { |
324 | if (!nlink) { | 324 | if (!nlink) { |
325 | printk_ratelimited(KERN_INFO | ||
326 | "set_nlink() clearing i_nlink on %s inode %li\n", | ||
327 | inode->i_sb->s_type->name, inode->i_ino); | ||
328 | clear_nlink(inode); | 325 | clear_nlink(inode); |
329 | } else { | 326 | } else { |
330 | /* Yes, some filesystems do change nlink from zero to one */ | 327 | /* Yes, some filesystems do change nlink from zero to one */ |
diff --git a/fs/proc/stat.c b/fs/proc/stat.c index d76ca6ae2b1b..121f77cfef76 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c | |||
@@ -77,6 +77,8 @@ static int show_stat(struct seq_file *p, void *v) | |||
77 | steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; | 77 | steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; |
78 | guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; | 78 | guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; |
79 | guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; | 79 | guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; |
80 | sum += kstat_cpu_irqs_sum(i); | ||
81 | sum += arch_irq_stat_cpu(i); | ||
80 | 82 | ||
81 | for (j = 0; j < NR_SOFTIRQS; j++) { | 83 | for (j = 0; j < NR_SOFTIRQS; j++) { |
82 | unsigned int softirq_stat = kstat_softirqs_cpu(j, i); | 84 | unsigned int softirq_stat = kstat_softirqs_cpu(j, i); |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index e418c5abdb0e..7dcd2a250495 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -518,6 +518,9 @@ static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr, | |||
518 | if (!page) | 518 | if (!page) |
519 | continue; | 519 | continue; |
520 | 520 | ||
521 | if (PageReserved(page)) | ||
522 | continue; | ||
523 | |||
521 | /* Clear accessed and referenced bits. */ | 524 | /* Clear accessed and referenced bits. */ |
522 | ptep_test_and_clear_young(vma, addr, pte); | 525 | ptep_test_and_clear_young(vma, addr, pte); |
523 | ClearPageReferenced(page); | 526 | ClearPageReferenced(page); |
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 2bfd987f4853..6b009548d2e0 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -179,47 +179,33 @@ static const char *qnx4_checkroot(struct super_block *sb) | |||
179 | struct qnx4_inode_entry *rootdir; | 179 | struct qnx4_inode_entry *rootdir; |
180 | int rd, rl; | 180 | int rd, rl; |
181 | int i, j; | 181 | int i, j; |
182 | int found = 0; | ||
183 | 182 | ||
184 | if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') { | 183 | if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') |
185 | return "no qnx4 filesystem (no root dir)."; | 184 | return "no qnx4 filesystem (no root dir)."; |
186 | } else { | 185 | QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id)); |
187 | QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id)); | 186 | rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1; |
188 | rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1; | 187 | rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size); |
189 | rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size); | 188 | for (j = 0; j < rl; j++) { |
190 | for (j = 0; j < rl; j++) { | 189 | bh = sb_bread(sb, rd + j); /* root dir, first block */ |
191 | bh = sb_bread(sb, rd + j); /* root dir, first block */ | 190 | if (bh == NULL) |
192 | if (bh == NULL) { | 191 | return "unable to read root entry."; |
193 | return "unable to read root entry."; | 192 | rootdir = (struct qnx4_inode_entry *) bh->b_data; |
194 | } | 193 | for (i = 0; i < QNX4_INODES_PER_BLOCK; i++, rootdir++) { |
195 | for (i = 0; i < QNX4_INODES_PER_BLOCK; i++) { | 194 | QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname)); |
196 | rootdir = (struct qnx4_inode_entry *) (bh->b_data + i * QNX4_DIR_ENTRY_SIZE); | 195 | if (strcmp(rootdir->di_fname, QNX4_BMNAME) != 0) |
197 | if (rootdir->di_fname != NULL) { | 196 | continue; |
198 | QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname)); | 197 | qnx4_sb(sb)->BitMap = kmemdup(rootdir, |
199 | if (!strcmp(rootdir->di_fname, | 198 | sizeof(struct qnx4_inode_entry), |
200 | QNX4_BMNAME)) { | 199 | GFP_KERNEL); |
201 | found = 1; | ||
202 | qnx4_sb(sb)->BitMap = kmemdup(rootdir, | ||
203 | sizeof(struct qnx4_inode_entry), | ||
204 | GFP_KERNEL); | ||
205 | if (!qnx4_sb(sb)->BitMap) { | ||
206 | brelse (bh); | ||
207 | return "not enough memory for bitmap inode"; | ||
208 | }/* keep bitmap inode known */ | ||
209 | break; | ||
210 | } | ||
211 | } | ||
212 | } | ||
213 | brelse(bh); | 200 | brelse(bh); |
214 | if (found != 0) { | 201 | if (!qnx4_sb(sb)->BitMap) |
215 | break; | 202 | return "not enough memory for bitmap inode"; |
216 | } | 203 | /* keep bitmap inode known */ |
217 | } | 204 | return NULL; |
218 | if (found == 0) { | ||
219 | return "bitmap file not found."; | ||
220 | } | 205 | } |
206 | brelse(bh); | ||
221 | } | 207 | } |
222 | return NULL; | 208 | return "bitmap file not found."; |
223 | } | 209 | } |
224 | 210 | ||
225 | static int qnx4_fill_super(struct super_block *s, void *data, int silent) | 211 | static int qnx4_fill_super(struct super_block *s, void *data, int silent) |
@@ -270,7 +256,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) | |||
270 | if (IS_ERR(root)) { | 256 | if (IS_ERR(root)) { |
271 | printk(KERN_ERR "qnx4: get inode failed\n"); | 257 | printk(KERN_ERR "qnx4: get inode failed\n"); |
272 | ret = PTR_ERR(root); | 258 | ret = PTR_ERR(root); |
273 | goto out; | 259 | goto outb; |
274 | } | 260 | } |
275 | 261 | ||
276 | ret = -ENOMEM; | 262 | ret = -ENOMEM; |
@@ -283,6 +269,8 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) | |||
283 | 269 | ||
284 | outi: | 270 | outi: |
285 | iput(root); | 271 | iput(root); |
272 | outb: | ||
273 | kfree(qs->BitMap); | ||
286 | out: | 274 | out: |
287 | brelse(bh); | 275 | brelse(bh); |
288 | outnobh: | 276 | outnobh: |
diff --git a/fs/super.c b/fs/super.c index de41e1e46f09..6015c02296b7 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -1186,6 +1186,8 @@ int freeze_super(struct super_block *sb) | |||
1186 | printk(KERN_ERR | 1186 | printk(KERN_ERR |
1187 | "VFS:Filesystem freeze failed\n"); | 1187 | "VFS:Filesystem freeze failed\n"); |
1188 | sb->s_frozen = SB_UNFROZEN; | 1188 | sb->s_frozen = SB_UNFROZEN; |
1189 | smp_wmb(); | ||
1190 | wake_up(&sb->s_wait_unfrozen); | ||
1189 | deactivate_locked_super(sb); | 1191 | deactivate_locked_super(sb); |
1190 | return ret; | 1192 | return ret; |
1191 | } | 1193 | } |
diff --git a/include/keys/user-type.h b/include/keys/user-type.h index c37c34275a44..bc9ec1d7698c 100644 --- a/include/keys/user-type.h +++ b/include/keys/user-type.h | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | /*****************************************************************************/ | 18 | /*****************************************************************************/ |
19 | /* | 19 | /* |
20 | * the payload for a key of type "user" | 20 | * the payload for a key of type "user" or "logon" |
21 | * - once filled in and attached to a key: | 21 | * - once filled in and attached to a key: |
22 | * - the payload struct is invariant may not be changed, only replaced | 22 | * - the payload struct is invariant may not be changed, only replaced |
23 | * - the payload must be read with RCU procedures or with the key semaphore | 23 | * - the payload must be read with RCU procedures or with the key semaphore |
@@ -33,6 +33,7 @@ struct user_key_payload { | |||
33 | }; | 33 | }; |
34 | 34 | ||
35 | extern struct key_type key_type_user; | 35 | extern struct key_type key_type_user; |
36 | extern struct key_type key_type_logon; | ||
36 | 37 | ||
37 | extern int user_instantiate(struct key *key, const void *data, size_t datalen); | 38 | extern int user_instantiate(struct key *key, const void *data, size_t datalen); |
38 | extern int user_update(struct key *key, const void *data, size_t datalen); | 39 | extern int user_update(struct key *key, const void *data, size_t datalen); |
diff --git a/include/linux/device.h b/include/linux/device.h index 5b3adb8f9588..b63fb393aa58 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -279,11 +279,11 @@ struct device *driver_find_device(struct device_driver *drv, | |||
279 | 279 | ||
280 | /** | 280 | /** |
281 | * struct subsys_interface - interfaces to device functions | 281 | * struct subsys_interface - interfaces to device functions |
282 | * @name name of the device function | 282 | * @name: name of the device function |
283 | * @subsystem subsytem of the devices to attach to | 283 | * @subsys: subsytem of the devices to attach to |
284 | * @node the list of functions registered at the subsystem | 284 | * @node: the list of functions registered at the subsystem |
285 | * @add device hookup to device function handler | 285 | * @add_dev: device hookup to device function handler |
286 | * @remove device hookup to device function handler | 286 | * @remove_dev: device hookup to device function handler |
287 | * | 287 | * |
288 | * Simple interfaces attached to a subsystem. Multiple interfaces can | 288 | * Simple interfaces attached to a subsystem. Multiple interfaces can |
289 | * attach to a subsystem and its devices. Unlike drivers, they do not | 289 | * attach to a subsystem and its devices. Unlike drivers, they do not |
@@ -612,6 +612,7 @@ struct device_dma_parameters { | |||
612 | * @archdata: For arch-specific additions. | 612 | * @archdata: For arch-specific additions. |
613 | * @of_node: Associated device tree node. | 613 | * @of_node: Associated device tree node. |
614 | * @devt: For creating the sysfs "dev". | 614 | * @devt: For creating the sysfs "dev". |
615 | * @id: device instance | ||
615 | * @devres_lock: Spinlock to protect the resource of the device. | 616 | * @devres_lock: Spinlock to protect the resource of the device. |
616 | * @devres_head: The resources list of the device. | 617 | * @devres_head: The resources list of the device. |
617 | * @knode_class: The node used to add the device to the class list. | 618 | * @knode_class: The node used to add the device to the class list. |
@@ -1003,6 +1004,10 @@ extern long sysfs_deprecated; | |||
1003 | * Each module may only use this macro once, and calling it replaces | 1004 | * Each module may only use this macro once, and calling it replaces |
1004 | * module_init() and module_exit(). | 1005 | * module_init() and module_exit(). |
1005 | * | 1006 | * |
1007 | * @__driver: driver name | ||
1008 | * @__register: register function for this driver type | ||
1009 | * @__unregister: unregister function for this driver type | ||
1010 | * | ||
1006 | * Use this macro to construct bus specific macros for registering | 1011 | * Use this macro to construct bus specific macros for registering |
1007 | * drivers, and do not use it on its own. | 1012 | * drivers, and do not use it on its own. |
1008 | */ | 1013 | */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 0244082d42c5..4b3a41fe22bf 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/ioctl.h> | 10 | #include <linux/ioctl.h> |
11 | #include <linux/blk_types.h> | 11 | #include <linux/blk_types.h> |
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/migrate_mode.h> | ||
13 | 14 | ||
14 | /* | 15 | /* |
15 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change | 16 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change |
@@ -526,7 +527,6 @@ enum positive_aop_returns { | |||
526 | struct page; | 527 | struct page; |
527 | struct address_space; | 528 | struct address_space; |
528 | struct writeback_control; | 529 | struct writeback_control; |
529 | enum migrate_mode; | ||
530 | 530 | ||
531 | struct iov_iter { | 531 | struct iov_iter { |
532 | const struct iovec *iov; | 532 | const struct iovec *iov; |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 2fa0901219d4..0d7d6a1b172f 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -50,9 +50,11 @@ | |||
50 | * note header. For kdump, the code in vmcore.c runs in the context | 50 | * note header. For kdump, the code in vmcore.c runs in the context |
51 | * of the second kernel to combine them into one note. | 51 | * of the second kernel to combine them into one note. |
52 | */ | 52 | */ |
53 | #ifndef KEXEC_NOTE_BYTES | ||
53 | #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \ | 54 | #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \ |
54 | KEXEC_CORE_NOTE_NAME_BYTES + \ | 55 | KEXEC_CORE_NOTE_NAME_BYTES + \ |
55 | KEXEC_CORE_NOTE_DESC_BYTES ) | 56 | KEXEC_CORE_NOTE_DESC_BYTES ) |
57 | #endif | ||
56 | 58 | ||
57 | /* | 59 | /* |
58 | * This structure is used to hold the arguments that are used when loading | 60 | * This structure is used to hold the arguments that are used when loading |
diff --git a/include/linux/key.h b/include/linux/key.h index bfc014c57351..5253471cd2ea 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
@@ -271,7 +271,7 @@ extern int keyring_add_key(struct key *keyring, | |||
271 | 271 | ||
272 | extern struct key *key_lookup(key_serial_t id); | 272 | extern struct key *key_lookup(key_serial_t id); |
273 | 273 | ||
274 | static inline key_serial_t key_serial(struct key *key) | 274 | static inline key_serial_t key_serial(const struct key *key) |
275 | { | 275 | { |
276 | return key ? key->serial : 0; | 276 | return key ? key->serial : 0; |
277 | } | 277 | } |
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index eaf867412f7a..05ed2828a553 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
@@ -3,22 +3,10 @@ | |||
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/mempolicy.h> | 5 | #include <linux/mempolicy.h> |
6 | #include <linux/migrate_mode.h> | ||
6 | 7 | ||
7 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); | 8 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); |
8 | 9 | ||
9 | /* | ||
10 | * MIGRATE_ASYNC means never block | ||
11 | * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking | ||
12 | * on most operations but not ->writepage as the potential stall time | ||
13 | * is too significant | ||
14 | * MIGRATE_SYNC will block when migrating pages | ||
15 | */ | ||
16 | enum migrate_mode { | ||
17 | MIGRATE_ASYNC, | ||
18 | MIGRATE_SYNC_LIGHT, | ||
19 | MIGRATE_SYNC, | ||
20 | }; | ||
21 | |||
22 | #ifdef CONFIG_MIGRATION | 10 | #ifdef CONFIG_MIGRATION |
23 | #define PAGE_MIGRATION 1 | 11 | #define PAGE_MIGRATION 1 |
24 | 12 | ||
diff --git a/include/linux/migrate_mode.h b/include/linux/migrate_mode.h new file mode 100644 index 000000000000..ebf3d89a3919 --- /dev/null +++ b/include/linux/migrate_mode.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef MIGRATE_MODE_H_INCLUDED | ||
2 | #define MIGRATE_MODE_H_INCLUDED | ||
3 | /* | ||
4 | * MIGRATE_ASYNC means never block | ||
5 | * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking | ||
6 | * on most operations but not ->writepage as the potential stall time | ||
7 | * is too significant | ||
8 | * MIGRATE_SYNC will block when migrating pages | ||
9 | */ | ||
10 | enum migrate_mode { | ||
11 | MIGRATE_ASYNC, | ||
12 | MIGRATE_SYNC_LIGHT, | ||
13 | MIGRATE_SYNC, | ||
14 | }; | ||
15 | |||
16 | #endif /* MIGRATE_MODE_H_INCLUDED */ | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4032ec1cf836..513f52459872 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2088,7 +2088,7 @@ extern int sched_setscheduler_nocheck(struct task_struct *, int, | |||
2088 | extern struct task_struct *idle_task(int cpu); | 2088 | extern struct task_struct *idle_task(int cpu); |
2089 | /** | 2089 | /** |
2090 | * is_idle_task - is the specified task an idle task? | 2090 | * is_idle_task - is the specified task an idle task? |
2091 | * @tsk: the task in question. | 2091 | * @p: the task in question. |
2092 | */ | 2092 | */ |
2093 | static inline bool is_idle_task(struct task_struct *p) | 2093 | static inline bool is_idle_task(struct task_struct *p) |
2094 | { | 2094 | { |
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index e4c711c6f321..79ab2555b3b0 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
@@ -48,6 +48,7 @@ extern struct file *shmem_file_setup(const char *name, | |||
48 | loff_t size, unsigned long flags); | 48 | loff_t size, unsigned long flags); |
49 | extern int shmem_zero_setup(struct vm_area_struct *); | 49 | extern int shmem_zero_setup(struct vm_area_struct *); |
50 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); | 50 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); |
51 | extern void shmem_unlock_mapping(struct address_space *mapping); | ||
51 | extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, | 52 | extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, |
52 | pgoff_t index, gfp_t gfp_mask); | 53 | pgoff_t index, gfp_t gfp_mask); |
53 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); | 54 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 06061a7f8e69..3e60228e7299 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -273,7 +273,7 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order) | |||
273 | #endif | 273 | #endif |
274 | 274 | ||
275 | extern int page_evictable(struct page *page, struct vm_area_struct *vma); | 275 | extern int page_evictable(struct page *page, struct vm_area_struct *vma); |
276 | extern void scan_mapping_unevictable_pages(struct address_space *); | 276 | extern void check_move_unevictable_pages(struct page **, int nr_pages); |
277 | 277 | ||
278 | extern unsigned long scan_unevictable_pages; | 278 | extern unsigned long scan_unevictable_pages; |
279 | extern int scan_unevictable_handler(struct ctl_table *, int, | 279 | extern int scan_unevictable_handler(struct ctl_table *, int, |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 27a4e16d2bf1..69d845739bc2 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -1073,6 +1073,7 @@ typedef void (*usb_complete_t)(struct urb *); | |||
1073 | * which the host controller driver should use in preference to the | 1073 | * which the host controller driver should use in preference to the |
1074 | * transfer_buffer. | 1074 | * transfer_buffer. |
1075 | * @sg: scatter gather buffer list | 1075 | * @sg: scatter gather buffer list |
1076 | * @num_mapped_sgs: (internal) number of mapped sg entries | ||
1076 | * @num_sgs: number of entries in the sg list | 1077 | * @num_sgs: number of entries in the sg list |
1077 | * @transfer_buffer_length: How big is transfer_buffer. The transfer may | 1078 | * @transfer_buffer_length: How big is transfer_buffer. The transfer may |
1078 | * be broken up into chunks according to the current maximum packet | 1079 | * be broken up into chunks according to the current maximum packet |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 15f4be7d768e..a067d30ce73e 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -1140,6 +1140,7 @@ struct cfg80211_disassoc_request { | |||
1140 | * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not | 1140 | * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not |
1141 | * search for IBSSs with a different BSSID. | 1141 | * search for IBSSs with a different BSSID. |
1142 | * @channel: The channel to use if no IBSS can be found to join. | 1142 | * @channel: The channel to use if no IBSS can be found to join. |
1143 | * @channel_type: channel type (HT mode) | ||
1143 | * @channel_fixed: The channel should be fixed -- do not search for | 1144 | * @channel_fixed: The channel should be fixed -- do not search for |
1144 | * IBSSs to join on other channels. | 1145 | * IBSSs to join on other channels. |
1145 | * @ie: information element(s) to include in the beacon | 1146 | * @ie: information element(s) to include in the beacon |
@@ -1978,6 +1979,11 @@ struct wiphy_wowlan_support { | |||
1978 | * configured as RX antennas. Antenna configuration commands will be | 1979 | * configured as RX antennas. Antenna configuration commands will be |
1979 | * rejected unless this or @available_antennas_tx is set. | 1980 | * rejected unless this or @available_antennas_tx is set. |
1980 | * | 1981 | * |
1982 | * @probe_resp_offload: | ||
1983 | * Bitmap of supported protocols for probe response offloading. | ||
1984 | * See &enum nl80211_probe_resp_offload_support_attr. Only valid | ||
1985 | * when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set. | ||
1986 | * | ||
1981 | * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation | 1987 | * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation |
1982 | * may request, if implemented. | 1988 | * may request, if implemented. |
1983 | * | 1989 | * |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 9b7c8ab7d75c..86ee272de210 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -128,7 +128,6 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
128 | 128 | ||
129 | if (S_ISREG(mode)) { | 129 | if (S_ISREG(mode)) { |
130 | struct mqueue_inode_info *info; | 130 | struct mqueue_inode_info *info; |
131 | struct task_struct *p = current; | ||
132 | unsigned long mq_bytes, mq_msg_tblsz; | 131 | unsigned long mq_bytes, mq_msg_tblsz; |
133 | 132 | ||
134 | inode->i_fop = &mqueue_file_operations; | 133 | inode->i_fop = &mqueue_file_operations; |
@@ -159,7 +158,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
159 | 158 | ||
160 | spin_lock(&mq_lock); | 159 | spin_lock(&mq_lock); |
161 | if (u->mq_bytes + mq_bytes < u->mq_bytes || | 160 | if (u->mq_bytes + mq_bytes < u->mq_bytes || |
162 | u->mq_bytes + mq_bytes > task_rlimit(p, RLIMIT_MSGQUEUE)) { | 161 | u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) { |
163 | spin_unlock(&mq_lock); | 162 | spin_unlock(&mq_lock); |
164 | /* mqueue_evict_inode() releases info->messages */ | 163 | /* mqueue_evict_inode() releases info->messages */ |
165 | ret = -EMFILE; | 164 | ret = -EMFILE; |
@@ -870,9 +870,7 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) | |||
870 | case SHM_LOCK: | 870 | case SHM_LOCK: |
871 | case SHM_UNLOCK: | 871 | case SHM_UNLOCK: |
872 | { | 872 | { |
873 | struct file *uninitialized_var(shm_file); | 873 | struct file *shm_file; |
874 | |||
875 | lru_add_drain_all(); /* drain pagevecs to lru lists */ | ||
876 | 874 | ||
877 | shp = shm_lock_check(ns, shmid); | 875 | shp = shm_lock_check(ns, shmid); |
878 | if (IS_ERR(shp)) { | 876 | if (IS_ERR(shp)) { |
@@ -895,22 +893,31 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) | |||
895 | err = security_shm_shmctl(shp, cmd); | 893 | err = security_shm_shmctl(shp, cmd); |
896 | if (err) | 894 | if (err) |
897 | goto out_unlock; | 895 | goto out_unlock; |
898 | 896 | ||
899 | if(cmd==SHM_LOCK) { | 897 | shm_file = shp->shm_file; |
898 | if (is_file_hugepages(shm_file)) | ||
899 | goto out_unlock; | ||
900 | |||
901 | if (cmd == SHM_LOCK) { | ||
900 | struct user_struct *user = current_user(); | 902 | struct user_struct *user = current_user(); |
901 | if (!is_file_hugepages(shp->shm_file)) { | 903 | err = shmem_lock(shm_file, 1, user); |
902 | err = shmem_lock(shp->shm_file, 1, user); | 904 | if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) { |
903 | if (!err && !(shp->shm_perm.mode & SHM_LOCKED)){ | 905 | shp->shm_perm.mode |= SHM_LOCKED; |
904 | shp->shm_perm.mode |= SHM_LOCKED; | 906 | shp->mlock_user = user; |
905 | shp->mlock_user = user; | ||
906 | } | ||
907 | } | 907 | } |
908 | } else if (!is_file_hugepages(shp->shm_file)) { | 908 | goto out_unlock; |
909 | shmem_lock(shp->shm_file, 0, shp->mlock_user); | ||
910 | shp->shm_perm.mode &= ~SHM_LOCKED; | ||
911 | shp->mlock_user = NULL; | ||
912 | } | 909 | } |
910 | |||
911 | /* SHM_UNLOCK */ | ||
912 | if (!(shp->shm_perm.mode & SHM_LOCKED)) | ||
913 | goto out_unlock; | ||
914 | shmem_lock(shm_file, 0, shp->mlock_user); | ||
915 | shp->shm_perm.mode &= ~SHM_LOCKED; | ||
916 | shp->mlock_user = NULL; | ||
917 | get_file(shm_file); | ||
913 | shm_unlock(shp); | 918 | shm_unlock(shp); |
919 | shmem_unlock_mapping(shm_file->f_mapping); | ||
920 | fput(shm_file); | ||
914 | goto out; | 921 | goto out; |
915 | } | 922 | } |
916 | case IPC_RMID: | 923 | case IPC_RMID: |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index caaea6e944f8..af1de0f34eae 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1863,11 +1863,12 @@ void __audit_syscall_entry(int arch, int major, | |||
1863 | 1863 | ||
1864 | /** | 1864 | /** |
1865 | * audit_syscall_exit - deallocate audit context after a system call | 1865 | * audit_syscall_exit - deallocate audit context after a system call |
1866 | * @pt_regs: syscall registers | 1866 | * @success: success value of the syscall |
1867 | * @return_code: return value of the syscall | ||
1867 | * | 1868 | * |
1868 | * Tear down after system call. If the audit context has been marked as | 1869 | * Tear down after system call. If the audit context has been marked as |
1869 | * auditable (either because of the AUDIT_RECORD_CONTEXT state from | 1870 | * auditable (either because of the AUDIT_RECORD_CONTEXT state from |
1870 | * filtering, or because some other part of the kernel write an audit | 1871 | * filtering, or because some other part of the kernel wrote an audit |
1871 | * message), then write out the syscall information. In call cases, | 1872 | * message), then write out the syscall information. In call cases, |
1872 | * free the names stored from getname(). | 1873 | * free the names stored from getname(). |
1873 | */ | 1874 | */ |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 95dd7212e610..29f5b65bee29 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1077,6 +1077,7 @@ void __kprobes kprobe_flush_task(struct task_struct *tk) | |||
1077 | /* Early boot. kretprobe_table_locks not yet initialized. */ | 1077 | /* Early boot. kretprobe_table_locks not yet initialized. */ |
1078 | return; | 1078 | return; |
1079 | 1079 | ||
1080 | INIT_HLIST_HEAD(&empty_rp); | ||
1080 | hash = hash_ptr(tk, KPROBE_HASH_BITS); | 1081 | hash = hash_ptr(tk, KPROBE_HASH_BITS); |
1081 | head = &kretprobe_inst_table[hash]; | 1082 | head = &kretprobe_inst_table[hash]; |
1082 | kretprobe_table_lock(hash, &flags); | 1083 | kretprobe_table_lock(hash, &flags); |
@@ -1085,7 +1086,6 @@ void __kprobes kprobe_flush_task(struct task_struct *tk) | |||
1085 | recycle_rp_inst(ri, &empty_rp); | 1086 | recycle_rp_inst(ri, &empty_rp); |
1086 | } | 1087 | } |
1087 | kretprobe_table_unlock(hash, &flags); | 1088 | kretprobe_table_unlock(hash, &flags); |
1088 | INIT_HLIST_HEAD(&empty_rp); | ||
1089 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { | 1089 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { |
1090 | hlist_del(&ri->hlist); | 1090 | hlist_del(&ri->hlist); |
1091 | kfree(ri); | 1091 | kfree(ri); |
diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index b0d798eaf130..d72586fdf660 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c | |||
@@ -129,7 +129,7 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p, | |||
129 | * cpupri_set - update the cpu priority setting | 129 | * cpupri_set - update the cpu priority setting |
130 | * @cp: The cpupri context | 130 | * @cp: The cpupri context |
131 | * @cpu: The target cpu | 131 | * @cpu: The target cpu |
132 | * @pri: The priority (INVALID-RT99) to assign to this CPU | 132 | * @newpri: The priority (INVALID-RT99) to assign to this CPU |
133 | * | 133 | * |
134 | * Note: Assumes cpu_rq(cpu)->lock is locked | 134 | * Note: Assumes cpu_rq(cpu)->lock is locked |
135 | * | 135 | * |
@@ -200,7 +200,6 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri) | |||
200 | /** | 200 | /** |
201 | * cpupri_init - initialize the cpupri structure | 201 | * cpupri_init - initialize the cpupri structure |
202 | * @cp: The cpupri context | 202 | * @cp: The cpupri context |
203 | * @bootmem: true if allocations need to use bootmem | ||
204 | * | 203 | * |
205 | * Returns: -ENOMEM if memory fails. | 204 | * Returns: -ENOMEM if memory fails. |
206 | */ | 205 | */ |
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index db110b8ae030..f1539decd99d 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
@@ -634,10 +634,11 @@ static int tracepoint_module_coming(struct module *mod) | |||
634 | int ret = 0; | 634 | int ret = 0; |
635 | 635 | ||
636 | /* | 636 | /* |
637 | * We skip modules that tain the kernel, especially those with different | 637 | * We skip modules that taint the kernel, especially those with different |
638 | * module header (for forced load), to make sure we don't cause a crash. | 638 | * module headers (for forced load), to make sure we don't cause a crash. |
639 | * Staging and out-of-tree GPL modules are fine. | ||
639 | */ | 640 | */ |
640 | if (mod->taints) | 641 | if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP))) |
641 | return 0; | 642 | return 0; |
642 | mutex_lock(&tracepoints_mutex); | 643 | mutex_lock(&tracepoints_mutex); |
643 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); | 644 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); |
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index fe84bb978e3b..716802b774ea 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
@@ -255,6 +255,8 @@ void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign) | |||
255 | if (!n) | 255 | if (!n) |
256 | n++; /* avoid zero length allocation */ | 256 | n++; /* avoid zero length allocation */ |
257 | p = buffer = kmalloc(n, GFP_KERNEL); | 257 | p = buffer = kmalloc(n, GFP_KERNEL); |
258 | if (!p) | ||
259 | return NULL; | ||
258 | 260 | ||
259 | for (i = a->nlimbs - 1; i >= 0; i--) { | 261 | for (i = a->nlimbs - 1; i >= 0; i--) { |
260 | alimb = a->d[i]; | 262 | alimb = a->d[i]; |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ea8c3a4cd2ae..5f34bd8dda34 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2508,6 +2508,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2508 | { | 2508 | { |
2509 | struct hstate *h = hstate_vma(vma); | 2509 | struct hstate *h = hstate_vma(vma); |
2510 | int ret = VM_FAULT_SIGBUS; | 2510 | int ret = VM_FAULT_SIGBUS; |
2511 | int anon_rmap = 0; | ||
2511 | pgoff_t idx; | 2512 | pgoff_t idx; |
2512 | unsigned long size; | 2513 | unsigned long size; |
2513 | struct page *page; | 2514 | struct page *page; |
@@ -2562,14 +2563,13 @@ retry: | |||
2562 | spin_lock(&inode->i_lock); | 2563 | spin_lock(&inode->i_lock); |
2563 | inode->i_blocks += blocks_per_huge_page(h); | 2564 | inode->i_blocks += blocks_per_huge_page(h); |
2564 | spin_unlock(&inode->i_lock); | 2565 | spin_unlock(&inode->i_lock); |
2565 | page_dup_rmap(page); | ||
2566 | } else { | 2566 | } else { |
2567 | lock_page(page); | 2567 | lock_page(page); |
2568 | if (unlikely(anon_vma_prepare(vma))) { | 2568 | if (unlikely(anon_vma_prepare(vma))) { |
2569 | ret = VM_FAULT_OOM; | 2569 | ret = VM_FAULT_OOM; |
2570 | goto backout_unlocked; | 2570 | goto backout_unlocked; |
2571 | } | 2571 | } |
2572 | hugepage_add_new_anon_rmap(page, vma, address); | 2572 | anon_rmap = 1; |
2573 | } | 2573 | } |
2574 | } else { | 2574 | } else { |
2575 | /* | 2575 | /* |
@@ -2582,7 +2582,6 @@ retry: | |||
2582 | VM_FAULT_SET_HINDEX(h - hstates); | 2582 | VM_FAULT_SET_HINDEX(h - hstates); |
2583 | goto backout_unlocked; | 2583 | goto backout_unlocked; |
2584 | } | 2584 | } |
2585 | page_dup_rmap(page); | ||
2586 | } | 2585 | } |
2587 | 2586 | ||
2588 | /* | 2587 | /* |
@@ -2606,6 +2605,10 @@ retry: | |||
2606 | if (!huge_pte_none(huge_ptep_get(ptep))) | 2605 | if (!huge_pte_none(huge_ptep_get(ptep))) |
2607 | goto backout; | 2606 | goto backout; |
2608 | 2607 | ||
2608 | if (anon_rmap) | ||
2609 | hugepage_add_new_anon_rmap(page, vma, address); | ||
2610 | else | ||
2611 | page_dup_rmap(page); | ||
2609 | new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE) | 2612 | new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE) |
2610 | && (vma->vm_flags & VM_SHARED))); | 2613 | && (vma->vm_flags & VM_SHARED))); |
2611 | set_huge_pte_at(mm, address, ptep, new_pte); | 2614 | set_huge_pte_at(mm, address, ptep, new_pte); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3dbff4dcde35..4baddbae94cc 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3247,7 +3247,7 @@ int mem_cgroup_prepare_migration(struct page *page, | |||
3247 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; | 3247 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; |
3248 | else | 3248 | else |
3249 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; | 3249 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; |
3250 | __mem_cgroup_commit_charge(memcg, page, 1, pc, ctype); | 3250 | __mem_cgroup_commit_charge(memcg, newpage, 1, pc, ctype); |
3251 | return ret; | 3251 | return ret; |
3252 | } | 3252 | } |
3253 | 3253 | ||
diff --git a/mm/memory.c b/mm/memory.c index 5e30583c2605..fa2f04e0337c 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -878,15 +878,24 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, | |||
878 | } | 878 | } |
879 | if (likely(!non_swap_entry(entry))) | 879 | if (likely(!non_swap_entry(entry))) |
880 | rss[MM_SWAPENTS]++; | 880 | rss[MM_SWAPENTS]++; |
881 | else if (is_write_migration_entry(entry) && | 881 | else if (is_migration_entry(entry)) { |
882 | is_cow_mapping(vm_flags)) { | 882 | page = migration_entry_to_page(entry); |
883 | /* | 883 | |
884 | * COW mappings require pages in both parent | 884 | if (PageAnon(page)) |
885 | * and child to be set to read. | 885 | rss[MM_ANONPAGES]++; |
886 | */ | 886 | else |
887 | make_migration_entry_read(&entry); | 887 | rss[MM_FILEPAGES]++; |
888 | pte = swp_entry_to_pte(entry); | 888 | |
889 | set_pte_at(src_mm, addr, src_pte, pte); | 889 | if (is_write_migration_entry(entry) && |
890 | is_cow_mapping(vm_flags)) { | ||
891 | /* | ||
892 | * COW mappings require pages in both | ||
893 | * parent and child to be set to read. | ||
894 | */ | ||
895 | make_migration_entry_read(&entry); | ||
896 | pte = swp_entry_to_pte(entry); | ||
897 | set_pte_at(src_mm, addr, src_pte, pte); | ||
898 | } | ||
890 | } | 899 | } |
891 | } | 900 | } |
892 | goto out_set_pte; | 901 | goto out_set_pte; |
@@ -1191,6 +1200,16 @@ again: | |||
1191 | 1200 | ||
1192 | if (!non_swap_entry(entry)) | 1201 | if (!non_swap_entry(entry)) |
1193 | rss[MM_SWAPENTS]--; | 1202 | rss[MM_SWAPENTS]--; |
1203 | else if (is_migration_entry(entry)) { | ||
1204 | struct page *page; | ||
1205 | |||
1206 | page = migration_entry_to_page(entry); | ||
1207 | |||
1208 | if (PageAnon(page)) | ||
1209 | rss[MM_ANONPAGES]--; | ||
1210 | else | ||
1211 | rss[MM_FILEPAGES]--; | ||
1212 | } | ||
1194 | if (unlikely(!free_swap_and_cache(entry))) | 1213 | if (unlikely(!free_swap_and_cache(entry))) |
1195 | print_bad_pte(vma, addr, ptent, NULL); | 1214 | print_bad_pte(vma, addr, ptent, NULL); |
1196 | } | 1215 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0027d8f4a1bb..d2186ecb36f7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5413,7 +5413,25 @@ __count_immobile_pages(struct zone *zone, struct page *page, int count) | |||
5413 | 5413 | ||
5414 | bool is_pageblock_removable_nolock(struct page *page) | 5414 | bool is_pageblock_removable_nolock(struct page *page) |
5415 | { | 5415 | { |
5416 | struct zone *zone = page_zone(page); | 5416 | struct zone *zone; |
5417 | unsigned long pfn; | ||
5418 | |||
5419 | /* | ||
5420 | * We have to be careful here because we are iterating over memory | ||
5421 | * sections which are not zone aware so we might end up outside of | ||
5422 | * the zone but still within the section. | ||
5423 | * We have to take care about the node as well. If the node is offline | ||
5424 | * its NODE_DATA will be NULL - see page_zone. | ||
5425 | */ | ||
5426 | if (!node_online(page_to_nid(page))) | ||
5427 | return false; | ||
5428 | |||
5429 | zone = page_zone(page); | ||
5430 | pfn = page_to_pfn(page); | ||
5431 | if (zone->zone_start_pfn > pfn || | ||
5432 | zone->zone_start_pfn + zone->spanned_pages <= pfn) | ||
5433 | return false; | ||
5434 | |||
5417 | return __count_immobile_pages(zone, page, 0); | 5435 | return __count_immobile_pages(zone, page, 0); |
5418 | } | 5436 | } |
5419 | 5437 | ||
diff --git a/mm/shmem.c b/mm/shmem.c index feead1943d92..269d049294ab 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -379,7 +379,7 @@ static int shmem_free_swap(struct address_space *mapping, | |||
379 | /* | 379 | /* |
380 | * Pagevec may contain swap entries, so shuffle up pages before releasing. | 380 | * Pagevec may contain swap entries, so shuffle up pages before releasing. |
381 | */ | 381 | */ |
382 | static void shmem_pagevec_release(struct pagevec *pvec) | 382 | static void shmem_deswap_pagevec(struct pagevec *pvec) |
383 | { | 383 | { |
384 | int i, j; | 384 | int i, j; |
385 | 385 | ||
@@ -389,7 +389,36 @@ static void shmem_pagevec_release(struct pagevec *pvec) | |||
389 | pvec->pages[j++] = page; | 389 | pvec->pages[j++] = page; |
390 | } | 390 | } |
391 | pvec->nr = j; | 391 | pvec->nr = j; |
392 | pagevec_release(pvec); | 392 | } |
393 | |||
394 | /* | ||
395 | * SysV IPC SHM_UNLOCK restore Unevictable pages to their evictable lists. | ||
396 | */ | ||
397 | void shmem_unlock_mapping(struct address_space *mapping) | ||
398 | { | ||
399 | struct pagevec pvec; | ||
400 | pgoff_t indices[PAGEVEC_SIZE]; | ||
401 | pgoff_t index = 0; | ||
402 | |||
403 | pagevec_init(&pvec, 0); | ||
404 | /* | ||
405 | * Minor point, but we might as well stop if someone else SHM_LOCKs it. | ||
406 | */ | ||
407 | while (!mapping_unevictable(mapping)) { | ||
408 | /* | ||
409 | * Avoid pagevec_lookup(): find_get_pages() returns 0 as if it | ||
410 | * has finished, if it hits a row of PAGEVEC_SIZE swap entries. | ||
411 | */ | ||
412 | pvec.nr = shmem_find_get_pages_and_swap(mapping, index, | ||
413 | PAGEVEC_SIZE, pvec.pages, indices); | ||
414 | if (!pvec.nr) | ||
415 | break; | ||
416 | index = indices[pvec.nr - 1] + 1; | ||
417 | shmem_deswap_pagevec(&pvec); | ||
418 | check_move_unevictable_pages(pvec.pages, pvec.nr); | ||
419 | pagevec_release(&pvec); | ||
420 | cond_resched(); | ||
421 | } | ||
393 | } | 422 | } |
394 | 423 | ||
395 | /* | 424 | /* |
@@ -440,7 +469,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
440 | } | 469 | } |
441 | unlock_page(page); | 470 | unlock_page(page); |
442 | } | 471 | } |
443 | shmem_pagevec_release(&pvec); | 472 | shmem_deswap_pagevec(&pvec); |
473 | pagevec_release(&pvec); | ||
444 | mem_cgroup_uncharge_end(); | 474 | mem_cgroup_uncharge_end(); |
445 | cond_resched(); | 475 | cond_resched(); |
446 | index++; | 476 | index++; |
@@ -470,7 +500,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
470 | continue; | 500 | continue; |
471 | } | 501 | } |
472 | if (index == start && indices[0] > end) { | 502 | if (index == start && indices[0] > end) { |
473 | shmem_pagevec_release(&pvec); | 503 | shmem_deswap_pagevec(&pvec); |
504 | pagevec_release(&pvec); | ||
474 | break; | 505 | break; |
475 | } | 506 | } |
476 | mem_cgroup_uncharge_start(); | 507 | mem_cgroup_uncharge_start(); |
@@ -494,7 +525,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
494 | } | 525 | } |
495 | unlock_page(page); | 526 | unlock_page(page); |
496 | } | 527 | } |
497 | shmem_pagevec_release(&pvec); | 528 | shmem_deswap_pagevec(&pvec); |
529 | pagevec_release(&pvec); | ||
498 | mem_cgroup_uncharge_end(); | 530 | mem_cgroup_uncharge_end(); |
499 | index++; | 531 | index++; |
500 | } | 532 | } |
@@ -1068,13 +1100,6 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user) | |||
1068 | user_shm_unlock(inode->i_size, user); | 1100 | user_shm_unlock(inode->i_size, user); |
1069 | info->flags &= ~VM_LOCKED; | 1101 | info->flags &= ~VM_LOCKED; |
1070 | mapping_clear_unevictable(file->f_mapping); | 1102 | mapping_clear_unevictable(file->f_mapping); |
1071 | /* | ||
1072 | * Ensure that a racing putback_lru_page() can see | ||
1073 | * the pages of this mapping are evictable when we | ||
1074 | * skip them due to !PageLRU during the scan. | ||
1075 | */ | ||
1076 | smp_mb__after_clear_bit(); | ||
1077 | scan_mapping_unevictable_pages(file->f_mapping); | ||
1078 | } | 1103 | } |
1079 | retval = 0; | 1104 | retval = 0; |
1080 | 1105 | ||
@@ -2445,6 +2470,10 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user) | |||
2445 | return 0; | 2470 | return 0; |
2446 | } | 2471 | } |
2447 | 2472 | ||
2473 | void shmem_unlock_mapping(struct address_space *mapping) | ||
2474 | { | ||
2475 | } | ||
2476 | |||
2448 | void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | 2477 | void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) |
2449 | { | 2478 | { |
2450 | truncate_inode_pages_range(inode->i_mapping, lstart, lend); | 2479 | truncate_inode_pages_range(inode->i_mapping, lstart, lend); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 2880396f7953..c52b23552659 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/buffer_head.h> /* for try_to_release_page(), | 26 | #include <linux/buffer_head.h> /* for try_to_release_page(), |
27 | buffer_heads_over_limit */ | 27 | buffer_heads_over_limit */ |
28 | #include <linux/mm_inline.h> | 28 | #include <linux/mm_inline.h> |
29 | #include <linux/pagevec.h> | ||
30 | #include <linux/backing-dev.h> | 29 | #include <linux/backing-dev.h> |
31 | #include <linux/rmap.h> | 30 | #include <linux/rmap.h> |
32 | #include <linux/topology.h> | 31 | #include <linux/topology.h> |
@@ -661,7 +660,7 @@ redo: | |||
661 | * When racing with an mlock or AS_UNEVICTABLE clearing | 660 | * When racing with an mlock or AS_UNEVICTABLE clearing |
662 | * (page is unlocked) make sure that if the other thread | 661 | * (page is unlocked) make sure that if the other thread |
663 | * does not observe our setting of PG_lru and fails | 662 | * does not observe our setting of PG_lru and fails |
664 | * isolation/check_move_unevictable_page, | 663 | * isolation/check_move_unevictable_pages, |
665 | * we see PG_mlocked/AS_UNEVICTABLE cleared below and move | 664 | * we see PG_mlocked/AS_UNEVICTABLE cleared below and move |
666 | * the page back to the evictable list. | 665 | * the page back to the evictable list. |
667 | * | 666 | * |
@@ -3499,100 +3498,61 @@ int page_evictable(struct page *page, struct vm_area_struct *vma) | |||
3499 | return 1; | 3498 | return 1; |
3500 | } | 3499 | } |
3501 | 3500 | ||
3501 | #ifdef CONFIG_SHMEM | ||
3502 | /** | 3502 | /** |
3503 | * check_move_unevictable_page - check page for evictability and move to appropriate zone lru list | 3503 | * check_move_unevictable_pages - check pages for evictability and move to appropriate zone lru list |
3504 | * @page: page to check evictability and move to appropriate lru list | 3504 | * @pages: array of pages to check |
3505 | * @zone: zone page is in | 3505 | * @nr_pages: number of pages to check |
3506 | * | 3506 | * |
3507 | * Checks a page for evictability and moves the page to the appropriate | 3507 | * Checks pages for evictability and moves them to the appropriate lru list. |
3508 | * zone lru list. | ||
3509 | * | 3508 | * |
3510 | * Restrictions: zone->lru_lock must be held, page must be on LRU and must | 3509 | * This function is only used for SysV IPC SHM_UNLOCK. |
3511 | * have PageUnevictable set. | ||
3512 | */ | 3510 | */ |
3513 | static void check_move_unevictable_page(struct page *page, struct zone *zone) | 3511 | void check_move_unevictable_pages(struct page **pages, int nr_pages) |
3514 | { | 3512 | { |
3515 | struct lruvec *lruvec; | 3513 | struct lruvec *lruvec; |
3514 | struct zone *zone = NULL; | ||
3515 | int pgscanned = 0; | ||
3516 | int pgrescued = 0; | ||
3517 | int i; | ||
3516 | 3518 | ||
3517 | VM_BUG_ON(PageActive(page)); | 3519 | for (i = 0; i < nr_pages; i++) { |
3518 | retry: | 3520 | struct page *page = pages[i]; |
3519 | ClearPageUnevictable(page); | 3521 | struct zone *pagezone; |
3520 | if (page_evictable(page, NULL)) { | ||
3521 | enum lru_list l = page_lru_base_type(page); | ||
3522 | |||
3523 | __dec_zone_state(zone, NR_UNEVICTABLE); | ||
3524 | lruvec = mem_cgroup_lru_move_lists(zone, page, | ||
3525 | LRU_UNEVICTABLE, l); | ||
3526 | list_move(&page->lru, &lruvec->lists[l]); | ||
3527 | __inc_zone_state(zone, NR_INACTIVE_ANON + l); | ||
3528 | __count_vm_event(UNEVICTABLE_PGRESCUED); | ||
3529 | } else { | ||
3530 | /* | ||
3531 | * rotate unevictable list | ||
3532 | */ | ||
3533 | SetPageUnevictable(page); | ||
3534 | lruvec = mem_cgroup_lru_move_lists(zone, page, LRU_UNEVICTABLE, | ||
3535 | LRU_UNEVICTABLE); | ||
3536 | list_move(&page->lru, &lruvec->lists[LRU_UNEVICTABLE]); | ||
3537 | if (page_evictable(page, NULL)) | ||
3538 | goto retry; | ||
3539 | } | ||
3540 | } | ||
3541 | |||
3542 | /** | ||
3543 | * scan_mapping_unevictable_pages - scan an address space for evictable pages | ||
3544 | * @mapping: struct address_space to scan for evictable pages | ||
3545 | * | ||
3546 | * Scan all pages in mapping. Check unevictable pages for | ||
3547 | * evictability and move them to the appropriate zone lru list. | ||
3548 | */ | ||
3549 | void scan_mapping_unevictable_pages(struct address_space *mapping) | ||
3550 | { | ||
3551 | pgoff_t next = 0; | ||
3552 | pgoff_t end = (i_size_read(mapping->host) + PAGE_CACHE_SIZE - 1) >> | ||
3553 | PAGE_CACHE_SHIFT; | ||
3554 | struct zone *zone; | ||
3555 | struct pagevec pvec; | ||
3556 | |||
3557 | if (mapping->nrpages == 0) | ||
3558 | return; | ||
3559 | |||
3560 | pagevec_init(&pvec, 0); | ||
3561 | while (next < end && | ||
3562 | pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) { | ||
3563 | int i; | ||
3564 | int pg_scanned = 0; | ||
3565 | |||
3566 | zone = NULL; | ||
3567 | |||
3568 | for (i = 0; i < pagevec_count(&pvec); i++) { | ||
3569 | struct page *page = pvec.pages[i]; | ||
3570 | pgoff_t page_index = page->index; | ||
3571 | struct zone *pagezone = page_zone(page); | ||
3572 | 3522 | ||
3573 | pg_scanned++; | 3523 | pgscanned++; |
3574 | if (page_index > next) | 3524 | pagezone = page_zone(page); |
3575 | next = page_index; | 3525 | if (pagezone != zone) { |
3576 | next++; | 3526 | if (zone) |
3527 | spin_unlock_irq(&zone->lru_lock); | ||
3528 | zone = pagezone; | ||
3529 | spin_lock_irq(&zone->lru_lock); | ||
3530 | } | ||
3577 | 3531 | ||
3578 | if (pagezone != zone) { | 3532 | if (!PageLRU(page) || !PageUnevictable(page)) |
3579 | if (zone) | 3533 | continue; |
3580 | spin_unlock_irq(&zone->lru_lock); | ||
3581 | zone = pagezone; | ||
3582 | spin_lock_irq(&zone->lru_lock); | ||
3583 | } | ||
3584 | 3534 | ||
3585 | if (PageLRU(page) && PageUnevictable(page)) | 3535 | if (page_evictable(page, NULL)) { |
3586 | check_move_unevictable_page(page, zone); | 3536 | enum lru_list lru = page_lru_base_type(page); |
3537 | |||
3538 | VM_BUG_ON(PageActive(page)); | ||
3539 | ClearPageUnevictable(page); | ||
3540 | __dec_zone_state(zone, NR_UNEVICTABLE); | ||
3541 | lruvec = mem_cgroup_lru_move_lists(zone, page, | ||
3542 | LRU_UNEVICTABLE, lru); | ||
3543 | list_move(&page->lru, &lruvec->lists[lru]); | ||
3544 | __inc_zone_state(zone, NR_INACTIVE_ANON + lru); | ||
3545 | pgrescued++; | ||
3587 | } | 3546 | } |
3588 | if (zone) | ||
3589 | spin_unlock_irq(&zone->lru_lock); | ||
3590 | pagevec_release(&pvec); | ||
3591 | |||
3592 | count_vm_events(UNEVICTABLE_PGSCANNED, pg_scanned); | ||
3593 | } | 3547 | } |
3594 | 3548 | ||
3549 | if (zone) { | ||
3550 | __count_vm_events(UNEVICTABLE_PGRESCUED, pgrescued); | ||
3551 | __count_vm_events(UNEVICTABLE_PGSCANNED, pgscanned); | ||
3552 | spin_unlock_irq(&zone->lru_lock); | ||
3553 | } | ||
3595 | } | 3554 | } |
3555 | #endif /* CONFIG_SHMEM */ | ||
3596 | 3556 | ||
3597 | static void warn_scan_unevictable_pages(void) | 3557 | static void warn_scan_unevictable_pages(void) |
3598 | { | 3558 | { |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index d793001929cf..9b0c0b8b4ab4 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -5,7 +5,7 @@ use strict; | |||
5 | ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## | 5 | ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## |
6 | ## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## | 6 | ## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## |
7 | ## Copyright (C) 2001 Simon Huggins ## | 7 | ## Copyright (C) 2001 Simon Huggins ## |
8 | ## Copyright (C) 2005-2010 Randy Dunlap ## | 8 | ## Copyright (C) 2005-2012 Randy Dunlap ## |
9 | ## ## | 9 | ## ## |
10 | ## #define enhancements by Armin Kuster <akuster@mvista.com> ## | 10 | ## #define enhancements by Armin Kuster <akuster@mvista.com> ## |
11 | ## Copyright (c) 2000 MontaVista Software, Inc. ## | 11 | ## Copyright (c) 2000 MontaVista Software, Inc. ## |
@@ -1785,6 +1785,7 @@ sub dump_function($$) { | |||
1785 | $prototype =~ s/__devinit +//; | 1785 | $prototype =~ s/__devinit +//; |
1786 | $prototype =~ s/__init +//; | 1786 | $prototype =~ s/__init +//; |
1787 | $prototype =~ s/__init_or_module +//; | 1787 | $prototype =~ s/__init_or_module +//; |
1788 | $prototype =~ s/__must_check +//; | ||
1788 | $prototype =~ s/^#\s*define\s+//; #ak added | 1789 | $prototype =~ s/^#\s*define\s+//; #ak added |
1789 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; | 1790 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; |
1790 | 1791 | ||
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index d661afbe474c..d45061d02fee 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c | |||
@@ -99,6 +99,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule, | |||
99 | struct inode *inode, enum ima_hooks func, int mask) | 99 | struct inode *inode, enum ima_hooks func, int mask) |
100 | { | 100 | { |
101 | struct task_struct *tsk = current; | 101 | struct task_struct *tsk = current; |
102 | const struct cred *cred = current_cred(); | ||
102 | int i; | 103 | int i; |
103 | 104 | ||
104 | if ((rule->flags & IMA_FUNC) && rule->func != func) | 105 | if ((rule->flags & IMA_FUNC) && rule->func != func) |
@@ -108,7 +109,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule, | |||
108 | if ((rule->flags & IMA_FSMAGIC) | 109 | if ((rule->flags & IMA_FSMAGIC) |
109 | && rule->fsmagic != inode->i_sb->s_magic) | 110 | && rule->fsmagic != inode->i_sb->s_magic) |
110 | return false; | 111 | return false; |
111 | if ((rule->flags & IMA_UID) && rule->uid != tsk->cred->uid) | 112 | if ((rule->flags & IMA_UID) && rule->uid != cred->uid) |
112 | return false; | 113 | return false; |
113 | for (i = 0; i < MAX_LSM_RULES; i++) { | 114 | for (i = 0; i < MAX_LSM_RULES; i++) { |
114 | int rc = 0; | 115 | int rc = 0; |
diff --git a/security/keys/internal.h b/security/keys/internal.h index c7a7caec4830..65647f825584 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | extern struct key_type key_type_dead; | 34 | extern struct key_type key_type_dead; |
35 | extern struct key_type key_type_user; | 35 | extern struct key_type key_type_user; |
36 | extern struct key_type key_type_logon; | ||
36 | 37 | ||
37 | /*****************************************************************************/ | 38 | /*****************************************************************************/ |
38 | /* | 39 | /* |
diff --git a/security/keys/key.c b/security/keys/key.c index 4f64c7267afb..7ada8019be1f 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -999,6 +999,7 @@ void __init key_init(void) | |||
999 | list_add_tail(&key_type_keyring.link, &key_types_list); | 999 | list_add_tail(&key_type_keyring.link, &key_types_list); |
1000 | list_add_tail(&key_type_dead.link, &key_types_list); | 1000 | list_add_tail(&key_type_dead.link, &key_types_list); |
1001 | list_add_tail(&key_type_user.link, &key_types_list); | 1001 | list_add_tail(&key_type_user.link, &key_types_list); |
1002 | list_add_tail(&key_type_logon.link, &key_types_list); | ||
1002 | 1003 | ||
1003 | /* record the root user tracking */ | 1004 | /* record the root user tracking */ |
1004 | rb_link_node(&root_key_user.node, | 1005 | rb_link_node(&root_key_user.node, |
diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c index 69ff52c08e97..c7660a25a3e4 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
19 | #include "internal.h" | 19 | #include "internal.h" |
20 | 20 | ||
21 | static int logon_vet_description(const char *desc); | ||
22 | |||
21 | /* | 23 | /* |
22 | * user defined keys take an arbitrary string as the description and an | 24 | * user defined keys take an arbitrary string as the description and an |
23 | * arbitrary blob of data as the payload | 25 | * arbitrary blob of data as the payload |
@@ -36,6 +38,24 @@ struct key_type key_type_user = { | |||
36 | EXPORT_SYMBOL_GPL(key_type_user); | 38 | EXPORT_SYMBOL_GPL(key_type_user); |
37 | 39 | ||
38 | /* | 40 | /* |
41 | * This key type is essentially the same as key_type_user, but it does | ||
42 | * not define a .read op. This is suitable for storing username and | ||
43 | * password pairs in the keyring that you do not want to be readable | ||
44 | * from userspace. | ||
45 | */ | ||
46 | struct key_type key_type_logon = { | ||
47 | .name = "logon", | ||
48 | .instantiate = user_instantiate, | ||
49 | .update = user_update, | ||
50 | .match = user_match, | ||
51 | .revoke = user_revoke, | ||
52 | .destroy = user_destroy, | ||
53 | .describe = user_describe, | ||
54 | .vet_description = logon_vet_description, | ||
55 | }; | ||
56 | EXPORT_SYMBOL_GPL(key_type_logon); | ||
57 | |||
58 | /* | ||
39 | * instantiate a user defined key | 59 | * instantiate a user defined key |
40 | */ | 60 | */ |
41 | int user_instantiate(struct key *key, const void *data, size_t datalen) | 61 | int user_instantiate(struct key *key, const void *data, size_t datalen) |
@@ -59,7 +79,7 @@ int user_instantiate(struct key *key, const void *data, size_t datalen) | |||
59 | /* attach the data */ | 79 | /* attach the data */ |
60 | upayload->datalen = datalen; | 80 | upayload->datalen = datalen; |
61 | memcpy(upayload->data, data, datalen); | 81 | memcpy(upayload->data, data, datalen); |
62 | rcu_assign_pointer(key->payload.data, upayload); | 82 | rcu_assign_keypointer(key, upayload); |
63 | ret = 0; | 83 | ret = 0; |
64 | 84 | ||
65 | error: | 85 | error: |
@@ -98,7 +118,7 @@ int user_update(struct key *key, const void *data, size_t datalen) | |||
98 | if (ret == 0) { | 118 | if (ret == 0) { |
99 | /* attach the new data, displacing the old */ | 119 | /* attach the new data, displacing the old */ |
100 | zap = key->payload.data; | 120 | zap = key->payload.data; |
101 | rcu_assign_pointer(key->payload.data, upayload); | 121 | rcu_assign_keypointer(key, upayload); |
102 | key->expiry = 0; | 122 | key->expiry = 0; |
103 | } | 123 | } |
104 | 124 | ||
@@ -133,7 +153,7 @@ void user_revoke(struct key *key) | |||
133 | key_payload_reserve(key, 0); | 153 | key_payload_reserve(key, 0); |
134 | 154 | ||
135 | if (upayload) { | 155 | if (upayload) { |
136 | rcu_assign_pointer(key->payload.data, NULL); | 156 | rcu_assign_keypointer(key, NULL); |
137 | kfree_rcu(upayload, rcu); | 157 | kfree_rcu(upayload, rcu); |
138 | } | 158 | } |
139 | } | 159 | } |
@@ -189,3 +209,20 @@ long user_read(const struct key *key, char __user *buffer, size_t buflen) | |||
189 | } | 209 | } |
190 | 210 | ||
191 | EXPORT_SYMBOL_GPL(user_read); | 211 | EXPORT_SYMBOL_GPL(user_read); |
212 | |||
213 | /* Vet the description for a "logon" key */ | ||
214 | static int logon_vet_description(const char *desc) | ||
215 | { | ||
216 | char *p; | ||
217 | |||
218 | /* require a "qualified" description string */ | ||
219 | p = strchr(desc, ':'); | ||
220 | if (!p) | ||
221 | return -EINVAL; | ||
222 | |||
223 | /* also reject description with ':' as first char */ | ||
224 | if (p == desc) | ||
225 | return -EINVAL; | ||
226 | |||
227 | return 0; | ||
228 | } | ||