diff options
| author | Chris Metcalf <cmetcalf@tilera.com> | 2010-07-06 13:45:24 -0400 |
|---|---|---|
| committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-07-06 13:45:24 -0400 |
| commit | a2262d8a231e92742651859a10c9a4430a5e899a (patch) | |
| tree | b5a823e3f6a3f60e1dd995f113caf0b350228d84 | |
| parent | ef06f55a5c936a395f3ee2e1237bbebdb4396c65 (diff) | |
| parent | 815c4163b6c8ebf8152f42b0a5fd015cfdcedc78 (diff) | |
Merge branch 'master' into for-linus
441 files changed, 3920 insertions, 3143 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 1808f1157f30..82d6aeb5228f 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -2048,7 +2048,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 2048 | WARNING: Forcing ASPM on may cause system lockups. | 2048 | WARNING: Forcing ASPM on may cause system lockups. |
| 2049 | 2049 | ||
| 2050 | pcie_pme= [PCIE,PM] Native PCIe PME signaling options: | 2050 | pcie_pme= [PCIE,PM] Native PCIe PME signaling options: |
| 2051 | off Do not use native PCIe PME signaling. | 2051 | Format: {auto|force}[,nomsi] |
| 2052 | auto Use native PCIe PME signaling if the BIOS allows the | ||
| 2053 | kernel to control PCIe config registers of root ports. | ||
| 2052 | force Use native PCIe PME signaling even if the BIOS refuses | 2054 | force Use native PCIe PME signaling even if the BIOS refuses |
| 2053 | to allow the kernel to control the relevant PCIe config | 2055 | to allow the kernel to control the relevant PCIe config |
| 2054 | registers. | 2056 | registers. |
diff --git a/Documentation/watchdog/watchdog-parameters.txt b/Documentation/watchdog/watchdog-parameters.txt index 41c95cc1dc1f..17ddd822b456 100644 --- a/Documentation/watchdog/watchdog-parameters.txt +++ b/Documentation/watchdog/watchdog-parameters.txt | |||
| @@ -125,6 +125,11 @@ ibmasr: | |||
| 125 | nowayout: Watchdog cannot be stopped once started | 125 | nowayout: Watchdog cannot be stopped once started |
| 126 | (default=kernel config parameter) | 126 | (default=kernel config parameter) |
| 127 | ------------------------------------------------- | 127 | ------------------------------------------------- |
| 128 | imx2_wdt: | ||
| 129 | timeout: Watchdog timeout in seconds (default 60 s) | ||
| 130 | nowayout: Watchdog cannot be stopped once started | ||
| 131 | (default=kernel config parameter) | ||
| 132 | ------------------------------------------------- | ||
| 128 | indydog: | 133 | indydog: |
| 129 | nowayout: Watchdog cannot be stopped once started | 134 | nowayout: Watchdog cannot be stopped once started |
| 130 | (default=kernel config parameter) | 135 | (default=kernel config parameter) |
diff --git a/MAINTAINERS b/MAINTAINERS index c92dd6663f8a..9566c90bfb36 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -896,11 +896,13 @@ S: Maintained | |||
| 896 | 896 | ||
| 897 | ARM/SAMSUNG ARM ARCHITECTURES | 897 | ARM/SAMSUNG ARM ARCHITECTURES |
| 898 | M: Ben Dooks <ben-linux@fluff.org> | 898 | M: Ben Dooks <ben-linux@fluff.org> |
| 899 | M: Kukjin Kim <kgene.kim@samsung.com> | ||
| 899 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 900 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 900 | W: http://www.fluff.org/ben/linux/ | 901 | W: http://www.fluff.org/ben/linux/ |
| 901 | S: Maintained | 902 | S: Maintained |
| 902 | F: arch/arm/plat-s3c/ | 903 | F: arch/arm/plat-samsung/ |
| 903 | F: arch/arm/plat-s3c24xx/ | 904 | F: arch/arm/plat-s3c24xx/ |
| 905 | F: arch/arm/plat-s5p/ | ||
| 904 | 906 | ||
| 905 | ARM/S3C2410 ARM ARCHITECTURE | 907 | ARM/S3C2410 ARM ARCHITECTURE |
| 906 | M: Ben Dooks <ben-linux@fluff.org> | 908 | M: Ben Dooks <ben-linux@fluff.org> |
| @@ -1148,7 +1150,7 @@ F: drivers/mmc/host/atmel-mci.c | |||
| 1148 | F: drivers/mmc/host/atmel-mci-regs.h | 1150 | F: drivers/mmc/host/atmel-mci-regs.h |
| 1149 | 1151 | ||
| 1150 | ATMEL AT91 / AT32 SERIAL DRIVER | 1152 | ATMEL AT91 / AT32 SERIAL DRIVER |
| 1151 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1153 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1152 | S: Supported | 1154 | S: Supported |
| 1153 | F: drivers/serial/atmel_serial.c | 1155 | F: drivers/serial/atmel_serial.c |
| 1154 | 1156 | ||
| @@ -1160,18 +1162,18 @@ F: drivers/video/atmel_lcdfb.c | |||
| 1160 | F: include/video/atmel_lcdc.h | 1162 | F: include/video/atmel_lcdc.h |
| 1161 | 1163 | ||
| 1162 | ATMEL MACB ETHERNET DRIVER | 1164 | ATMEL MACB ETHERNET DRIVER |
| 1163 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1165 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1164 | S: Supported | 1166 | S: Supported |
| 1165 | F: drivers/net/macb.* | 1167 | F: drivers/net/macb.* |
| 1166 | 1168 | ||
| 1167 | ATMEL SPI DRIVER | 1169 | ATMEL SPI DRIVER |
| 1168 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1170 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1169 | S: Supported | 1171 | S: Supported |
| 1170 | F: drivers/spi/atmel_spi.* | 1172 | F: drivers/spi/atmel_spi.* |
| 1171 | 1173 | ||
| 1172 | ATMEL USBA UDC DRIVER | 1174 | ATMEL USBA UDC DRIVER |
| 1173 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1175 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1174 | L: kernel@avr32linux.org | 1176 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1175 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver | 1177 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver |
| 1176 | S: Supported | 1178 | S: Supported |
| 1177 | F: drivers/usb/gadget/atmel_usba_udc.* | 1179 | F: drivers/usb/gadget/atmel_usba_udc.* |
| @@ -1581,7 +1583,7 @@ F: include/linux/coda*.h | |||
| 1581 | 1583 | ||
| 1582 | COMMON INTERNET FILE SYSTEM (CIFS) | 1584 | COMMON INTERNET FILE SYSTEM (CIFS) |
| 1583 | M: Steve French <sfrench@samba.org> | 1585 | M: Steve French <sfrench@samba.org> |
| 1584 | L: linux-cifs-client@lists.samba.org (moderated for non-subscribers) | 1586 | L: linux-cifs@vger.kernel.org |
| 1585 | L: samba-technical@lists.samba.org (moderated for non-subscribers) | 1587 | L: samba-technical@lists.samba.org (moderated for non-subscribers) |
| 1586 | W: http://linux-cifs.samba.org/ | 1588 | W: http://linux-cifs.samba.org/ |
| 1587 | Q: http://patchwork.ozlabs.org/project/linux-cifs-client/list/ | 1589 | Q: http://patchwork.ozlabs.org/project/linux-cifs-client/list/ |
| @@ -2109,11 +2111,18 @@ F: drivers/edac/i5000_edac.c | |||
| 2109 | 2111 | ||
| 2110 | EDAC-I5400 | 2112 | EDAC-I5400 |
| 2111 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | 2113 | M: Mauro Carvalho Chehab <mchehab@redhat.com> |
| 2112 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2114 | L: linux-edac@vger.kernel.org |
| 2113 | W: bluesmoke.sourceforge.net | 2115 | W: bluesmoke.sourceforge.net |
| 2114 | S: Maintained | 2116 | S: Maintained |
| 2115 | F: drivers/edac/i5400_edac.c | 2117 | F: drivers/edac/i5400_edac.c |
| 2116 | 2118 | ||
| 2119 | EDAC-I7CORE | ||
| 2120 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | ||
| 2121 | L: linux-edac@vger.kernel.org | ||
| 2122 | W: bluesmoke.sourceforge.net | ||
| 2123 | S: Maintained | ||
| 2124 | F: drivers/edac/i7core_edac.c linux/edac_mce.h drivers/edac/edac_mce.c | ||
| 2125 | |||
| 2117 | EDAC-I82975X | 2126 | EDAC-I82975X |
| 2118 | M: Ranganathan Desikan <ravi@jetztechnologies.com> | 2127 | M: Ranganathan Desikan <ravi@jetztechnologies.com> |
| 2119 | M: "Arvind R." <arvind@jetztechnologies.com> | 2128 | M: "Arvind R." <arvind@jetztechnologies.com> |
| @@ -2887,6 +2896,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | |||
| 2887 | S: Maintained | 2896 | S: Maintained |
| 2888 | F: drivers/input/ | 2897 | F: drivers/input/ |
| 2889 | 2898 | ||
| 2899 | INPUT MULTITOUCH (MT) PROTOCOL | ||
| 2900 | M: Henrik Rydberg <rydberg@euromail.se> | ||
| 2901 | L: linux-input@vger.kernel.org | ||
| 2902 | S: Maintained | ||
| 2903 | F: Documentation/input/multi-touch-protocol.txt | ||
| 2904 | K: \b(ABS|SYN)_MT_ | ||
| 2905 | |||
| 2890 | INTEL IDLE DRIVER | 2906 | INTEL IDLE DRIVER |
| 2891 | M: Len Brown <lenb@kernel.org> | 2907 | M: Len Brown <lenb@kernel.org> |
| 2892 | L: linux-pm@lists.linux-foundation.org | 2908 | L: linux-pm@lists.linux-foundation.org |
| @@ -2978,20 +2994,14 @@ F: drivers/net/ixgb/ | |||
| 2978 | F: drivers/net/ixgbe/ | 2994 | F: drivers/net/ixgbe/ |
| 2979 | 2995 | ||
| 2980 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT | 2996 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT |
| 2981 | M: Reinette Chatre <reinette.chatre@intel.com> | ||
| 2982 | M: Intel Linux Wireless <ilw@linux.intel.com> | ||
| 2983 | L: linux-wireless@vger.kernel.org | 2997 | L: linux-wireless@vger.kernel.org |
| 2984 | W: http://ipw2100.sourceforge.net | 2998 | S: Orphan |
| 2985 | S: Odd Fixes | ||
| 2986 | F: Documentation/networking/README.ipw2100 | 2999 | F: Documentation/networking/README.ipw2100 |
| 2987 | F: drivers/net/wireless/ipw2x00/ipw2100.* | 3000 | F: drivers/net/wireless/ipw2x00/ipw2100.* |
| 2988 | 3001 | ||
| 2989 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT | 3002 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT |
| 2990 | M: Reinette Chatre <reinette.chatre@intel.com> | ||
| 2991 | M: Intel Linux Wireless <ilw@linux.intel.com> | ||
| 2992 | L: linux-wireless@vger.kernel.org | 3003 | L: linux-wireless@vger.kernel.org |
| 2993 | W: http://ipw2200.sourceforge.net | 3004 | S: Orphan |
| 2994 | S: Odd Fixes | ||
| 2995 | F: Documentation/networking/README.ipw2200 | 3005 | F: Documentation/networking/README.ipw2200 |
| 2996 | F: drivers/net/wireless/ipw2x00/ipw2200.* | 3006 | F: drivers/net/wireless/ipw2x00/ipw2200.* |
| 2997 | 3007 | ||
| @@ -3379,7 +3389,7 @@ KPROBES | |||
| 3379 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 3389 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
| 3380 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 3390 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
| 3381 | M: "David S. Miller" <davem@davemloft.net> | 3391 | M: "David S. Miller" <davem@davemloft.net> |
| 3382 | M: Masami Hiramatsu <mhiramat@redhat.com> | 3392 | M: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> |
| 3383 | S: Maintained | 3393 | S: Maintained |
| 3384 | F: Documentation/kprobes.txt | 3394 | F: Documentation/kprobes.txt |
| 3385 | F: include/linux/kprobes.h | 3395 | F: include/linux/kprobes.h |
| @@ -4212,6 +4222,7 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE | |||
| 4212 | M: Grant Likely <grant.likely@secretlab.ca> | 4222 | M: Grant Likely <grant.likely@secretlab.ca> |
| 4213 | L: devicetree-discuss@lists.ozlabs.org | 4223 | L: devicetree-discuss@lists.ozlabs.org |
| 4214 | W: http://fdt.secretlab.ca | 4224 | W: http://fdt.secretlab.ca |
| 4225 | T: git git://git.secretlab.ca/git/linux-2.6.git | ||
| 4215 | S: Maintained | 4226 | S: Maintained |
| 4216 | F: drivers/of | 4227 | F: drivers/of |
| 4217 | F: include/linux/of*.h | 4228 | F: include/linux/of*.h |
| @@ -4626,6 +4637,12 @@ M: Robert Jarzmik <robert.jarzmik@free.fr> | |||
| 4626 | L: rtc-linux@googlegroups.com | 4637 | L: rtc-linux@googlegroups.com |
| 4627 | S: Maintained | 4638 | S: Maintained |
| 4628 | 4639 | ||
| 4640 | QLOGIC QLA1280 SCSI DRIVER | ||
| 4641 | M: Michael Reed <mdr@sgi.com> | ||
| 4642 | L: linux-scsi@vger.kernel.org | ||
| 4643 | S: Maintained | ||
| 4644 | F: drivers/scsi/qla1280.[ch] | ||
| 4645 | |||
| 4629 | QLOGIC QLA2XXX FC-SCSI DRIVER | 4646 | QLOGIC QLA2XXX FC-SCSI DRIVER |
| 4630 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> | 4647 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> |
| 4631 | M: linux-driver@qlogic.com | 4648 | M: linux-driver@qlogic.com |
| @@ -5384,6 +5401,7 @@ M: David Brownell <dbrownell@users.sourceforge.net> | |||
| 5384 | M: Grant Likely <grant.likely@secretlab.ca> | 5401 | M: Grant Likely <grant.likely@secretlab.ca> |
| 5385 | L: spi-devel-general@lists.sourceforge.net | 5402 | L: spi-devel-general@lists.sourceforge.net |
| 5386 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ | 5403 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ |
| 5404 | T: git git://git.secretlab.ca/git/linux-2.6.git | ||
| 5387 | S: Maintained | 5405 | S: Maintained |
| 5388 | F: Documentation/spi/ | 5406 | F: Documentation/spi/ |
| 5389 | F: drivers/spi/ | 5407 | F: drivers/spi/ |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 35 | 3 | SUBLEVEL = 35 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc4 |
| 5 | NAME = Sheep on Meth | 5 | NAME = Sheep on Meth |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -883,80 +883,10 @@ PHONY += $(vmlinux-dirs) | |||
| 883 | $(vmlinux-dirs): prepare scripts | 883 | $(vmlinux-dirs): prepare scripts |
| 884 | $(Q)$(MAKE) $(build)=$@ | 884 | $(Q)$(MAKE) $(build)=$@ |
| 885 | 885 | ||
| 886 | # Build the kernel release string | ||
| 887 | # | ||
| 888 | # The KERNELRELEASE value built here is stored in the file | ||
| 889 | # include/config/kernel.release, and is used when executing several | ||
| 890 | # make targets, such as "make install" or "make modules_install." | ||
| 891 | # | ||
| 892 | # The eventual kernel release string consists of the following fields, | ||
| 893 | # shown in a hierarchical format to show how smaller parts are concatenated | ||
| 894 | # to form the larger and final value, with values coming from places like | ||
| 895 | # the Makefile, kernel config options, make command line options and/or | ||
| 896 | # SCM tag information. | ||
| 897 | # | ||
| 898 | # $(KERNELVERSION) | ||
| 899 | # $(VERSION) eg, 2 | ||
| 900 | # $(PATCHLEVEL) eg, 6 | ||
| 901 | # $(SUBLEVEL) eg, 18 | ||
| 902 | # $(EXTRAVERSION) eg, -rc6 | ||
| 903 | # $(localver-full) | ||
| 904 | # $(localver) | ||
| 905 | # localversion* (files without backups, containing '~') | ||
| 906 | # $(CONFIG_LOCALVERSION) (from kernel config setting) | ||
| 907 | # $(LOCALVERSION) (from make command line, if provided) | ||
| 908 | # $(localver-extra) | ||
| 909 | # $(scm-identifier) (unique SCM tag, if one exists) | ||
| 910 | # ./scripts/setlocalversion (only with CONFIG_LOCALVERSION_AUTO) | ||
| 911 | # .scmversion (only with CONFIG_LOCALVERSION_AUTO) | ||
| 912 | # + (only without CONFIG_LOCALVERSION_AUTO | ||
| 913 | # and without LOCALVERSION= and | ||
| 914 | # repository is at non-tagged commit) | ||
| 915 | # | ||
| 916 | # For kernels without CONFIG_LOCALVERSION_AUTO compiled from an SCM that has | ||
| 917 | # been revised beyond a tagged commit, `+' is appended to the version string | ||
| 918 | # when not overridden by using "make LOCALVERSION=". This indicates that the | ||
| 919 | # kernel is not a vanilla release version and has been modified. | ||
| 920 | |||
| 921 | pattern = ".*/localversion[^~]*" | ||
| 922 | string = $(shell cat /dev/null \ | ||
| 923 | `find $(objtree) $(srctree) -maxdepth 1 -regex $(pattern) | sort -u`) | ||
| 924 | |||
| 925 | localver = $(subst $(space),, $(string) \ | ||
| 926 | $(patsubst "%",%,$(CONFIG_LOCALVERSION))) | ||
| 927 | |||
| 928 | # scripts/setlocalversion is called to create a unique identifier if the source | ||
| 929 | # is managed by a known SCM and the repository has been revised since the last | ||
| 930 | # tagged (release) commit. The format of the identifier is determined by the | ||
| 931 | # SCM's implementation. | ||
| 932 | # | ||
| 933 | # .scmversion is used when generating rpm packages so we do not loose | ||
| 934 | # the version information from the SCM when we do the build of the kernel | ||
| 935 | # from the copied source | ||
| 936 | ifeq ($(wildcard .scmversion),) | ||
| 937 | scm-identifier = $(shell $(CONFIG_SHELL) \ | ||
| 938 | $(srctree)/scripts/setlocalversion $(srctree)) | ||
| 939 | else | ||
| 940 | scm-identifier = $(shell cat .scmversion 2> /dev/null) | ||
| 941 | endif | ||
| 942 | |||
| 943 | ifdef CONFIG_LOCALVERSION_AUTO | ||
| 944 | localver-extra = $(scm-identifier) | ||
| 945 | else | ||
| 946 | ifneq ($(scm-identifier),) | ||
| 947 | ifeq ($(LOCALVERSION),) | ||
| 948 | localver-extra = + | ||
| 949 | endif | ||
| 950 | endif | ||
| 951 | endif | ||
| 952 | |||
| 953 | localver-full = $(localver)$(LOCALVERSION)$(localver-extra) | ||
| 954 | |||
| 955 | # Store (new) KERNELRELASE string in include/config/kernel.release | 886 | # Store (new) KERNELRELASE string in include/config/kernel.release |
| 956 | kernelrelease = $(KERNELVERSION)$(localver-full) | ||
| 957 | include/config/kernel.release: include/config/auto.conf FORCE | 887 | include/config/kernel.release: include/config/auto.conf FORCE |
| 958 | $(Q)rm -f $@ | 888 | $(Q)rm -f $@ |
| 959 | $(Q)echo $(kernelrelease) > $@ | 889 | $(Q)echo "$(KERNELVERSION)$$($(CONFIG_SHELL) scripts/setlocalversion $(srctree))" > $@ |
| 960 | 890 | ||
| 961 | 891 | ||
| 962 | # Things we need to do before we recursively start building the kernel | 892 | # Things we need to do before we recursively start building the kernel |
diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h index 1dce24bc455a..adfab8a21dfe 100644 --- a/arch/alpha/include/asm/bitops.h +++ b/arch/alpha/include/asm/bitops.h | |||
| @@ -410,7 +410,7 @@ static inline unsigned long __arch_hweight64(unsigned long w) | |||
| 410 | return __kernel_ctpop(w); | 410 | return __kernel_ctpop(w); |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | static inline unsigned int __arch_weight32(unsigned int w) | 413 | static inline unsigned int __arch_hweight32(unsigned int w) |
| 414 | { | 414 | { |
| 415 | return __arch_hweight64(w); | 415 | return __arch_hweight64(w); |
| 416 | } | 416 | } |
diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index 7739a62440a7..5a62fb46ef20 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile | |||
| @@ -35,7 +35,7 @@ endif | |||
| 35 | 35 | ||
| 36 | obj-y += irq_pyxis.o irq_i8259.o irq_srm.o | 36 | obj-y += irq_pyxis.o irq_i8259.o irq_srm.o |
| 37 | obj-y += err_ev6.o | 37 | obj-y += err_ev6.o |
| 38 | obj-y += es1888.o smc37c669.o smc37c93x.o ns87312.o gct.o | 38 | obj-y += es1888.o smc37c669.o smc37c93x.o pc873xx.o gct.o |
| 39 | obj-y += srmcons.o | 39 | obj-y += srmcons.o |
| 40 | 40 | ||
| 41 | else | 41 | else |
| @@ -63,11 +63,11 @@ obj-$(CONFIG_ALPHA_WILDFIRE) += core_wildfire.o | |||
| 63 | # Board support | 63 | # Board support |
| 64 | obj-$(CONFIG_ALPHA_ALCOR) += sys_alcor.o irq_i8259.o irq_srm.o | 64 | obj-$(CONFIG_ALPHA_ALCOR) += sys_alcor.o irq_i8259.o irq_srm.o |
| 65 | obj-$(CONFIG_ALPHA_CABRIOLET) += sys_cabriolet.o irq_i8259.o irq_srm.o \ | 65 | obj-$(CONFIG_ALPHA_CABRIOLET) += sys_cabriolet.o irq_i8259.o irq_srm.o \ |
| 66 | ns87312.o | 66 | pc873xx.o |
| 67 | obj-$(CONFIG_ALPHA_EB164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ | 67 | obj-$(CONFIG_ALPHA_EB164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ |
| 68 | ns87312.o | 68 | pc873xx.o |
| 69 | obj-$(CONFIG_ALPHA_EB66P) += sys_cabriolet.o irq_i8259.o irq_srm.o \ | 69 | obj-$(CONFIG_ALPHA_EB66P) += sys_cabriolet.o irq_i8259.o irq_srm.o \ |
| 70 | ns87312.o | 70 | pc873xx.o |
| 71 | obj-$(CONFIG_ALPHA_LX164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ | 71 | obj-$(CONFIG_ALPHA_LX164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ |
| 72 | smc37c93x.o | 72 | smc37c93x.o |
| 73 | obj-$(CONFIG_ALPHA_PC164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ | 73 | obj-$(CONFIG_ALPHA_PC164) += sys_cabriolet.o irq_i8259.o irq_srm.o \ |
| @@ -90,14 +90,14 @@ obj-$(CONFIG_ALPHA_RUFFIAN) += sys_ruffian.o irq_pyxis.o irq_i8259.o | |||
| 90 | obj-$(CONFIG_ALPHA_RX164) += sys_rx164.o irq_i8259.o | 90 | obj-$(CONFIG_ALPHA_RX164) += sys_rx164.o irq_i8259.o |
| 91 | obj-$(CONFIG_ALPHA_SABLE) += sys_sable.o | 91 | obj-$(CONFIG_ALPHA_SABLE) += sys_sable.o |
| 92 | obj-$(CONFIG_ALPHA_LYNX) += sys_sable.o | 92 | obj-$(CONFIG_ALPHA_LYNX) += sys_sable.o |
| 93 | obj-$(CONFIG_ALPHA_BOOK1) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o | 93 | obj-$(CONFIG_ALPHA_BOOK1) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o |
| 94 | obj-$(CONFIG_ALPHA_AVANTI) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o | 94 | obj-$(CONFIG_ALPHA_AVANTI) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o |
| 95 | obj-$(CONFIG_ALPHA_NONAME) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o | 95 | obj-$(CONFIG_ALPHA_NONAME) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o |
| 96 | obj-$(CONFIG_ALPHA_P2K) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o | 96 | obj-$(CONFIG_ALPHA_P2K) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o |
| 97 | obj-$(CONFIG_ALPHA_XL) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o | 97 | obj-$(CONFIG_ALPHA_XL) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o |
| 98 | obj-$(CONFIG_ALPHA_SX164) += sys_sx164.o irq_pyxis.o irq_i8259.o \ | 98 | obj-$(CONFIG_ALPHA_SX164) += sys_sx164.o irq_pyxis.o irq_i8259.o \ |
| 99 | irq_srm.o smc37c669.o | 99 | irq_srm.o smc37c669.o |
| 100 | obj-$(CONFIG_ALPHA_TAKARA) += sys_takara.o irq_i8259.o ns87312.o | 100 | obj-$(CONFIG_ALPHA_TAKARA) += sys_takara.o irq_i8259.o pc873xx.o |
| 101 | obj-$(CONFIG_ALPHA_WILDFIRE) += sys_wildfire.o irq_i8259.o | 101 | obj-$(CONFIG_ALPHA_WILDFIRE) += sys_wildfire.o irq_i8259.o |
| 102 | 102 | ||
| 103 | # Error support | 103 | # Error support |
diff --git a/arch/alpha/kernel/ns87312.c b/arch/alpha/kernel/ns87312.c deleted file mode 100644 index 342b56d24c20..000000000000 --- a/arch/alpha/kernel/ns87312.c +++ /dev/null | |||
| @@ -1,38 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/alpha/kernel/ns87312.c | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <linux/init.h> | ||
| 6 | #include <asm/io.h> | ||
| 7 | #include "proto.h" | ||
| 8 | |||
| 9 | |||
| 10 | /* | ||
| 11 | * The SRM console *disables* the IDE interface, this code ensures it's | ||
| 12 | * enabled. | ||
| 13 | * | ||
| 14 | * This code bangs on a control register of the 87312 Super I/O chip | ||
| 15 | * that implements parallel port/serial ports/IDE/FDI. Depending on | ||
| 16 | * the motherboard, the Super I/O chip can be configured through a | ||
| 17 | * pair of registers that are located either at I/O ports 0x26e/0x26f | ||
| 18 | * or 0x398/0x399. Unfortunately, autodetecting which base address is | ||
| 19 | * in use works only once (right after a reset). The Super I/O chip | ||
| 20 | * has the additional quirk that configuration register data must be | ||
| 21 | * written twice (I believe this is a safety feature to prevent | ||
| 22 | * accidental modification---fun, isn't it?). | ||
| 23 | */ | ||
| 24 | |||
| 25 | void __init | ||
| 26 | ns87312_enable_ide(long ide_base) | ||
| 27 | { | ||
| 28 | int data; | ||
| 29 | unsigned long flags; | ||
| 30 | |||
| 31 | local_irq_save(flags); | ||
| 32 | outb(0, ide_base); /* set the index register for reg #0 */ | ||
| 33 | data = inb(ide_base+1); /* read the current contents */ | ||
| 34 | outb(0, ide_base); /* set the index register for reg #0 */ | ||
| 35 | outb(data | 0x40, ide_base+1); /* turn on IDE */ | ||
| 36 | outb(data | 0x40, ide_base+1); /* turn on IDE, really! */ | ||
| 37 | local_irq_restore(flags); | ||
| 38 | } | ||
diff --git a/arch/alpha/kernel/pc873xx.c b/arch/alpha/kernel/pc873xx.c new file mode 100644 index 000000000000..27dcbff85613 --- /dev/null +++ b/arch/alpha/kernel/pc873xx.c | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | #include <linux/ioport.h> | ||
| 2 | #include <asm/io.h> | ||
| 3 | |||
| 4 | #include "pc873xx.h" | ||
| 5 | |||
| 6 | static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0}; | ||
| 7 | |||
| 8 | static char *pc873xx_names[] = { | ||
| 9 | "PC87303", "PC87306", "PC87312", "PC87332", "PC87334" | ||
| 10 | }; | ||
| 11 | |||
| 12 | static unsigned int base, model; | ||
| 13 | |||
| 14 | |||
| 15 | unsigned int __init pc873xx_get_base() | ||
| 16 | { | ||
| 17 | return base; | ||
| 18 | } | ||
| 19 | |||
| 20 | char *__init pc873xx_get_model() | ||
| 21 | { | ||
| 22 | return pc873xx_names[model]; | ||
| 23 | } | ||
| 24 | |||
| 25 | static unsigned char __init pc873xx_read(unsigned int base, int reg) | ||
| 26 | { | ||
| 27 | outb(reg, base); | ||
| 28 | return inb(base + 1); | ||
| 29 | } | ||
| 30 | |||
| 31 | static void __init pc873xx_write(unsigned int base, int reg, unsigned char data) | ||
| 32 | { | ||
| 33 | unsigned long flags; | ||
| 34 | |||
| 35 | local_irq_save(flags); | ||
| 36 | outb(reg, base); | ||
| 37 | outb(data, base + 1); | ||
| 38 | outb(data, base + 1); /* Must be written twice */ | ||
| 39 | local_irq_restore(flags); | ||
| 40 | } | ||
| 41 | |||
| 42 | int __init pc873xx_probe(void) | ||
| 43 | { | ||
| 44 | int val, index = 0; | ||
| 45 | |||
| 46 | while ((base = pc873xx_probelist[index++])) { | ||
| 47 | |||
| 48 | if (request_region(base, 2, "Super IO PC873xx") == NULL) | ||
| 49 | continue; | ||
| 50 | |||
| 51 | val = pc873xx_read(base, REG_SID); | ||
| 52 | if ((val & 0xf0) == 0x10) { | ||
| 53 | model = PC87332; | ||
| 54 | break; | ||
| 55 | } else if ((val & 0xf8) == 0x70) { | ||
| 56 | model = PC87306; | ||
| 57 | break; | ||
| 58 | } else if ((val & 0xf8) == 0x50) { | ||
| 59 | model = PC87334; | ||
| 60 | break; | ||
| 61 | } else if ((val & 0xf8) == 0x40) { | ||
| 62 | model = PC87303; | ||
| 63 | break; | ||
| 64 | } | ||
| 65 | |||
| 66 | release_region(base, 2); | ||
| 67 | } | ||
| 68 | |||
| 69 | return (base == 0) ? -1 : 1; | ||
| 70 | } | ||
| 71 | |||
| 72 | void __init pc873xx_enable_epp19(void) | ||
| 73 | { | ||
| 74 | unsigned char data; | ||
| 75 | |||
| 76 | printk(KERN_INFO "PC873xx enabling EPP v1.9\n"); | ||
| 77 | data = pc873xx_read(base, REG_PCR); | ||
| 78 | pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02); | ||
| 79 | } | ||
| 80 | |||
| 81 | void __init pc873xx_enable_ide(void) | ||
| 82 | { | ||
| 83 | unsigned char data; | ||
| 84 | |||
| 85 | printk(KERN_INFO "PC873xx enabling IDE interrupt\n"); | ||
| 86 | data = pc873xx_read(base, REG_FER); | ||
| 87 | pc873xx_write(base, REG_FER, data | 0x40); | ||
| 88 | } | ||
diff --git a/arch/alpha/kernel/pc873xx.h b/arch/alpha/kernel/pc873xx.h new file mode 100644 index 000000000000..25e16956fe3e --- /dev/null +++ b/arch/alpha/kernel/pc873xx.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | |||
| 2 | #ifndef _PC873xx_H_ | ||
| 3 | #define _PC873xx_H_ | ||
| 4 | |||
| 5 | /* | ||
| 6 | * Control Register Values | ||
| 7 | */ | ||
| 8 | #define REG_FER 0x00 | ||
| 9 | #define REG_FAR 0x01 | ||
| 10 | #define REG_PTR 0x02 | ||
| 11 | #define REG_FCR 0x03 | ||
| 12 | #define REG_PCR 0x04 | ||
| 13 | #define REG_KRR 0x05 | ||
| 14 | #define REG_PMC 0x06 | ||
| 15 | #define REG_TUP 0x07 | ||
| 16 | #define REG_SID 0x08 | ||
| 17 | #define REG_ASC 0x09 | ||
| 18 | #define REG_IRC 0x0e | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Model numbers | ||
| 22 | */ | ||
| 23 | #define PC87303 0 | ||
| 24 | #define PC87306 1 | ||
| 25 | #define PC87312 2 | ||
| 26 | #define PC87332 3 | ||
| 27 | #define PC87334 4 | ||
| 28 | |||
| 29 | int pc873xx_probe(void); | ||
| 30 | unsigned int pc873xx_get_base(void); | ||
| 31 | char *pc873xx_get_model(void); | ||
| 32 | void pc873xx_enable_epp19(void); | ||
| 33 | void pc873xx_enable_ide(void); | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/arch/alpha/kernel/pci-sysfs.c b/arch/alpha/kernel/pci-sysfs.c index a5fffc882c72..738fc824e2ea 100644 --- a/arch/alpha/kernel/pci-sysfs.c +++ b/arch/alpha/kernel/pci-sysfs.c | |||
| @@ -53,7 +53,6 @@ static int __pci_mmap_fits(struct pci_dev *pdev, int num, | |||
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| 55 | * pci_mmap_resource - map a PCI resource into user memory space | 55 | * pci_mmap_resource - map a PCI resource into user memory space |
| 56 | * @filp: open sysfs file | ||
| 57 | * @kobj: kobject for mapping | 56 | * @kobj: kobject for mapping |
| 58 | * @attr: struct bin_attribute for the file being mapped | 57 | * @attr: struct bin_attribute for the file being mapped |
| 59 | * @vma: struct vm_area_struct passed into the mmap | 58 | * @vma: struct vm_area_struct passed into the mmap |
| @@ -61,7 +60,7 @@ static int __pci_mmap_fits(struct pci_dev *pdev, int num, | |||
| 61 | * | 60 | * |
| 62 | * Use the bus mapping routines to map a PCI resource into userspace. | 61 | * Use the bus mapping routines to map a PCI resource into userspace. |
| 63 | */ | 62 | */ |
| 64 | static int pci_mmap_resource(struct file *filp, struct kobject *kobj, | 63 | static int pci_mmap_resource(struct kobject *kobj, |
| 65 | struct bin_attribute *attr, | 64 | struct bin_attribute *attr, |
| 66 | struct vm_area_struct *vma, int sparse) | 65 | struct vm_area_struct *vma, int sparse) |
| 67 | { | 66 | { |
diff --git a/arch/alpha/kernel/sys_sio.c b/arch/alpha/kernel/sys_sio.c index d4327e461c22..85b4aea01ef8 100644 --- a/arch/alpha/kernel/sys_sio.c +++ b/arch/alpha/kernel/sys_sio.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include "irq_impl.h" | 34 | #include "irq_impl.h" |
| 35 | #include "pci_impl.h" | 35 | #include "pci_impl.h" |
| 36 | #include "machvec_impl.h" | 36 | #include "machvec_impl.h" |
| 37 | #include "pc873xx.h" | ||
| 37 | 38 | ||
| 38 | #if defined(ALPHA_RESTORE_SRM_SETUP) | 39 | #if defined(ALPHA_RESTORE_SRM_SETUP) |
| 39 | /* Save LCA configuration data as the console had it set up. */ | 40 | /* Save LCA configuration data as the console had it set up. */ |
| @@ -208,7 +209,27 @@ noname_init_pci(void) | |||
| 208 | common_init_pci(); | 209 | common_init_pci(); |
| 209 | sio_pci_route(); | 210 | sio_pci_route(); |
| 210 | sio_fixup_irq_levels(sio_collect_irq_levels()); | 211 | sio_fixup_irq_levels(sio_collect_irq_levels()); |
| 211 | ns87312_enable_ide(0x26e); | 212 | |
| 213 | if (pc873xx_probe() == -1) { | ||
| 214 | printk(KERN_ERR "Probing for PC873xx Super IO chip failed.\n"); | ||
| 215 | } else { | ||
| 216 | printk(KERN_INFO "Found %s Super IO chip at 0x%x\n", | ||
| 217 | pc873xx_get_model(), pc873xx_get_base()); | ||
| 218 | |||
| 219 | /* Enabling things in the Super IO chip doesn't actually | ||
| 220 | * configure and enable things, the legacy drivers still | ||
| 221 | * need to do the actual configuration and enabling. | ||
| 222 | * This only unblocks them. | ||
| 223 | */ | ||
| 224 | |||
| 225 | #if !defined(CONFIG_ALPHA_AVANTI) | ||
| 226 | /* Don't bother on the Avanti family. | ||
| 227 | * None of them had on-board IDE. | ||
| 228 | */ | ||
| 229 | pc873xx_enable_ide(); | ||
| 230 | #endif | ||
| 231 | pc873xx_enable_epp19(); | ||
| 232 | } | ||
| 212 | } | 233 | } |
| 213 | 234 | ||
| 214 | static inline void __init | 235 | static inline void __init |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1f254bd6c937..98922f7d2d12 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -955,7 +955,8 @@ config XSCALE_PMU | |||
| 955 | default y | 955 | default y |
| 956 | 956 | ||
| 957 | config CPU_HAS_PMU | 957 | config CPU_HAS_PMU |
| 958 | depends on CPU_V6 || CPU_V7 || XSCALE_PMU | 958 | depends on (CPU_V6 || CPU_V7 || XSCALE_PMU) && \ |
| 959 | (!ARCH_OMAP3 || OMAP3_EMU) | ||
| 959 | default y | 960 | default y |
| 960 | bool | 961 | bool |
| 961 | 962 | ||
diff --git a/arch/arm/include/asm/mach/udc_pxa2xx.h b/arch/arm/include/asm/mach/udc_pxa2xx.h index f3eabf1ecec3..833306ee9e7f 100644 --- a/arch/arm/include/asm/mach/udc_pxa2xx.h +++ b/arch/arm/include/asm/mach/udc_pxa2xx.h | |||
| @@ -21,8 +21,8 @@ struct pxa2xx_udc_mach_info { | |||
| 21 | * here. Note that sometimes the signals go through inverters... | 21 | * here. Note that sometimes the signals go through inverters... |
| 22 | */ | 22 | */ |
| 23 | bool gpio_vbus_inverted; | 23 | bool gpio_vbus_inverted; |
| 24 | u16 gpio_vbus; /* high == vbus present */ | 24 | int gpio_vbus; /* high == vbus present */ |
| 25 | bool gpio_pullup_inverted; | 25 | bool gpio_pullup_inverted; |
| 26 | u16 gpio_pullup; /* high == pullup activated */ | 26 | int gpio_pullup; /* high == pullup activated */ |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 6a89567ffc5b..7bed3daf83b8 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -91,7 +91,11 @@ extern void release_thread(struct task_struct *); | |||
| 91 | 91 | ||
| 92 | unsigned long get_wchan(struct task_struct *p); | 92 | unsigned long get_wchan(struct task_struct *p); |
| 93 | 93 | ||
| 94 | #if __LINUX_ARM_ARCH__ == 6 | ||
| 95 | #define cpu_relax() smp_mb() | ||
| 96 | #else | ||
| 94 | #define cpu_relax() barrier() | 97 | #define cpu_relax() barrier() |
| 98 | #endif | ||
| 95 | 99 | ||
| 96 | /* | 100 | /* |
| 97 | * Create a new kernel thread | 101 | * Create a new kernel thread |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index c45768614c8a..de12536d687f 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -201,7 +201,7 @@ armpmu_event_update(struct perf_event *event, | |||
| 201 | { | 201 | { |
| 202 | int shift = 64 - 32; | 202 | int shift = 64 - 32; |
| 203 | s64 prev_raw_count, new_raw_count; | 203 | s64 prev_raw_count, new_raw_count; |
| 204 | s64 delta; | 204 | u64 delta; |
| 205 | 205 | ||
| 206 | again: | 206 | again: |
| 207 | prev_raw_count = atomic64_read(&hwc->prev_count); | 207 | prev_raw_count = atomic64_read(&hwc->prev_count); |
diff --git a/arch/arm/mach-mx3/mach-mx31lilly.c b/arch/arm/mach-mx3/mach-mx31lilly.c index d3d5877c750e..b2c7f512070f 100644 --- a/arch/arm/mach-mx3/mach-mx31lilly.c +++ b/arch/arm/mach-mx3/mach-mx31lilly.c | |||
| @@ -115,6 +115,8 @@ static struct platform_device physmap_flash_device = { | |||
| 115 | 115 | ||
| 116 | /* USB */ | 116 | /* USB */ |
| 117 | 117 | ||
| 118 | #if defined(CONFIG_USB_ULPI) | ||
| 119 | |||
| 118 | #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ | 120 | #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ |
| 119 | PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU) | 121 | PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU) |
| 120 | 122 | ||
| @@ -244,10 +246,20 @@ static struct mxc_usbh_platform_data usbh2_pdata = { | |||
| 244 | .flags = MXC_EHCI_POWER_PINS_ENABLED, | 246 | .flags = MXC_EHCI_POWER_PINS_ENABLED, |
| 245 | }; | 247 | }; |
| 246 | 248 | ||
| 247 | static struct platform_device *devices[] __initdata = { | 249 | static void lilly1131_usb_init(void) |
| 248 | &smsc91x_device, | 250 | { |
| 249 | &physmap_flash_device, | 251 | usbotg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, |
| 250 | }; | 252 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); |
| 253 | usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | ||
| 254 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); | ||
| 255 | |||
| 256 | mxc_register_device(&mxc_usbh1, &usbh1_pdata); | ||
| 257 | mxc_register_device(&mxc_usbh2, &usbh2_pdata); | ||
| 258 | } | ||
| 259 | |||
| 260 | #else | ||
| 261 | static inline void lilly1131_usb_init(void) {} | ||
| 262 | #endif /* CONFIG_USB_ULPI */ | ||
| 251 | 263 | ||
| 252 | /* SPI */ | 264 | /* SPI */ |
| 253 | 265 | ||
| @@ -279,6 +291,11 @@ static struct spi_board_info mc13783_dev __initdata = { | |||
| 279 | .platform_data = &mc13783_pdata, | 291 | .platform_data = &mc13783_pdata, |
| 280 | }; | 292 | }; |
| 281 | 293 | ||
| 294 | static struct platform_device *devices[] __initdata = { | ||
| 295 | &smsc91x_device, | ||
| 296 | &physmap_flash_device, | ||
| 297 | }; | ||
| 298 | |||
| 282 | static int mx31lilly_baseboard; | 299 | static int mx31lilly_baseboard; |
| 283 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); | 300 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); |
| 284 | 301 | ||
| @@ -321,13 +338,7 @@ static void __init mx31lilly_board_init(void) | |||
| 321 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 338 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 322 | 339 | ||
| 323 | /* USB */ | 340 | /* USB */ |
| 324 | usbotg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | 341 | lilly1131_usb_init(); |
| 325 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); | ||
| 326 | usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | ||
| 327 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); | ||
| 328 | |||
| 329 | mxc_register_device(&mxc_usbh1, &usbh1_pdata); | ||
| 330 | mxc_register_device(&mxc_usbh2, &usbh2_pdata); | ||
| 331 | } | 342 | } |
| 332 | 343 | ||
| 333 | static void __init mx31lilly_timer_init(void) | 344 | static void __init mx31lilly_timer_init(void) |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index f848ba8dbc16..a04cffd691c5 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
| @@ -538,9 +538,7 @@ static void ads7846_dev_init(void) | |||
| 538 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); | 538 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); |
| 539 | 539 | ||
| 540 | gpio_direction_input(OMAP3_STALKER_TS_GPIO); | 540 | gpio_direction_input(OMAP3_STALKER_TS_GPIO); |
| 541 | 541 | gpio_set_debounce(OMAP3_STALKER_TS_GPIO, 310); | |
| 542 | omap_set_gpio_debounce(OMAP3_STALKER_TS_GPIO, 1); | ||
| 543 | omap_set_gpio_debounce_time(OMAP3_STALKER_TS_GPIO, 0xa); | ||
| 544 | } | 542 | } |
| 545 | 543 | ||
| 546 | static int ads7846_get_pendown_state(void) | 544 | static int ads7846_get_pendown_state(void) |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 02804224517b..e10db7a90cb2 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -1369,6 +1369,7 @@ static struct clk emif1_ick = { | |||
| 1369 | .ops = &clkops_omap2_dflt, | 1369 | .ops = &clkops_omap2_dflt, |
| 1370 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL, | 1370 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL, |
| 1371 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | 1371 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, |
| 1372 | .flags = ENABLE_ON_INIT, | ||
| 1372 | .clkdm_name = "l3_emif_clkdm", | 1373 | .clkdm_name = "l3_emif_clkdm", |
| 1373 | .parent = &ddrphy_ck, | 1374 | .parent = &ddrphy_ck, |
| 1374 | .recalc = &followparent_recalc, | 1375 | .recalc = &followparent_recalc, |
| @@ -1379,6 +1380,7 @@ static struct clk emif2_ick = { | |||
| 1379 | .ops = &clkops_omap2_dflt, | 1380 | .ops = &clkops_omap2_dflt, |
| 1380 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL, | 1381 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL, |
| 1381 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | 1382 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, |
| 1383 | .flags = ENABLE_ON_INIT, | ||
| 1382 | .clkdm_name = "l3_emif_clkdm", | 1384 | .clkdm_name = "l3_emif_clkdm", |
| 1383 | .parent = &ddrphy_ck, | 1385 | .parent = &ddrphy_ck, |
| 1384 | .recalc = &followparent_recalc, | 1386 | .recalc = &followparent_recalc, |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 95c9a5f774e1..b7a4133267d8 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -409,10 +409,11 @@ static int _init_main_clk(struct omap_hwmod *oh) | |||
| 409 | return 0; | 409 | return 0; |
| 410 | 410 | ||
| 411 | oh->_clk = omap_clk_get_by_name(oh->main_clk); | 411 | oh->_clk = omap_clk_get_by_name(oh->main_clk); |
| 412 | if (!oh->_clk) | 412 | if (!oh->_clk) { |
| 413 | pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", | 413 | pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", |
| 414 | oh->name, oh->main_clk); | 414 | oh->name, oh->main_clk); |
| 415 | return -EINVAL; | 415 | return -EINVAL; |
| 416 | } | ||
| 416 | 417 | ||
| 417 | if (!oh->_clk->clkdm) | 418 | if (!oh->_clk->clkdm) |
| 418 | pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", | 419 | pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", |
| @@ -444,10 +445,11 @@ static int _init_interface_clks(struct omap_hwmod *oh) | |||
| 444 | continue; | 445 | continue; |
| 445 | 446 | ||
| 446 | c = omap_clk_get_by_name(os->clk); | 447 | c = omap_clk_get_by_name(os->clk); |
| 447 | if (!c) | 448 | if (!c) { |
| 448 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", | 449 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", |
| 449 | oh->name, os->clk); | 450 | oh->name, os->clk); |
| 450 | ret = -EINVAL; | 451 | ret = -EINVAL; |
| 452 | } | ||
| 451 | os->_clk = c; | 453 | os->_clk = c; |
| 452 | } | 454 | } |
| 453 | 455 | ||
| @@ -470,10 +472,11 @@ static int _init_opt_clks(struct omap_hwmod *oh) | |||
| 470 | 472 | ||
| 471 | for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { | 473 | for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { |
| 472 | c = omap_clk_get_by_name(oc->clk); | 474 | c = omap_clk_get_by_name(oc->clk); |
| 473 | if (!c) | 475 | if (!c) { |
| 474 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", | 476 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", |
| 475 | oh->name, oc->clk); | 477 | oh->name, oc->clk); |
| 476 | ret = -EINVAL; | 478 | ret = -EINVAL; |
| 479 | } | ||
| 477 | oc->_clk = c; | 480 | oc->_clk = c; |
| 478 | } | 481 | } |
| 479 | 482 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2e967716cc3f..b88737fd6cfe 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -99,7 +99,7 @@ static void omap3_enable_io_chain(void) | |||
| 99 | /* Do a readback to assure write has been done */ | 99 | /* Do a readback to assure write has been done */ |
| 100 | prm_read_mod_reg(WKUP_MOD, PM_WKEN); | 100 | prm_read_mod_reg(WKUP_MOD, PM_WKEN); |
| 101 | 101 | ||
| 102 | while (!(prm_read_mod_reg(WKUP_MOD, PM_WKST) & | 102 | while (!(prm_read_mod_reg(WKUP_MOD, PM_WKEN) & |
| 103 | OMAP3430_ST_IO_CHAIN_MASK)) { | 103 | OMAP3430_ST_IO_CHAIN_MASK)) { |
| 104 | timeout++; | 104 | timeout++; |
| 105 | if (timeout > 1000) { | 105 | if (timeout > 1000) { |
| @@ -108,7 +108,7 @@ static void omap3_enable_io_chain(void) | |||
| 108 | return; | 108 | return; |
| 109 | } | 109 | } |
| 110 | prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, | 110 | prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, |
| 111 | WKUP_MOD, PM_WKST); | 111 | WKUP_MOD, PM_WKEN); |
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | } | 114 | } |
diff --git a/arch/arm/mach-omap2/usb-ehci.c b/arch/arm/mach-omap2/usb-ehci.c index c68f799e83c5..d72d1ac30333 100644 --- a/arch/arm/mach-omap2/usb-ehci.c +++ b/arch/arm/mach-omap2/usb-ehci.c | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
| 22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 23 | #include <linux/dma-mapping.h> | ||
| 24 | |||
| 23 | #include <asm/io.h> | 25 | #include <asm/io.h> |
| 24 | #include <plat/mux.h> | 26 | #include <plat/mux.h> |
| 25 | 27 | ||
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index d60db87dde08..fa6a708b4099 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
| @@ -697,7 +697,7 @@ static struct i2c_board_info __initdata mioa701_pi2c_devices[] = { | |||
| 697 | }; | 697 | }; |
| 698 | 698 | ||
| 699 | /* Board I2C devices. */ | 699 | /* Board I2C devices. */ |
| 700 | static struct i2c_board_info __initdata mioa701_i2c_devices[] = { | 700 | static struct i2c_board_info mioa701_i2c_devices[] = { |
| 701 | { | 701 | { |
| 702 | I2C_BOARD_INFO("mt9m111", 0x5d), | 702 | I2C_BOARD_INFO("mt9m111", 0x5d), |
| 703 | }, | 703 | }, |
diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c index f5d1ae3db3a4..d303c6929d32 100644 --- a/arch/arm/mach-pxa/z2.c +++ b/arch/arm/mach-pxa/z2.c | |||
| @@ -3,8 +3,9 @@ | |||
| 3 | * | 3 | * |
| 4 | * Support for the Zipit Z2 Handheld device. | 4 | * Support for the Zipit Z2 Handheld device. |
| 5 | * | 5 | * |
| 6 | * Author: Ken McGuire | 6 | * Copyright (C) 2009-2010 Marek Vasut <marek.vasut@gmail.com> |
| 7 | * Created: Jan 25, 2009 | 7 | * |
| 8 | * Based on research and code by: Ken McGuire | ||
| 8 | * Based on mainstone.c as modified for the Zipit Z2. | 9 | * Based on mainstone.c as modified for the Zipit Z2. |
| 9 | * | 10 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| @@ -157,21 +158,14 @@ static struct mtd_partition z2_flash_parts[] = { | |||
| 157 | { | 158 | { |
| 158 | .name = "U-Boot Bootloader", | 159 | .name = "U-Boot Bootloader", |
| 159 | .offset = 0x0, | 160 | .offset = 0x0, |
| 160 | .size = 0x20000, | 161 | .size = 0x40000, |
| 161 | }, | 162 | }, { |
| 162 | { | ||
| 163 | .name = "Linux Kernel", | ||
| 164 | .offset = 0x20000, | ||
| 165 | .size = 0x220000, | ||
| 166 | }, | ||
| 167 | { | ||
| 168 | .name = "Filesystem", | ||
| 169 | .offset = 0x240000, | ||
| 170 | .size = 0x5b0000, | ||
| 171 | }, | ||
| 172 | { | ||
| 173 | .name = "U-Boot Environment", | 163 | .name = "U-Boot Environment", |
| 174 | .offset = 0x7f0000, | 164 | .offset = 0x40000, |
| 165 | .size = 0x60000, | ||
| 166 | }, { | ||
| 167 | .name = "Flash", | ||
| 168 | .offset = 0x60000, | ||
| 175 | .size = MTDPART_SIZ_FULL, | 169 | .size = MTDPART_SIZ_FULL, |
| 176 | }, | 170 | }, |
| 177 | }; | 171 | }; |
diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig index ee5e392430e8..b4575ae9648e 100644 --- a/arch/arm/mach-realview/Kconfig +++ b/arch/arm/mach-realview/Kconfig | |||
| @@ -18,6 +18,7 @@ config REALVIEW_EB_ARM11MP | |||
| 18 | bool "Support ARM11MPCore tile" | 18 | bool "Support ARM11MPCore tile" |
| 19 | depends on MACH_REALVIEW_EB | 19 | depends on MACH_REALVIEW_EB |
| 20 | select CPU_V6 | 20 | select CPU_V6 |
| 21 | select ARCH_HAS_BARRIERS if SMP | ||
| 21 | help | 22 | help |
| 22 | Enable support for the ARM11MPCore tile on the Realview platform. | 23 | Enable support for the ARM11MPCore tile on the Realview platform. |
| 23 | 24 | ||
| @@ -35,6 +36,7 @@ config MACH_REALVIEW_PB11MP | |||
| 35 | select CPU_V6 | 36 | select CPU_V6 |
| 36 | select ARM_GIC | 37 | select ARM_GIC |
| 37 | select HAVE_PATA_PLATFORM | 38 | select HAVE_PATA_PLATFORM |
| 39 | select ARCH_HAS_BARRIERS if SMP | ||
| 38 | help | 40 | help |
| 39 | Include support for the ARM(R) RealView MPCore Platform Baseboard. | 41 | Include support for the ARM(R) RealView MPCore Platform Baseboard. |
| 40 | PB11MPCore is a platform with an on-board ARM11MPCore and has | 42 | PB11MPCore is a platform with an on-board ARM11MPCore and has |
diff --git a/arch/arm/mach-realview/include/mach/barriers.h b/arch/arm/mach-realview/include/mach/barriers.h new file mode 100644 index 000000000000..0c5d749d7b5f --- /dev/null +++ b/arch/arm/mach-realview/include/mach/barriers.h | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | /* | ||
| 2 | * Barriers redefined for RealView ARM11MPCore platforms with L220 cache | ||
| 3 | * controller to work around hardware errata causing the outer_sync() | ||
| 4 | * operation to deadlock the system. | ||
| 5 | */ | ||
| 6 | #define mb() dsb() | ||
| 7 | #define rmb() dmb() | ||
| 8 | #define wmb() mb() | ||
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 422ccd70d5f5..4425018fab82 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | 34 | #include <asm/pmu.h> |
| 35 | #include <asm/pgtable.h> | ||
| 35 | #include <asm/hardware/gic.h> | 36 | #include <asm/hardware/gic.h> |
| 36 | #include <asm/hardware/cache-l2x0.h> | 37 | #include <asm/hardware/cache-l2x0.h> |
| 37 | #include <asm/localtimer.h> | 38 | #include <asm/localtimer.h> |
| @@ -457,7 +458,7 @@ static void __init realview_eb_init(void) | |||
| 457 | 458 | ||
| 458 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | 459 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") |
| 459 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 460 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
| 460 | .phys_io = REALVIEW_EB_UART0_BASE, | 461 | .phys_io = REALVIEW_EB_UART0_BASE & SECTION_MASK, |
| 461 | .io_pg_offst = (IO_ADDRESS(REALVIEW_EB_UART0_BASE) >> 18) & 0xfffc, | 462 | .io_pg_offst = (IO_ADDRESS(REALVIEW_EB_UART0_BASE) >> 18) & 0xfffc, |
| 462 | .boot_params = PHYS_OFFSET + 0x00000100, | 463 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 463 | .fixup = realview_fixup, | 464 | .fixup = realview_fixup, |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index 96568ebfa2bb..099a1f125cf8 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | 34 | #include <asm/pmu.h> |
| 35 | #include <asm/pgtable.h> | ||
| 35 | #include <asm/hardware/gic.h> | 36 | #include <asm/hardware/gic.h> |
| 36 | #include <asm/hardware/cache-l2x0.h> | 37 | #include <asm/hardware/cache-l2x0.h> |
| 37 | 38 | ||
| @@ -351,7 +352,7 @@ static void __init realview_pb1176_init(void) | |||
| 351 | 352 | ||
| 352 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | 353 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") |
| 353 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 354 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
| 354 | .phys_io = REALVIEW_PB1176_UART0_BASE, | 355 | .phys_io = REALVIEW_PB1176_UART0_BASE & SECTION_MASK, |
| 355 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PB1176_UART0_BASE) >> 18) & 0xfffc, | 356 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PB1176_UART0_BASE) >> 18) & 0xfffc, |
| 356 | .boot_params = PHYS_OFFSET + 0x00000100, | 357 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 357 | .fixup = realview_pb1176_fixup, | 358 | .fixup = realview_pb1176_fixup, |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 7fbefbbebaf0..0e07a5ccb75f 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | 34 | #include <asm/pmu.h> |
| 35 | #include <asm/pgtable.h> | ||
| 35 | #include <asm/hardware/gic.h> | 36 | #include <asm/hardware/gic.h> |
| 36 | #include <asm/hardware/cache-l2x0.h> | 37 | #include <asm/hardware/cache-l2x0.h> |
| 37 | #include <asm/localtimer.h> | 38 | #include <asm/localtimer.h> |
| @@ -373,7 +374,7 @@ static void __init realview_pb11mp_init(void) | |||
| 373 | 374 | ||
| 374 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | 375 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") |
| 375 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 376 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
| 376 | .phys_io = REALVIEW_PB11MP_UART0_BASE, | 377 | .phys_io = REALVIEW_PB11MP_UART0_BASE & SECTION_MASK, |
| 377 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PB11MP_UART0_BASE) >> 18) & 0xfffc, | 378 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PB11MP_UART0_BASE) >> 18) & 0xfffc, |
| 378 | .boot_params = PHYS_OFFSET + 0x00000100, | 379 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 379 | .fixup = realview_fixup, | 380 | .fixup = realview_fixup, |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index d3c113b3dfce..ac2f06f1ca50 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <asm/leds.h> | 31 | #include <asm/leds.h> |
| 32 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
| 33 | #include <asm/pmu.h> | 33 | #include <asm/pmu.h> |
| 34 | #include <asm/pgtable.h> | ||
| 34 | #include <asm/hardware/gic.h> | 35 | #include <asm/hardware/gic.h> |
| 35 | 36 | ||
| 36 | #include <asm/mach/arch.h> | 37 | #include <asm/mach/arch.h> |
| @@ -323,7 +324,7 @@ static void __init realview_pba8_init(void) | |||
| 323 | 324 | ||
| 324 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | 325 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") |
| 325 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 326 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
| 326 | .phys_io = REALVIEW_PBA8_UART0_BASE, | 327 | .phys_io = REALVIEW_PBA8_UART0_BASE & SECTION_MASK, |
| 327 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PBA8_UART0_BASE) >> 18) & 0xfffc, | 328 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PBA8_UART0_BASE) >> 18) & 0xfffc, |
| 328 | .boot_params = PHYS_OFFSET + 0x00000100, | 329 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 329 | .fixup = realview_fixup, | 330 | .fixup = realview_fixup, |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index a235ba30996b..08fd683adc4c 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| 32 | #include <asm/pmu.h> | 32 | #include <asm/pmu.h> |
| 33 | #include <asm/smp_twd.h> | 33 | #include <asm/smp_twd.h> |
| 34 | #include <asm/pgtable.h> | ||
| 34 | #include <asm/hardware/gic.h> | 35 | #include <asm/hardware/gic.h> |
| 35 | #include <asm/hardware/cache-l2x0.h> | 36 | #include <asm/hardware/cache-l2x0.h> |
| 36 | 37 | ||
| @@ -409,7 +410,7 @@ static void __init realview_pbx_init(void) | |||
| 409 | 410 | ||
| 410 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | 411 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") |
| 411 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 412 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
| 412 | .phys_io = REALVIEW_PBX_UART0_BASE, | 413 | .phys_io = REALVIEW_PBX_UART0_BASE & SECTION_MASK, |
| 413 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PBX_UART0_BASE) >> 18) & 0xfffc, | 414 | .io_pg_offst = (IO_ADDRESS(REALVIEW_PBX_UART0_BASE) >> 18) & 0xfffc, |
| 414 | .boot_params = PHYS_OFFSET + 0x00000100, | 415 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 415 | .fixup = realview_pbx_fixup, | 416 | .fixup = realview_pbx_fixup, |
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index e6f73030d5f0..6353459bb567 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * Versatile Express Core Tile Cortex A9x4 Support | 2 | * Versatile Express Core Tile Cortex A9x4 Support |
| 3 | */ | 3 | */ |
| 4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
| 5 | #include <linux/gfp.h> | ||
| 5 | #include <linux/device.h> | 6 | #include <linux/device.h> |
| 6 | #include <linux/dma-mapping.h> | 7 | #include <linux/dma-mapping.h> |
| 7 | #include <linux/platform_device.h> | 8 | #include <linux/platform_device.h> |
| @@ -9,6 +10,7 @@ | |||
| 9 | #include <linux/amba/clcd.h> | 10 | #include <linux/amba/clcd.h> |
| 10 | 11 | ||
| 11 | #include <asm/clkdev.h> | 12 | #include <asm/clkdev.h> |
| 13 | #include <asm/pgtable.h> | ||
| 12 | #include <asm/hardware/arm_timer.h> | 14 | #include <asm/hardware/arm_timer.h> |
| 13 | #include <asm/hardware/cache-l2x0.h> | 15 | #include <asm/hardware/cache-l2x0.h> |
| 14 | #include <asm/hardware/gic.h> | 16 | #include <asm/hardware/gic.h> |
| @@ -235,7 +237,7 @@ static void ct_ca9x4_init(void) | |||
| 235 | } | 237 | } |
| 236 | 238 | ||
| 237 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") | 239 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") |
| 238 | .phys_io = V2M_UART0, | 240 | .phys_io = V2M_UART0 & SECTION_MASK, |
| 239 | .io_pg_offst = (__MMIO_P2V(V2M_UART0) >> 18) & 0xfffc, | 241 | .io_pg_offst = (__MMIO_P2V(V2M_UART0) >> 18) & 0xfffc, |
| 240 | .boot_params = PHYS_OFFSET + 0x00000100, | 242 | .boot_params = PHYS_OFFSET + 0x00000100, |
| 241 | .map_io = ct_ca9x4_map_io, | 243 | .map_io = ct_ca9x4_map_io, |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 346ae14824a5..101105e52610 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -735,6 +735,25 @@ config NEEDS_SYSCALL_FOR_CMPXCHG | |||
| 735 | Forget about fast user space cmpxchg support. | 735 | Forget about fast user space cmpxchg support. |
| 736 | It is just not possible. | 736 | It is just not possible. |
| 737 | 737 | ||
| 738 | config DMA_CACHE_RWFO | ||
| 739 | bool "Enable read/write for ownership DMA cache maintenance" | ||
| 740 | depends on CPU_V6 && SMP | ||
| 741 | default y | ||
| 742 | help | ||
| 743 | The Snoop Control Unit on ARM11MPCore does not detect the | ||
| 744 | cache maintenance operations and the dma_{map,unmap}_area() | ||
| 745 | functions may leave stale cache entries on other CPUs. By | ||
| 746 | enabling this option, Read or Write For Ownership in the ARMv6 | ||
| 747 | DMA cache maintenance functions is performed. These LDR/STR | ||
| 748 | instructions change the cache line state to shared or modified | ||
| 749 | so that the cache operation has the desired effect. | ||
| 750 | |||
| 751 | Note that the workaround is only valid on processors that do | ||
| 752 | not perform speculative loads into the D-cache. For such | ||
| 753 | processors, if cache maintenance operations are not broadcast | ||
| 754 | in hardware, other workarounds are needed (e.g. cache | ||
| 755 | maintenance broadcasting in software via FIQ). | ||
| 756 | |||
| 738 | config OUTER_CACHE | 757 | config OUTER_CACHE |
| 739 | bool | 758 | bool |
| 740 | 759 | ||
| @@ -794,6 +813,8 @@ config ARM_L1_CACHE_SHIFT | |||
| 794 | 813 | ||
| 795 | config ARM_DMA_MEM_BUFFERABLE | 814 | config ARM_DMA_MEM_BUFFERABLE |
| 796 | bool "Use non-cacheable memory for DMA" if CPU_V6 && !CPU_V7 | 815 | bool "Use non-cacheable memory for DMA" if CPU_V6 && !CPU_V7 |
| 816 | depends on !(MACH_REALVIEW_PB1176 || REALVIEW_EB_ARM11MP || \ | ||
| 817 | MACH_REALVIEW_PB11MP) | ||
| 797 | default y if CPU_V6 || CPU_V7 | 818 | default y if CPU_V6 || CPU_V7 |
| 798 | help | 819 | help |
| 799 | Historically, the kernel has used strongly ordered mappings to | 820 | Historically, the kernel has used strongly ordered mappings to |
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index e46ecd847138..86aa689ef1aa 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
| @@ -211,8 +211,9 @@ v6_dma_inv_range: | |||
| 211 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line | 211 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line |
| 212 | #endif | 212 | #endif |
| 213 | 1: | 213 | 1: |
| 214 | #ifdef CONFIG_SMP | 214 | #ifdef CONFIG_DMA_CACHE_RWFO |
| 215 | str r0, [r0] @ write for ownership | 215 | ldr r2, [r0] @ read for ownership |
| 216 | str r2, [r0] @ write for ownership | ||
| 216 | #endif | 217 | #endif |
| 217 | #ifdef HARVARD_CACHE | 218 | #ifdef HARVARD_CACHE |
| 218 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line | 219 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line |
| @@ -234,7 +235,7 @@ v6_dma_inv_range: | |||
| 234 | v6_dma_clean_range: | 235 | v6_dma_clean_range: |
| 235 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 236 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
| 236 | 1: | 237 | 1: |
| 237 | #ifdef CONFIG_SMP | 238 | #ifdef CONFIG_DMA_CACHE_RWFO |
| 238 | ldr r2, [r0] @ read for ownership | 239 | ldr r2, [r0] @ read for ownership |
| 239 | #endif | 240 | #endif |
| 240 | #ifdef HARVARD_CACHE | 241 | #ifdef HARVARD_CACHE |
| @@ -257,7 +258,7 @@ v6_dma_clean_range: | |||
| 257 | ENTRY(v6_dma_flush_range) | 258 | ENTRY(v6_dma_flush_range) |
| 258 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 259 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
| 259 | 1: | 260 | 1: |
| 260 | #ifdef CONFIG_SMP | 261 | #ifdef CONFIG_DMA_CACHE_RWFO |
| 261 | ldr r2, [r0] @ read for ownership | 262 | ldr r2, [r0] @ read for ownership |
| 262 | str r2, [r0] @ write for ownership | 263 | str r2, [r0] @ write for ownership |
| 263 | #endif | 264 | #endif |
| @@ -283,9 +284,13 @@ ENTRY(v6_dma_map_area) | |||
| 283 | add r1, r1, r0 | 284 | add r1, r1, r0 |
| 284 | teq r2, #DMA_FROM_DEVICE | 285 | teq r2, #DMA_FROM_DEVICE |
| 285 | beq v6_dma_inv_range | 286 | beq v6_dma_inv_range |
| 287 | #ifndef CONFIG_DMA_CACHE_RWFO | ||
| 288 | b v6_dma_clean_range | ||
| 289 | #else | ||
| 286 | teq r2, #DMA_TO_DEVICE | 290 | teq r2, #DMA_TO_DEVICE |
| 287 | beq v6_dma_clean_range | 291 | beq v6_dma_clean_range |
| 288 | b v6_dma_flush_range | 292 | b v6_dma_flush_range |
| 293 | #endif | ||
| 289 | ENDPROC(v6_dma_map_area) | 294 | ENDPROC(v6_dma_map_area) |
| 290 | 295 | ||
| 291 | /* | 296 | /* |
| @@ -295,6 +300,11 @@ ENDPROC(v6_dma_map_area) | |||
| 295 | * - dir - DMA direction | 300 | * - dir - DMA direction |
| 296 | */ | 301 | */ |
| 297 | ENTRY(v6_dma_unmap_area) | 302 | ENTRY(v6_dma_unmap_area) |
| 303 | #ifndef CONFIG_DMA_CACHE_RWFO | ||
| 304 | add r1, r1, r0 | ||
| 305 | teq r2, #DMA_TO_DEVICE | ||
| 306 | bne v6_dma_inv_range | ||
| 307 | #endif | ||
| 298 | mov pc, lr | 308 | mov pc, lr |
| 299 | ENDPROC(v6_dma_unmap_area) | 309 | ENDPROC(v6_dma_unmap_area) |
| 300 | 310 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 13fa536d82e6..9e7742f0a102 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -24,15 +24,6 @@ | |||
| 24 | #include <asm/tlbflush.h> | 24 | #include <asm/tlbflush.h> |
| 25 | #include <asm/sizes.h> | 25 | #include <asm/sizes.h> |
| 26 | 26 | ||
| 27 | /* Sanity check size */ | ||
| 28 | #if (CONSISTENT_DMA_SIZE % SZ_2M) | ||
| 29 | #error "CONSISTENT_DMA_SIZE must be multiple of 2MiB" | ||
| 30 | #endif | ||
| 31 | |||
| 32 | #define CONSISTENT_OFFSET(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT) | ||
| 33 | #define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT) | ||
| 34 | #define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT) | ||
| 35 | |||
| 36 | static u64 get_coherent_dma_mask(struct device *dev) | 27 | static u64 get_coherent_dma_mask(struct device *dev) |
| 37 | { | 28 | { |
| 38 | u64 mask = ISA_DMA_THRESHOLD; | 29 | u64 mask = ISA_DMA_THRESHOLD; |
| @@ -123,6 +114,15 @@ static void __dma_free_buffer(struct page *page, size_t size) | |||
| 123 | } | 114 | } |
| 124 | 115 | ||
| 125 | #ifdef CONFIG_MMU | 116 | #ifdef CONFIG_MMU |
| 117 | /* Sanity check size */ | ||
| 118 | #if (CONSISTENT_DMA_SIZE % SZ_2M) | ||
| 119 | #error "CONSISTENT_DMA_SIZE must be multiple of 2MiB" | ||
| 120 | #endif | ||
| 121 | |||
| 122 | #define CONSISTENT_OFFSET(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT) | ||
| 123 | #define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT) | ||
| 124 | #define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT) | ||
| 125 | |||
| 126 | /* | 126 | /* |
| 127 | * These are the page tables (2MB each) covering uncached, DMA consistent allocations | 127 | * These are the page tables (2MB each) covering uncached, DMA consistent allocations |
| 128 | */ | 128 | */ |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index c64875f11fac..44bafdab2dce 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
| @@ -541,11 +541,11 @@ void omap_dm_timer_stop(struct omap_dm_timer *timer) | |||
| 541 | * timer is stopped | 541 | * timer is stopped |
| 542 | */ | 542 | */ |
| 543 | udelay(3500000 / clk_get_rate(timer->fclk) + 1); | 543 | udelay(3500000 / clk_get_rate(timer->fclk) + 1); |
| 544 | /* Ack possibly pending interrupt */ | ||
| 545 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, | ||
| 546 | OMAP_TIMER_INT_OVERFLOW); | ||
| 547 | #endif | 544 | #endif |
| 548 | } | 545 | } |
| 546 | /* Ack possibly pending interrupt */ | ||
| 547 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, | ||
| 548 | OMAP_TIMER_INT_OVERFLOW); | ||
| 549 | } | 549 | } |
| 550 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | 550 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); |
| 551 | 551 | ||
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 393e9219a5b6..9b7e3545f325 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -673,6 +673,7 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | |||
| 673 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) | 673 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) |
| 674 | clk_disable(bank->dbck); | 674 | clk_disable(bank->dbck); |
| 675 | } | 675 | } |
| 676 | bank->dbck_enable_mask = val; | ||
| 676 | 677 | ||
| 677 | __raw_writel(val, reg); | 678 | __raw_writel(val, reg); |
| 678 | } | 679 | } |
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index e43983ba59c5..8ce0de247c71 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
| @@ -140,8 +140,10 @@ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags) | |||
| 140 | return ERR_PTR(-ENOMEM); | 140 | return ERR_PTR(-ENOMEM); |
| 141 | 141 | ||
| 142 | err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); | 142 | err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); |
| 143 | if (err) | 143 | if (err) { |
| 144 | kfree(sgt); | ||
| 144 | return ERR_PTR(err); | 145 | return ERR_PTR(err); |
| 146 | } | ||
| 145 | 147 | ||
| 146 | pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); | 148 | pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); |
| 147 | 149 | ||
diff --git a/arch/arm/plat-pxa/Makefile b/arch/arm/plat-pxa/Makefile index 6187edfbcb77..a17cc0c6a6b0 100644 --- a/arch/arm/plat-pxa/Makefile +++ b/arch/arm/plat-pxa/Makefile | |||
| @@ -2,8 +2,9 @@ | |||
| 2 | # Makefile for code common across different PXA processor families | 2 | # Makefile for code common across different PXA processor families |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := dma.o pmu.o | 5 | obj-y := dma.o |
| 6 | 6 | ||
| 7 | obj-$(CONFIG_ARCH_PXA) += pmu.o | ||
| 7 | obj-$(CONFIG_GENERIC_GPIO) += gpio.o | 8 | obj-$(CONFIG_GENERIC_GPIO) += gpio.o |
| 8 | obj-$(CONFIG_PXA3xx) += mfp.o | 9 | obj-$(CONFIG_PXA3xx) += mfp.o |
| 9 | obj-$(CONFIG_ARCH_MMP) += mfp.o | 10 | obj-$(CONFIG_ARCH_MMP) += mfp.o |
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 5dfd916e9ea6..7b3cdc6c6d91 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c | |||
| @@ -121,7 +121,7 @@ static inline void down_spin(struct spinaphore *ss) | |||
| 121 | ia64_invala(); | 121 | ia64_invala(); |
| 122 | 122 | ||
| 123 | for (;;) { | 123 | for (;;) { |
| 124 | asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | 124 | asm volatile ("ld8.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); |
| 125 | if (time_before(t, serve)) | 125 | if (time_before(t, serve)) |
| 126 | return; | 126 | return; |
| 127 | cpu_relax(); | 127 | cpu_relax(); |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 53696da4518f..2d38a50e66ba 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
| @@ -135,13 +135,6 @@ config DEBUGGER | |||
| 135 | depends on KGDB || XMON | 135 | depends on KGDB || XMON |
| 136 | default y | 136 | default y |
| 137 | 137 | ||
| 138 | config IRQSTACKS | ||
| 139 | bool "Use separate kernel stacks when processing interrupts" | ||
| 140 | help | ||
| 141 | If you say Y here the kernel will use separate kernel stacks | ||
| 142 | for handling hard and soft interrupts. This can help avoid | ||
| 143 | overflowing the process kernel stacks. | ||
| 144 | |||
| 145 | config VIRQ_DEBUG | 138 | config VIRQ_DEBUG |
| 146 | bool "Expose hardware/virtual IRQ mapping via debugfs" | 139 | bool "Expose hardware/virtual IRQ mapping via debugfs" |
| 147 | depends on DEBUG_FS | 140 | depends on DEBUG_FS |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index ad0df7d0a643..fae8192c8fcc 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
| @@ -141,7 +141,7 @@ $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE | |||
| 141 | $(obj)/wrapper.a: $(obj-wlib) FORCE | 141 | $(obj)/wrapper.a: $(obj-wlib) FORCE |
| 142 | $(call if_changed,bootar) | 142 | $(call if_changed,bootar) |
| 143 | 143 | ||
| 144 | hostprogs-y := addnote addRamDisk hack-coff mktree | 144 | hostprogs-y := addnote hack-coff mktree |
| 145 | 145 | ||
| 146 | targets += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a) | 146 | targets += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a) |
| 147 | extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \ | 147 | extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \ |
diff --git a/arch/powerpc/boot/addRamDisk.c b/arch/powerpc/boot/addRamDisk.c deleted file mode 100644 index 893f446cbd22..000000000000 --- a/arch/powerpc/boot/addRamDisk.c +++ /dev/null | |||
| @@ -1,311 +0,0 @@ | |||
| 1 | #include <stdio.h> | ||
| 2 | #include <stdlib.h> | ||
| 3 | #include <netinet/in.h> | ||
| 4 | #include <unistd.h> | ||
| 5 | #include <sys/types.h> | ||
| 6 | #include <sys/stat.h> | ||
| 7 | #include <string.h> | ||
| 8 | #include <elf.h> | ||
| 9 | |||
| 10 | #define ElfHeaderSize (64 * 1024) | ||
| 11 | #define ElfPages (ElfHeaderSize / 4096) | ||
| 12 | #define KERNELBASE (0xc000000000000000) | ||
| 13 | #define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1))) | ||
| 14 | |||
| 15 | struct addr_range { | ||
| 16 | unsigned long long addr; | ||
| 17 | unsigned long memsize; | ||
| 18 | unsigned long offset; | ||
| 19 | }; | ||
| 20 | |||
| 21 | static int check_elf64(void *p, int size, struct addr_range *r) | ||
| 22 | { | ||
| 23 | Elf64_Ehdr *elf64 = p; | ||
| 24 | Elf64_Phdr *elf64ph; | ||
| 25 | |||
| 26 | if (elf64->e_ident[EI_MAG0] != ELFMAG0 || | ||
| 27 | elf64->e_ident[EI_MAG1] != ELFMAG1 || | ||
| 28 | elf64->e_ident[EI_MAG2] != ELFMAG2 || | ||
| 29 | elf64->e_ident[EI_MAG3] != ELFMAG3 || | ||
| 30 | elf64->e_ident[EI_CLASS] != ELFCLASS64 || | ||
| 31 | elf64->e_ident[EI_DATA] != ELFDATA2MSB || | ||
| 32 | elf64->e_type != ET_EXEC || elf64->e_machine != EM_PPC64) | ||
| 33 | return 0; | ||
| 34 | |||
| 35 | if ((elf64->e_phoff + sizeof(Elf64_Phdr)) > size) | ||
| 36 | return 0; | ||
| 37 | |||
| 38 | elf64ph = (Elf64_Phdr *) ((unsigned long)elf64 + | ||
| 39 | (unsigned long)elf64->e_phoff); | ||
| 40 | |||
| 41 | r->memsize = (unsigned long)elf64ph->p_memsz; | ||
| 42 | r->offset = (unsigned long)elf64ph->p_offset; | ||
| 43 | r->addr = (unsigned long long)elf64ph->p_vaddr; | ||
| 44 | |||
| 45 | #ifdef DEBUG | ||
| 46 | printf("PPC64 ELF file, ph:\n"); | ||
| 47 | printf("p_type 0x%08x\n", elf64ph->p_type); | ||
| 48 | printf("p_flags 0x%08x\n", elf64ph->p_flags); | ||
| 49 | printf("p_offset 0x%016llx\n", elf64ph->p_offset); | ||
| 50 | printf("p_vaddr 0x%016llx\n", elf64ph->p_vaddr); | ||
| 51 | printf("p_paddr 0x%016llx\n", elf64ph->p_paddr); | ||
| 52 | printf("p_filesz 0x%016llx\n", elf64ph->p_filesz); | ||
| 53 | printf("p_memsz 0x%016llx\n", elf64ph->p_memsz); | ||
| 54 | printf("p_align 0x%016llx\n", elf64ph->p_align); | ||
| 55 | printf("... skipping 0x%08lx bytes of ELF header\n", | ||
| 56 | (unsigned long)elf64ph->p_offset); | ||
| 57 | #endif | ||
| 58 | |||
| 59 | return 64; | ||
| 60 | } | ||
| 61 | static void get4k(FILE *file, char *buf ) | ||
| 62 | { | ||
| 63 | unsigned j; | ||
| 64 | unsigned num = fread(buf, 1, 4096, file); | ||
| 65 | for ( j=num; j<4096; ++j ) | ||
| 66 | buf[j] = 0; | ||
| 67 | } | ||
| 68 | |||
| 69 | static void put4k(FILE *file, char *buf ) | ||
| 70 | { | ||
| 71 | fwrite(buf, 1, 4096, file); | ||
| 72 | } | ||
| 73 | |||
| 74 | static void death(const char *msg, FILE *fdesc, const char *fname) | ||
| 75 | { | ||
| 76 | fprintf(stderr, msg); | ||
| 77 | fclose(fdesc); | ||
| 78 | unlink(fname); | ||
| 79 | exit(1); | ||
| 80 | } | ||
| 81 | |||
| 82 | int main(int argc, char **argv) | ||
| 83 | { | ||
| 84 | char inbuf[4096]; | ||
| 85 | struct addr_range vmlinux; | ||
| 86 | FILE *ramDisk; | ||
| 87 | FILE *inputVmlinux; | ||
| 88 | FILE *outputVmlinux; | ||
| 89 | |||
| 90 | char *rd_name, *lx_name, *out_name; | ||
| 91 | |||
| 92 | size_t i; | ||
| 93 | unsigned long ramFileLen; | ||
| 94 | unsigned long ramLen; | ||
| 95 | unsigned long roundR; | ||
| 96 | unsigned long offset_end; | ||
| 97 | |||
| 98 | unsigned long kernelLen; | ||
| 99 | unsigned long actualKernelLen; | ||
| 100 | unsigned long round; | ||
| 101 | unsigned long roundedKernelLen; | ||
| 102 | unsigned long ramStartOffs; | ||
| 103 | unsigned long ramPages; | ||
| 104 | unsigned long roundedKernelPages; | ||
| 105 | unsigned long hvReleaseData; | ||
| 106 | u_int32_t eyeCatcher = 0xc8a5d9c4; | ||
| 107 | unsigned long naca; | ||
| 108 | unsigned long xRamDisk; | ||
| 109 | unsigned long xRamDiskSize; | ||
| 110 | long padPages; | ||
| 111 | |||
| 112 | |||
| 113 | if (argc < 2) { | ||
| 114 | fprintf(stderr, "Name of RAM disk file missing.\n"); | ||
| 115 | exit(1); | ||
| 116 | } | ||
| 117 | rd_name = argv[1]; | ||
| 118 | |||
| 119 | if (argc < 3) { | ||
| 120 | fprintf(stderr, "Name of vmlinux file missing.\n"); | ||
| 121 | exit(1); | ||
| 122 | } | ||
| 123 | lx_name = argv[2]; | ||
| 124 | |||
| 125 | if (argc < 4) { | ||
| 126 | fprintf(stderr, "Name of vmlinux output file missing.\n"); | ||
| 127 | exit(1); | ||
| 128 | } | ||
| 129 | out_name = argv[3]; | ||
| 130 | |||
| 131 | |||
| 132 | ramDisk = fopen(rd_name, "r"); | ||
| 133 | if ( ! ramDisk ) { | ||
| 134 | fprintf(stderr, "RAM disk file \"%s\" failed to open.\n", rd_name); | ||
| 135 | exit(1); | ||
| 136 | } | ||
| 137 | |||
| 138 | inputVmlinux = fopen(lx_name, "r"); | ||
| 139 | if ( ! inputVmlinux ) { | ||
| 140 | fprintf(stderr, "vmlinux file \"%s\" failed to open.\n", lx_name); | ||
| 141 | exit(1); | ||
| 142 | } | ||
| 143 | |||
| 144 | outputVmlinux = fopen(out_name, "w+"); | ||
| 145 | if ( ! outputVmlinux ) { | ||
| 146 | fprintf(stderr, "output vmlinux file \"%s\" failed to open.\n", out_name); | ||
| 147 | exit(1); | ||
| 148 | } | ||
| 149 | |||
| 150 | i = fread(inbuf, 1, sizeof(inbuf), inputVmlinux); | ||
| 151 | if (i != sizeof(inbuf)) { | ||
| 152 | fprintf(stderr, "can not read vmlinux file %s: %u\n", lx_name, i); | ||
| 153 | exit(1); | ||
| 154 | } | ||
| 155 | |||
| 156 | i = check_elf64(inbuf, sizeof(inbuf), &vmlinux); | ||
| 157 | if (i == 0) { | ||
| 158 | fprintf(stderr, "You must have a linux kernel specified as argv[2]\n"); | ||
| 159 | exit(1); | ||
| 160 | } | ||
| 161 | |||
| 162 | /* Input Vmlinux file */ | ||
| 163 | fseek(inputVmlinux, 0, SEEK_END); | ||
| 164 | kernelLen = ftell(inputVmlinux); | ||
| 165 | fseek(inputVmlinux, 0, SEEK_SET); | ||
| 166 | printf("kernel file size = %lu\n", kernelLen); | ||
| 167 | |||
| 168 | actualKernelLen = kernelLen - ElfHeaderSize; | ||
| 169 | |||
| 170 | printf("actual kernel length (minus ELF header) = %lu\n", actualKernelLen); | ||
| 171 | |||
| 172 | round = actualKernelLen % 4096; | ||
| 173 | roundedKernelLen = actualKernelLen; | ||
| 174 | if ( round ) | ||
| 175 | roundedKernelLen += (4096 - round); | ||
| 176 | printf("Vmlinux length rounded up to a 4k multiple = %ld/0x%lx \n", roundedKernelLen, roundedKernelLen); | ||
| 177 | roundedKernelPages = roundedKernelLen / 4096; | ||
| 178 | printf("Vmlinux pages to copy = %ld/0x%lx \n", roundedKernelPages, roundedKernelPages); | ||
| 179 | |||
| 180 | offset_end = _ALIGN_UP(vmlinux.memsize, 4096); | ||
| 181 | /* calc how many pages we need to insert between the vmlinux and the start of the ram disk */ | ||
| 182 | padPages = offset_end/4096 - roundedKernelPages; | ||
| 183 | |||
| 184 | /* Check and see if the vmlinux is already larger than _end in System.map */ | ||
| 185 | if (padPages < 0) { | ||
| 186 | /* vmlinux is larger than _end - adjust the offset to the start of the embedded ram disk */ | ||
| 187 | offset_end = roundedKernelLen; | ||
| 188 | printf("vmlinux is larger than _end indicates it needs to be - offset_end = %lx \n", offset_end); | ||
| 189 | padPages = 0; | ||
| 190 | printf("will insert %lx pages between the vmlinux and the start of the ram disk \n", padPages); | ||
| 191 | } | ||
| 192 | else { | ||
| 193 | /* _end is larger than vmlinux - use the offset to _end that we calculated from the system map */ | ||
| 194 | printf("vmlinux is smaller than _end indicates is needed - offset_end = %lx \n", offset_end); | ||
| 195 | printf("will insert %lx pages between the vmlinux and the start of the ram disk \n", padPages); | ||
| 196 | } | ||
| 197 | |||
| 198 | |||
| 199 | |||
| 200 | /* Input Ram Disk file */ | ||
| 201 | // Set the offset that the ram disk will be started at. | ||
| 202 | ramStartOffs = offset_end; /* determined from the input vmlinux file and the system map */ | ||
| 203 | printf("Ram Disk will start at offset = 0x%lx \n", ramStartOffs); | ||
| 204 | |||
| 205 | fseek(ramDisk, 0, SEEK_END); | ||
| 206 | ramFileLen = ftell(ramDisk); | ||
| 207 | fseek(ramDisk, 0, SEEK_SET); | ||
| 208 | printf("%s file size = %ld/0x%lx \n", rd_name, ramFileLen, ramFileLen); | ||
| 209 | |||
| 210 | ramLen = ramFileLen; | ||
| 211 | |||
| 212 | roundR = 4096 - (ramLen % 4096); | ||
| 213 | if ( roundR ) { | ||
| 214 | printf("Rounding RAM disk file up to a multiple of 4096, adding %ld/0x%lx \n", roundR, roundR); | ||
| 215 | ramLen += roundR; | ||
| 216 | } | ||
| 217 | |||
| 218 | printf("Rounded RAM disk size is %ld/0x%lx \n", ramLen, ramLen); | ||
| 219 | ramPages = ramLen / 4096; | ||
| 220 | printf("RAM disk pages to copy = %ld/0x%lx\n", ramPages, ramPages); | ||
| 221 | |||
| 222 | |||
| 223 | |||
| 224 | // Copy 64K ELF header | ||
| 225 | for (i=0; i<(ElfPages); ++i) { | ||
| 226 | get4k( inputVmlinux, inbuf ); | ||
| 227 | put4k( outputVmlinux, inbuf ); | ||
| 228 | } | ||
| 229 | |||
| 230 | /* Copy the vmlinux (as full pages). */ | ||
| 231 | fseek(inputVmlinux, ElfHeaderSize, SEEK_SET); | ||
| 232 | for ( i=0; i<roundedKernelPages; ++i ) { | ||
| 233 | get4k( inputVmlinux, inbuf ); | ||
| 234 | put4k( outputVmlinux, inbuf ); | ||
| 235 | } | ||
| 236 | |||
| 237 | /* Insert pad pages (if appropriate) that are needed between */ | ||
| 238 | /* | the end of the vmlinux and the ram disk. */ | ||
| 239 | for (i=0; i<padPages; ++i) { | ||
| 240 | memset(inbuf, 0, 4096); | ||
| 241 | put4k(outputVmlinux, inbuf); | ||
| 242 | } | ||
| 243 | |||
| 244 | /* Copy the ram disk (as full pages). */ | ||
| 245 | for ( i=0; i<ramPages; ++i ) { | ||
| 246 | get4k( ramDisk, inbuf ); | ||
| 247 | put4k( outputVmlinux, inbuf ); | ||
| 248 | } | ||
| 249 | |||
| 250 | /* Close the input files */ | ||
| 251 | fclose(ramDisk); | ||
| 252 | fclose(inputVmlinux); | ||
| 253 | /* And flush the written output file */ | ||
| 254 | fflush(outputVmlinux); | ||
| 255 | |||
| 256 | |||
| 257 | |||
| 258 | /* Fixup the new vmlinux to contain the ram disk starting offset (xRamDisk) and the ram disk size (xRamDiskSize) */ | ||
| 259 | /* fseek to the hvReleaseData pointer */ | ||
| 260 | fseek(outputVmlinux, ElfHeaderSize + 0x24, SEEK_SET); | ||
| 261 | if (fread(&hvReleaseData, 4, 1, outputVmlinux) != 1) { | ||
| 262 | death("Could not read hvReleaseData pointer\n", outputVmlinux, out_name); | ||
| 263 | } | ||
| 264 | hvReleaseData = ntohl(hvReleaseData); /* Convert to native int */ | ||
| 265 | printf("hvReleaseData is at %08lx\n", hvReleaseData); | ||
| 266 | |||
| 267 | /* fseek to the hvReleaseData */ | ||
| 268 | fseek(outputVmlinux, ElfHeaderSize + hvReleaseData, SEEK_SET); | ||
| 269 | if (fread(inbuf, 0x40, 1, outputVmlinux) != 1) { | ||
| 270 | death("Could not read hvReleaseData\n", outputVmlinux, out_name); | ||
| 271 | } | ||
| 272 | /* Check hvReleaseData sanity */ | ||
| 273 | if (memcmp(inbuf, &eyeCatcher, 4) != 0) { | ||
| 274 | death("hvReleaseData is invalid\n", outputVmlinux, out_name); | ||
| 275 | } | ||
| 276 | /* Get the naca pointer */ | ||
| 277 | naca = ntohl(*((u_int32_t*) &inbuf[0x0C])) - KERNELBASE; | ||
| 278 | printf("Naca is at offset 0x%lx \n", naca); | ||
| 279 | |||
| 280 | /* fseek to the naca */ | ||
| 281 | fseek(outputVmlinux, ElfHeaderSize + naca, SEEK_SET); | ||
| 282 | if (fread(inbuf, 0x18, 1, outputVmlinux) != 1) { | ||
| 283 | death("Could not read naca\n", outputVmlinux, out_name); | ||
| 284 | } | ||
| 285 | xRamDisk = ntohl(*((u_int32_t *) &inbuf[0x0c])); | ||
| 286 | xRamDiskSize = ntohl(*((u_int32_t *) &inbuf[0x14])); | ||
| 287 | /* Make sure a RAM disk isn't already present */ | ||
| 288 | if ((xRamDisk != 0) || (xRamDiskSize != 0)) { | ||
| 289 | death("RAM disk is already attached to this kernel\n", outputVmlinux, out_name); | ||
| 290 | } | ||
| 291 | /* Fill in the values */ | ||
| 292 | *((u_int32_t *) &inbuf[0x0c]) = htonl(ramStartOffs); | ||
| 293 | *((u_int32_t *) &inbuf[0x14]) = htonl(ramPages); | ||
| 294 | |||
| 295 | /* Write out the new naca */ | ||
| 296 | fflush(outputVmlinux); | ||
| 297 | fseek(outputVmlinux, ElfHeaderSize + naca, SEEK_SET); | ||
| 298 | if (fwrite(inbuf, 0x18, 1, outputVmlinux) != 1) { | ||
| 299 | death("Could not write naca\n", outputVmlinux, out_name); | ||
| 300 | } | ||
| 301 | printf("Ram Disk of 0x%lx pages is attached to the kernel at offset 0x%08lx\n", | ||
| 302 | ramPages, ramStartOffs); | ||
| 303 | |||
| 304 | /* Done */ | ||
| 305 | fclose(outputVmlinux); | ||
| 306 | /* Set permission to executable */ | ||
| 307 | chmod(out_name, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); | ||
| 308 | |||
| 309 | return 0; | ||
| 310 | } | ||
| 311 | |||
diff --git a/arch/powerpc/boot/dts/lite5200.dts b/arch/powerpc/boot/dts/lite5200.dts index 82ff2b13bc37..179a1785d645 100644 --- a/arch/powerpc/boot/dts/lite5200.dts +++ b/arch/powerpc/boot/dts/lite5200.dts | |||
| @@ -134,12 +134,16 @@ | |||
| 134 | compatible = "fsl,mpc5200-gpio"; | 134 | compatible = "fsl,mpc5200-gpio"; |
| 135 | reg = <0xb00 0x40>; | 135 | reg = <0xb00 0x40>; |
| 136 | interrupts = <1 7 0>; | 136 | interrupts = <1 7 0>; |
| 137 | gpio-controller; | ||
| 138 | #gpio-cells = <2>; | ||
| 137 | }; | 139 | }; |
| 138 | 140 | ||
| 139 | gpio@c00 { | 141 | gpio@c00 { |
| 140 | compatible = "fsl,mpc5200-gpio-wkup"; | 142 | compatible = "fsl,mpc5200-gpio-wkup"; |
| 141 | reg = <0xc00 0x40>; | 143 | reg = <0xc00 0x40>; |
| 142 | interrupts = <1 8 0 0 3 0>; | 144 | interrupts = <1 8 0 0 3 0>; |
| 145 | gpio-controller; | ||
| 146 | #gpio-cells = <2>; | ||
| 143 | }; | 147 | }; |
| 144 | 148 | ||
| 145 | spi@f00 { | 149 | spi@f00 { |
| @@ -230,8 +234,8 @@ | |||
| 230 | reg = <0x3000 0x400>; // fec range, since we need to setup fec interrupts | 234 | reg = <0x3000 0x400>; // fec range, since we need to setup fec interrupts |
| 231 | interrupts = <2 5 0>; // these are for "mii command finished", not link changes & co. | 235 | interrupts = <2 5 0>; // these are for "mii command finished", not link changes & co. |
| 232 | 236 | ||
| 233 | phy0: ethernet-phy@1 { | 237 | phy0: ethernet-phy@0 { |
| 234 | reg = <1>; | 238 | reg = <0>; |
| 235 | }; | 239 | }; |
| 236 | }; | 240 | }; |
| 237 | 241 | ||
| @@ -255,7 +259,13 @@ | |||
| 255 | compatible = "fsl,mpc5200-i2c","fsl-i2c"; | 259 | compatible = "fsl,mpc5200-i2c","fsl-i2c"; |
| 256 | reg = <0x3d40 0x40>; | 260 | reg = <0x3d40 0x40>; |
| 257 | interrupts = <2 16 0>; | 261 | interrupts = <2 16 0>; |
| 262 | |||
| 263 | eeprom@50 { | ||
| 264 | compatible = "atmel,24c02"; | ||
| 265 | reg = <0x50>; | ||
| 266 | }; | ||
| 258 | }; | 267 | }; |
| 268 | |||
| 259 | sram@8000 { | 269 | sram@8000 { |
| 260 | compatible = "fsl,mpc5200-sram"; | 270 | compatible = "fsl,mpc5200-sram"; |
| 261 | reg = <0x8000 0x4000>; | 271 | reg = <0x8000 0x4000>; |
| @@ -281,4 +291,18 @@ | |||
| 281 | 0x02000000 0 0xa0000000 0xa0000000 0 0x10000000 | 291 | 0x02000000 0 0xa0000000 0xa0000000 0 0x10000000 |
| 282 | 0x01000000 0 0x00000000 0xb0000000 0 0x01000000>; | 292 | 0x01000000 0 0x00000000 0xb0000000 0 0x01000000>; |
| 283 | }; | 293 | }; |
| 294 | |||
| 295 | localbus { | ||
| 296 | compatible = "fsl,mpc5200-lpb","simple-bus"; | ||
| 297 | #address-cells = <2>; | ||
| 298 | #size-cells = <1>; | ||
| 299 | |||
| 300 | ranges = <0 0 0xff000000 0x01000000>; | ||
| 301 | |||
| 302 | flash@0,0 { | ||
| 303 | compatible = "amd,am29lv652d", "cfi-flash"; | ||
| 304 | reg = <0 0 0x01000000>; | ||
| 305 | bank-width = <1>; | ||
| 306 | }; | ||
| 307 | }; | ||
| 284 | }; | 308 | }; |
diff --git a/arch/powerpc/boot/dts/lite5200b.dts b/arch/powerpc/boot/dts/lite5200b.dts index e45a63be3a86..59702ace900f 100644 --- a/arch/powerpc/boot/dts/lite5200b.dts +++ b/arch/powerpc/boot/dts/lite5200b.dts | |||
| @@ -259,6 +259,11 @@ | |||
| 259 | compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; | 259 | compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; |
| 260 | reg = <0x3d40 0x40>; | 260 | reg = <0x3d40 0x40>; |
| 261 | interrupts = <2 16 0>; | 261 | interrupts = <2 16 0>; |
| 262 | |||
| 263 | eeprom@50 { | ||
| 264 | compatible = "atmel,24c02"; | ||
| 265 | reg = <0x50>; | ||
| 266 | }; | ||
| 262 | }; | 267 | }; |
| 263 | 268 | ||
| 264 | sram@8000 { | 269 | sram@8000 { |
diff --git a/arch/powerpc/configs/40x/acadia_defconfig b/arch/powerpc/configs/40x/acadia_defconfig index 8e95f8d227b9..4aa17b676a3f 100644 --- a/arch/powerpc/configs/40x/acadia_defconfig +++ b/arch/powerpc/configs/40x/acadia_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/40x/ep405_defconfig b/arch/powerpc/configs/40x/ep405_defconfig index 918f23fd2b18..9a5f1ab777ed 100644 --- a/arch/powerpc/configs/40x/ep405_defconfig +++ b/arch/powerpc/configs/40x/ep405_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/40x/hcu4_defconfig b/arch/powerpc/configs/40x/hcu4_defconfig index f87ef0382280..0b452135d1d4 100644 --- a/arch/powerpc/configs/40x/hcu4_defconfig +++ b/arch/powerpc/configs/40x/hcu4_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/40x/kilauea_defconfig b/arch/powerpc/configs/40x/kilauea_defconfig index 19fbcb075376..4d2de0bed60e 100644 --- a/arch/powerpc/configs/40x/kilauea_defconfig +++ b/arch/powerpc/configs/40x/kilauea_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/40x/makalu_defconfig b/arch/powerpc/configs/40x/makalu_defconfig index eb41cd695979..a1f3f505e4a7 100644 --- a/arch/powerpc/configs/40x/makalu_defconfig +++ b/arch/powerpc/configs/40x/makalu_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/40x/virtex_defconfig b/arch/powerpc/configs/40x/virtex_defconfig index 416e79ac0711..c76313577140 100644 --- a/arch/powerpc/configs/40x/virtex_defconfig +++ b/arch/powerpc/configs/40x/virtex_defconfig | |||
| @@ -77,8 +77,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 77 | CONFIG_LOG_BUF_SHIFT=14 | 77 | CONFIG_LOG_BUF_SHIFT=14 |
| 78 | # CONFIG_GROUP_SCHED is not set | 78 | # CONFIG_GROUP_SCHED is not set |
| 79 | # CONFIG_CGROUPS is not set | 79 | # CONFIG_CGROUPS is not set |
| 80 | CONFIG_SYSFS_DEPRECATED=y | 80 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 81 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 82 | # CONFIG_RELAY is not set | 81 | # CONFIG_RELAY is not set |
| 83 | CONFIG_NAMESPACES=y | 82 | CONFIG_NAMESPACES=y |
| 84 | # CONFIG_UTS_NS is not set | 83 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/40x/walnut_defconfig b/arch/powerpc/configs/40x/walnut_defconfig index bfff0eae39d2..6597b2f1d1a8 100644 --- a/arch/powerpc/configs/40x/walnut_defconfig +++ b/arch/powerpc/configs/40x/walnut_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 98 | CONFIG_USER_SCHED=y | 98 | CONFIG_USER_SCHED=y |
| 99 | # CONFIG_CGROUP_SCHED is not set | 99 | # CONFIG_CGROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/arches_defconfig b/arch/powerpc/configs/44x/arches_defconfig index 1f6d0490e28d..2d3dfb55fbed 100644 --- a/arch/powerpc/configs/44x/arches_defconfig +++ b/arch/powerpc/configs/44x/arches_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_GROUP_SCHED is not set | 99 | # CONFIG_GROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/bamboo_defconfig b/arch/powerpc/configs/44x/bamboo_defconfig index 788faac6c27a..51a00c46df19 100644 --- a/arch/powerpc/configs/44x/bamboo_defconfig +++ b/arch/powerpc/configs/44x/bamboo_defconfig | |||
| @@ -102,8 +102,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 102 | CONFIG_USER_SCHED=y | 102 | CONFIG_USER_SCHED=y |
| 103 | # CONFIG_CGROUP_SCHED is not set | 103 | # CONFIG_CGROUP_SCHED is not set |
| 104 | # CONFIG_CGROUPS is not set | 104 | # CONFIG_CGROUPS is not set |
| 105 | CONFIG_SYSFS_DEPRECATED=y | 105 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 106 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 107 | # CONFIG_RELAY is not set | 106 | # CONFIG_RELAY is not set |
| 108 | # CONFIG_NAMESPACES is not set | 107 | # CONFIG_NAMESPACES is not set |
| 109 | CONFIG_BLK_DEV_INITRD=y | 108 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/canyonlands_defconfig b/arch/powerpc/configs/44x/canyonlands_defconfig index 4ef8bcab61f8..1028b1bfb602 100644 --- a/arch/powerpc/configs/44x/canyonlands_defconfig +++ b/arch/powerpc/configs/44x/canyonlands_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_GROUP_SCHED is not set | 99 | # CONFIG_GROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/ebony_defconfig b/arch/powerpc/configs/44x/ebony_defconfig index ca17b1496e32..69f5633cbd4f 100644 --- a/arch/powerpc/configs/44x/ebony_defconfig +++ b/arch/powerpc/configs/44x/ebony_defconfig | |||
| @@ -101,8 +101,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 101 | CONFIG_USER_SCHED=y | 101 | CONFIG_USER_SCHED=y |
| 102 | # CONFIG_CGROUP_SCHED is not set | 102 | # CONFIG_CGROUP_SCHED is not set |
| 103 | # CONFIG_CGROUPS is not set | 103 | # CONFIG_CGROUPS is not set |
| 104 | CONFIG_SYSFS_DEPRECATED=y | 104 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 105 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 106 | # CONFIG_RELAY is not set | 105 | # CONFIG_RELAY is not set |
| 107 | # CONFIG_NAMESPACES is not set | 106 | # CONFIG_NAMESPACES is not set |
| 108 | CONFIG_BLK_DEV_INITRD=y | 107 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/eiger_defconfig b/arch/powerpc/configs/44x/eiger_defconfig index e3149bade0b2..dcd859c8b4a6 100644 --- a/arch/powerpc/configs/44x/eiger_defconfig +++ b/arch/powerpc/configs/44x/eiger_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_GROUP_SCHED is not set | 99 | # CONFIG_GROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/katmai_defconfig b/arch/powerpc/configs/44x/katmai_defconfig index af244e1d255e..a2c24d1e051e 100644 --- a/arch/powerpc/configs/44x/katmai_defconfig +++ b/arch/powerpc/configs/44x/katmai_defconfig | |||
| @@ -97,8 +97,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 97 | CONFIG_LOG_BUF_SHIFT=14 | 97 | CONFIG_LOG_BUF_SHIFT=14 |
| 98 | # CONFIG_GROUP_SCHED is not set | 98 | # CONFIG_GROUP_SCHED is not set |
| 99 | # CONFIG_CGROUPS is not set | 99 | # CONFIG_CGROUPS is not set |
| 100 | CONFIG_SYSFS_DEPRECATED=y | 100 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 101 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 102 | # CONFIG_RELAY is not set | 101 | # CONFIG_RELAY is not set |
| 103 | # CONFIG_NAMESPACES is not set | 102 | # CONFIG_NAMESPACES is not set |
| 104 | CONFIG_BLK_DEV_INITRD=y | 103 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/rainier_defconfig b/arch/powerpc/configs/44x/rainier_defconfig index 8fed3b26af2e..3bb55b57077e 100644 --- a/arch/powerpc/configs/44x/rainier_defconfig +++ b/arch/powerpc/configs/44x/rainier_defconfig | |||
| @@ -101,8 +101,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 101 | CONFIG_USER_SCHED=y | 101 | CONFIG_USER_SCHED=y |
| 102 | # CONFIG_CGROUP_SCHED is not set | 102 | # CONFIG_CGROUP_SCHED is not set |
| 103 | # CONFIG_CGROUPS is not set | 103 | # CONFIG_CGROUPS is not set |
| 104 | CONFIG_SYSFS_DEPRECATED=y | 104 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 105 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 106 | # CONFIG_RELAY is not set | 105 | # CONFIG_RELAY is not set |
| 107 | # CONFIG_NAMESPACES is not set | 106 | # CONFIG_NAMESPACES is not set |
| 108 | CONFIG_BLK_DEV_INITRD=y | 107 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/redwood_defconfig b/arch/powerpc/configs/44x/redwood_defconfig index a67ec91a28c3..684f40dc8a41 100644 --- a/arch/powerpc/configs/44x/redwood_defconfig +++ b/arch/powerpc/configs/44x/redwood_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_GROUP_SCHED is not set | 99 | # CONFIG_GROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/sam440ep_defconfig b/arch/powerpc/configs/44x/sam440ep_defconfig index 886cb6aa6432..e202924e6173 100644 --- a/arch/powerpc/configs/44x/sam440ep_defconfig +++ b/arch/powerpc/configs/44x/sam440ep_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 103 | CONFIG_USER_SCHED=y | 103 | CONFIG_USER_SCHED=y |
| 104 | # CONFIG_CGROUP_SCHED is not set | 104 | # CONFIG_CGROUP_SCHED is not set |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | # CONFIG_RELAY is not set | 107 | # CONFIG_RELAY is not set |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/sequoia_defconfig b/arch/powerpc/configs/44x/sequoia_defconfig index 1b2f41dbcafb..c348a4662a9e 100644 --- a/arch/powerpc/configs/44x/sequoia_defconfig +++ b/arch/powerpc/configs/44x/sequoia_defconfig | |||
| @@ -102,8 +102,7 @@ CONFIG_GROUP_SCHED=y | |||
| 102 | CONFIG_USER_SCHED=y | 102 | CONFIG_USER_SCHED=y |
| 103 | # CONFIG_CGROUP_SCHED is not set | 103 | # CONFIG_CGROUP_SCHED is not set |
| 104 | # CONFIG_CGROUPS is not set | 104 | # CONFIG_CGROUPS is not set |
| 105 | CONFIG_SYSFS_DEPRECATED=y | 105 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 106 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 107 | # CONFIG_RELAY is not set | 106 | # CONFIG_RELAY is not set |
| 108 | # CONFIG_NAMESPACES is not set | 107 | # CONFIG_NAMESPACES is not set |
| 109 | CONFIG_BLK_DEV_INITRD=y | 108 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/taishan_defconfig b/arch/powerpc/configs/44x/taishan_defconfig index 12041d355b8c..f4cb7e84cb83 100644 --- a/arch/powerpc/configs/44x/taishan_defconfig +++ b/arch/powerpc/configs/44x/taishan_defconfig | |||
| @@ -101,8 +101,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 101 | CONFIG_USER_SCHED=y | 101 | CONFIG_USER_SCHED=y |
| 102 | # CONFIG_CGROUP_SCHED is not set | 102 | # CONFIG_CGROUP_SCHED is not set |
| 103 | # CONFIG_CGROUPS is not set | 103 | # CONFIG_CGROUPS is not set |
| 104 | CONFIG_SYSFS_DEPRECATED=y | 104 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 105 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 106 | # CONFIG_RELAY is not set | 105 | # CONFIG_RELAY is not set |
| 107 | # CONFIG_NAMESPACES is not set | 106 | # CONFIG_NAMESPACES is not set |
| 108 | CONFIG_BLK_DEV_INITRD=y | 107 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig index 2518b8568c70..c7ead0ec00bc 100644 --- a/arch/powerpc/configs/44x/virtex5_defconfig +++ b/arch/powerpc/configs/44x/virtex5_defconfig | |||
| @@ -80,8 +80,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 80 | CONFIG_LOG_BUF_SHIFT=14 | 80 | CONFIG_LOG_BUF_SHIFT=14 |
| 81 | # CONFIG_GROUP_SCHED is not set | 81 | # CONFIG_GROUP_SCHED is not set |
| 82 | # CONFIG_CGROUPS is not set | 82 | # CONFIG_CGROUPS is not set |
| 83 | CONFIG_SYSFS_DEPRECATED=y | 83 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 84 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 85 | # CONFIG_RELAY is not set | 84 | # CONFIG_RELAY is not set |
| 86 | CONFIG_NAMESPACES=y | 85 | CONFIG_NAMESPACES=y |
| 87 | # CONFIG_UTS_NS is not set | 86 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/52xx/cm5200_defconfig b/arch/powerpc/configs/52xx/cm5200_defconfig index 218d49b36a0c..7664c83c17c2 100644 --- a/arch/powerpc/configs/52xx/cm5200_defconfig +++ b/arch/powerpc/configs/52xx/cm5200_defconfig | |||
| @@ -95,8 +95,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 95 | # CONFIG_IKCONFIG is not set | 95 | # CONFIG_IKCONFIG is not set |
| 96 | CONFIG_LOG_BUF_SHIFT=14 | 96 | CONFIG_LOG_BUF_SHIFT=14 |
| 97 | # CONFIG_CGROUPS is not set | 97 | # CONFIG_CGROUPS is not set |
| 98 | CONFIG_SYSFS_DEPRECATED=y | 98 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 99 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 100 | # CONFIG_RELAY is not set | 99 | # CONFIG_RELAY is not set |
| 101 | # CONFIG_NAMESPACES is not set | 100 | # CONFIG_NAMESPACES is not set |
| 102 | CONFIG_BLK_DEV_INITRD=y | 101 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/52xx/lite5200b_defconfig b/arch/powerpc/configs/52xx/lite5200b_defconfig index 90492ff25232..eac7c17eef34 100644 --- a/arch/powerpc/configs/52xx/lite5200b_defconfig +++ b/arch/powerpc/configs/52xx/lite5200b_defconfig | |||
| @@ -96,8 +96,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 96 | # CONFIG_IKCONFIG is not set | 96 | # CONFIG_IKCONFIG is not set |
| 97 | CONFIG_LOG_BUF_SHIFT=14 | 97 | CONFIG_LOG_BUF_SHIFT=14 |
| 98 | # CONFIG_CGROUPS is not set | 98 | # CONFIG_CGROUPS is not set |
| 99 | CONFIG_SYSFS_DEPRECATED=y | 99 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 100 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 101 | # CONFIG_RELAY is not set | 100 | # CONFIG_RELAY is not set |
| 102 | # CONFIG_NAMESPACES is not set | 101 | # CONFIG_NAMESPACES is not set |
| 103 | CONFIG_BLK_DEV_INITRD=y | 102 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/52xx/motionpro_defconfig b/arch/powerpc/configs/52xx/motionpro_defconfig index dffc8cac825f..27afb6ecdf61 100644 --- a/arch/powerpc/configs/52xx/motionpro_defconfig +++ b/arch/powerpc/configs/52xx/motionpro_defconfig | |||
| @@ -95,8 +95,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 95 | # CONFIG_IKCONFIG is not set | 95 | # CONFIG_IKCONFIG is not set |
| 96 | CONFIG_LOG_BUF_SHIFT=14 | 96 | CONFIG_LOG_BUF_SHIFT=14 |
| 97 | # CONFIG_CGROUPS is not set | 97 | # CONFIG_CGROUPS is not set |
| 98 | CONFIG_SYSFS_DEPRECATED=y | 98 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 99 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 100 | # CONFIG_RELAY is not set | 99 | # CONFIG_RELAY is not set |
| 101 | # CONFIG_NAMESPACES is not set | 100 | # CONFIG_NAMESPACES is not set |
| 102 | CONFIG_BLK_DEV_INITRD=y | 101 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/52xx/pcm030_defconfig b/arch/powerpc/configs/52xx/pcm030_defconfig index 3cb2a522046a..5fe39ddb4e14 100644 --- a/arch/powerpc/configs/52xx/pcm030_defconfig +++ b/arch/powerpc/configs/52xx/pcm030_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_IKCONFIG=y | |||
| 98 | CONFIG_IKCONFIG_PROC=y | 98 | CONFIG_IKCONFIG_PROC=y |
| 99 | CONFIG_LOG_BUF_SHIFT=14 | 99 | CONFIG_LOG_BUF_SHIFT=14 |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | # CONFIG_BLK_DEV_INITRD is not set | 104 | # CONFIG_BLK_DEV_INITRD is not set |
diff --git a/arch/powerpc/configs/52xx/tqm5200_defconfig b/arch/powerpc/configs/52xx/tqm5200_defconfig index 96181c62abfa..a108b84c0074 100644 --- a/arch/powerpc/configs/52xx/tqm5200_defconfig +++ b/arch/powerpc/configs/52xx/tqm5200_defconfig | |||
| @@ -95,8 +95,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 95 | # CONFIG_IKCONFIG is not set | 95 | # CONFIG_IKCONFIG is not set |
| 96 | CONFIG_LOG_BUF_SHIFT=14 | 96 | CONFIG_LOG_BUF_SHIFT=14 |
| 97 | # CONFIG_CGROUPS is not set | 97 | # CONFIG_CGROUPS is not set |
| 98 | CONFIG_SYSFS_DEPRECATED=y | 98 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 99 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 100 | # CONFIG_RELAY is not set | 99 | # CONFIG_RELAY is not set |
| 101 | # CONFIG_NAMESPACES is not set | 100 | # CONFIG_NAMESPACES is not set |
| 102 | CONFIG_BLK_DEV_INITRD=y | 101 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig index 183c59c6d896..b728a7d64250 100644 --- a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig +++ b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_IKCONFIG=y | |||
| 103 | CONFIG_IKCONFIG_PROC=y | 103 | CONFIG_IKCONFIG_PROC=y |
| 104 | CONFIG_LOG_BUF_SHIFT=14 | 104 | CONFIG_LOG_BUF_SHIFT=14 |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | CONFIG_RELAY=y | 107 | CONFIG_RELAY=y |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/gef_sbc310_defconfig b/arch/powerpc/configs/86xx/gef_sbc310_defconfig index 1524d948a2ba..8e738de5f6a5 100644 --- a/arch/powerpc/configs/86xx/gef_sbc310_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc310_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_IKCONFIG=y | |||
| 103 | CONFIG_IKCONFIG_PROC=y | 103 | CONFIG_IKCONFIG_PROC=y |
| 104 | CONFIG_LOG_BUF_SHIFT=14 | 104 | CONFIG_LOG_BUF_SHIFT=14 |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | CONFIG_RELAY=y | 107 | CONFIG_RELAY=y |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/gef_sbc610_defconfig b/arch/powerpc/configs/86xx/gef_sbc610_defconfig index 767c204c0603..59bf9e27d7f2 100644 --- a/arch/powerpc/configs/86xx/gef_sbc610_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc610_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_IKCONFIG=y | |||
| 103 | CONFIG_IKCONFIG_PROC=y | 103 | CONFIG_IKCONFIG_PROC=y |
| 104 | CONFIG_LOG_BUF_SHIFT=14 | 104 | CONFIG_LOG_BUF_SHIFT=14 |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | CONFIG_RELAY=y | 107 | CONFIG_RELAY=y |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig b/arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig index 55b9e4e867ac..4e8b01e73245 100644 --- a/arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig +++ b/arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_IKCONFIG=y | |||
| 98 | CONFIG_IKCONFIG_PROC=y | 98 | CONFIG_IKCONFIG_PROC=y |
| 99 | CONFIG_LOG_BUF_SHIFT=14 | 99 | CONFIG_LOG_BUF_SHIFT=14 |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | # CONFIG_NAMESPACES is not set | 103 | # CONFIG_NAMESPACES is not set |
| 105 | CONFIG_BLK_DEV_INITRD=y | 104 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig b/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig index 1be38eb05783..20fde6374aad 100644 --- a/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig +++ b/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_IKCONFIG=y | |||
| 103 | CONFIG_IKCONFIG_PROC=y | 103 | CONFIG_IKCONFIG_PROC=y |
| 104 | CONFIG_LOG_BUF_SHIFT=14 | 104 | CONFIG_LOG_BUF_SHIFT=14 |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | # CONFIG_RELAY is not set | 107 | # CONFIG_RELAY is not set |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/86xx/sbc8641d_defconfig b/arch/powerpc/configs/86xx/sbc8641d_defconfig index a63009457323..74f714d85936 100644 --- a/arch/powerpc/configs/86xx/sbc8641d_defconfig +++ b/arch/powerpc/configs/86xx/sbc8641d_defconfig | |||
| @@ -102,8 +102,7 @@ CONFIG_IKCONFIG=y | |||
| 102 | CONFIG_IKCONFIG_PROC=y | 102 | CONFIG_IKCONFIG_PROC=y |
| 103 | CONFIG_LOG_BUF_SHIFT=14 | 103 | CONFIG_LOG_BUF_SHIFT=14 |
| 104 | # CONFIG_CGROUPS is not set | 104 | # CONFIG_CGROUPS is not set |
| 105 | CONFIG_SYSFS_DEPRECATED=y | 105 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 106 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 107 | CONFIG_RELAY=y | 106 | CONFIG_RELAY=y |
| 108 | # CONFIG_NAMESPACES is not set | 107 | # CONFIG_NAMESPACES is not set |
| 109 | CONFIG_BLK_DEV_INITRD=y | 108 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/adder875_defconfig b/arch/powerpc/configs/adder875_defconfig index 9f89d5c9c0be..a670cee255b9 100644 --- a/arch/powerpc/configs/adder875_defconfig +++ b/arch/powerpc/configs/adder875_defconfig | |||
| @@ -92,8 +92,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 92 | # CONFIG_IKCONFIG is not set | 92 | # CONFIG_IKCONFIG is not set |
| 93 | CONFIG_LOG_BUF_SHIFT=14 | 93 | CONFIG_LOG_BUF_SHIFT=14 |
| 94 | # CONFIG_CGROUPS is not set | 94 | # CONFIG_CGROUPS is not set |
| 95 | CONFIG_SYSFS_DEPRECATED=y | 95 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 96 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 97 | # CONFIG_RELAY is not set | 96 | # CONFIG_RELAY is not set |
| 98 | # CONFIG_NAMESPACES is not set | 97 | # CONFIG_NAMESPACES is not set |
| 99 | # CONFIG_BLK_DEV_INITRD is not set | 98 | # CONFIG_BLK_DEV_INITRD is not set |
diff --git a/arch/powerpc/configs/amigaone_defconfig b/arch/powerpc/configs/amigaone_defconfig index b63cc38df6b1..851287e78fc3 100644 --- a/arch/powerpc/configs/amigaone_defconfig +++ b/arch/powerpc/configs/amigaone_defconfig | |||
| @@ -87,8 +87,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 87 | CONFIG_LOG_BUF_SHIFT=15 | 87 | CONFIG_LOG_BUF_SHIFT=15 |
| 88 | # CONFIG_GROUP_SCHED is not set | 88 | # CONFIG_GROUP_SCHED is not set |
| 89 | # CONFIG_CGROUPS is not set | 89 | # CONFIG_CGROUPS is not set |
| 90 | CONFIG_SYSFS_DEPRECATED=y | 90 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 91 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 92 | # CONFIG_RELAY is not set | 91 | # CONFIG_RELAY is not set |
| 93 | CONFIG_NAMESPACES=y | 92 | CONFIG_NAMESPACES=y |
| 94 | # CONFIG_UTS_NS is not set | 93 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/c2k_defconfig b/arch/powerpc/configs/c2k_defconfig index 4ab6074db3cf..b429a655b541 100644 --- a/arch/powerpc/configs/c2k_defconfig +++ b/arch/powerpc/configs/c2k_defconfig | |||
| @@ -102,8 +102,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 102 | # CONFIG_IKCONFIG is not set | 102 | # CONFIG_IKCONFIG is not set |
| 103 | CONFIG_LOG_BUF_SHIFT=17 | 103 | CONFIG_LOG_BUF_SHIFT=17 |
| 104 | # CONFIG_CGROUPS is not set | 104 | # CONFIG_CGROUPS is not set |
| 105 | CONFIG_SYSFS_DEPRECATED=y | 105 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 106 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 107 | # CONFIG_RELAY is not set | 106 | # CONFIG_RELAY is not set |
| 108 | CONFIG_NAMESPACES=y | 107 | CONFIG_NAMESPACES=y |
| 109 | # CONFIG_UTS_NS is not set | 108 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index c6d2baa7aaeb..943371954317 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
| @@ -83,8 +83,7 @@ CONFIG_CPUSETS=y | |||
| 83 | # CONFIG_CGROUP_SCHED is not set | 83 | # CONFIG_CGROUP_SCHED is not set |
| 84 | # CONFIG_CGROUP_CPUACCT is not set | 84 | # CONFIG_CGROUP_CPUACCT is not set |
| 85 | # CONFIG_RESOURCE_COUNTERS is not set | 85 | # CONFIG_RESOURCE_COUNTERS is not set |
| 86 | CONFIG_SYSFS_DEPRECATED=y | 86 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 87 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 88 | CONFIG_PROC_PID_CPUSET=y | 87 | CONFIG_PROC_PID_CPUSET=y |
| 89 | # CONFIG_RELAY is not set | 88 | # CONFIG_RELAY is not set |
| 90 | CONFIG_NAMESPACES=y | 89 | CONFIG_NAMESPACES=y |
diff --git a/arch/powerpc/configs/celleb_defconfig b/arch/powerpc/configs/celleb_defconfig index d2123779512a..6be6c09eba6d 100644 --- a/arch/powerpc/configs/celleb_defconfig +++ b/arch/powerpc/configs/celleb_defconfig | |||
| @@ -78,8 +78,7 @@ CONFIG_LOG_BUF_SHIFT=15 | |||
| 78 | # CONFIG_GROUP_SCHED is not set | 78 | # CONFIG_GROUP_SCHED is not set |
| 79 | # CONFIG_USER_SCHED is not set | 79 | # CONFIG_USER_SCHED is not set |
| 80 | # CONFIG_CGROUP_SCHED is not set | 80 | # CONFIG_CGROUP_SCHED is not set |
| 81 | CONFIG_SYSFS_DEPRECATED=y | 81 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 82 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 83 | # CONFIG_RELAY is not set | 82 | # CONFIG_RELAY is not set |
| 84 | CONFIG_NAMESPACES=y | 83 | CONFIG_NAMESPACES=y |
| 85 | # CONFIG_UTS_NS is not set | 84 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig index 5094a65a4493..2fdab660fce3 100644 --- a/arch/powerpc/configs/chrp32_defconfig +++ b/arch/powerpc/configs/chrp32_defconfig | |||
| @@ -77,8 +77,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 77 | CONFIG_LOG_BUF_SHIFT=15 | 77 | CONFIG_LOG_BUF_SHIFT=15 |
| 78 | # CONFIG_CGROUPS is not set | 78 | # CONFIG_CGROUPS is not set |
| 79 | # CONFIG_GROUP_SCHED is not set | 79 | # CONFIG_GROUP_SCHED is not set |
| 80 | CONFIG_SYSFS_DEPRECATED=y | 80 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 81 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 82 | # CONFIG_RELAY is not set | 81 | # CONFIG_RELAY is not set |
| 83 | CONFIG_NAMESPACES=y | 82 | CONFIG_NAMESPACES=y |
| 84 | # CONFIG_UTS_NS is not set | 83 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/ep8248e_defconfig b/arch/powerpc/configs/ep8248e_defconfig index 81e904e9f392..6b708395a7c6 100644 --- a/arch/powerpc/configs/ep8248e_defconfig +++ b/arch/powerpc/configs/ep8248e_defconfig | |||
| @@ -96,8 +96,7 @@ CONFIG_IKCONFIG=y | |||
| 96 | CONFIG_IKCONFIG_PROC=y | 96 | CONFIG_IKCONFIG_PROC=y |
| 97 | CONFIG_LOG_BUF_SHIFT=14 | 97 | CONFIG_LOG_BUF_SHIFT=14 |
| 98 | # CONFIG_CGROUPS is not set | 98 | # CONFIG_CGROUPS is not set |
| 99 | CONFIG_SYSFS_DEPRECATED=y | 99 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 100 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 101 | # CONFIG_RELAY is not set | 100 | # CONFIG_RELAY is not set |
| 102 | # CONFIG_NAMESPACES is not set | 101 | # CONFIG_NAMESPACES is not set |
| 103 | # CONFIG_BLK_DEV_INITRD is not set | 102 | # CONFIG_BLK_DEV_INITRD is not set |
diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig index c5af46ef5f40..1cee889dd9ec 100644 --- a/arch/powerpc/configs/ep88xc_defconfig +++ b/arch/powerpc/configs/ep88xc_defconfig | |||
| @@ -91,8 +91,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 91 | # CONFIG_IKCONFIG is not set | 91 | # CONFIG_IKCONFIG is not set |
| 92 | CONFIG_LOG_BUF_SHIFT=14 | 92 | CONFIG_LOG_BUF_SHIFT=14 |
| 93 | # CONFIG_CGROUPS is not set | 93 | # CONFIG_CGROUPS is not set |
| 94 | CONFIG_SYSFS_DEPRECATED=y | 94 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 95 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 96 | # CONFIG_RELAY is not set | 95 | # CONFIG_RELAY is not set |
| 97 | # CONFIG_NAMESPACES is not set | 96 | # CONFIG_NAMESPACES is not set |
| 98 | # CONFIG_BLK_DEV_INITRD is not set | 97 | # CONFIG_BLK_DEV_INITRD is not set |
diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig index 826a65d3f002..57d3ffa3026a 100644 --- a/arch/powerpc/configs/g5_defconfig +++ b/arch/powerpc/configs/g5_defconfig | |||
| @@ -82,8 +82,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 82 | CONFIG_LOG_BUF_SHIFT=17 | 82 | CONFIG_LOG_BUF_SHIFT=17 |
| 83 | # CONFIG_CGROUPS is not set | 83 | # CONFIG_CGROUPS is not set |
| 84 | # CONFIG_GROUP_SCHED is not set | 84 | # CONFIG_GROUP_SCHED is not set |
| 85 | CONFIG_SYSFS_DEPRECATED=y | 85 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 86 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 87 | # CONFIG_RELAY is not set | 86 | # CONFIG_RELAY is not set |
| 88 | CONFIG_NAMESPACES=y | 87 | CONFIG_NAMESPACES=y |
| 89 | # CONFIG_UTS_NS is not set | 88 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/gamecube_defconfig b/arch/powerpc/configs/gamecube_defconfig index 942e1193e9e4..1c2dbf07ac35 100644 --- a/arch/powerpc/configs/gamecube_defconfig +++ b/arch/powerpc/configs/gamecube_defconfig | |||
| @@ -101,8 +101,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 101 | CONFIG_USER_SCHED=y | 101 | CONFIG_USER_SCHED=y |
| 102 | # CONFIG_CGROUP_SCHED is not set | 102 | # CONFIG_CGROUP_SCHED is not set |
| 103 | # CONFIG_CGROUPS is not set | 103 | # CONFIG_CGROUPS is not set |
| 104 | CONFIG_SYSFS_DEPRECATED=y | 104 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 105 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 106 | # CONFIG_RELAY is not set | 105 | # CONFIG_RELAY is not set |
| 107 | # CONFIG_NAMESPACES is not set | 106 | # CONFIG_NAMESPACES is not set |
| 108 | CONFIG_BLK_DEV_INITRD=y | 107 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/holly_defconfig b/arch/powerpc/configs/holly_defconfig index a211a79959ca..a60d61bee48d 100644 --- a/arch/powerpc/configs/holly_defconfig +++ b/arch/powerpc/configs/holly_defconfig | |||
| @@ -73,7 +73,6 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
| 73 | CONFIG_LOG_BUF_SHIFT=14 | 73 | CONFIG_LOG_BUF_SHIFT=14 |
| 74 | # CONFIG_CGROUPS is not set | 74 | # CONFIG_CGROUPS is not set |
| 75 | # CONFIG_FAIR_GROUP_SCHED is not set | 75 | # CONFIG_FAIR_GROUP_SCHED is not set |
| 76 | CONFIG_SYSFS_DEPRECATED=y | ||
| 77 | # CONFIG_RELAY is not set | 76 | # CONFIG_RELAY is not set |
| 78 | CONFIG_BLK_DEV_INITRD=y | 77 | CONFIG_BLK_DEV_INITRD=y |
| 79 | CONFIG_INITRAMFS_SOURCE="" | 78 | CONFIG_INITRAMFS_SOURCE="" |
diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig index 76982c51a4c7..151c8e14f3ab 100644 --- a/arch/powerpc/configs/iseries_defconfig +++ b/arch/powerpc/configs/iseries_defconfig | |||
| @@ -81,8 +81,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 81 | CONFIG_LOG_BUF_SHIFT=17 | 81 | CONFIG_LOG_BUF_SHIFT=17 |
| 82 | # CONFIG_CGROUPS is not set | 82 | # CONFIG_CGROUPS is not set |
| 83 | # CONFIG_GROUP_SCHED is not set | 83 | # CONFIG_GROUP_SCHED is not set |
| 84 | CONFIG_SYSFS_DEPRECATED=y | 84 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 85 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 86 | # CONFIG_RELAY is not set | 85 | # CONFIG_RELAY is not set |
| 87 | CONFIG_NAMESPACES=y | 86 | CONFIG_NAMESPACES=y |
| 88 | # CONFIG_UTS_NS is not set | 87 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/linkstation_defconfig b/arch/powerpc/configs/linkstation_defconfig index 588a2add393f..8ecacf74d3e5 100644 --- a/arch/powerpc/configs/linkstation_defconfig +++ b/arch/powerpc/configs/linkstation_defconfig | |||
| @@ -97,8 +97,7 @@ CONFIG_IKCONFIG=y | |||
| 97 | CONFIG_IKCONFIG_PROC=y | 97 | CONFIG_IKCONFIG_PROC=y |
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_CGROUPS is not set | 99 | # CONFIG_CGROUPS is not set |
| 100 | CONFIG_SYSFS_DEPRECATED=y | 100 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 101 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 102 | # CONFIG_RELAY is not set | 101 | # CONFIG_RELAY is not set |
| 103 | CONFIG_NAMESPACES=y | 102 | CONFIG_NAMESPACES=y |
| 104 | # CONFIG_UTS_NS is not set | 103 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/maple_defconfig b/arch/powerpc/configs/maple_defconfig index 8b244003b9e1..dc50eec58e78 100644 --- a/arch/powerpc/configs/maple_defconfig +++ b/arch/powerpc/configs/maple_defconfig | |||
| @@ -78,8 +78,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 78 | CONFIG_LOG_BUF_SHIFT=17 | 78 | CONFIG_LOG_BUF_SHIFT=17 |
| 79 | # CONFIG_CGROUPS is not set | 79 | # CONFIG_CGROUPS is not set |
| 80 | # CONFIG_GROUP_SCHED is not set | 80 | # CONFIG_GROUP_SCHED is not set |
| 81 | CONFIG_SYSFS_DEPRECATED=y | 81 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 82 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 83 | # CONFIG_RELAY is not set | 82 | # CONFIG_RELAY is not set |
| 84 | CONFIG_NAMESPACES=y | 83 | CONFIG_NAMESPACES=y |
| 85 | # CONFIG_UTS_NS is not set | 84 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/mgcoge_defconfig b/arch/powerpc/configs/mgcoge_defconfig index 0cbd56fe2e1e..b36ebb7e843e 100644 --- a/arch/powerpc/configs/mgcoge_defconfig +++ b/arch/powerpc/configs/mgcoge_defconfig | |||
| @@ -96,8 +96,7 @@ CONFIG_IKCONFIG=y | |||
| 96 | CONFIG_IKCONFIG_PROC=y | 96 | CONFIG_IKCONFIG_PROC=y |
| 97 | CONFIG_LOG_BUF_SHIFT=14 | 97 | CONFIG_LOG_BUF_SHIFT=14 |
| 98 | # CONFIG_CGROUPS is not set | 98 | # CONFIG_CGROUPS is not set |
| 99 | CONFIG_SYSFS_DEPRECATED=y | 99 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 100 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 101 | # CONFIG_RELAY is not set | 100 | # CONFIG_RELAY is not set |
| 102 | # CONFIG_NAMESPACES is not set | 101 | # CONFIG_NAMESPACES is not set |
| 103 | CONFIG_BLK_DEV_INITRD=y | 102 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/mgsuvd_defconfig b/arch/powerpc/configs/mgsuvd_defconfig index c1be26151021..0dd5015ea81d 100644 --- a/arch/powerpc/configs/mgsuvd_defconfig +++ b/arch/powerpc/configs/mgsuvd_defconfig | |||
| @@ -90,8 +90,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 90 | # CONFIG_IKCONFIG is not set | 90 | # CONFIG_IKCONFIG is not set |
| 91 | CONFIG_LOG_BUF_SHIFT=17 | 91 | CONFIG_LOG_BUF_SHIFT=17 |
| 92 | # CONFIG_CGROUPS is not set | 92 | # CONFIG_CGROUPS is not set |
| 93 | CONFIG_SYSFS_DEPRECATED=y | 93 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 94 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 95 | # CONFIG_RELAY is not set | 94 | # CONFIG_RELAY is not set |
| 96 | # CONFIG_NAMESPACES is not set | 95 | # CONFIG_NAMESPACES is not set |
| 97 | CONFIG_BLK_DEV_INITRD=y | 96 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/mpc512x_defconfig b/arch/powerpc/configs/mpc512x_defconfig index a04727295d46..aa2654e6edeb 100644 --- a/arch/powerpc/configs/mpc512x_defconfig +++ b/arch/powerpc/configs/mpc512x_defconfig | |||
| @@ -97,8 +97,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 97 | CONFIG_LOG_BUF_SHIFT=16 | 97 | CONFIG_LOG_BUF_SHIFT=16 |
| 98 | # CONFIG_GROUP_SCHED is not set | 98 | # CONFIG_GROUP_SCHED is not set |
| 99 | # CONFIG_CGROUPS is not set | 99 | # CONFIG_CGROUPS is not set |
| 100 | CONFIG_SYSFS_DEPRECATED=y | 100 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 101 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 102 | # CONFIG_RELAY is not set | 101 | # CONFIG_RELAY is not set |
| 103 | CONFIG_NAMESPACES=y | 102 | CONFIG_NAMESPACES=y |
| 104 | # CONFIG_UTS_NS is not set | 103 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/mpc5200_defconfig b/arch/powerpc/configs/mpc5200_defconfig index 7012ac0134f0..f875ec21c91c 100644 --- a/arch/powerpc/configs/mpc5200_defconfig +++ b/arch/powerpc/configs/mpc5200_defconfig | |||
| @@ -97,8 +97,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 97 | # CONFIG_IKCONFIG is not set | 97 | # CONFIG_IKCONFIG is not set |
| 98 | CONFIG_LOG_BUF_SHIFT=14 | 98 | CONFIG_LOG_BUF_SHIFT=14 |
| 99 | # CONFIG_CGROUPS is not set | 99 | # CONFIG_CGROUPS is not set |
| 100 | CONFIG_SYSFS_DEPRECATED=y | 100 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 101 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 102 | # CONFIG_RELAY is not set | 101 | # CONFIG_RELAY is not set |
| 103 | CONFIG_NAMESPACES=y | 102 | CONFIG_NAMESPACES=y |
| 104 | # CONFIG_UTS_NS is not set | 103 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/mpc7448_hpc2_defconfig b/arch/powerpc/configs/mpc7448_hpc2_defconfig index 27c63ceeb45a..b1e88fe1d9fb 100644 --- a/arch/powerpc/configs/mpc7448_hpc2_defconfig +++ b/arch/powerpc/configs/mpc7448_hpc2_defconfig | |||
| @@ -95,8 +95,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 95 | # CONFIG_IKCONFIG is not set | 95 | # CONFIG_IKCONFIG is not set |
| 96 | CONFIG_LOG_BUF_SHIFT=14 | 96 | CONFIG_LOG_BUF_SHIFT=14 |
| 97 | # CONFIG_CGROUPS is not set | 97 | # CONFIG_CGROUPS is not set |
| 98 | CONFIG_SYSFS_DEPRECATED=y | 98 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 99 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 100 | # CONFIG_RELAY is not set | 99 | # CONFIG_RELAY is not set |
| 101 | # CONFIG_NAMESPACES is not set | 100 | # CONFIG_NAMESPACES is not set |
| 102 | CONFIG_BLK_DEV_INITRD=y | 101 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index 20ba0cfff8ba..74a7216183e8 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=64 | |||
| 98 | CONFIG_LOG_BUF_SHIFT=17 | 98 | CONFIG_LOG_BUF_SHIFT=17 |
| 99 | # CONFIG_GROUP_SCHED is not set | 99 | # CONFIG_GROUP_SCHED is not set |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | CONFIG_NAMESPACES=y | 103 | CONFIG_NAMESPACES=y |
| 105 | # CONFIG_UTS_NS is not set | 104 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig index ea8870a34482..753bb7912e28 100644 --- a/arch/powerpc/configs/pmac32_defconfig +++ b/arch/powerpc/configs/pmac32_defconfig | |||
| @@ -93,8 +93,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 93 | CONFIG_LOG_BUF_SHIFT=14 | 93 | CONFIG_LOG_BUF_SHIFT=14 |
| 94 | # CONFIG_GROUP_SCHED is not set | 94 | # CONFIG_GROUP_SCHED is not set |
| 95 | # CONFIG_CGROUPS is not set | 95 | # CONFIG_CGROUPS is not set |
| 96 | CONFIG_SYSFS_DEPRECATED=y | 96 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 97 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 98 | # CONFIG_RELAY is not set | 97 | # CONFIG_RELAY is not set |
| 99 | CONFIG_NAMESPACES=y | 98 | CONFIG_NAMESPACES=y |
| 100 | # CONFIG_UTS_NS is not set | 99 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/ppc40x_defconfig b/arch/powerpc/configs/ppc40x_defconfig index 35b60683cde5..afb4d1bb2ba9 100644 --- a/arch/powerpc/configs/ppc40x_defconfig +++ b/arch/powerpc/configs/ppc40x_defconfig | |||
| @@ -99,8 +99,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 99 | CONFIG_USER_SCHED=y | 99 | CONFIG_USER_SCHED=y |
| 100 | # CONFIG_CGROUP_SCHED is not set | 100 | # CONFIG_CGROUP_SCHED is not set |
| 101 | # CONFIG_CGROUPS is not set | 101 | # CONFIG_CGROUPS is not set |
| 102 | CONFIG_SYSFS_DEPRECATED=y | 102 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 103 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 104 | # CONFIG_RELAY is not set | 103 | # CONFIG_RELAY is not set |
| 105 | # CONFIG_NAMESPACES is not set | 104 | # CONFIG_NAMESPACES is not set |
| 106 | CONFIG_BLK_DEV_INITRD=y | 105 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/ppc44x_defconfig b/arch/powerpc/configs/ppc44x_defconfig index 46f5c47e9f85..bd3d23fb4dd3 100644 --- a/arch/powerpc/configs/ppc44x_defconfig +++ b/arch/powerpc/configs/ppc44x_defconfig | |||
| @@ -103,8 +103,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 103 | CONFIG_USER_SCHED=y | 103 | CONFIG_USER_SCHED=y |
| 104 | # CONFIG_CGROUP_SCHED is not set | 104 | # CONFIG_CGROUP_SCHED is not set |
| 105 | # CONFIG_CGROUPS is not set | 105 | # CONFIG_CGROUPS is not set |
| 106 | CONFIG_SYSFS_DEPRECATED=y | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 107 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 108 | # CONFIG_RELAY is not set | 107 | # CONFIG_RELAY is not set |
| 109 | # CONFIG_NAMESPACES is not set | 108 | # CONFIG_NAMESPACES is not set |
| 110 | CONFIG_BLK_DEV_INITRD=y | 109 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index dad617e2a88c..369f4e02c5dd 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig | |||
| @@ -93,8 +93,7 @@ CONFIG_CPUSETS=y | |||
| 93 | # CONFIG_GROUP_SCHED is not set | 93 | # CONFIG_GROUP_SCHED is not set |
| 94 | # CONFIG_CGROUP_CPUACCT is not set | 94 | # CONFIG_CGROUP_CPUACCT is not set |
| 95 | # CONFIG_RESOURCE_COUNTERS is not set | 95 | # CONFIG_RESOURCE_COUNTERS is not set |
| 96 | CONFIG_SYSFS_DEPRECATED=y | 96 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 97 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 98 | CONFIG_PROC_PID_CPUSET=y | 97 | CONFIG_PROC_PID_CPUSET=y |
| 99 | CONFIG_RELAY=y | 98 | CONFIG_RELAY=y |
| 100 | CONFIG_NAMESPACES=y | 99 | CONFIG_NAMESPACES=y |
diff --git a/arch/powerpc/configs/ppc64e_defconfig b/arch/powerpc/configs/ppc64e_defconfig index 8195f1650cbf..403e82e2e83c 100644 --- a/arch/powerpc/configs/ppc64e_defconfig +++ b/arch/powerpc/configs/ppc64e_defconfig | |||
| @@ -107,8 +107,7 @@ CONFIG_CPUSETS=y | |||
| 107 | CONFIG_PROC_PID_CPUSET=y | 107 | CONFIG_PROC_PID_CPUSET=y |
| 108 | # CONFIG_CGROUP_CPUACCT is not set | 108 | # CONFIG_CGROUP_CPUACCT is not set |
| 109 | # CONFIG_RESOURCE_COUNTERS is not set | 109 | # CONFIG_RESOURCE_COUNTERS is not set |
| 110 | CONFIG_SYSFS_DEPRECATED=y | 110 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 111 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 112 | CONFIG_RELAY=y | 111 | CONFIG_RELAY=y |
| 113 | CONFIG_NAMESPACES=y | 112 | CONFIG_NAMESPACES=y |
| 114 | # CONFIG_UTS_NS is not set | 113 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/pq2fads_defconfig b/arch/powerpc/configs/pq2fads_defconfig index 68c175ea427a..12c8ee8dd12b 100644 --- a/arch/powerpc/configs/pq2fads_defconfig +++ b/arch/powerpc/configs/pq2fads_defconfig | |||
| @@ -96,8 +96,7 @@ CONFIG_IKCONFIG=y | |||
| 96 | CONFIG_IKCONFIG_PROC=y | 96 | CONFIG_IKCONFIG_PROC=y |
| 97 | CONFIG_LOG_BUF_SHIFT=14 | 97 | CONFIG_LOG_BUF_SHIFT=14 |
| 98 | # CONFIG_CGROUPS is not set | 98 | # CONFIG_CGROUPS is not set |
| 99 | CONFIG_SYSFS_DEPRECATED=y | 99 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 100 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 101 | # CONFIG_RELAY is not set | 100 | # CONFIG_RELAY is not set |
| 102 | # CONFIG_NAMESPACES is not set | 101 | # CONFIG_NAMESPACES is not set |
| 103 | CONFIG_BLK_DEV_INITRD=y | 102 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/configs/prpmc2800_defconfig b/arch/powerpc/configs/prpmc2800_defconfig index 93f4505b5ac2..a18f597c6e5f 100644 --- a/arch/powerpc/configs/prpmc2800_defconfig +++ b/arch/powerpc/configs/prpmc2800_defconfig | |||
| @@ -98,8 +98,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 98 | # CONFIG_IKCONFIG is not set | 98 | # CONFIG_IKCONFIG is not set |
| 99 | CONFIG_LOG_BUF_SHIFT=14 | 99 | CONFIG_LOG_BUF_SHIFT=14 |
| 100 | # CONFIG_CGROUPS is not set | 100 | # CONFIG_CGROUPS is not set |
| 101 | CONFIG_SYSFS_DEPRECATED=y | 101 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 102 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 103 | # CONFIG_RELAY is not set | 102 | # CONFIG_RELAY is not set |
| 104 | CONFIG_NAMESPACES=y | 103 | CONFIG_NAMESPACES=y |
| 105 | # CONFIG_UTS_NS is not set | 104 | # CONFIG_UTS_NS is not set |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 16a14589bd40..16ae717d1958 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
| @@ -92,8 +92,7 @@ CONFIG_CPUSETS=y | |||
| 92 | # CONFIG_GROUP_SCHED is not set | 92 | # CONFIG_GROUP_SCHED is not set |
| 93 | CONFIG_CGROUP_CPUACCT=y | 93 | CONFIG_CGROUP_CPUACCT=y |
| 94 | # CONFIG_RESOURCE_COUNTERS is not set | 94 | # CONFIG_RESOURCE_COUNTERS is not set |
| 95 | CONFIG_SYSFS_DEPRECATED=y | 95 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 96 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 97 | CONFIG_PROC_PID_CPUSET=y | 96 | CONFIG_PROC_PID_CPUSET=y |
| 98 | CONFIG_RELAY=y | 97 | CONFIG_RELAY=y |
| 99 | CONFIG_NAMESPACES=y | 98 | CONFIG_NAMESPACES=y |
diff --git a/arch/powerpc/configs/storcenter_defconfig b/arch/powerpc/configs/storcenter_defconfig index b1625801526e..01be0e207f40 100644 --- a/arch/powerpc/configs/storcenter_defconfig +++ b/arch/powerpc/configs/storcenter_defconfig | |||
| @@ -95,8 +95,7 @@ CONFIG_RCU_FANOUT=32 | |||
| 95 | # CONFIG_IKCONFIG is not set | 95 | # CONFIG_IKCONFIG is not set |
| 96 | CONFIG_LOG_BUF_SHIFT=14 | 96 | CONFIG_LOG_BUF_SHIFT=14 |
| 97 | # CONFIG_CGROUPS is not set | 97 | # CONFIG_CGROUPS is not set |
| 98 | CONFIG_SYSFS_DEPRECATED=y | 98 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 99 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 100 | # CONFIG_RELAY is not set | 99 | # CONFIG_RELAY is not set |
| 101 | # CONFIG_NAMESPACES is not set | 100 | # CONFIG_NAMESPACES is not set |
| 102 | # CONFIG_BLK_DEV_INITRD is not set | 101 | # CONFIG_BLK_DEV_INITRD is not set |
diff --git a/arch/powerpc/configs/wii_defconfig b/arch/powerpc/configs/wii_defconfig index c386828c639a..ee054f8118be 100644 --- a/arch/powerpc/configs/wii_defconfig +++ b/arch/powerpc/configs/wii_defconfig | |||
| @@ -102,8 +102,7 @@ CONFIG_FAIR_GROUP_SCHED=y | |||
| 102 | CONFIG_USER_SCHED=y | 102 | CONFIG_USER_SCHED=y |
| 103 | # CONFIG_CGROUP_SCHED is not set | 103 | # CONFIG_CGROUP_SCHED is not set |
| 104 | # CONFIG_CGROUPS is not set | 104 | # CONFIG_CGROUPS is not set |
| 105 | CONFIG_SYSFS_DEPRECATED=y | 105 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 106 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 107 | CONFIG_RELAY=y | 106 | CONFIG_RELAY=y |
| 108 | # CONFIG_NAMESPACES is not set | 107 | # CONFIG_NAMESPACES is not set |
| 109 | CONFIG_BLK_DEV_INITRD=y | 108 | CONFIG_BLK_DEV_INITRD=y |
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h index e054baef1845..ecba37a91749 100644 --- a/arch/powerpc/include/asm/irq.h +++ b/arch/powerpc/include/asm/irq.h | |||
| @@ -358,7 +358,6 @@ extern void exc_lvl_ctx_init(void); | |||
| 358 | #define exc_lvl_ctx_init() | 358 | #define exc_lvl_ctx_init() |
| 359 | #endif | 359 | #endif |
| 360 | 360 | ||
| 361 | #ifdef CONFIG_IRQSTACKS | ||
| 362 | /* | 361 | /* |
| 363 | * Per-cpu stacks for handling hard and soft interrupts. | 362 | * Per-cpu stacks for handling hard and soft interrupts. |
| 364 | */ | 363 | */ |
| @@ -369,11 +368,6 @@ extern void irq_ctx_init(void); | |||
| 369 | extern void call_do_softirq(struct thread_info *tp); | 368 | extern void call_do_softirq(struct thread_info *tp); |
| 370 | extern int call_handle_irq(int irq, void *p1, | 369 | extern int call_handle_irq(int irq, void *p1, |
| 371 | struct thread_info *tp, void *func); | 370 | struct thread_info *tp, void *func); |
| 372 | #else | ||
| 373 | #define irq_ctx_init() | ||
| 374 | |||
| 375 | #endif /* CONFIG_IRQSTACKS */ | ||
| 376 | |||
| 377 | extern void do_IRQ(struct pt_regs *regs); | 371 | extern void do_IRQ(struct pt_regs *regs); |
| 378 | 372 | ||
| 379 | #endif /* _ASM_IRQ_H */ | 373 | #endif /* _ASM_IRQ_H */ |
diff --git a/arch/powerpc/include/asm/kdump.h b/arch/powerpc/include/asm/kdump.h index 5ebfe5d3c61f..6857af58b02e 100644 --- a/arch/powerpc/include/asm/kdump.h +++ b/arch/powerpc/include/asm/kdump.h | |||
| @@ -3,8 +3,17 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm/page.h> | 4 | #include <asm/page.h> |
| 5 | 5 | ||
| 6 | /* Kdump kernel runs at 32 MB, change at your peril. */ | 6 | /* |
| 7 | * If CONFIG_RELOCATABLE is enabled we can place the kdump kernel anywhere. | ||
| 8 | * To keep enough space in the RMO for the first stage kernel on 64bit, we | ||
| 9 | * place it at 64MB. If CONFIG_RELOCATABLE is not enabled we must place | ||
| 10 | * the second stage at 32MB. | ||
| 11 | */ | ||
| 12 | #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_PPC64) | ||
| 13 | #define KDUMP_KERNELBASE 0x4000000 | ||
| 14 | #else | ||
| 7 | #define KDUMP_KERNELBASE 0x2000000 | 15 | #define KDUMP_KERNELBASE 0x2000000 |
| 16 | #endif | ||
| 8 | 17 | ||
| 9 | /* How many bytes to reserve at zero for kdump. The reserve limit should | 18 | /* How many bytes to reserve at zero for kdump. The reserve limit should |
| 10 | * be greater or equal to the trampoline's end address. | 19 | * be greater or equal to the trampoline's end address. |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 30817d9b20cb..3333bbdd23ef 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -317,7 +317,6 @@ void fixup_irqs(const struct cpumask *map) | |||
| 317 | } | 317 | } |
| 318 | #endif | 318 | #endif |
| 319 | 319 | ||
| 320 | #ifdef CONFIG_IRQSTACKS | ||
| 321 | static inline void handle_one_irq(unsigned int irq) | 320 | static inline void handle_one_irq(unsigned int irq) |
| 322 | { | 321 | { |
| 323 | struct thread_info *curtp, *irqtp; | 322 | struct thread_info *curtp, *irqtp; |
| @@ -358,12 +357,6 @@ static inline void handle_one_irq(unsigned int irq) | |||
| 358 | if (irqtp->flags) | 357 | if (irqtp->flags) |
| 359 | set_bits(irqtp->flags, &curtp->flags); | 358 | set_bits(irqtp->flags, &curtp->flags); |
| 360 | } | 359 | } |
| 361 | #else | ||
| 362 | static inline void handle_one_irq(unsigned int irq) | ||
| 363 | { | ||
| 364 | generic_handle_irq(irq); | ||
| 365 | } | ||
| 366 | #endif | ||
| 367 | 360 | ||
| 368 | static inline void check_stack_overflow(void) | 361 | static inline void check_stack_overflow(void) |
| 369 | { | 362 | { |
| @@ -455,7 +448,6 @@ void exc_lvl_ctx_init(void) | |||
| 455 | } | 448 | } |
| 456 | #endif | 449 | #endif |
| 457 | 450 | ||
| 458 | #ifdef CONFIG_IRQSTACKS | ||
| 459 | struct thread_info *softirq_ctx[NR_CPUS] __read_mostly; | 451 | struct thread_info *softirq_ctx[NR_CPUS] __read_mostly; |
| 460 | struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly; | 452 | struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly; |
| 461 | 453 | ||
| @@ -492,10 +484,6 @@ static inline void do_softirq_onstack(void) | |||
| 492 | irqtp->task = NULL; | 484 | irqtp->task = NULL; |
| 493 | } | 485 | } |
| 494 | 486 | ||
| 495 | #else | ||
| 496 | #define do_softirq_onstack() __do_softirq() | ||
| 497 | #endif /* CONFIG_IRQSTACKS */ | ||
| 498 | |||
| 499 | void do_softirq(void) | 487 | void do_softirq(void) |
| 500 | { | 488 | { |
| 501 | unsigned long flags; | 489 | unsigned long flags; |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index 26f9900f773c..ed31a29c4ff7 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
| @@ -182,28 +182,12 @@ static void kexec_prepare_cpus_wait(int wait_state) | |||
| 182 | 182 | ||
| 183 | my_cpu = get_cpu(); | 183 | my_cpu = get_cpu(); |
| 184 | /* Make sure each CPU has atleast made it to the state we need */ | 184 | /* Make sure each CPU has atleast made it to the state we need */ |
| 185 | for (i=0; i < NR_CPUS; i++) { | 185 | for_each_online_cpu(i) { |
| 186 | if (i == my_cpu) | 186 | if (i == my_cpu) |
| 187 | continue; | 187 | continue; |
| 188 | 188 | ||
| 189 | while (paca[i].kexec_state < wait_state) { | 189 | while (paca[i].kexec_state < wait_state) { |
| 190 | barrier(); | 190 | barrier(); |
| 191 | if (!cpu_possible(i)) { | ||
| 192 | printk("kexec: cpu %d hw_cpu_id %d is not" | ||
| 193 | " possible, ignoring\n", | ||
| 194 | i, paca[i].hw_cpu_id); | ||
| 195 | break; | ||
| 196 | } | ||
| 197 | if (!cpu_online(i)) { | ||
| 198 | /* Fixme: this can be spinning in | ||
| 199 | * pSeries_secondary_wait with a paca | ||
| 200 | * waiting for it to go online. | ||
| 201 | */ | ||
| 202 | printk("kexec: cpu %d hw_cpu_id %d is not" | ||
| 203 | " online, ignoring\n", | ||
| 204 | i, paca[i].hw_cpu_id); | ||
| 205 | break; | ||
| 206 | } | ||
| 207 | if (i != notified) { | 191 | if (i != notified) { |
| 208 | printk( "kexec: waiting for cpu %d (physical" | 192 | printk( "kexec: waiting for cpu %d (physical" |
| 209 | " %d) to enter %i state\n", | 193 | " %d) to enter %i state\n", |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index dc66d52dcff5..6bbd7a604d24 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | 33 | ||
| 34 | .text | 34 | .text |
| 35 | 35 | ||
| 36 | #ifdef CONFIG_IRQSTACKS | ||
| 37 | _GLOBAL(call_do_softirq) | 36 | _GLOBAL(call_do_softirq) |
| 38 | mflr r0 | 37 | mflr r0 |
| 39 | stw r0,4(r1) | 38 | stw r0,4(r1) |
| @@ -56,7 +55,6 @@ _GLOBAL(call_handle_irq) | |||
| 56 | lwz r0,4(r1) | 55 | lwz r0,4(r1) |
| 57 | mtlr r0 | 56 | mtlr r0 |
| 58 | blr | 57 | blr |
| 59 | #endif /* CONFIG_IRQSTACKS */ | ||
| 60 | 58 | ||
| 61 | /* | 59 | /* |
| 62 | * This returns the high 64 bits of the product of two 64-bit numbers. | 60 | * This returns the high 64 bits of the product of two 64-bit numbers. |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index a2b18dffa03e..e5144906a56d 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | 28 | ||
| 29 | .text | 29 | .text |
| 30 | 30 | ||
| 31 | #ifdef CONFIG_IRQSTACKS | ||
| 32 | _GLOBAL(call_do_softirq) | 31 | _GLOBAL(call_do_softirq) |
| 33 | mflr r0 | 32 | mflr r0 |
| 34 | std r0,16(r1) | 33 | std r0,16(r1) |
| @@ -52,7 +51,6 @@ _GLOBAL(call_handle_irq) | |||
| 52 | ld r0,16(r1) | 51 | ld r0,16(r1) |
| 53 | mtlr r0 | 52 | mtlr r0 |
| 54 | blr | 53 | blr |
| 55 | #endif /* CONFIG_IRQSTACKS */ | ||
| 56 | 54 | ||
| 57 | .section ".toc","aw" | 55 | .section ".toc","aw" |
| 58 | PPC64_CACHES: | 56 | PPC64_CACHES: |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 9d255b4f0a0e..773424df828a 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -1005,7 +1005,6 @@ out: | |||
| 1005 | return error; | 1005 | return error; |
| 1006 | } | 1006 | } |
| 1007 | 1007 | ||
| 1008 | #ifdef CONFIG_IRQSTACKS | ||
| 1009 | static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, | 1008 | static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, |
| 1010 | unsigned long nbytes) | 1009 | unsigned long nbytes) |
| 1011 | { | 1010 | { |
| @@ -1030,10 +1029,6 @@ static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, | |||
| 1030 | return 0; | 1029 | return 0; |
| 1031 | } | 1030 | } |
| 1032 | 1031 | ||
| 1033 | #else | ||
| 1034 | #define valid_irq_stack(sp, p, nb) 0 | ||
| 1035 | #endif /* CONFIG_IRQSTACKS */ | ||
| 1036 | |||
| 1037 | int validate_sp(unsigned long sp, struct task_struct *p, | 1032 | int validate_sp(unsigned long sp, struct task_struct *p, |
| 1038 | unsigned long nbytes) | 1033 | unsigned long nbytes) |
| 1039 | { | 1034 | { |
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index bfc2abafac44..67a84d8f118d 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
| @@ -94,12 +94,8 @@ struct flash_block_list { | |||
| 94 | struct flash_block_list *next; | 94 | struct flash_block_list *next; |
| 95 | struct flash_block blocks[FLASH_BLOCKS_PER_NODE]; | 95 | struct flash_block blocks[FLASH_BLOCKS_PER_NODE]; |
| 96 | }; | 96 | }; |
| 97 | struct flash_block_list_header { /* just the header of flash_block_list */ | ||
| 98 | unsigned long num_blocks; | ||
| 99 | struct flash_block_list *next; | ||
| 100 | }; | ||
| 101 | 97 | ||
| 102 | static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; | 98 | static struct flash_block_list *rtas_firmware_flash_list; |
| 103 | 99 | ||
| 104 | /* Use slab cache to guarantee 4k alignment */ | 100 | /* Use slab cache to guarantee 4k alignment */ |
| 105 | static struct kmem_cache *flash_block_cache = NULL; | 101 | static struct kmem_cache *flash_block_cache = NULL; |
| @@ -108,13 +104,14 @@ static struct kmem_cache *flash_block_cache = NULL; | |||
| 108 | 104 | ||
| 109 | /* Local copy of the flash block list. | 105 | /* Local copy of the flash block list. |
| 110 | * We only allow one open of the flash proc file and create this | 106 | * We only allow one open of the flash proc file and create this |
| 111 | * list as we go. This list will be put in the | 107 | * list as we go. The rtas_firmware_flash_list varable will be |
| 112 | * rtas_firmware_flash_list var once it is fully read. | 108 | * set once the data is fully read. |
| 113 | * | 109 | * |
| 114 | * For convenience as we build the list we use virtual addrs, | 110 | * For convenience as we build the list we use virtual addrs, |
| 115 | * we do not fill in the version number, and the length field | 111 | * we do not fill in the version number, and the length field |
| 116 | * is treated as the number of entries currently in the block | 112 | * is treated as the number of entries currently in the block |
| 117 | * (i.e. not a byte count). This is all fixed on release. | 113 | * (i.e. not a byte count). This is all fixed when calling |
| 114 | * the flash routine. | ||
| 118 | */ | 115 | */ |
| 119 | 116 | ||
| 120 | /* Status int must be first member of struct */ | 117 | /* Status int must be first member of struct */ |
| @@ -201,16 +198,16 @@ static int rtas_flash_release(struct inode *inode, struct file *file) | |||
| 201 | if (uf->flist) { | 198 | if (uf->flist) { |
| 202 | /* File was opened in write mode for a new flash attempt */ | 199 | /* File was opened in write mode for a new flash attempt */ |
| 203 | /* Clear saved list */ | 200 | /* Clear saved list */ |
| 204 | if (rtas_firmware_flash_list.next) { | 201 | if (rtas_firmware_flash_list) { |
| 205 | free_flash_list(rtas_firmware_flash_list.next); | 202 | free_flash_list(rtas_firmware_flash_list); |
| 206 | rtas_firmware_flash_list.next = NULL; | 203 | rtas_firmware_flash_list = NULL; |
| 207 | } | 204 | } |
| 208 | 205 | ||
| 209 | if (uf->status != FLASH_AUTH) | 206 | if (uf->status != FLASH_AUTH) |
| 210 | uf->status = flash_list_valid(uf->flist); | 207 | uf->status = flash_list_valid(uf->flist); |
| 211 | 208 | ||
| 212 | if (uf->status == FLASH_IMG_READY) | 209 | if (uf->status == FLASH_IMG_READY) |
| 213 | rtas_firmware_flash_list.next = uf->flist; | 210 | rtas_firmware_flash_list = uf->flist; |
| 214 | else | 211 | else |
| 215 | free_flash_list(uf->flist); | 212 | free_flash_list(uf->flist); |
| 216 | 213 | ||
| @@ -593,7 +590,7 @@ static void rtas_flash_firmware(int reboot_type) | |||
| 593 | unsigned long rtas_block_list; | 590 | unsigned long rtas_block_list; |
| 594 | int i, status, update_token; | 591 | int i, status, update_token; |
| 595 | 592 | ||
| 596 | if (rtas_firmware_flash_list.next == NULL) | 593 | if (rtas_firmware_flash_list == NULL) |
| 597 | return; /* nothing to do */ | 594 | return; /* nothing to do */ |
| 598 | 595 | ||
| 599 | if (reboot_type != SYS_RESTART) { | 596 | if (reboot_type != SYS_RESTART) { |
| @@ -610,20 +607,25 @@ static void rtas_flash_firmware(int reboot_type) | |||
| 610 | return; | 607 | return; |
| 611 | } | 608 | } |
| 612 | 609 | ||
| 613 | /* NOTE: the "first" block list is a global var with no data | 610 | /* |
| 614 | * blocks in the kernel data segment. We do this because | 611 | * NOTE: the "first" block must be under 4GB, so we create |
| 615 | * we want to ensure this block_list addr is under 4GB. | 612 | * an entry with no data blocks in the reserved buffer in |
| 613 | * the kernel data segment. | ||
| 616 | */ | 614 | */ |
| 617 | rtas_firmware_flash_list.num_blocks = 0; | 615 | spin_lock(&rtas_data_buf_lock); |
| 618 | flist = (struct flash_block_list *)&rtas_firmware_flash_list; | 616 | flist = (struct flash_block_list *)&rtas_data_buf[0]; |
| 617 | flist->num_blocks = 0; | ||
| 618 | flist->next = rtas_firmware_flash_list; | ||
| 619 | rtas_block_list = virt_to_abs(flist); | 619 | rtas_block_list = virt_to_abs(flist); |
| 620 | if (rtas_block_list >= 4UL*1024*1024*1024) { | 620 | if (rtas_block_list >= 4UL*1024*1024*1024) { |
| 621 | printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); | 621 | printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); |
| 622 | spin_unlock(&rtas_data_buf_lock); | ||
| 622 | return; | 623 | return; |
| 623 | } | 624 | } |
| 624 | 625 | ||
| 625 | printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n"); | 626 | printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n"); |
| 626 | /* Update the block_list in place. */ | 627 | /* Update the block_list in place. */ |
| 628 | rtas_firmware_flash_list = NULL; /* too hard to backout on error */ | ||
| 627 | image_size = 0; | 629 | image_size = 0; |
| 628 | for (f = flist; f; f = next) { | 630 | for (f = flist; f; f = next) { |
| 629 | /* Translate data addrs to absolute */ | 631 | /* Translate data addrs to absolute */ |
| @@ -664,6 +666,7 @@ static void rtas_flash_firmware(int reboot_type) | |||
| 664 | printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status); | 666 | printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status); |
| 665 | break; | 667 | break; |
| 666 | } | 668 | } |
| 669 | spin_unlock(&rtas_data_buf_lock); | ||
| 667 | } | 670 | } |
| 668 | 671 | ||
| 669 | static void remove_flash_pde(struct proc_dir_entry *dp) | 672 | static void remove_flash_pde(struct proc_dir_entry *dp) |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 8f58986c2ad9..7d84b210f168 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
| @@ -241,7 +241,6 @@ int __init ppc_init(void) | |||
| 241 | 241 | ||
| 242 | arch_initcall(ppc_init); | 242 | arch_initcall(ppc_init); |
| 243 | 243 | ||
| 244 | #ifdef CONFIG_IRQSTACKS | ||
| 245 | static void __init irqstack_early_init(void) | 244 | static void __init irqstack_early_init(void) |
| 246 | { | 245 | { |
| 247 | unsigned int i; | 246 | unsigned int i; |
| @@ -255,9 +254,6 @@ static void __init irqstack_early_init(void) | |||
| 255 | __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); | 254 | __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); |
| 256 | } | 255 | } |
| 257 | } | 256 | } |
| 258 | #else | ||
| 259 | #define irqstack_early_init() | ||
| 260 | #endif | ||
| 261 | 257 | ||
| 262 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) | 258 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
| 263 | static void __init exc_lvl_early_init(void) | 259 | static void __init exc_lvl_early_init(void) |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index f3fb5a79de52..643dcac40fcb 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
| @@ -432,7 +432,6 @@ static u64 slb0_limit(void) | |||
| 432 | return 1UL << SID_SHIFT; | 432 | return 1UL << SID_SHIFT; |
| 433 | } | 433 | } |
| 434 | 434 | ||
| 435 | #ifdef CONFIG_IRQSTACKS | ||
| 436 | static void __init irqstack_early_init(void) | 435 | static void __init irqstack_early_init(void) |
| 437 | { | 436 | { |
| 438 | u64 limit = slb0_limit(); | 437 | u64 limit = slb0_limit(); |
| @@ -451,9 +450,6 @@ static void __init irqstack_early_init(void) | |||
| 451 | THREAD_SIZE, limit)); | 450 | THREAD_SIZE, limit)); |
| 452 | } | 451 | } |
| 453 | } | 452 | } |
| 454 | #else | ||
| 455 | #define irqstack_early_init() | ||
| 456 | #endif | ||
| 457 | 453 | ||
| 458 | #ifdef CONFIG_PPC_BOOK3E | 454 | #ifdef CONFIG_PPC_BOOK3E |
| 459 | static void __init exc_lvl_early_init(void) | 455 | static void __init exc_lvl_early_init(void) |
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index 9fc02dc72ce9..34347b2e7e31 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
| @@ -115,11 +115,7 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) | |||
| 115 | { | 115 | { |
| 116 | struct page *ptepage; | 116 | struct page *ptepage; |
| 117 | 117 | ||
| 118 | #ifdef CONFIG_HIGHPTE | ||
| 119 | gfp_t flags = GFP_KERNEL | __GFP_HIGHMEM | __GFP_REPEAT | __GFP_ZERO; | ||
| 120 | #else | ||
| 121 | gfp_t flags = GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO; | 118 | gfp_t flags = GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO; |
| 122 | #endif | ||
| 123 | 119 | ||
| 124 | ptepage = alloc_pages(flags, 0); | 120 | ptepage = alloc_pages(flags, 0); |
| 125 | if (!ptepage) | 121 | if (!ptepage) |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pm.c b/arch/powerpc/platforms/52xx/mpc52xx_pm.c index a55b0b6813ed..76722532bd95 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_pm.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_pm.c | |||
| @@ -64,10 +64,19 @@ int mpc52xx_pm_prepare(void) | |||
| 64 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ | 64 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ |
| 65 | {} | 65 | {} |
| 66 | }; | 66 | }; |
| 67 | struct resource res; | ||
| 67 | 68 | ||
| 68 | /* map the whole register space */ | 69 | /* map the whole register space */ |
| 69 | np = of_find_matching_node(NULL, immr_ids); | 70 | np = of_find_matching_node(NULL, immr_ids); |
| 70 | mbar = of_iomap(np, 0); | 71 | |
| 72 | if (of_address_to_resource(np, 0, &res)) { | ||
| 73 | pr_err("mpc52xx_pm_prepare(): could not get IMMR address\n"); | ||
| 74 | of_node_put(np); | ||
| 75 | return -ENOSYS; | ||
| 76 | } | ||
| 77 | |||
| 78 | mbar = ioremap(res.start, 0xc000); /* we should map whole region including SRAM */ | ||
| 79 | |||
| 71 | of_node_put(np); | 80 | of_node_put(np); |
| 72 | if (!mbar) { | 81 | if (!mbar) { |
| 73 | pr_err("mpc52xx_pm_prepare(): could not map registers\n"); | 82 | pr_err("mpc52xx_pm_prepare(): could not map registers\n"); |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 2102487612a4..20b73c025a45 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
| @@ -1666,7 +1666,7 @@ static int mpic_resume(struct sys_device *dev) | |||
| 1666 | mpic->save_data[i].dest); | 1666 | mpic->save_data[i].dest); |
| 1667 | 1667 | ||
| 1668 | #ifdef CONFIG_MPIC_U3_HT_IRQS | 1668 | #ifdef CONFIG_MPIC_U3_HT_IRQS |
| 1669 | { | 1669 | if (mpic->fixups) { |
| 1670 | struct mpic_irq_fixup *fixup = &mpic->fixups[i]; | 1670 | struct mpic_irq_fixup *fixup = &mpic->fixups[i]; |
| 1671 | 1671 | ||
| 1672 | if (fixup->base) { | 1672 | if (fixup->base) { |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index be1d114d3a43..1d7b495a7db4 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/spi/spi.h> | 25 | #include <linux/spi/spi.h> |
| 26 | #include <linux/spi/sh_msiof.h> | 26 | #include <linux/spi/sh_msiof.h> |
| 27 | #include <linux/spi/mmc_spi.h> | 27 | #include <linux/spi/mmc_spi.h> |
| 28 | #include <linux/mmc/host.h> | ||
| 29 | #include <linux/input.h> | 28 | #include <linux/input.h> |
| 30 | #include <linux/input/sh_keysc.h> | 29 | #include <linux/input/sh_keysc.h> |
| 31 | #include <video/sh_mobile_lcdc.h> | 30 | #include <video/sh_mobile_lcdc.h> |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 953af139e230..1e9598d2bbf4 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
| @@ -139,8 +139,6 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev, | |||
| 139 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | 139 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
| 140 | if (!dev->resource[i].start) | 140 | if (!dev->resource[i].start) |
| 141 | continue; | 141 | continue; |
| 142 | if (dev->resource[i].flags & IORESOURCE_PCI_FIXED) | ||
| 143 | continue; | ||
| 144 | if (dev->resource[i].flags & IORESOURCE_IO) | 142 | if (dev->resource[i].flags & IORESOURCE_IO) |
| 145 | offset = hose->io_offset; | 143 | offset = hose->io_offset; |
| 146 | else if (dev->resource[i].flags & IORESOURCE_MEM) | 144 | else if (dev->resource[i].flags & IORESOURCE_MEM) |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index 18623ba751b3..6379091a1647 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
| @@ -770,7 +770,7 @@ static void __init pmb_resize(void) | |||
| 770 | spin_unlock_irqrestore(&pmbe->lock, flags); | 770 | spin_unlock_irqrestore(&pmbe->lock, flags); |
| 771 | } | 771 | } |
| 772 | 772 | ||
| 773 | read_lock(&pmb_rwlock); | 773 | read_unlock(&pmb_rwlock); |
| 774 | } | 774 | } |
| 775 | #endif | 775 | #endif |
| 776 | 776 | ||
diff --git a/arch/um/include/asm/arch_hweight.h b/arch/um/include/asm/arch_hweight.h new file mode 100644 index 000000000000..c656cf443f4a --- /dev/null +++ b/arch/um/include/asm/arch_hweight.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef _ASM_UM_HWEIGHT_H | ||
| 2 | #define _ASM_UM_HWEIGHT_H | ||
| 3 | |||
| 4 | #include <asm-generic/bitops/arch_hweight.h> | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/arch/um/os-Linux/mem.c b/arch/um/os-Linux/mem.c index 93a11d7edfa0..e696144d2be3 100644 --- a/arch/um/os-Linux/mem.c +++ b/arch/um/os-Linux/mem.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <errno.h> | 10 | #include <errno.h> |
| 11 | #include <fcntl.h> | 11 | #include <fcntl.h> |
| 12 | #include <string.h> | 12 | #include <string.h> |
| 13 | #include <sys/stat.h> | ||
| 13 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
| 14 | #include <sys/param.h> | 15 | #include <sys/param.h> |
| 15 | #include "init.h" | 16 | #include "init.h" |
diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index ed7aeff786b2..45bc9402aa49 100644 --- a/arch/x86/boot/video-vga.c +++ b/arch/x86/boot/video-vga.c | |||
| @@ -41,13 +41,12 @@ static __videocard video_vga; | |||
| 41 | static u8 vga_set_basic_mode(void) | 41 | static u8 vga_set_basic_mode(void) |
| 42 | { | 42 | { |
| 43 | struct biosregs ireg, oreg; | 43 | struct biosregs ireg, oreg; |
| 44 | u16 ax; | ||
| 45 | u8 mode; | 44 | u8 mode; |
| 46 | 45 | ||
| 47 | initregs(&ireg); | 46 | initregs(&ireg); |
| 48 | 47 | ||
| 49 | /* Query current mode */ | 48 | /* Query current mode */ |
| 50 | ax = 0x0f00; | 49 | ireg.ax = 0x0f00; |
| 51 | intcall(0x10, &ireg, &oreg); | 50 | intcall(0x10, &ireg, &oreg); |
| 52 | mode = oreg.al; | 51 | mode = oreg.al; |
| 53 | 52 | ||
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 63cb4096c3dc..9cb2edb87c2f 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -183,7 +183,7 @@ struct mp_ioapic_gsi{ | |||
| 183 | u32 gsi_end; | 183 | u32 gsi_end; |
| 184 | }; | 184 | }; |
| 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; | 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; |
| 186 | extern u32 gsi_end; | 186 | extern u32 gsi_top; |
| 187 | int mp_find_ioapic(u32 gsi); | 187 | int mp_find_ioapic(u32 gsi); |
| 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); | 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); |
| 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); | 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); |
| @@ -197,7 +197,7 @@ static const int timer_through_8259 = 0; | |||
| 197 | static inline void ioapic_init_mappings(void) { } | 197 | static inline void ioapic_init_mappings(void) { } |
| 198 | static inline void ioapic_insert_resources(void) { } | 198 | static inline void ioapic_insert_resources(void) { } |
| 199 | static inline void probe_nr_irqs_gsi(void) { } | 199 | static inline void probe_nr_irqs_gsi(void) { } |
| 200 | #define gsi_end (NR_IRQS_LEGACY - 1) | 200 | #define gsi_top (NR_IRQS_LEGACY) |
| 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } | 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } |
| 202 | 202 | ||
| 203 | struct io_apic_irq_attr; | 203 | struct io_apic_irq_attr; |
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 0797e748d280..cd28f9ad910d 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -77,6 +77,7 @@ do { \ | |||
| 77 | if (0) { \ | 77 | if (0) { \ |
| 78 | pto_T__ pto_tmp__; \ | 78 | pto_T__ pto_tmp__; \ |
| 79 | pto_tmp__ = (val); \ | 79 | pto_tmp__ = (val); \ |
| 80 | (void)pto_tmp__; \ | ||
| 80 | } \ | 81 | } \ |
| 81 | switch (sizeof(var)) { \ | 82 | switch (sizeof(var)) { \ |
| 82 | case 1: \ | 83 | case 1: \ |
| @@ -115,6 +116,7 @@ do { \ | |||
| 115 | if (0) { \ | 116 | if (0) { \ |
| 116 | pao_T__ pao_tmp__; \ | 117 | pao_T__ pao_tmp__; \ |
| 117 | pao_tmp__ = (val); \ | 118 | pao_tmp__ = (val); \ |
| 119 | (void)pao_tmp__; \ | ||
| 118 | } \ | 120 | } \ |
| 119 | switch (sizeof(var)) { \ | 121 | switch (sizeof(var)) { \ |
| 120 | case 1: \ | 122 | case 1: \ |
diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h index 5e67c1532314..ed5903be26fe 100644 --- a/arch/x86/include/asm/pgtable_32_types.h +++ b/arch/x86/include/asm/pgtable_32_types.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) |
| 28 | 28 | ||
| 29 | #ifndef __ASSEMBLER__ | 29 | #ifndef __ASSEMBLY__ |
| 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ | 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index b8fe48ee2ed9..e7f4d33c55ed 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -451,7 +451,7 @@ void stop_this_cpu(void *dummy); | |||
| 451 | * | 451 | * |
| 452 | * (Could use an alternative three way for this if there was one.) | 452 | * (Could use an alternative three way for this if there was one.) |
| 453 | */ | 453 | */ |
| 454 | static inline void rdtsc_barrier(void) | 454 | static __always_inline void rdtsc_barrier(void) |
| 455 | { | 455 | { |
| 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); |
| 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 60cc4058ed5f..c05872aa3ce0 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -118,7 +118,7 @@ static unsigned int gsi_to_irq(unsigned int gsi) | |||
| 118 | if (gsi >= NR_IRQS_LEGACY) | 118 | if (gsi >= NR_IRQS_LEGACY) |
| 119 | irq = gsi; | 119 | irq = gsi; |
| 120 | else | 120 | else |
| 121 | irq = gsi_end + 1 + gsi; | 121 | irq = gsi_top + gsi; |
| 122 | 122 | ||
| 123 | return irq; | 123 | return irq; |
| 124 | } | 124 | } |
| @@ -129,10 +129,10 @@ static u32 irq_to_gsi(int irq) | |||
| 129 | 129 | ||
| 130 | if (irq < NR_IRQS_LEGACY) | 130 | if (irq < NR_IRQS_LEGACY) |
| 131 | gsi = isa_irq_to_gsi[irq]; | 131 | gsi = isa_irq_to_gsi[irq]; |
| 132 | else if (irq <= gsi_end) | 132 | else if (irq < gsi_top) |
| 133 | gsi = irq; | 133 | gsi = irq; |
| 134 | else if (irq <= (gsi_end + NR_IRQS_LEGACY)) | 134 | else if (irq < (gsi_top + NR_IRQS_LEGACY)) |
| 135 | gsi = irq - gsi_end; | 135 | gsi = irq - gsi_top; |
| 136 | else | 136 | else |
| 137 | gsi = 0xffffffff; | 137 | gsi = 0xffffffff; |
| 138 | 138 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 33f3563a2a52..e41ed24ab26d 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -89,8 +89,8 @@ int nr_ioapics; | |||
| 89 | /* IO APIC gsi routing info */ | 89 | /* IO APIC gsi routing info */ |
| 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; | 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; |
| 91 | 91 | ||
| 92 | /* The last gsi number used */ | 92 | /* The one past the highest gsi number used */ |
| 93 | u32 gsi_end; | 93 | u32 gsi_top; |
| 94 | 94 | ||
| 95 | /* MP IRQ source entries */ | 95 | /* MP IRQ source entries */ |
| 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
| @@ -1035,7 +1035,7 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
| 1035 | if (gsi >= NR_IRQS_LEGACY) | 1035 | if (gsi >= NR_IRQS_LEGACY) |
| 1036 | irq = gsi; | 1036 | irq = gsi; |
| 1037 | else | 1037 | else |
| 1038 | irq = gsi_end + 1 + gsi; | 1038 | irq = gsi_top + gsi; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | #ifdef CONFIG_X86_32 | 1041 | #ifdef CONFIG_X86_32 |
| @@ -3853,7 +3853,7 @@ void __init probe_nr_irqs_gsi(void) | |||
| 3853 | { | 3853 | { |
| 3854 | int nr; | 3854 | int nr; |
| 3855 | 3855 | ||
| 3856 | nr = gsi_end + 1 + NR_IRQS_LEGACY; | 3856 | nr = gsi_top + NR_IRQS_LEGACY; |
| 3857 | if (nr > nr_irqs_gsi) | 3857 | if (nr > nr_irqs_gsi) |
| 3858 | nr_irqs_gsi = nr; | 3858 | nr_irqs_gsi = nr; |
| 3859 | 3859 | ||
| @@ -4294,8 +4294,8 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
| 4294 | */ | 4294 | */ |
| 4295 | nr_ioapic_registers[idx] = entries; | 4295 | nr_ioapic_registers[idx] = entries; |
| 4296 | 4296 | ||
| 4297 | if (mp_gsi_routing[idx].gsi_end > gsi_end) | 4297 | if (mp_gsi_routing[idx].gsi_end >= gsi_top) |
| 4298 | gsi_end = mp_gsi_routing[idx].gsi_end; | 4298 | gsi_top = mp_gsi_routing[idx].gsi_end + 1; |
| 4299 | 4299 | ||
| 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
| 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, | 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 611df11ba15e..c2897b7b4a3b 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c | |||
| @@ -102,8 +102,8 @@ static const u64 amd_perfmon_event_map[] = | |||
| 102 | [PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0, | 102 | [PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0, |
| 103 | [PERF_COUNT_HW_CACHE_REFERENCES] = 0x0080, | 103 | [PERF_COUNT_HW_CACHE_REFERENCES] = 0x0080, |
| 104 | [PERF_COUNT_HW_CACHE_MISSES] = 0x0081, | 104 | [PERF_COUNT_HW_CACHE_MISSES] = 0x0081, |
| 105 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c4, | 105 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c2, |
| 106 | [PERF_COUNT_HW_BRANCH_MISSES] = 0x00c5, | 106 | [PERF_COUNT_HW_BRANCH_MISSES] = 0x00c3, |
| 107 | }; | 107 | }; |
| 108 | 108 | ||
| 109 | static u64 amd_pmu_event_map(int hw_event) | 109 | static u64 amd_pmu_event_map(int hw_event) |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index fdbc652d3feb..214ac860ebe0 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -72,6 +72,7 @@ static struct event_constraint intel_westmere_event_constraints[] = | |||
| 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
| 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ |
| 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
| 75 | INTEL_EVENT_CONSTRAINT(0xb3, 0x1), /* SNOOPQ_REQUEST_OUTSTANDING */ | ||
| 75 | EVENT_CONSTRAINT_END | 76 | EVENT_CONSTRAINT_END |
| 76 | }; | 77 | }; |
| 77 | 78 | ||
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 7bca3c6a02fb..0d6fc71bedb1 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -729,7 +729,7 @@ static int __init e820_mark_nvs_memory(void) | |||
| 729 | struct e820entry *ei = &e820.map[i]; | 729 | struct e820entry *ei = &e820.map[i]; |
| 730 | 730 | ||
| 731 | if (ei->type == E820_NVS) | 731 | if (ei->type == E820_NVS) |
| 732 | hibernate_nvs_register(ei->addr, ei->size); | 732 | suspend_nvs_register(ei->addr, ei->size); |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | return 0; | 735 | return 0; |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 5ae5d2426edf..d86dbf7e54be 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -123,7 +123,7 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m) | |||
| 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", | 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", |
| 124 | m->apicid, m->apicver, m->apicaddr); | 124 | m->apicid, m->apicver, m->apicaddr); |
| 125 | 125 | ||
| 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_end + 1); | 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_top); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) | 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index fb99f7edb341..0b96b5589f08 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -103,11 +103,16 @@ int use_calgary __read_mostly = 0; | |||
| 103 | #define PMR_SOFTSTOPFAULT 0x40000000 | 103 | #define PMR_SOFTSTOPFAULT 0x40000000 |
| 104 | #define PMR_HARDSTOP 0x20000000 | 104 | #define PMR_HARDSTOP 0x20000000 |
| 105 | 105 | ||
| 106 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | 106 | /* |
| 107 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ | 107 | * The maximum PHB bus number. |
| 108 | /* MAX_PHB_BUS_NUM is the maximal possible dev->bus->number */ | 108 | * x3950M2 (rare): 8 chassis, 48 PHBs per chassis = 384 |
| 109 | #define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) | 109 | * x3950M2: 4 chassis, 48 PHBs per chassis = 192 |
| 110 | #define PHBS_PER_CALGARY 4 | 110 | * x3950 (PCIE): 8 chassis, 32 PHBs per chassis = 256 |
| 111 | * x3950 (PCIX): 8 chassis, 16 PHBs per chassis = 128 | ||
| 112 | */ | ||
| 113 | #define MAX_PHB_BUS_NUM 384 | ||
| 114 | |||
| 115 | #define PHBS_PER_CALGARY 4 | ||
| 111 | 116 | ||
| 112 | /* register offsets in Calgary's internal register space */ | 117 | /* register offsets in Calgary's internal register space */ |
| 113 | static const unsigned long tar_offsets[] = { | 118 | static const unsigned long tar_offsets[] = { |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 8e1aac86b50c..e3af342fe83a 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -228,6 +228,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), | 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), |
| 229 | }, | 229 | }, |
| 230 | }, | 230 | }, |
| 231 | { /* Handle problems with rebooting on Dell T7400's */ | ||
| 232 | .callback = set_bios_reboot, | ||
| 233 | .ident = "Dell Precision T7400", | ||
| 234 | .matches = { | ||
| 235 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 236 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T7400"), | ||
| 237 | }, | ||
| 238 | }, | ||
| 231 | { /* Handle problems with rebooting on HP laptops */ | 239 | { /* Handle problems with rebooting on HP laptops */ |
| 232 | .callback = set_bios_reboot, | 240 | .callback = set_bios_reboot, |
| 233 | .ident = "HP Compaq Laptop", | 241 | .ident = "HP Compaq Laptop", |
diff --git a/arch/x86/kernel/sfi.c b/arch/x86/kernel/sfi.c index 7ded57896c0a..cb22acf3ed09 100644 --- a/arch/x86/kernel/sfi.c +++ b/arch/x86/kernel/sfi.c | |||
| @@ -93,7 +93,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table) | |||
| 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; | 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; |
| 94 | 94 | ||
| 95 | for (i = 0; i < num; i++) { | 95 | for (i = 0; i < num; i++) { |
| 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_end + 1); | 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_top); |
| 97 | pentry++; | 97 | pentry++; |
| 98 | } | 98 | } |
| 99 | 99 | ||
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 142d70c74b02..725ef4d17cd5 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -526,6 +526,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) | |||
| 526 | dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | 526 | dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) |
| 527 | { | 527 | { |
| 528 | struct task_struct *tsk = current; | 528 | struct task_struct *tsk = current; |
| 529 | int user_icebp = 0; | ||
| 529 | unsigned long dr6; | 530 | unsigned long dr6; |
| 530 | int si_code; | 531 | int si_code; |
| 531 | 532 | ||
| @@ -534,6 +535,14 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
| 534 | /* Filter out all the reserved bits which are preset to 1 */ | 535 | /* Filter out all the reserved bits which are preset to 1 */ |
| 535 | dr6 &= ~DR6_RESERVED; | 536 | dr6 &= ~DR6_RESERVED; |
| 536 | 537 | ||
| 538 | /* | ||
| 539 | * If dr6 has no reason to give us about the origin of this trap, | ||
| 540 | * then it's very likely the result of an icebp/int01 trap. | ||
| 541 | * User wants a sigtrap for that. | ||
| 542 | */ | ||
| 543 | if (!dr6 && user_mode(regs)) | ||
| 544 | user_icebp = 1; | ||
| 545 | |||
| 537 | /* Catch kmemcheck conditions first of all! */ | 546 | /* Catch kmemcheck conditions first of all! */ |
| 538 | if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) | 547 | if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) |
| 539 | return; | 548 | return; |
| @@ -575,7 +584,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
| 575 | regs->flags &= ~X86_EFLAGS_TF; | 584 | regs->flags &= ~X86_EFLAGS_TF; |
| 576 | } | 585 | } |
| 577 | si_code = get_si_code(tsk->thread.debugreg6); | 586 | si_code = get_si_code(tsk->thread.debugreg6); |
| 578 | if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS)) | 587 | if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) |
| 579 | send_sigtrap(tsk, regs, error_code, si_code); | 588 | send_sigtrap(tsk, regs, error_code, si_code); |
| 580 | preempt_conditional_cli(regs); | 589 | preempt_conditional_cli(regs); |
| 581 | 590 | ||
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index acc15b23b743..64121a18b8cb 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -302,7 +302,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 302 | return -EINVAL; | 302 | return -EINVAL; |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | new = kmalloc(sizeof(struct memtype), GFP_KERNEL); | 305 | new = kzalloc(sizeof(struct memtype), GFP_KERNEL); |
| 306 | if (!new) | 306 | if (!new) |
| 307 | return -ENOMEM; | 307 | return -ENOMEM; |
| 308 | 308 | ||
diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index f537087bb740..f20eeec85a86 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c | |||
| @@ -226,6 +226,7 @@ int rbt_memtype_check_insert(struct memtype *new, unsigned long *ret_type) | |||
| 226 | if (ret_type) | 226 | if (ret_type) |
| 227 | new->type = *ret_type; | 227 | new->type = *ret_type; |
| 228 | 228 | ||
| 229 | new->subtree_max_end = new->end; | ||
| 229 | memtype_rb_insert(&memtype_rbroot, new); | 230 | memtype_rb_insert(&memtype_rbroot, new); |
| 230 | } | 231 | } |
| 231 | return err; | 232 | return err; |
diff --git a/block/blk-core.c b/block/blk-core.c index f84cce42fc58..f0640d7f800f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -1149,13 +1149,10 @@ void init_request_from_bio(struct request *req, struct bio *bio) | |||
| 1149 | else | 1149 | else |
| 1150 | req->cmd_flags |= bio->bi_rw & REQ_FAILFAST_MASK; | 1150 | req->cmd_flags |= bio->bi_rw & REQ_FAILFAST_MASK; |
| 1151 | 1151 | ||
| 1152 | if (unlikely(bio_rw_flagged(bio, BIO_RW_DISCARD))) { | 1152 | if (bio_rw_flagged(bio, BIO_RW_DISCARD)) |
| 1153 | req->cmd_flags |= REQ_DISCARD; | 1153 | req->cmd_flags |= REQ_DISCARD; |
| 1154 | if (bio_rw_flagged(bio, BIO_RW_BARRIER)) | 1154 | if (bio_rw_flagged(bio, BIO_RW_BARRIER)) |
| 1155 | req->cmd_flags |= REQ_SOFTBARRIER; | ||
| 1156 | } else if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) | ||
| 1157 | req->cmd_flags |= REQ_HARDBARRIER; | 1155 | req->cmd_flags |= REQ_HARDBARRIER; |
| 1158 | |||
| 1159 | if (bio_rw_flagged(bio, BIO_RW_SYNCIO)) | 1156 | if (bio_rw_flagged(bio, BIO_RW_SYNCIO)) |
| 1160 | req->cmd_flags |= REQ_RW_SYNC; | 1157 | req->cmd_flags |= REQ_RW_SYNC; |
| 1161 | if (bio_rw_flagged(bio, BIO_RW_META)) | 1158 | if (bio_rw_flagged(bio, BIO_RW_META)) |
| @@ -1586,7 +1583,7 @@ void submit_bio(int rw, struct bio *bio) | |||
| 1586 | * If it's a regular read/write or a barrier with data attached, | 1583 | * If it's a regular read/write or a barrier with data attached, |
| 1587 | * go through the normal accounting stuff before submission. | 1584 | * go through the normal accounting stuff before submission. |
| 1588 | */ | 1585 | */ |
| 1589 | if (bio_has_data(bio)) { | 1586 | if (bio_has_data(bio) && !(rw & (1 << BIO_RW_DISCARD))) { |
| 1590 | if (rw & WRITE) { | 1587 | if (rw & WRITE) { |
| 1591 | count_vm_events(PGPGOUT, count); | 1588 | count_vm_events(PGPGOUT, count); |
| 1592 | } else { | 1589 | } else { |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 5ff4f4850e71..7982b830db58 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/rbtree.h> | 14 | #include <linux/rbtree.h> |
| 15 | #include <linux/ioprio.h> | 15 | #include <linux/ioprio.h> |
| 16 | #include <linux/blktrace_api.h> | 16 | #include <linux/blktrace_api.h> |
| 17 | #include "blk-cgroup.h" | 17 | #include "cfq.h" |
| 18 | 18 | ||
| 19 | /* | 19 | /* |
| 20 | * tunables | 20 | * tunables |
| @@ -879,7 +879,7 @@ cfq_group_service_tree_del(struct cfq_data *cfqd, struct cfq_group *cfqg) | |||
| 879 | if (!RB_EMPTY_NODE(&cfqg->rb_node)) | 879 | if (!RB_EMPTY_NODE(&cfqg->rb_node)) |
| 880 | cfq_rb_erase(&cfqg->rb_node, st); | 880 | cfq_rb_erase(&cfqg->rb_node, st); |
| 881 | cfqg->saved_workload_slice = 0; | 881 | cfqg->saved_workload_slice = 0; |
| 882 | blkiocg_update_dequeue_stats(&cfqg->blkg, 1); | 882 | cfq_blkiocg_update_dequeue_stats(&cfqg->blkg, 1); |
| 883 | } | 883 | } |
| 884 | 884 | ||
| 885 | static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq) | 885 | static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq) |
| @@ -939,8 +939,8 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg, | |||
| 939 | 939 | ||
| 940 | cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime, | 940 | cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime, |
| 941 | st->min_vdisktime); | 941 | st->min_vdisktime); |
| 942 | blkiocg_update_timeslice_used(&cfqg->blkg, used_sl); | 942 | cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl); |
| 943 | blkiocg_set_start_empty_time(&cfqg->blkg); | 943 | cfq_blkiocg_set_start_empty_time(&cfqg->blkg); |
| 944 | } | 944 | } |
| 945 | 945 | ||
| 946 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | 946 | #ifdef CONFIG_CFQ_GROUP_IOSCHED |
| @@ -995,7 +995,7 @@ cfq_find_alloc_cfqg(struct cfq_data *cfqd, struct cgroup *cgroup, int create) | |||
| 995 | 995 | ||
| 996 | /* Add group onto cgroup list */ | 996 | /* Add group onto cgroup list */ |
| 997 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); | 997 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); |
| 998 | blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, | 998 | cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, |
| 999 | MKDEV(major, minor)); | 999 | MKDEV(major, minor)); |
| 1000 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); | 1000 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); |
| 1001 | 1001 | ||
| @@ -1079,7 +1079,7 @@ static void cfq_release_cfq_groups(struct cfq_data *cfqd) | |||
| 1079 | * it from cgroup list, then it will take care of destroying | 1079 | * it from cgroup list, then it will take care of destroying |
| 1080 | * cfqg also. | 1080 | * cfqg also. |
| 1081 | */ | 1081 | */ |
| 1082 | if (!blkiocg_del_blkio_group(&cfqg->blkg)) | 1082 | if (!cfq_blkiocg_del_blkio_group(&cfqg->blkg)) |
| 1083 | cfq_destroy_cfqg(cfqd, cfqg); | 1083 | cfq_destroy_cfqg(cfqd, cfqg); |
| 1084 | } | 1084 | } |
| 1085 | } | 1085 | } |
| @@ -1421,10 +1421,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) | |||
| 1421 | { | 1421 | { |
| 1422 | elv_rb_del(&cfqq->sort_list, rq); | 1422 | elv_rb_del(&cfqq->sort_list, rq); |
| 1423 | cfqq->queued[rq_is_sync(rq)]--; | 1423 | cfqq->queued[rq_is_sync(rq)]--; |
| 1424 | blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq), | 1424 | cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, |
| 1425 | rq_is_sync(rq)); | 1425 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1426 | cfq_add_rq_rb(rq); | 1426 | cfq_add_rq_rb(rq); |
| 1427 | blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, | 1427 | cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, |
| 1428 | &cfqq->cfqd->serving_group->blkg, rq_data_dir(rq), | 1428 | &cfqq->cfqd->serving_group->blkg, rq_data_dir(rq), |
| 1429 | rq_is_sync(rq)); | 1429 | rq_is_sync(rq)); |
| 1430 | } | 1430 | } |
| @@ -1482,8 +1482,8 @@ static void cfq_remove_request(struct request *rq) | |||
| 1482 | cfq_del_rq_rb(rq); | 1482 | cfq_del_rq_rb(rq); |
| 1483 | 1483 | ||
| 1484 | cfqq->cfqd->rq_queued--; | 1484 | cfqq->cfqd->rq_queued--; |
| 1485 | blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq), | 1485 | cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, |
| 1486 | rq_is_sync(rq)); | 1486 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1487 | if (rq_is_meta(rq)) { | 1487 | if (rq_is_meta(rq)) { |
| 1488 | WARN_ON(!cfqq->meta_pending); | 1488 | WARN_ON(!cfqq->meta_pending); |
| 1489 | cfqq->meta_pending--; | 1489 | cfqq->meta_pending--; |
| @@ -1518,8 +1518,8 @@ static void cfq_merged_request(struct request_queue *q, struct request *req, | |||
| 1518 | static void cfq_bio_merged(struct request_queue *q, struct request *req, | 1518 | static void cfq_bio_merged(struct request_queue *q, struct request *req, |
| 1519 | struct bio *bio) | 1519 | struct bio *bio) |
| 1520 | { | 1520 | { |
| 1521 | blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg, bio_data_dir(bio), | 1521 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg, |
| 1522 | cfq_bio_sync(bio)); | 1522 | bio_data_dir(bio), cfq_bio_sync(bio)); |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| 1525 | static void | 1525 | static void |
| @@ -1539,8 +1539,8 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, | |||
| 1539 | if (cfqq->next_rq == next) | 1539 | if (cfqq->next_rq == next) |
| 1540 | cfqq->next_rq = rq; | 1540 | cfqq->next_rq = rq; |
| 1541 | cfq_remove_request(next); | 1541 | cfq_remove_request(next); |
| 1542 | blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(next), | 1542 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, |
| 1543 | rq_is_sync(next)); | 1543 | rq_data_dir(next), rq_is_sync(next)); |
| 1544 | } | 1544 | } |
| 1545 | 1545 | ||
| 1546 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, | 1546 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, |
| @@ -1571,7 +1571,7 @@ static int cfq_allow_merge(struct request_queue *q, struct request *rq, | |||
| 1571 | static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq) | 1571 | static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq) |
| 1572 | { | 1572 | { |
| 1573 | del_timer(&cfqd->idle_slice_timer); | 1573 | del_timer(&cfqd->idle_slice_timer); |
| 1574 | blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg); | 1574 | cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg); |
| 1575 | } | 1575 | } |
| 1576 | 1576 | ||
| 1577 | static void __cfq_set_active_queue(struct cfq_data *cfqd, | 1577 | static void __cfq_set_active_queue(struct cfq_data *cfqd, |
| @@ -1580,7 +1580,7 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd, | |||
| 1580 | if (cfqq) { | 1580 | if (cfqq) { |
| 1581 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", | 1581 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", |
| 1582 | cfqd->serving_prio, cfqd->serving_type); | 1582 | cfqd->serving_prio, cfqd->serving_type); |
| 1583 | blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg); | 1583 | cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg); |
| 1584 | cfqq->slice_start = 0; | 1584 | cfqq->slice_start = 0; |
| 1585 | cfqq->dispatch_start = jiffies; | 1585 | cfqq->dispatch_start = jiffies; |
| 1586 | cfqq->allocated_slice = 0; | 1586 | cfqq->allocated_slice = 0; |
| @@ -1911,7 +1911,7 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd) | |||
| 1911 | sl = cfqd->cfq_slice_idle; | 1911 | sl = cfqd->cfq_slice_idle; |
| 1912 | 1912 | ||
| 1913 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); | 1913 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); |
| 1914 | blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg); | 1914 | cfq_blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg); |
| 1915 | cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl); | 1915 | cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl); |
| 1916 | } | 1916 | } |
| 1917 | 1917 | ||
| @@ -1931,7 +1931,7 @@ static void cfq_dispatch_insert(struct request_queue *q, struct request *rq) | |||
| 1931 | elv_dispatch_sort(q, rq); | 1931 | elv_dispatch_sort(q, rq); |
| 1932 | 1932 | ||
| 1933 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++; | 1933 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++; |
| 1934 | blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq), | 1934 | cfq_blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq), |
| 1935 | rq_data_dir(rq), rq_is_sync(rq)); | 1935 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1936 | } | 1936 | } |
| 1937 | 1937 | ||
| @@ -1986,6 +1986,15 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | |||
| 1986 | int process_refs, new_process_refs; | 1986 | int process_refs, new_process_refs; |
| 1987 | struct cfq_queue *__cfqq; | 1987 | struct cfq_queue *__cfqq; |
| 1988 | 1988 | ||
| 1989 | /* | ||
| 1990 | * If there are no process references on the new_cfqq, then it is | ||
| 1991 | * unsafe to follow the ->new_cfqq chain as other cfqq's in the | ||
| 1992 | * chain may have dropped their last reference (not just their | ||
| 1993 | * last process reference). | ||
| 1994 | */ | ||
| 1995 | if (!cfqq_process_refs(new_cfqq)) | ||
| 1996 | return; | ||
| 1997 | |||
| 1989 | /* Avoid a circular list and skip interim queue merges */ | 1998 | /* Avoid a circular list and skip interim queue merges */ |
| 1990 | while ((__cfqq = new_cfqq->new_cfqq)) { | 1999 | while ((__cfqq = new_cfqq->new_cfqq)) { |
| 1991 | if (__cfqq == cfqq) | 2000 | if (__cfqq == cfqq) |
| @@ -1994,17 +2003,17 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | |||
| 1994 | } | 2003 | } |
| 1995 | 2004 | ||
| 1996 | process_refs = cfqq_process_refs(cfqq); | 2005 | process_refs = cfqq_process_refs(cfqq); |
| 2006 | new_process_refs = cfqq_process_refs(new_cfqq); | ||
| 1997 | /* | 2007 | /* |
| 1998 | * If the process for the cfqq has gone away, there is no | 2008 | * If the process for the cfqq has gone away, there is no |
| 1999 | * sense in merging the queues. | 2009 | * sense in merging the queues. |
| 2000 | */ | 2010 | */ |
| 2001 | if (process_refs == 0) | 2011 | if (process_refs == 0 || new_process_refs == 0) |
| 2002 | return; | 2012 | return; |
| 2003 | 2013 | ||
| 2004 | /* | 2014 | /* |
| 2005 | * Merge in the direction of the lesser amount of work. | 2015 | * Merge in the direction of the lesser amount of work. |
| 2006 | */ | 2016 | */ |
| 2007 | new_process_refs = cfqq_process_refs(new_cfqq); | ||
| 2008 | if (new_process_refs >= process_refs) { | 2017 | if (new_process_refs >= process_refs) { |
| 2009 | cfqq->new_cfqq = new_cfqq; | 2018 | cfqq->new_cfqq = new_cfqq; |
| 2010 | atomic_add(process_refs, &new_cfqq->ref); | 2019 | atomic_add(process_refs, &new_cfqq->ref); |
| @@ -3248,7 +3257,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 3248 | cfq_clear_cfqq_wait_request(cfqq); | 3257 | cfq_clear_cfqq_wait_request(cfqq); |
| 3249 | __blk_run_queue(cfqd->queue); | 3258 | __blk_run_queue(cfqd->queue); |
| 3250 | } else { | 3259 | } else { |
| 3251 | blkiocg_update_idle_time_stats( | 3260 | cfq_blkiocg_update_idle_time_stats( |
| 3252 | &cfqq->cfqg->blkg); | 3261 | &cfqq->cfqg->blkg); |
| 3253 | cfq_mark_cfqq_must_dispatch(cfqq); | 3262 | cfq_mark_cfqq_must_dispatch(cfqq); |
| 3254 | } | 3263 | } |
| @@ -3276,7 +3285,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) | |||
| 3276 | rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]); | 3285 | rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]); |
| 3277 | list_add_tail(&rq->queuelist, &cfqq->fifo); | 3286 | list_add_tail(&rq->queuelist, &cfqq->fifo); |
| 3278 | cfq_add_rq_rb(rq); | 3287 | cfq_add_rq_rb(rq); |
| 3279 | blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, | 3288 | cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, |
| 3280 | &cfqd->serving_group->blkg, rq_data_dir(rq), | 3289 | &cfqd->serving_group->blkg, rq_data_dir(rq), |
| 3281 | rq_is_sync(rq)); | 3290 | rq_is_sync(rq)); |
| 3282 | cfq_rq_enqueued(cfqd, cfqq, rq); | 3291 | cfq_rq_enqueued(cfqd, cfqq, rq); |
| @@ -3364,9 +3373,9 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) | |||
| 3364 | WARN_ON(!cfqq->dispatched); | 3373 | WARN_ON(!cfqq->dispatched); |
| 3365 | cfqd->rq_in_driver--; | 3374 | cfqd->rq_in_driver--; |
| 3366 | cfqq->dispatched--; | 3375 | cfqq->dispatched--; |
| 3367 | blkiocg_update_completion_stats(&cfqq->cfqg->blkg, rq_start_time_ns(rq), | 3376 | cfq_blkiocg_update_completion_stats(&cfqq->cfqg->blkg, |
| 3368 | rq_io_start_time_ns(rq), rq_data_dir(rq), | 3377 | rq_start_time_ns(rq), rq_io_start_time_ns(rq), |
| 3369 | rq_is_sync(rq)); | 3378 | rq_data_dir(rq), rq_is_sync(rq)); |
| 3370 | 3379 | ||
| 3371 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; | 3380 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; |
| 3372 | 3381 | ||
| @@ -3730,7 +3739,7 @@ static void cfq_exit_queue(struct elevator_queue *e) | |||
| 3730 | 3739 | ||
| 3731 | cfq_put_async_queues(cfqd); | 3740 | cfq_put_async_queues(cfqd); |
| 3732 | cfq_release_cfq_groups(cfqd); | 3741 | cfq_release_cfq_groups(cfqd); |
| 3733 | blkiocg_del_blkio_group(&cfqd->root_group.blkg); | 3742 | cfq_blkiocg_del_blkio_group(&cfqd->root_group.blkg); |
| 3734 | 3743 | ||
| 3735 | spin_unlock_irq(q->queue_lock); | 3744 | spin_unlock_irq(q->queue_lock); |
| 3736 | 3745 | ||
| @@ -3798,8 +3807,8 @@ static void *cfq_init_queue(struct request_queue *q) | |||
| 3798 | */ | 3807 | */ |
| 3799 | atomic_set(&cfqg->ref, 1); | 3808 | atomic_set(&cfqg->ref, 1); |
| 3800 | rcu_read_lock(); | 3809 | rcu_read_lock(); |
| 3801 | blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, (void *)cfqd, | 3810 | cfq_blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, |
| 3802 | 0); | 3811 | (void *)cfqd, 0); |
| 3803 | rcu_read_unlock(); | 3812 | rcu_read_unlock(); |
| 3804 | #endif | 3813 | #endif |
| 3805 | /* | 3814 | /* |
diff --git a/block/cfq.h b/block/cfq.h new file mode 100644 index 000000000000..93448e5a2e41 --- /dev/null +++ b/block/cfq.h | |||
| @@ -0,0 +1,115 @@ | |||
| 1 | #ifndef _CFQ_H | ||
| 2 | #define _CFQ_H | ||
| 3 | #include "blk-cgroup.h" | ||
| 4 | |||
| 5 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | ||
| 6 | static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg, | ||
| 7 | struct blkio_group *curr_blkg, bool direction, bool sync) | ||
| 8 | { | ||
| 9 | blkiocg_update_io_add_stats(blkg, curr_blkg, direction, sync); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg, | ||
| 13 | unsigned long dequeue) | ||
| 14 | { | ||
| 15 | blkiocg_update_dequeue_stats(blkg, dequeue); | ||
| 16 | } | ||
| 17 | |||
| 18 | static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg, | ||
| 19 | unsigned long time) | ||
| 20 | { | ||
| 21 | blkiocg_update_timeslice_used(blkg, time); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg) | ||
| 25 | { | ||
| 26 | blkiocg_set_start_empty_time(blkg); | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg, | ||
| 30 | bool direction, bool sync) | ||
| 31 | { | ||
| 32 | blkiocg_update_io_remove_stats(blkg, direction, sync); | ||
| 33 | } | ||
| 34 | |||
| 35 | static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg, | ||
| 36 | bool direction, bool sync) | ||
| 37 | { | ||
| 38 | blkiocg_update_io_merged_stats(blkg, direction, sync); | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg) | ||
| 42 | { | ||
| 43 | blkiocg_update_idle_time_stats(blkg); | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline void | ||
| 47 | cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg) | ||
| 48 | { | ||
| 49 | blkiocg_update_avg_queue_size_stats(blkg); | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline void | ||
| 53 | cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) | ||
| 54 | { | ||
| 55 | blkiocg_update_set_idle_time_stats(blkg); | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg, | ||
| 59 | uint64_t bytes, bool direction, bool sync) | ||
| 60 | { | ||
| 61 | blkiocg_update_dispatch_stats(blkg, bytes, direction, sync); | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync) | ||
| 65 | { | ||
| 66 | blkiocg_update_completion_stats(blkg, start_time, io_start_time, | ||
| 67 | direction, sync); | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, | ||
| 71 | struct blkio_group *blkg, void *key, dev_t dev) { | ||
| 72 | blkiocg_add_blkio_group(blkcg, blkg, key, dev); | ||
| 73 | } | ||
| 74 | |||
| 75 | static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg) | ||
| 76 | { | ||
| 77 | return blkiocg_del_blkio_group(blkg); | ||
| 78 | } | ||
| 79 | |||
| 80 | #else /* CFQ_GROUP_IOSCHED */ | ||
| 81 | static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg, | ||
| 82 | struct blkio_group *curr_blkg, bool direction, bool sync) {} | ||
| 83 | |||
| 84 | static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg, | ||
| 85 | unsigned long dequeue) {} | ||
| 86 | |||
| 87 | static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg, | ||
| 88 | unsigned long time) {} | ||
| 89 | static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg) {} | ||
| 90 | static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg, | ||
| 91 | bool direction, bool sync) {} | ||
| 92 | static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg, | ||
| 93 | bool direction, bool sync) {} | ||
| 94 | static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg) | ||
| 95 | { | ||
| 96 | } | ||
| 97 | static inline void | ||
| 98 | cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg) {} | ||
| 99 | |||
| 100 | static inline void | ||
| 101 | cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) {} | ||
| 102 | |||
| 103 | static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg, | ||
| 104 | uint64_t bytes, bool direction, bool sync) {} | ||
| 105 | static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync) {} | ||
| 106 | |||
| 107 | static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, | ||
| 108 | struct blkio_group *blkg, void *key, dev_t dev) {} | ||
| 109 | static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg) | ||
| 110 | { | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | #endif /* CFQ_GROUP_IOSCHED */ | ||
| 115 | #endif | ||
diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c index d269a8f3329c..446aced33aff 100644 --- a/drivers/acpi/acpi_pad.c +++ b/drivers/acpi/acpi_pad.c | |||
| @@ -46,6 +46,8 @@ static unsigned long power_saving_mwait_eax; | |||
| 46 | 46 | ||
| 47 | static unsigned char tsc_detected_unstable; | 47 | static unsigned char tsc_detected_unstable; |
| 48 | static unsigned char tsc_marked_unstable; | 48 | static unsigned char tsc_marked_unstable; |
| 49 | static unsigned char lapic_detected_unstable; | ||
| 50 | static unsigned char lapic_marked_unstable; | ||
| 49 | 51 | ||
| 50 | static void power_saving_mwait_init(void) | 52 | static void power_saving_mwait_init(void) |
| 51 | { | 53 | { |
| @@ -75,9 +77,6 @@ static void power_saving_mwait_init(void) | |||
| 75 | power_saving_mwait_eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) | | 77 | power_saving_mwait_eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) | |
| 76 | (highest_subcstate - 1); | 78 | (highest_subcstate - 1); |
| 77 | 79 | ||
| 78 | for_each_online_cpu(i) | ||
| 79 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &i); | ||
| 80 | |||
| 81 | #if defined(CONFIG_GENERIC_TIME) && defined(CONFIG_X86) | 80 | #if defined(CONFIG_GENERIC_TIME) && defined(CONFIG_X86) |
| 82 | switch (boot_cpu_data.x86_vendor) { | 81 | switch (boot_cpu_data.x86_vendor) { |
| 83 | case X86_VENDOR_AMD: | 82 | case X86_VENDOR_AMD: |
| @@ -86,13 +85,15 @@ static void power_saving_mwait_init(void) | |||
| 86 | * AMD Fam10h TSC will tick in all | 85 | * AMD Fam10h TSC will tick in all |
| 87 | * C/P/S0/S1 states when this bit is set. | 86 | * C/P/S0/S1 states when this bit is set. |
| 88 | */ | 87 | */ |
| 89 | if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) | 88 | if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) |
| 90 | return; | 89 | tsc_detected_unstable = 1; |
| 91 | 90 | if (!boot_cpu_has(X86_FEATURE_ARAT)) | |
| 92 | /*FALL THROUGH*/ | 91 | lapic_detected_unstable = 1; |
| 92 | break; | ||
| 93 | default: | 93 | default: |
| 94 | /* TSC could halt in idle */ | 94 | /* TSC & LAPIC could halt in idle */ |
| 95 | tsc_detected_unstable = 1; | 95 | tsc_detected_unstable = 1; |
| 96 | lapic_detected_unstable = 1; | ||
| 96 | } | 97 | } |
| 97 | #endif | 98 | #endif |
| 98 | } | 99 | } |
| @@ -180,10 +181,20 @@ static int power_saving_thread(void *data) | |||
| 180 | mark_tsc_unstable("TSC halts in idle"); | 181 | mark_tsc_unstable("TSC halts in idle"); |
| 181 | tsc_marked_unstable = 1; | 182 | tsc_marked_unstable = 1; |
| 182 | } | 183 | } |
| 184 | if (lapic_detected_unstable && !lapic_marked_unstable) { | ||
| 185 | int i; | ||
| 186 | /* LAPIC could halt in idle, so notify users */ | ||
| 187 | for_each_online_cpu(i) | ||
| 188 | clockevents_notify( | ||
| 189 | CLOCK_EVT_NOTIFY_BROADCAST_ON, | ||
| 190 | &i); | ||
| 191 | lapic_marked_unstable = 1; | ||
| 192 | } | ||
| 183 | local_irq_disable(); | 193 | local_irq_disable(); |
| 184 | cpu = smp_processor_id(); | 194 | cpu = smp_processor_id(); |
| 185 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, | 195 | if (lapic_marked_unstable) |
| 186 | &cpu); | 196 | clockevents_notify( |
| 197 | CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); | ||
| 187 | stop_critical_timings(); | 198 | stop_critical_timings(); |
| 188 | 199 | ||
| 189 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | 200 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
| @@ -192,8 +203,9 @@ static int power_saving_thread(void *data) | |||
| 192 | __mwait(power_saving_mwait_eax, 1); | 203 | __mwait(power_saving_mwait_eax, 1); |
| 193 | 204 | ||
| 194 | start_critical_timings(); | 205 | start_critical_timings(); |
| 195 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, | 206 | if (lapic_marked_unstable) |
| 196 | &cpu); | 207 | clockevents_notify( |
| 208 | CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); | ||
| 197 | local_irq_enable(); | 209 | local_irq_enable(); |
| 198 | 210 | ||
| 199 | if (jiffies > expire_time) { | 211 | if (jiffies > expire_time) { |
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h index 33181ad350d5..b17d8de9f6ff 100644 --- a/drivers/acpi/acpica/acconfig.h +++ b/drivers/acpi/acpica/acconfig.h | |||
| @@ -119,6 +119,10 @@ | |||
| 119 | 119 | ||
| 120 | #define ACPI_MAX_LOOP_ITERATIONS 0xFFFF | 120 | #define ACPI_MAX_LOOP_ITERATIONS 0xFFFF |
| 121 | 121 | ||
| 122 | /* Maximum sleep allowed via Sleep() operator */ | ||
| 123 | |||
| 124 | #define ACPI_MAX_SLEEP 20000 /* Two seconds */ | ||
| 125 | |||
| 122 | /****************************************************************************** | 126 | /****************************************************************************** |
| 123 | * | 127 | * |
| 124 | * ACPI Specification constants (Do not change unless the specification changes) | 128 | * ACPI Specification constants (Do not change unless the specification changes) |
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h index 64d1e5c2d4ae..c3f43daa8be3 100644 --- a/drivers/acpi/acpica/acevents.h +++ b/drivers/acpi/acpica/acevents.h | |||
| @@ -80,10 +80,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); | |||
| 80 | acpi_status | 80 | acpi_status |
| 81 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info); | 81 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info); |
| 82 | 82 | ||
| 83 | acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
| 84 | |||
| 85 | acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
| 86 | |||
| 87 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | 83 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, |
| 88 | u32 gpe_number); | 84 | u32 gpe_number); |
| 89 | 85 | ||
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 9070f1fe8f17..899d68afc3c5 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
| @@ -125,6 +125,14 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); | |||
| 125 | */ | 125 | */ |
| 126 | u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); | 126 | u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); |
| 127 | 127 | ||
| 128 | /* | ||
| 129 | * Optionally truncate I/O addresses to 16 bits. Provides compatibility | ||
| 130 | * with other ACPI implementations. NOTE: During ACPICA initialization, | ||
| 131 | * this value is set to TRUE if any Windows OSI strings have been | ||
| 132 | * requested by the BIOS. | ||
| 133 | */ | ||
| 134 | u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); | ||
| 135 | |||
| 128 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 136 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
| 129 | 137 | ||
| 130 | struct acpi_table_fadt acpi_gbl_FADT; | 138 | struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h index 5900f135dc6d..32391588e163 100644 --- a/drivers/acpi/acpica/achware.h +++ b/drivers/acpi/acpica/achware.h | |||
| @@ -90,7 +90,11 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width); | |||
| 90 | /* | 90 | /* |
| 91 | * hwgpe - GPE support | 91 | * hwgpe - GPE support |
| 92 | */ | 92 | */ |
| 93 | acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info); | 93 | u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info, |
| 94 | struct acpi_gpe_register_info *gpe_register_info); | ||
| 95 | |||
| 96 | acpi_status | ||
| 97 | acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action); | ||
| 94 | 98 | ||
| 95 | acpi_status | 99 | acpi_status |
| 96 | acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info); | 100 | acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info); |
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index a221ad404167..7c2c336006a1 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
| @@ -69,7 +69,7 @@ acpi_status | |||
| 69 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | 69 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) |
| 70 | { | 70 | { |
| 71 | struct acpi_gpe_register_info *gpe_register_info; | 71 | struct acpi_gpe_register_info *gpe_register_info; |
| 72 | u8 register_bit; | 72 | u32 register_bit; |
| 73 | 73 | ||
| 74 | ACPI_FUNCTION_TRACE(ev_update_gpe_enable_masks); | 74 | ACPI_FUNCTION_TRACE(ev_update_gpe_enable_masks); |
| 75 | 75 | ||
| @@ -78,9 +78,8 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
| 78 | return_ACPI_STATUS(AE_NOT_EXIST); | 78 | return_ACPI_STATUS(AE_NOT_EXIST); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | register_bit = (u8) | 81 | register_bit = acpi_hw_gpe_register_bit(gpe_event_info, |
| 82 | (1 << | 82 | gpe_register_info); |
| 83 | (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number)); | ||
| 84 | 83 | ||
| 85 | /* Clear the wake/run bits up front */ | 84 | /* Clear the wake/run bits up front */ |
| 86 | 85 | ||
| @@ -100,106 +99,6 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
| 100 | return_ACPI_STATUS(AE_OK); | 99 | return_ACPI_STATUS(AE_OK); |
| 101 | } | 100 | } |
| 102 | 101 | ||
| 103 | /******************************************************************************* | ||
| 104 | * | ||
| 105 | * FUNCTION: acpi_ev_enable_gpe | ||
| 106 | * | ||
| 107 | * PARAMETERS: gpe_event_info - GPE to enable | ||
| 108 | * | ||
| 109 | * RETURN: Status | ||
| 110 | * | ||
| 111 | * DESCRIPTION: Hardware-enable a GPE. Always enables the GPE, regardless | ||
| 112 | * of type or number of references. | ||
| 113 | * | ||
| 114 | * Note: The GPE lock should be already acquired when this function is called. | ||
| 115 | * | ||
| 116 | ******************************************************************************/ | ||
| 117 | |||
| 118 | acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
| 119 | { | ||
| 120 | acpi_status status; | ||
| 121 | |||
| 122 | |||
| 123 | ACPI_FUNCTION_TRACE(ev_enable_gpe); | ||
| 124 | |||
| 125 | |||
| 126 | /* | ||
| 127 | * We will only allow a GPE to be enabled if it has either an | ||
| 128 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
| 129 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
| 130 | * first time it fires. | ||
| 131 | */ | ||
| 132 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
| 133 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
| 134 | } | ||
| 135 | |||
| 136 | /* Ensure the HW enable masks are current */ | ||
| 137 | |||
| 138 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
| 139 | if (ACPI_FAILURE(status)) { | ||
| 140 | return_ACPI_STATUS(status); | ||
| 141 | } | ||
| 142 | |||
| 143 | /* Clear the GPE (of stale events) */ | ||
| 144 | |||
| 145 | status = acpi_hw_clear_gpe(gpe_event_info); | ||
| 146 | if (ACPI_FAILURE(status)) { | ||
| 147 | return_ACPI_STATUS(status); | ||
| 148 | } | ||
| 149 | |||
| 150 | /* Enable the requested GPE */ | ||
| 151 | |||
| 152 | status = acpi_hw_write_gpe_enable_reg(gpe_event_info); | ||
| 153 | return_ACPI_STATUS(status); | ||
| 154 | } | ||
| 155 | |||
| 156 | /******************************************************************************* | ||
| 157 | * | ||
| 158 | * FUNCTION: acpi_ev_disable_gpe | ||
| 159 | * | ||
| 160 | * PARAMETERS: gpe_event_info - GPE to disable | ||
| 161 | * | ||
| 162 | * RETURN: Status | ||
| 163 | * | ||
| 164 | * DESCRIPTION: Hardware-disable a GPE. Always disables the requested GPE, | ||
| 165 | * regardless of the type or number of references. | ||
| 166 | * | ||
| 167 | * Note: The GPE lock should be already acquired when this function is called. | ||
| 168 | * | ||
| 169 | ******************************************************************************/ | ||
| 170 | |||
| 171 | acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
| 172 | { | ||
| 173 | acpi_status status; | ||
| 174 | |||
| 175 | ACPI_FUNCTION_TRACE(ev_disable_gpe); | ||
| 176 | |||
| 177 | |||
| 178 | /* | ||
| 179 | * Note: Always disable the GPE, even if we think that that it is already | ||
| 180 | * disabled. It is possible that the AML or some other code has enabled | ||
| 181 | * the GPE behind our back. | ||
| 182 | */ | ||
| 183 | |||
| 184 | /* Ensure the HW enable masks are current */ | ||
| 185 | |||
| 186 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
| 187 | if (ACPI_FAILURE(status)) { | ||
| 188 | return_ACPI_STATUS(status); | ||
| 189 | } | ||
| 190 | |||
| 191 | /* | ||
| 192 | * Always H/W disable this GPE, even if we don't know the GPE type. | ||
| 193 | * Simply clear the enable bit for this particular GPE, but do not | ||
| 194 | * write out the current GPE enable mask since this may inadvertently | ||
| 195 | * enable GPEs too early. An example is a rogue GPE that has arrived | ||
| 196 | * during ACPICA initialization - possibly because AML or other code | ||
| 197 | * has enabled the GPE. | ||
| 198 | */ | ||
| 199 | status = acpi_hw_low_disable_gpe(gpe_event_info); | ||
| 200 | return_ACPI_STATUS(status); | ||
| 201 | } | ||
| 202 | |||
| 203 | 102 | ||
| 204 | /******************************************************************************* | 103 | /******************************************************************************* |
| 205 | * | 104 | * |
| @@ -451,10 +350,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
| 451 | return_VOID; | 350 | return_VOID; |
| 452 | } | 351 | } |
| 453 | 352 | ||
| 454 | /* Update the GPE register masks for return to enabled state */ | ||
| 455 | |||
| 456 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
| 457 | |||
| 458 | /* | 353 | /* |
| 459 | * Take a snapshot of the GPE info for this level - we copy the info to | 354 | * Take a snapshot of the GPE info for this level - we copy the info to |
| 460 | * prevent a race condition with remove_handler/remove_block. | 355 | * prevent a race condition with remove_handler/remove_block. |
| @@ -607,7 +502,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
| 607 | * Disable the GPE, so it doesn't keep firing before the method has a | 502 | * Disable the GPE, so it doesn't keep firing before the method has a |
| 608 | * chance to run (it runs asynchronously with interrupts enabled). | 503 | * chance to run (it runs asynchronously with interrupts enabled). |
| 609 | */ | 504 | */ |
| 610 | status = acpi_ev_disable_gpe(gpe_event_info); | 505 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); |
| 611 | if (ACPI_FAILURE(status)) { | 506 | if (ACPI_FAILURE(status)) { |
| 612 | ACPI_EXCEPTION((AE_INFO, status, | 507 | ACPI_EXCEPTION((AE_INFO, status, |
| 613 | "Unable to disable GPE[0x%2X]", | 508 | "Unable to disable GPE[0x%2X]", |
| @@ -644,7 +539,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
| 644 | * Disable the GPE. The GPE will remain disabled a handler | 539 | * Disable the GPE. The GPE will remain disabled a handler |
| 645 | * is installed or ACPICA is restarted. | 540 | * is installed or ACPICA is restarted. |
| 646 | */ | 541 | */ |
| 647 | status = acpi_ev_disable_gpe(gpe_event_info); | 542 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); |
| 648 | if (ACPI_FAILURE(status)) { | 543 | if (ACPI_FAILURE(status)) { |
| 649 | ACPI_EXCEPTION((AE_INFO, status, | 544 | ACPI_EXCEPTION((AE_INFO, status, |
| 650 | "Unable to disable GPE[0x%2X]", | 545 | "Unable to disable GPE[0x%2X]", |
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index 7c28f2d9fd35..341a38ce8aa6 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
| @@ -500,6 +500,19 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | |||
| 500 | 500 | ||
| 501 | gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j; | 501 | gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j; |
| 502 | gpe_event_info = &gpe_block->event_info[gpe_index]; | 502 | gpe_event_info = &gpe_block->event_info[gpe_index]; |
| 503 | gpe_number = gpe_index + gpe_block->block_base_number; | ||
| 504 | |||
| 505 | /* | ||
| 506 | * If the GPE has already been enabled for runtime | ||
| 507 | * signaling, make sure it remains enabled, but do not | ||
| 508 | * increment its reference counter. | ||
| 509 | */ | ||
| 510 | if (gpe_event_info->runtime_count) { | ||
| 511 | acpi_set_gpe(gpe_device, gpe_number, | ||
| 512 | ACPI_GPE_ENABLE); | ||
| 513 | gpe_enabled_count++; | ||
| 514 | continue; | ||
| 515 | } | ||
| 503 | 516 | ||
| 504 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { | 517 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { |
| 505 | wake_gpe_count++; | 518 | wake_gpe_count++; |
| @@ -516,7 +529,6 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | |||
| 516 | 529 | ||
| 517 | /* Enable this GPE */ | 530 | /* Enable this GPE */ |
| 518 | 531 | ||
| 519 | gpe_number = gpe_index + gpe_block->block_base_number; | ||
| 520 | status = acpi_enable_gpe(gpe_device, gpe_number, | 532 | status = acpi_enable_gpe(gpe_device, gpe_number, |
| 521 | ACPI_GPE_TYPE_RUNTIME); | 533 | ACPI_GPE_TYPE_RUNTIME); |
| 522 | if (ACPI_FAILURE(status)) { | 534 | if (ACPI_FAILURE(status)) { |
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c index cc825023012a..4a531cdf7942 100644 --- a/drivers/acpi/acpica/evxface.c +++ b/drivers/acpi/acpica/evxface.c | |||
| @@ -719,13 +719,6 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
| 719 | handler->context = context; | 719 | handler->context = context; |
| 720 | handler->method_node = gpe_event_info->dispatch.method_node; | 720 | handler->method_node = gpe_event_info->dispatch.method_node; |
| 721 | 721 | ||
| 722 | /* Disable the GPE before installing the handler */ | ||
| 723 | |||
| 724 | status = acpi_ev_disable_gpe(gpe_event_info); | ||
| 725 | if (ACPI_FAILURE (status)) { | ||
| 726 | goto unlock_and_exit; | ||
| 727 | } | ||
| 728 | |||
| 729 | /* Install the handler */ | 722 | /* Install the handler */ |
| 730 | 723 | ||
| 731 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | 724 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c index d5a5efc043bf..d97b8dce1668 100644 --- a/drivers/acpi/acpica/evxfevnt.c +++ b/drivers/acpi/acpica/evxfevnt.c | |||
| @@ -210,6 +210,44 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event) | |||
| 210 | 210 | ||
| 211 | /******************************************************************************* | 211 | /******************************************************************************* |
| 212 | * | 212 | * |
| 213 | * FUNCTION: acpi_clear_and_enable_gpe | ||
| 214 | * | ||
| 215 | * PARAMETERS: gpe_event_info - GPE to enable | ||
| 216 | * | ||
| 217 | * RETURN: Status | ||
| 218 | * | ||
| 219 | * DESCRIPTION: Clear the given GPE from stale events and enable it. | ||
| 220 | * | ||
| 221 | ******************************************************************************/ | ||
| 222 | static acpi_status | ||
| 223 | acpi_clear_and_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
| 224 | { | ||
| 225 | acpi_status status; | ||
| 226 | |||
| 227 | /* | ||
| 228 | * We will only allow a GPE to be enabled if it has either an | ||
| 229 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
| 230 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
| 231 | * first time it fires. | ||
| 232 | */ | ||
| 233 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
| 234 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
| 235 | } | ||
| 236 | |||
| 237 | /* Clear the GPE (of stale events) */ | ||
| 238 | status = acpi_hw_clear_gpe(gpe_event_info); | ||
| 239 | if (ACPI_FAILURE(status)) { | ||
| 240 | return_ACPI_STATUS(status); | ||
| 241 | } | ||
| 242 | |||
| 243 | /* Enable the requested GPE */ | ||
| 244 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE); | ||
| 245 | |||
| 246 | return_ACPI_STATUS(status); | ||
| 247 | } | ||
| 248 | |||
| 249 | /******************************************************************************* | ||
| 250 | * | ||
| 213 | * FUNCTION: acpi_set_gpe | 251 | * FUNCTION: acpi_set_gpe |
| 214 | * | 252 | * |
| 215 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 | 253 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
| @@ -249,11 +287,11 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) | |||
| 249 | 287 | ||
| 250 | switch (action) { | 288 | switch (action) { |
| 251 | case ACPI_GPE_ENABLE: | 289 | case ACPI_GPE_ENABLE: |
| 252 | status = acpi_ev_enable_gpe(gpe_event_info); | 290 | status = acpi_clear_and_enable_gpe(gpe_event_info); |
| 253 | break; | 291 | break; |
| 254 | 292 | ||
| 255 | case ACPI_GPE_DISABLE: | 293 | case ACPI_GPE_DISABLE: |
| 256 | status = acpi_ev_disable_gpe(gpe_event_info); | 294 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); |
| 257 | break; | 295 | break; |
| 258 | 296 | ||
| 259 | default: | 297 | default: |
| @@ -316,7 +354,11 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) | |||
| 316 | 354 | ||
| 317 | gpe_event_info->runtime_count++; | 355 | gpe_event_info->runtime_count++; |
| 318 | if (gpe_event_info->runtime_count == 1) { | 356 | if (gpe_event_info->runtime_count == 1) { |
| 319 | status = acpi_ev_enable_gpe(gpe_event_info); | 357 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
| 358 | if (ACPI_SUCCESS(status)) { | ||
| 359 | status = acpi_clear_and_enable_gpe(gpe_event_info); | ||
| 360 | } | ||
| 361 | |||
| 320 | if (ACPI_FAILURE(status)) { | 362 | if (ACPI_FAILURE(status)) { |
| 321 | gpe_event_info->runtime_count--; | 363 | gpe_event_info->runtime_count--; |
| 322 | goto unlock_and_exit; | 364 | goto unlock_and_exit; |
| @@ -343,7 +385,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) | |||
| 343 | */ | 385 | */ |
| 344 | gpe_event_info->wakeup_count++; | 386 | gpe_event_info->wakeup_count++; |
| 345 | if (gpe_event_info->wakeup_count == 1) { | 387 | if (gpe_event_info->wakeup_count == 1) { |
| 346 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | 388 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
| 347 | } | 389 | } |
| 348 | } | 390 | } |
| 349 | 391 | ||
| @@ -403,7 +445,12 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type | |||
| 403 | 445 | ||
| 404 | gpe_event_info->runtime_count--; | 446 | gpe_event_info->runtime_count--; |
| 405 | if (!gpe_event_info->runtime_count) { | 447 | if (!gpe_event_info->runtime_count) { |
| 406 | status = acpi_ev_disable_gpe(gpe_event_info); | 448 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
| 449 | if (ACPI_SUCCESS(status)) { | ||
| 450 | status = acpi_hw_low_set_gpe(gpe_event_info, | ||
| 451 | ACPI_GPE_DISABLE); | ||
| 452 | } | ||
| 453 | |||
| 407 | if (ACPI_FAILURE(status)) { | 454 | if (ACPI_FAILURE(status)) { |
| 408 | gpe_event_info->runtime_count++; | 455 | gpe_event_info->runtime_count++; |
| 409 | goto unlock_and_exit; | 456 | goto unlock_and_exit; |
| @@ -424,7 +471,7 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type | |||
| 424 | 471 | ||
| 425 | gpe_event_info->wakeup_count--; | 472 | gpe_event_info->wakeup_count--; |
| 426 | if (!gpe_event_info->wakeup_count) { | 473 | if (!gpe_event_info->wakeup_count) { |
| 427 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | 474 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
| 428 | } | 475 | } |
| 429 | } | 476 | } |
| 430 | 477 | ||
diff --git a/drivers/acpi/acpica/exsystem.c b/drivers/acpi/acpica/exsystem.c index 6d32e09327f1..675aaa91a770 100644 --- a/drivers/acpi/acpica/exsystem.c +++ b/drivers/acpi/acpica/exsystem.c | |||
| @@ -201,6 +201,14 @@ acpi_status acpi_ex_system_do_sleep(u64 how_long) | |||
| 201 | 201 | ||
| 202 | acpi_ex_relinquish_interpreter(); | 202 | acpi_ex_relinquish_interpreter(); |
| 203 | 203 | ||
| 204 | /* | ||
| 205 | * For compatibility with other ACPI implementations and to prevent | ||
| 206 | * accidental deep sleeps, limit the sleep time to something reasonable. | ||
| 207 | */ | ||
| 208 | if (how_long > ACPI_MAX_SLEEP) { | ||
| 209 | how_long = ACPI_MAX_SLEEP; | ||
| 210 | } | ||
| 211 | |||
| 204 | acpi_os_sleep(how_long); | 212 | acpi_os_sleep(how_long); |
| 205 | 213 | ||
| 206 | /* And now we must get the interpreter again */ | 214 | /* And now we must get the interpreter again */ |
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c index bd72319a38f0..3450309c2786 100644 --- a/drivers/acpi/acpica/hwgpe.c +++ b/drivers/acpi/acpica/hwgpe.c | |||
| @@ -57,21 +57,47 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
| 57 | 57 | ||
| 58 | /****************************************************************************** | 58 | /****************************************************************************** |
| 59 | * | 59 | * |
| 60 | * FUNCTION: acpi_hw_low_disable_gpe | 60 | * FUNCTION: acpi_hw_gpe_register_bit |
| 61 | * | ||
| 62 | * PARAMETERS: gpe_event_info - Info block for the GPE | ||
| 63 | * gpe_register_info - Info block for the GPE register | ||
| 64 | * | ||
| 65 | * RETURN: Status | ||
| 66 | * | ||
| 67 | * DESCRIPTION: Compute GPE enable mask with one bit corresponding to the given | ||
| 68 | * GPE set. | ||
| 69 | * | ||
| 70 | ******************************************************************************/ | ||
| 71 | |||
| 72 | u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info, | ||
| 73 | struct acpi_gpe_register_info *gpe_register_info) | ||
| 74 | { | ||
| 75 | return (u32)1 << (gpe_event_info->gpe_number - | ||
| 76 | gpe_register_info->base_gpe_number); | ||
| 77 | } | ||
| 78 | |||
| 79 | /****************************************************************************** | ||
| 80 | * | ||
| 81 | * FUNCTION: acpi_hw_low_set_gpe | ||
| 61 | * | 82 | * |
| 62 | * PARAMETERS: gpe_event_info - Info block for the GPE to be disabled | 83 | * PARAMETERS: gpe_event_info - Info block for the GPE to be disabled |
| 84 | * action - Enable or disable | ||
| 63 | * | 85 | * |
| 64 | * RETURN: Status | 86 | * RETURN: Status |
| 65 | * | 87 | * |
| 66 | * DESCRIPTION: Disable a single GPE in the enable register. | 88 | * DESCRIPTION: Enable or disable a single GPE in its enable register. |
| 67 | * | 89 | * |
| 68 | ******************************************************************************/ | 90 | ******************************************************************************/ |
| 69 | 91 | ||
| 70 | acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | 92 | acpi_status |
| 93 | acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action) | ||
| 71 | { | 94 | { |
| 72 | struct acpi_gpe_register_info *gpe_register_info; | 95 | struct acpi_gpe_register_info *gpe_register_info; |
| 73 | acpi_status status; | 96 | acpi_status status; |
| 74 | u32 enable_mask; | 97 | u32 enable_mask; |
| 98 | u32 register_bit; | ||
| 99 | |||
| 100 | ACPI_FUNCTION_ENTRY(); | ||
| 75 | 101 | ||
| 76 | /* Get the info block for the entire GPE register */ | 102 | /* Get the info block for the entire GPE register */ |
| 77 | 103 | ||
| @@ -87,11 +113,27 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
| 87 | return (status); | 113 | return (status); |
| 88 | } | 114 | } |
| 89 | 115 | ||
| 90 | /* Clear just the bit that corresponds to this GPE */ | 116 | /* Set ot clear just the bit that corresponds to this GPE */ |
| 91 | 117 | ||
| 92 | ACPI_CLEAR_BIT(enable_mask, ((u32)1 << | 118 | register_bit = acpi_hw_gpe_register_bit(gpe_event_info, |
| 93 | (gpe_event_info->gpe_number - | 119 | gpe_register_info); |
| 94 | gpe_register_info->base_gpe_number))); | 120 | switch (action) { |
| 121 | case ACPI_GPE_COND_ENABLE: | ||
| 122 | if (!(register_bit & gpe_register_info->enable_for_run)) | ||
| 123 | return (AE_BAD_PARAMETER); | ||
| 124 | |||
| 125 | case ACPI_GPE_ENABLE: | ||
| 126 | ACPI_SET_BIT(enable_mask, register_bit); | ||
| 127 | break; | ||
| 128 | |||
| 129 | case ACPI_GPE_DISABLE: | ||
| 130 | ACPI_CLEAR_BIT(enable_mask, register_bit); | ||
| 131 | break; | ||
| 132 | |||
| 133 | default: | ||
| 134 | ACPI_ERROR((AE_INFO, "Invalid action\n")); | ||
| 135 | return (AE_BAD_PARAMETER); | ||
| 136 | } | ||
| 95 | 137 | ||
| 96 | /* Write the updated enable mask */ | 138 | /* Write the updated enable mask */ |
| 97 | 139 | ||
| @@ -116,23 +158,11 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
| 116 | acpi_status | 158 | acpi_status |
| 117 | acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info) | 159 | acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info) |
| 118 | { | 160 | { |
| 119 | struct acpi_gpe_register_info *gpe_register_info; | ||
| 120 | acpi_status status; | 161 | acpi_status status; |
| 121 | 162 | ||
| 122 | ACPI_FUNCTION_ENTRY(); | 163 | ACPI_FUNCTION_ENTRY(); |
| 123 | 164 | ||
| 124 | /* Get the info block for the entire GPE register */ | 165 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_COND_ENABLE); |
| 125 | |||
| 126 | gpe_register_info = gpe_event_info->register_info; | ||
| 127 | if (!gpe_register_info) { | ||
| 128 | return (AE_NOT_EXIST); | ||
| 129 | } | ||
| 130 | |||
| 131 | /* Write the entire GPE (runtime) enable register */ | ||
| 132 | |||
| 133 | status = acpi_hw_write(gpe_register_info->enable_for_run, | ||
| 134 | &gpe_register_info->enable_address); | ||
| 135 | |||
| 136 | return (status); | 166 | return (status); |
| 137 | } | 167 | } |
| 138 | 168 | ||
| @@ -150,21 +180,28 @@ acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info) | |||
| 150 | 180 | ||
| 151 | acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info) | 181 | acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info) |
| 152 | { | 182 | { |
| 183 | struct acpi_gpe_register_info *gpe_register_info; | ||
| 153 | acpi_status status; | 184 | acpi_status status; |
| 154 | u8 register_bit; | 185 | u32 register_bit; |
| 155 | 186 | ||
| 156 | ACPI_FUNCTION_ENTRY(); | 187 | ACPI_FUNCTION_ENTRY(); |
| 157 | 188 | ||
| 158 | register_bit = (u8)(1 << | 189 | /* Get the info block for the entire GPE register */ |
| 159 | (gpe_event_info->gpe_number - | 190 | |
| 160 | gpe_event_info->register_info->base_gpe_number)); | 191 | gpe_register_info = gpe_event_info->register_info; |
| 192 | if (!gpe_register_info) { | ||
| 193 | return (AE_NOT_EXIST); | ||
| 194 | } | ||
| 195 | |||
| 196 | register_bit = acpi_hw_gpe_register_bit(gpe_event_info, | ||
| 197 | gpe_register_info); | ||
| 161 | 198 | ||
| 162 | /* | 199 | /* |
| 163 | * Write a one to the appropriate bit in the status register to | 200 | * Write a one to the appropriate bit in the status register to |
| 164 | * clear this GPE. | 201 | * clear this GPE. |
| 165 | */ | 202 | */ |
| 166 | status = acpi_hw_write(register_bit, | 203 | status = acpi_hw_write(register_bit, |
| 167 | &gpe_event_info->register_info->status_address); | 204 | &gpe_register_info->status_address); |
| 168 | 205 | ||
| 169 | return (status); | 206 | return (status); |
| 170 | } | 207 | } |
| @@ -187,7 +224,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info, | |||
| 187 | acpi_event_status * event_status) | 224 | acpi_event_status * event_status) |
| 188 | { | 225 | { |
| 189 | u32 in_byte; | 226 | u32 in_byte; |
| 190 | u8 register_bit; | 227 | u32 register_bit; |
| 191 | struct acpi_gpe_register_info *gpe_register_info; | 228 | struct acpi_gpe_register_info *gpe_register_info; |
| 192 | acpi_status status; | 229 | acpi_status status; |
| 193 | acpi_event_status local_event_status = 0; | 230 | acpi_event_status local_event_status = 0; |
| @@ -204,9 +241,8 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info, | |||
| 204 | 241 | ||
| 205 | /* Get the register bitmask for this GPE */ | 242 | /* Get the register bitmask for this GPE */ |
| 206 | 243 | ||
| 207 | register_bit = (u8)(1 << | 244 | register_bit = acpi_hw_gpe_register_bit(gpe_event_info, |
| 208 | (gpe_event_info->gpe_number - | 245 | gpe_register_info); |
| 209 | gpe_event_info->register_info->base_gpe_number)); | ||
| 210 | 246 | ||
| 211 | /* GPE currently enabled? (enabled for runtime?) */ | 247 | /* GPE currently enabled? (enabled for runtime?) */ |
| 212 | 248 | ||
diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index c10d587c1641..e1d9c777b213 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c | |||
| @@ -222,6 +222,12 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) | |||
| 222 | u32 one_byte; | 222 | u32 one_byte; |
| 223 | u32 i; | 223 | u32 i; |
| 224 | 224 | ||
| 225 | /* Truncate address to 16 bits if requested */ | ||
| 226 | |||
| 227 | if (acpi_gbl_truncate_io_addresses) { | ||
| 228 | address &= ACPI_UINT16_MAX; | ||
| 229 | } | ||
| 230 | |||
| 225 | /* Validate the entire request and perform the I/O */ | 231 | /* Validate the entire request and perform the I/O */ |
| 226 | 232 | ||
| 227 | status = acpi_hw_validate_io_request(address, width); | 233 | status = acpi_hw_validate_io_request(address, width); |
| @@ -279,6 +285,12 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width) | |||
| 279 | acpi_status status; | 285 | acpi_status status; |
| 280 | u32 i; | 286 | u32 i; |
| 281 | 287 | ||
| 288 | /* Truncate address to 16 bits if requested */ | ||
| 289 | |||
| 290 | if (acpi_gbl_truncate_io_addresses) { | ||
| 291 | address &= ACPI_UINT16_MAX; | ||
| 292 | } | ||
| 293 | |||
| 282 | /* Validate the entire request and perform the I/O */ | 294 | /* Validate the entire request and perform the I/O */ |
| 283 | 295 | ||
| 284 | status = acpi_hw_validate_io_request(address, width); | 296 | status = acpi_hw_validate_io_request(address, width); |
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index 9bd6f050f299..4e5272c313e0 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
| @@ -193,6 +193,15 @@ acpi_status acpi_ns_initialize_devices(void) | |||
| 193 | acpi_ns_init_one_device, NULL, &info, | 193 | acpi_ns_init_one_device, NULL, &info, |
| 194 | NULL); | 194 | NULL); |
| 195 | 195 | ||
| 196 | /* | ||
| 197 | * Any _OSI requests should be completed by now. If the BIOS has | ||
| 198 | * requested any Windows OSI strings, we will always truncate | ||
| 199 | * I/O addresses to 16 bits -- for Windows compatibility. | ||
| 200 | */ | ||
| 201 | if (acpi_gbl_osi_data >= ACPI_OSI_WIN_2000) { | ||
| 202 | acpi_gbl_truncate_io_addresses = TRUE; | ||
| 203 | } | ||
| 204 | |||
| 196 | ACPI_FREE(info.evaluate_info); | 205 | ACPI_FREE(info.evaluate_info); |
| 197 | if (ACPI_FAILURE(status)) { | 206 | if (ACPI_FAILURE(status)) { |
| 198 | goto error_exit; | 207 | goto error_exit; |
diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c index db3946e9c66b..216e1e948ff6 100644 --- a/drivers/acpi/apei/apei-base.c +++ b/drivers/acpi/apei/apei-base.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
| 36 | #include <linux/acpi.h> | 36 | #include <linux/acpi.h> |
| 37 | #include <linux/slab.h> | ||
| 37 | #include <linux/io.h> | 38 | #include <linux/io.h> |
| 38 | #include <linux/kref.h> | 39 | #include <linux/kref.h> |
| 39 | #include <linux/rculist.h> | 40 | #include <linux/rculist.h> |
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c index 2ebc39115507..864dd46c346f 100644 --- a/drivers/acpi/apei/erst.c +++ b/drivers/acpi/apei/erst.c | |||
| @@ -781,7 +781,7 @@ static int __init erst_init(void) | |||
| 781 | status = acpi_get_table(ACPI_SIG_ERST, 0, | 781 | status = acpi_get_table(ACPI_SIG_ERST, 0, |
| 782 | (struct acpi_table_header **)&erst_tab); | 782 | (struct acpi_table_header **)&erst_tab); |
| 783 | if (status == AE_NOT_FOUND) { | 783 | if (status == AE_NOT_FOUND) { |
| 784 | pr_err(ERST_PFX "Table is not found!\n"); | 784 | pr_info(ERST_PFX "Table is not found!\n"); |
| 785 | goto err; | 785 | goto err; |
| 786 | } else if (ACPI_FAILURE(status)) { | 786 | } else if (ACPI_FAILURE(status)) { |
| 787 | const char *msg = acpi_format_exception(status); | 787 | const char *msg = acpi_format_exception(status); |
diff --git a/drivers/acpi/atomicio.c b/drivers/acpi/atomicio.c index 814b19249616..8f8bd736d4ff 100644 --- a/drivers/acpi/atomicio.c +++ b/drivers/acpi/atomicio.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/kref.h> | 31 | #include <linux/kref.h> |
| 32 | #include <linux/rculist.h> | 32 | #include <linux/rculist.h> |
| 33 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
| 34 | #include <linux/slab.h> | ||
| 34 | #include <acpi/atomicio.h> | 35 | #include <acpi/atomicio.h> |
| 35 | 36 | ||
| 36 | #define ACPI_PFX "ACPI: " | 37 | #define ACPI_PFX "ACPI: " |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index 2815df66f6f7..01381be05e96 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
| @@ -218,6 +218,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
| 218 | }, | 218 | }, |
| 219 | }, | 219 | }, |
| 220 | { | 220 | { |
| 221 | .callback = dmi_disable_osi_vista, | ||
| 222 | .ident = "VGN-NS50B_L", | ||
| 223 | .matches = { | ||
| 224 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
| 225 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NS50B_L"), | ||
| 226 | }, | ||
| 227 | }, | ||
| 228 | { | ||
| 221 | .callback = dmi_disable_osi_win7, | 229 | .callback = dmi_disable_osi_win7, |
| 222 | .ident = "ASUS K50IJ", | 230 | .ident = "ASUS K50IJ", |
| 223 | .matches = { | 231 | .matches = { |
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index fd51c4ab4829..7d857dabdde4 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
| @@ -425,7 +425,7 @@ static int acpi_button_add(struct acpi_device *device) | |||
| 425 | /* Button's GPE is run-wake GPE */ | 425 | /* Button's GPE is run-wake GPE */ |
| 426 | acpi_enable_gpe(device->wakeup.gpe_device, | 426 | acpi_enable_gpe(device->wakeup.gpe_device, |
| 427 | device->wakeup.gpe_number, | 427 | device->wakeup.gpe_number, |
| 428 | ACPI_GPE_TYPE_WAKE_RUN); | 428 | ACPI_GPE_TYPE_RUNTIME); |
| 429 | device->wakeup.run_wake_count++; | 429 | device->wakeup.run_wake_count++; |
| 430 | device->wakeup.state.enabled = 1; | 430 | device->wakeup.state.enabled = 1; |
| 431 | } | 431 | } |
| @@ -449,7 +449,7 @@ static int acpi_button_remove(struct acpi_device *device, int type) | |||
| 449 | if (device->wakeup.flags.valid) { | 449 | if (device->wakeup.flags.valid) { |
| 450 | acpi_disable_gpe(device->wakeup.gpe_device, | 450 | acpi_disable_gpe(device->wakeup.gpe_device, |
| 451 | device->wakeup.gpe_number, | 451 | device->wakeup.gpe_number, |
| 452 | ACPI_GPE_TYPE_WAKE_RUN); | 452 | ACPI_GPE_TYPE_RUNTIME); |
| 453 | device->wakeup.run_wake_count--; | 453 | device->wakeup.run_wake_count--; |
| 454 | device->wakeup.state.enabled = 0; | 454 | device->wakeup.state.enabled = 0; |
| 455 | } | 455 | } |
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index acf2ab249842..8a3b840c0bb2 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
| @@ -347,7 +347,6 @@ static int __init acpi_fan_init(void) | |||
| 347 | { | 347 | { |
| 348 | int result = 0; | 348 | int result = 0; |
| 349 | 349 | ||
| 350 | |||
| 351 | #ifdef CONFIG_ACPI_PROCFS | 350 | #ifdef CONFIG_ACPI_PROCFS |
| 352 | acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir); | 351 | acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir); |
| 353 | if (!acpi_fan_dir) | 352 | if (!acpi_fan_dir) |
| @@ -356,7 +355,9 @@ static int __init acpi_fan_init(void) | |||
| 356 | 355 | ||
| 357 | result = acpi_bus_register_driver(&acpi_fan_driver); | 356 | result = acpi_bus_register_driver(&acpi_fan_driver); |
| 358 | if (result < 0) { | 357 | if (result < 0) { |
| 358 | #ifdef CONFIG_ACPI_PROCFS | ||
| 359 | remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir); | 359 | remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir); |
| 360 | #endif | ||
| 360 | return -ENODEV; | 361 | return -ENODEV; |
| 361 | } | 362 | } |
| 362 | 363 | ||
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index b1034a9ada4e..38ea0cc6dc49 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
| @@ -581,6 +581,11 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) | |||
| 581 | return 0; | 581 | return 0; |
| 582 | } | 582 | } |
| 583 | 583 | ||
| 584 | #ifdef CONFIG_SMP | ||
| 585 | if (pr->id >= setup_max_cpus && pr->id != 0) | ||
| 586 | return 0; | ||
| 587 | #endif | ||
| 588 | |||
| 584 | BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); | 589 | BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); |
| 585 | 590 | ||
| 586 | /* | 591 | /* |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 3fb4bdea7e06..5b7c52e4a00f 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -114,6 +114,8 @@ static int __acpi_pm_prepare(void) | |||
| 114 | { | 114 | { |
| 115 | int error = acpi_sleep_prepare(acpi_target_sleep_state); | 115 | int error = acpi_sleep_prepare(acpi_target_sleep_state); |
| 116 | 116 | ||
| 117 | suspend_nvs_save(); | ||
| 118 | |||
| 117 | if (error) | 119 | if (error) |
| 118 | acpi_target_sleep_state = ACPI_STATE_S0; | 120 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 119 | return error; | 121 | return error; |
| @@ -143,6 +145,9 @@ static void acpi_pm_finish(void) | |||
| 143 | { | 145 | { |
| 144 | u32 acpi_state = acpi_target_sleep_state; | 146 | u32 acpi_state = acpi_target_sleep_state; |
| 145 | 147 | ||
| 148 | suspend_nvs_free(); | ||
| 149 | acpi_ec_unblock_transactions(); | ||
| 150 | |||
| 146 | if (acpi_state == ACPI_STATE_S0) | 151 | if (acpi_state == ACPI_STATE_S0) |
| 147 | return; | 152 | return; |
| 148 | 153 | ||
| @@ -192,6 +197,11 @@ static int acpi_suspend_begin(suspend_state_t pm_state) | |||
| 192 | u32 acpi_state = acpi_suspend_states[pm_state]; | 197 | u32 acpi_state = acpi_suspend_states[pm_state]; |
| 193 | int error = 0; | 198 | int error = 0; |
| 194 | 199 | ||
| 200 | error = suspend_nvs_alloc(); | ||
| 201 | |||
| 202 | if (error) | ||
| 203 | return error; | ||
| 204 | |||
| 195 | if (sleep_states[acpi_state]) { | 205 | if (sleep_states[acpi_state]) { |
| 196 | acpi_target_sleep_state = acpi_state; | 206 | acpi_target_sleep_state = acpi_state; |
| 197 | acpi_sleep_tts_switch(acpi_target_sleep_state); | 207 | acpi_sleep_tts_switch(acpi_target_sleep_state); |
| @@ -269,12 +279,13 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | |||
| 269 | if (acpi_state == ACPI_STATE_S3) | 279 | if (acpi_state == ACPI_STATE_S3) |
| 270 | acpi_restore_state_mem(); | 280 | acpi_restore_state_mem(); |
| 271 | 281 | ||
| 282 | suspend_nvs_restore(); | ||
| 283 | |||
| 272 | return ACPI_SUCCESS(status) ? 0 : -EFAULT; | 284 | return ACPI_SUCCESS(status) ? 0 : -EFAULT; |
| 273 | } | 285 | } |
| 274 | 286 | ||
| 275 | static void acpi_suspend_finish(void) | 287 | static void acpi_suspend_finish(void) |
| 276 | { | 288 | { |
| 277 | acpi_ec_unblock_transactions(); | ||
| 278 | acpi_pm_finish(); | 289 | acpi_pm_finish(); |
| 279 | } | 290 | } |
| 280 | 291 | ||
| @@ -404,7 +415,7 @@ static int acpi_hibernation_begin(void) | |||
| 404 | { | 415 | { |
| 405 | int error; | 416 | int error; |
| 406 | 417 | ||
| 407 | error = s4_no_nvs ? 0 : hibernate_nvs_alloc(); | 418 | error = s4_no_nvs ? 0 : suspend_nvs_alloc(); |
| 408 | if (!error) { | 419 | if (!error) { |
| 409 | acpi_target_sleep_state = ACPI_STATE_S4; | 420 | acpi_target_sleep_state = ACPI_STATE_S4; |
| 410 | acpi_sleep_tts_switch(acpi_target_sleep_state); | 421 | acpi_sleep_tts_switch(acpi_target_sleep_state); |
| @@ -418,7 +429,7 @@ static int acpi_hibernation_pre_snapshot(void) | |||
| 418 | int error = acpi_pm_prepare(); | 429 | int error = acpi_pm_prepare(); |
| 419 | 430 | ||
| 420 | if (!error) | 431 | if (!error) |
| 421 | hibernate_nvs_save(); | 432 | suspend_nvs_save(); |
| 422 | 433 | ||
| 423 | return error; | 434 | return error; |
| 424 | } | 435 | } |
| @@ -441,13 +452,6 @@ static int acpi_hibernation_enter(void) | |||
| 441 | return ACPI_SUCCESS(status) ? 0 : -EFAULT; | 452 | return ACPI_SUCCESS(status) ? 0 : -EFAULT; |
| 442 | } | 453 | } |
| 443 | 454 | ||
| 444 | static void acpi_hibernation_finish(void) | ||
| 445 | { | ||
| 446 | hibernate_nvs_free(); | ||
| 447 | acpi_ec_unblock_transactions(); | ||
| 448 | acpi_pm_finish(); | ||
| 449 | } | ||
| 450 | |||
| 451 | static void acpi_hibernation_leave(void) | 455 | static void acpi_hibernation_leave(void) |
| 452 | { | 456 | { |
| 453 | /* | 457 | /* |
| @@ -464,7 +468,7 @@ static void acpi_hibernation_leave(void) | |||
| 464 | panic("ACPI S4 hardware signature mismatch"); | 468 | panic("ACPI S4 hardware signature mismatch"); |
| 465 | } | 469 | } |
| 466 | /* Restore the NVS memory area */ | 470 | /* Restore the NVS memory area */ |
| 467 | hibernate_nvs_restore(); | 471 | suspend_nvs_restore(); |
| 468 | /* Allow EC transactions to happen. */ | 472 | /* Allow EC transactions to happen. */ |
| 469 | acpi_ec_unblock_transactions_early(); | 473 | acpi_ec_unblock_transactions_early(); |
| 470 | } | 474 | } |
| @@ -479,7 +483,7 @@ static struct platform_hibernation_ops acpi_hibernation_ops = { | |||
| 479 | .begin = acpi_hibernation_begin, | 483 | .begin = acpi_hibernation_begin, |
| 480 | .end = acpi_pm_end, | 484 | .end = acpi_pm_end, |
| 481 | .pre_snapshot = acpi_hibernation_pre_snapshot, | 485 | .pre_snapshot = acpi_hibernation_pre_snapshot, |
| 482 | .finish = acpi_hibernation_finish, | 486 | .finish = acpi_pm_finish, |
| 483 | .prepare = acpi_pm_prepare, | 487 | .prepare = acpi_pm_prepare, |
| 484 | .enter = acpi_hibernation_enter, | 488 | .enter = acpi_hibernation_enter, |
| 485 | .leave = acpi_hibernation_leave, | 489 | .leave = acpi_hibernation_leave, |
| @@ -507,7 +511,7 @@ static int acpi_hibernation_begin_old(void) | |||
| 507 | 511 | ||
| 508 | if (!error) { | 512 | if (!error) { |
| 509 | if (!s4_no_nvs) | 513 | if (!s4_no_nvs) |
| 510 | error = hibernate_nvs_alloc(); | 514 | error = suspend_nvs_alloc(); |
| 511 | if (!error) | 515 | if (!error) |
| 512 | acpi_target_sleep_state = ACPI_STATE_S4; | 516 | acpi_target_sleep_state = ACPI_STATE_S4; |
| 513 | } | 517 | } |
| @@ -517,7 +521,7 @@ static int acpi_hibernation_begin_old(void) | |||
| 517 | static int acpi_hibernation_pre_snapshot_old(void) | 521 | static int acpi_hibernation_pre_snapshot_old(void) |
| 518 | { | 522 | { |
| 519 | acpi_pm_freeze(); | 523 | acpi_pm_freeze(); |
| 520 | hibernate_nvs_save(); | 524 | suspend_nvs_save(); |
| 521 | return 0; | 525 | return 0; |
| 522 | } | 526 | } |
| 523 | 527 | ||
| @@ -529,8 +533,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops_old = { | |||
| 529 | .begin = acpi_hibernation_begin_old, | 533 | .begin = acpi_hibernation_begin_old, |
| 530 | .end = acpi_pm_end, | 534 | .end = acpi_pm_end, |
| 531 | .pre_snapshot = acpi_hibernation_pre_snapshot_old, | 535 | .pre_snapshot = acpi_hibernation_pre_snapshot_old, |
| 532 | .finish = acpi_hibernation_finish, | ||
| 533 | .prepare = acpi_pm_freeze, | 536 | .prepare = acpi_pm_freeze, |
| 537 | .finish = acpi_pm_finish, | ||
| 534 | .enter = acpi_hibernation_enter, | 538 | .enter = acpi_hibernation_enter, |
| 535 | .leave = acpi_hibernation_leave, | 539 | .leave = acpi_hibernation_leave, |
| 536 | .pre_restore = acpi_pm_freeze, | 540 | .pre_restore = acpi_pm_freeze, |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index c79e789ed03a..f8db50a0941c 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
| @@ -388,10 +388,12 @@ static ssize_t counter_set(struct kobject *kobj, | |||
| 388 | if (index < num_gpes) { | 388 | if (index < num_gpes) { |
| 389 | if (!strcmp(buf, "disable\n") && | 389 | if (!strcmp(buf, "disable\n") && |
| 390 | (status & ACPI_EVENT_FLAG_ENABLED)) | 390 | (status & ACPI_EVENT_FLAG_ENABLED)) |
| 391 | result = acpi_set_gpe(handle, index, ACPI_GPE_DISABLE); | 391 | result = acpi_disable_gpe(handle, index, |
| 392 | ACPI_GPE_TYPE_RUNTIME); | ||
| 392 | else if (!strcmp(buf, "enable\n") && | 393 | else if (!strcmp(buf, "enable\n") && |
| 393 | !(status & ACPI_EVENT_FLAG_ENABLED)) | 394 | !(status & ACPI_EVENT_FLAG_ENABLED)) |
| 394 | result = acpi_set_gpe(handle, index, ACPI_GPE_ENABLE); | 395 | result = acpi_enable_gpe(handle, index, |
| 396 | ACPI_GPE_TYPE_RUNTIME); | ||
| 395 | else if (!strcmp(buf, "clear\n") && | 397 | else if (!strcmp(buf, "clear\n") && |
| 396 | (status & ACPI_EVENT_FLAG_SET)) | 398 | (status & ACPI_EVENT_FLAG_SET)) |
| 397 | result = acpi_clear_gpe(handle, index); | 399 | result = acpi_clear_gpe(handle, index); |
diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c index 4b9d339a6e28..388747a7ef4f 100644 --- a/drivers/acpi/wakeup.c +++ b/drivers/acpi/wakeup.c | |||
| @@ -64,16 +64,13 @@ void acpi_enable_wakeup_device(u8 sleep_state) | |||
| 64 | struct acpi_device *dev = | 64 | struct acpi_device *dev = |
| 65 | container_of(node, struct acpi_device, wakeup_list); | 65 | container_of(node, struct acpi_device, wakeup_list); |
| 66 | 66 | ||
| 67 | if (!dev->wakeup.flags.valid) | 67 | if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled |
| 68 | continue; | ||
| 69 | |||
| 70 | if ((!dev->wakeup.state.enabled && !dev->wakeup.prepare_count) | ||
| 71 | || sleep_state > (u32) dev->wakeup.sleep_state) | 68 | || sleep_state > (u32) dev->wakeup.sleep_state) |
| 72 | continue; | 69 | continue; |
| 73 | 70 | ||
| 74 | /* The wake-up power should have been enabled already. */ | 71 | /* The wake-up power should have been enabled already. */ |
| 75 | acpi_set_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, | 72 | acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, |
| 76 | ACPI_GPE_ENABLE); | 73 | ACPI_GPE_TYPE_WAKE); |
| 77 | } | 74 | } |
| 78 | } | 75 | } |
| 79 | 76 | ||
| @@ -96,6 +93,8 @@ void acpi_disable_wakeup_device(u8 sleep_state) | |||
| 96 | || (sleep_state > (u32) dev->wakeup.sleep_state)) | 93 | || (sleep_state > (u32) dev->wakeup.sleep_state)) |
| 97 | continue; | 94 | continue; |
| 98 | 95 | ||
| 96 | acpi_disable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, | ||
| 97 | ACPI_GPE_TYPE_WAKE); | ||
| 99 | acpi_disable_wakeup_device_power(dev); | 98 | acpi_disable_wakeup_device_power(dev); |
| 100 | } | 99 | } |
| 101 | } | 100 | } |
| @@ -109,13 +108,8 @@ int __init acpi_wakeup_device_init(void) | |||
| 109 | struct acpi_device *dev = container_of(node, | 108 | struct acpi_device *dev = container_of(node, |
| 110 | struct acpi_device, | 109 | struct acpi_device, |
| 111 | wakeup_list); | 110 | wakeup_list); |
| 112 | /* In case user doesn't load button driver */ | 111 | if (dev->wakeup.flags.always_enabled) |
| 113 | if (!dev->wakeup.flags.always_enabled || | 112 | dev->wakeup.state.enabled = 1; |
| 114 | dev->wakeup.state.enabled) | ||
| 115 | continue; | ||
| 116 | acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, | ||
| 117 | ACPI_GPE_TYPE_WAKE); | ||
| 118 | dev->wakeup.state.enabled = 1; | ||
| 119 | } | 113 | } |
| 120 | mutex_unlock(&acpi_device_lock); | 114 | mutex_unlock(&acpi_device_lock); |
| 121 | return 0; | 115 | return 0; |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 8ca16f54e1ed..f2522534ae63 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -1053,6 +1053,16 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1053 | if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable) | 1053 | if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable) |
| 1054 | return -ENODEV; | 1054 | return -ENODEV; |
| 1055 | 1055 | ||
| 1056 | /* | ||
| 1057 | * For some reason, MCP89 on MacBook 7,1 doesn't work with | ||
| 1058 | * ahci, use ata_generic instead. | ||
| 1059 | */ | ||
| 1060 | if (pdev->vendor == PCI_VENDOR_ID_NVIDIA && | ||
| 1061 | pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA && | ||
| 1062 | pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && | ||
| 1063 | pdev->subsystem_device == 0xcb89) | ||
| 1064 | return -ENODEV; | ||
| 1065 | |||
| 1056 | /* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode. | 1066 | /* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode. |
| 1057 | * At the moment, we can only use the AHCI mode. Let the users know | 1067 | * At the moment, we can only use the AHCI mode. Let the users know |
| 1058 | * that for SAS drives they're out of luck. | 1068 | * that for SAS drives they're out of luck. |
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 573158a9668d..7107a6929deb 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
| @@ -32,6 +32,11 @@ | |||
| 32 | * A generic parallel ATA driver using libata | 32 | * A generic parallel ATA driver using libata |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | enum { | ||
| 36 | ATA_GEN_CLASS_MATCH = (1 << 0), | ||
| 37 | ATA_GEN_FORCE_DMA = (1 << 1), | ||
| 38 | }; | ||
| 39 | |||
| 35 | /** | 40 | /** |
| 36 | * generic_set_mode - mode setting | 41 | * generic_set_mode - mode setting |
| 37 | * @link: link to set up | 42 | * @link: link to set up |
| @@ -46,13 +51,17 @@ | |||
| 46 | static int generic_set_mode(struct ata_link *link, struct ata_device **unused) | 51 | static int generic_set_mode(struct ata_link *link, struct ata_device **unused) |
| 47 | { | 52 | { |
| 48 | struct ata_port *ap = link->ap; | 53 | struct ata_port *ap = link->ap; |
| 54 | const struct pci_device_id *id = ap->host->private_data; | ||
| 49 | int dma_enabled = 0; | 55 | int dma_enabled = 0; |
| 50 | struct ata_device *dev; | 56 | struct ata_device *dev; |
| 51 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 57 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 52 | 58 | ||
| 53 | /* Bits 5 and 6 indicate if DMA is active on master/slave */ | 59 | if (id->driver_data & ATA_GEN_FORCE_DMA) { |
| 54 | if (ap->ioaddr.bmdma_addr) | 60 | dma_enabled = 0xff; |
| 61 | } else if (ap->ioaddr.bmdma_addr) { | ||
| 62 | /* Bits 5 and 6 indicate if DMA is active on master/slave */ | ||
| 55 | dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); | 63 | dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); |
| 64 | } | ||
| 56 | 65 | ||
| 57 | if (pdev->vendor == PCI_VENDOR_ID_CENATEK) | 66 | if (pdev->vendor == PCI_VENDOR_ID_CENATEK) |
| 58 | dma_enabled = 0xFF; | 67 | dma_enabled = 0xFF; |
| @@ -126,7 +135,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id | |||
| 126 | const struct ata_port_info *ppi[] = { &info, NULL }; | 135 | const struct ata_port_info *ppi[] = { &info, NULL }; |
| 127 | 136 | ||
| 128 | /* Don't use the generic entry unless instructed to do so */ | 137 | /* Don't use the generic entry unless instructed to do so */ |
| 129 | if (id->driver_data == 1 && all_generic_ide == 0) | 138 | if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0) |
| 130 | return -ENODEV; | 139 | return -ENODEV; |
| 131 | 140 | ||
| 132 | /* Devices that need care */ | 141 | /* Devices that need care */ |
| @@ -155,7 +164,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id | |||
| 155 | return rc; | 164 | return rc; |
| 156 | pcim_pin_device(dev); | 165 | pcim_pin_device(dev); |
| 157 | } | 166 | } |
| 158 | return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, NULL, 0); | 167 | return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0); |
| 159 | } | 168 | } |
| 160 | 169 | ||
| 161 | static struct pci_device_id ata_generic[] = { | 170 | static struct pci_device_id ata_generic[] = { |
| @@ -167,7 +176,15 @@ static struct pci_device_id ata_generic[] = { | |||
| 167 | { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), }, | 176 | { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), }, |
| 168 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, | 177 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, |
| 169 | { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, | 178 | { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, |
| 170 | { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), }, | 179 | { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), |
| 180 | .driver_data = ATA_GEN_FORCE_DMA }, | ||
| 181 | /* | ||
| 182 | * For some reason, MCP89 on MacBook 7,1 doesn't work with | ||
| 183 | * ahci, use ata_generic instead. | ||
| 184 | */ | ||
| 185 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA, | ||
| 186 | PCI_VENDOR_ID_APPLE, 0xcb89, | ||
| 187 | .driver_data = ATA_GEN_FORCE_DMA }, | ||
| 171 | #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) | 188 | #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) |
| 172 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, | 189 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, |
| 173 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, | 190 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, |
| @@ -175,7 +192,8 @@ static struct pci_device_id ata_generic[] = { | |||
| 175 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), }, | 192 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), }, |
| 176 | #endif | 193 | #endif |
| 177 | /* Must come last. If you add entries adjust this table appropriately */ | 194 | /* Must come last. If you add entries adjust this table appropriately */ |
| 178 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1}, | 195 | { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL), |
| 196 | .driver_data = ATA_GEN_CLASS_MATCH }, | ||
| 179 | { 0, }, | 197 | { 0, }, |
| 180 | }; | 198 | }; |
| 181 | 199 | ||
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 261f86d102e8..81e772a94d59 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
| @@ -324,6 +324,7 @@ static ssize_t ahci_store_em_buffer(struct device *dev, | |||
| 324 | struct ahci_host_priv *hpriv = ap->host->private_data; | 324 | struct ahci_host_priv *hpriv = ap->host->private_data; |
| 325 | void __iomem *mmio = hpriv->mmio; | 325 | void __iomem *mmio = hpriv->mmio; |
| 326 | void __iomem *em_mmio = mmio + hpriv->em_loc; | 326 | void __iomem *em_mmio = mmio + hpriv->em_loc; |
| 327 | const unsigned char *msg_buf = buf; | ||
| 327 | u32 em_ctl, msg; | 328 | u32 em_ctl, msg; |
| 328 | unsigned long flags; | 329 | unsigned long flags; |
| 329 | int i; | 330 | int i; |
| @@ -343,8 +344,8 @@ static ssize_t ahci_store_em_buffer(struct device *dev, | |||
| 343 | } | 344 | } |
| 344 | 345 | ||
| 345 | for (i = 0; i < size; i += 4) { | 346 | for (i = 0; i < size; i += 4) { |
| 346 | msg = buf[i] | buf[i + 1] << 8 | | 347 | msg = msg_buf[i] | msg_buf[i + 1] << 8 | |
| 347 | buf[i + 2] << 16 | buf[i + 3] << 24; | 348 | msg_buf[i + 2] << 16 | msg_buf[i + 3] << 24; |
| 348 | writel(msg, em_mmio + i); | 349 | writel(msg, em_mmio + i); |
| 349 | } | 350 | } |
| 350 | 351 | ||
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 3381505c8a6c..72dae92f3cab 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
| @@ -861,6 +861,7 @@ cciss_scsi_detect(int ctlr) | |||
| 861 | sh->n_io_port = 0; // I don't think we use these two... | 861 | sh->n_io_port = 0; // I don't think we use these two... |
| 862 | sh->this_id = SELF_SCSI_ID; | 862 | sh->this_id = SELF_SCSI_ID; |
| 863 | sh->sg_tablesize = hba[ctlr]->maxsgentries; | 863 | sh->sg_tablesize = hba[ctlr]->maxsgentries; |
| 864 | sh->max_cmd_len = MAX_COMMAND_SIZE; | ||
| 864 | 865 | ||
| 865 | ((struct cciss_scsi_adapter_data_t *) | 866 | ((struct cciss_scsi_adapter_data_t *) |
| 866 | hba[ctlr]->scsi_ctlr)->scsi_host = sh; | 867 | hba[ctlr]->scsi_ctlr)->scsi_host = sh; |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 91d11631cec9..abb4ec6690fc 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
| @@ -386,7 +386,7 @@ static void __devexit cpqarray_remove_one_eisa (int i) | |||
| 386 | } | 386 | } |
| 387 | 387 | ||
| 388 | /* pdev is NULL for eisa */ | 388 | /* pdev is NULL for eisa */ |
| 389 | static int __init cpqarray_register_ctlr( int i, struct pci_dev *pdev) | 389 | static int __devinit cpqarray_register_ctlr( int i, struct pci_dev *pdev) |
| 390 | { | 390 | { |
| 391 | struct request_queue *q; | 391 | struct request_queue *q; |
| 392 | int j; | 392 | int j; |
| @@ -503,7 +503,7 @@ Enomem4: | |||
| 503 | return -1; | 503 | return -1; |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | static int __init cpqarray_init_one( struct pci_dev *pdev, | 506 | static int __devinit cpqarray_init_one( struct pci_dev *pdev, |
| 507 | const struct pci_device_id *ent) | 507 | const struct pci_device_id *ent) |
| 508 | { | 508 | { |
| 509 | int i; | 509 | int i; |
| @@ -740,7 +740,7 @@ __setup("smart2=", cpqarray_setup); | |||
| 740 | /* | 740 | /* |
| 741 | * Find an EISA controller's signature. Set up an hba if we find it. | 741 | * Find an EISA controller's signature. Set up an hba if we find it. |
| 742 | */ | 742 | */ |
| 743 | static int __init cpqarray_eisa_detect(void) | 743 | static int __devinit cpqarray_eisa_detect(void) |
| 744 | { | 744 | { |
| 745 | int i=0, j; | 745 | int i=0, j; |
| 746 | __u32 board_id; | 746 | __u32 board_id; |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 6b077f93acc6..7258c95e895e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -1236,8 +1236,6 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
| 1236 | /* Last part of the attaching process ... */ | 1236 | /* Last part of the attaching process ... */ |
| 1237 | if (ns.conn >= C_CONNECTED && | 1237 | if (ns.conn >= C_CONNECTED && |
| 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { | 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { |
| 1239 | kfree(mdev->p_uuid); /* We expect to receive up-to-date UUIDs soon. */ | ||
| 1240 | mdev->p_uuid = NULL; /* ...to not use the old ones in the mean time */ | ||
| 1241 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ | 1239 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ |
| 1242 | drbd_send_uuids(mdev); | 1240 | drbd_send_uuids(mdev); |
| 1243 | drbd_send_state(mdev); | 1241 | drbd_send_state(mdev); |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 632e3245d1bb..2151f18b21de 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
| @@ -1114,6 +1114,12 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
| 1114 | mdev->new_state_tmp.i = ns.i; | 1114 | mdev->new_state_tmp.i = ns.i; |
| 1115 | ns.i = os.i; | 1115 | ns.i = os.i; |
| 1116 | ns.disk = D_NEGOTIATING; | 1116 | ns.disk = D_NEGOTIATING; |
| 1117 | |||
| 1118 | /* We expect to receive up-to-date UUIDs soon. | ||
| 1119 | To avoid a race in receive_state, free p_uuid while | ||
| 1120 | holding req_lock. I.e. atomic with the state change */ | ||
| 1121 | kfree(mdev->p_uuid); | ||
| 1122 | mdev->p_uuid = NULL; | ||
| 1117 | } | 1123 | } |
| 1118 | 1124 | ||
| 1119 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); | 1125 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 4b51982fd23a..d2abf5143983 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -97,20 +97,18 @@ EXPORT_SYMBOL(agp_flush_chipset); | |||
| 97 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) | 97 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) |
| 98 | { | 98 | { |
| 99 | mem->pages = NULL; | 99 | mem->pages = NULL; |
| 100 | mem->vmalloc_flag = false; | ||
| 101 | 100 | ||
| 102 | if (size <= 2*PAGE_SIZE) | 101 | if (size <= 2*PAGE_SIZE) |
| 103 | mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NORETRY); | 102 | mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
| 104 | if (mem->pages == NULL) { | 103 | if (mem->pages == NULL) { |
| 105 | mem->pages = vmalloc(size); | 104 | mem->pages = vmalloc(size); |
| 106 | mem->vmalloc_flag = true; | ||
| 107 | } | 105 | } |
| 108 | } | 106 | } |
| 109 | EXPORT_SYMBOL(agp_alloc_page_array); | 107 | EXPORT_SYMBOL(agp_alloc_page_array); |
| 110 | 108 | ||
| 111 | void agp_free_page_array(struct agp_memory *mem) | 109 | void agp_free_page_array(struct agp_memory *mem) |
| 112 | { | 110 | { |
| 113 | if (mem->vmalloc_flag) { | 111 | if (is_vmalloc_addr(mem->pages)) { |
| 114 | vfree(mem->pages); | 112 | vfree(mem->pages); |
| 115 | } else { | 113 | } else { |
| 116 | kfree(mem->pages); | 114 | kfree(mem->pages); |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 35603dd4e6c5..094bdc355b1f 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -302,6 +302,12 @@ struct smi_info { | |||
| 302 | 302 | ||
| 303 | static int force_kipmid[SI_MAX_PARMS]; | 303 | static int force_kipmid[SI_MAX_PARMS]; |
| 304 | static int num_force_kipmid; | 304 | static int num_force_kipmid; |
| 305 | #ifdef CONFIG_PCI | ||
| 306 | static int pci_registered; | ||
| 307 | #endif | ||
| 308 | #ifdef CONFIG_PPC_OF | ||
| 309 | static int of_registered; | ||
| 310 | #endif | ||
| 305 | 311 | ||
| 306 | static unsigned int kipmid_max_busy_us[SI_MAX_PARMS]; | 312 | static unsigned int kipmid_max_busy_us[SI_MAX_PARMS]; |
| 307 | static int num_max_busy_us; | 313 | static int num_max_busy_us; |
| @@ -1018,7 +1024,7 @@ static int ipmi_thread(void *data) | |||
| 1018 | else if (smi_result == SI_SM_IDLE) | 1024 | else if (smi_result == SI_SM_IDLE) |
| 1019 | schedule_timeout_interruptible(100); | 1025 | schedule_timeout_interruptible(100); |
| 1020 | else | 1026 | else |
| 1021 | schedule_timeout_interruptible(0); | 1027 | schedule_timeout_interruptible(1); |
| 1022 | } | 1028 | } |
| 1023 | return 0; | 1029 | return 0; |
| 1024 | } | 1030 | } |
| @@ -3314,6 +3320,8 @@ static __devinit int init_ipmi_si(void) | |||
| 3314 | rv = pci_register_driver(&ipmi_pci_driver); | 3320 | rv = pci_register_driver(&ipmi_pci_driver); |
| 3315 | if (rv) | 3321 | if (rv) |
| 3316 | printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv); | 3322 | printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv); |
| 3323 | else | ||
| 3324 | pci_registered = 1; | ||
| 3317 | #endif | 3325 | #endif |
| 3318 | 3326 | ||
| 3319 | #ifdef CONFIG_ACPI | 3327 | #ifdef CONFIG_ACPI |
| @@ -3330,6 +3338,7 @@ static __devinit int init_ipmi_si(void) | |||
| 3330 | 3338 | ||
| 3331 | #ifdef CONFIG_PPC_OF | 3339 | #ifdef CONFIG_PPC_OF |
| 3332 | of_register_platform_driver(&ipmi_of_platform_driver); | 3340 | of_register_platform_driver(&ipmi_of_platform_driver); |
| 3341 | of_registered = 1; | ||
| 3333 | #endif | 3342 | #endif |
| 3334 | 3343 | ||
| 3335 | /* We prefer devices with interrupts, but in the case of a machine | 3344 | /* We prefer devices with interrupts, but in the case of a machine |
| @@ -3383,11 +3392,13 @@ static __devinit int init_ipmi_si(void) | |||
| 3383 | if (unload_when_empty && list_empty(&smi_infos)) { | 3392 | if (unload_when_empty && list_empty(&smi_infos)) { |
| 3384 | mutex_unlock(&smi_infos_lock); | 3393 | mutex_unlock(&smi_infos_lock); |
| 3385 | #ifdef CONFIG_PCI | 3394 | #ifdef CONFIG_PCI |
| 3386 | pci_unregister_driver(&ipmi_pci_driver); | 3395 | if (pci_registered) |
| 3396 | pci_unregister_driver(&ipmi_pci_driver); | ||
| 3387 | #endif | 3397 | #endif |
| 3388 | 3398 | ||
| 3389 | #ifdef CONFIG_PPC_OF | 3399 | #ifdef CONFIG_PPC_OF |
| 3390 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3400 | if (of_registered) |
| 3401 | of_unregister_platform_driver(&ipmi_of_platform_driver); | ||
| 3391 | #endif | 3402 | #endif |
| 3392 | driver_unregister(&ipmi_driver.driver); | 3403 | driver_unregister(&ipmi_driver.driver); |
| 3393 | printk(KERN_WARNING PFX | 3404 | printk(KERN_WARNING PFX |
| @@ -3478,14 +3489,16 @@ static __exit void cleanup_ipmi_si(void) | |||
| 3478 | return; | 3489 | return; |
| 3479 | 3490 | ||
| 3480 | #ifdef CONFIG_PCI | 3491 | #ifdef CONFIG_PCI |
| 3481 | pci_unregister_driver(&ipmi_pci_driver); | 3492 | if (pci_registered) |
| 3493 | pci_unregister_driver(&ipmi_pci_driver); | ||
| 3482 | #endif | 3494 | #endif |
| 3483 | #ifdef CONFIG_ACPI | 3495 | #ifdef CONFIG_ACPI |
| 3484 | pnp_unregister_driver(&ipmi_pnp_driver); | 3496 | pnp_unregister_driver(&ipmi_pnp_driver); |
| 3485 | #endif | 3497 | #endif |
| 3486 | 3498 | ||
| 3487 | #ifdef CONFIG_PPC_OF | 3499 | #ifdef CONFIG_PPC_OF |
| 3488 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3500 | if (of_registered) |
| 3501 | of_unregister_platform_driver(&ipmi_of_platform_driver); | ||
| 3489 | #endif | 3502 | #endif |
| 3490 | 3503 | ||
| 3491 | mutex_lock(&smi_infos_lock); | 3504 | mutex_lock(&smi_infos_lock); |
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c index 5d15630a5830..5d64e3acb000 100644 --- a/drivers/char/sysrq.c +++ b/drivers/char/sysrq.c | |||
| @@ -580,8 +580,12 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type, | |||
| 580 | case KEY_RIGHTALT: | 580 | case KEY_RIGHTALT: |
| 581 | if (value) | 581 | if (value) |
| 582 | sysrq_alt = code; | 582 | sysrq_alt = code; |
| 583 | else if (sysrq_down && code == sysrq_alt_use) | 583 | else { |
| 584 | sysrq_down = false; | 584 | if (sysrq_down && code == sysrq_alt_use) |
| 585 | sysrq_down = false; | ||
| 586 | |||
| 587 | sysrq_alt = 0; | ||
| 588 | } | ||
| 585 | break; | 589 | break; |
| 586 | 590 | ||
| 587 | case KEY_SYSRQ: | 591 | case KEY_SYSRQ: |
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 8e00b4ddd083..792868d24f2a 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h | |||
| @@ -224,6 +224,7 @@ struct tpm_readpubek_params_out { | |||
| 224 | u8 algorithm[4]; | 224 | u8 algorithm[4]; |
| 225 | u8 encscheme[2]; | 225 | u8 encscheme[2]; |
| 226 | u8 sigscheme[2]; | 226 | u8 sigscheme[2]; |
| 227 | __be32 paramsize; | ||
| 227 | u8 parameters[12]; /*assuming RSA*/ | 228 | u8 parameters[12]; /*assuming RSA*/ |
| 228 | __be32 keysize; | 229 | __be32 keysize; |
| 229 | u8 modulus[256]; | 230 | u8 modulus[256]; |
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index f3d3898898ed..717305d30444 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c | |||
| @@ -449,7 +449,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, | |||
| 449 | clk_disable(p->clk); | 449 | clk_disable(p->clk); |
| 450 | 450 | ||
| 451 | /* TODO: calculate good shift from rate and counter bit width */ | 451 | /* TODO: calculate good shift from rate and counter bit width */ |
| 452 | cs->shift = 10; | 452 | cs->shift = 0; |
| 453 | cs->mult = clocksource_hz2mult(p->rate, cs->shift); | 453 | cs->mult = clocksource_hz2mult(p->rate, cs->shift); |
| 454 | 454 | ||
| 455 | dev_info(&p->pdev->dev, "used as clock source\n"); | 455 | dev_info(&p->pdev->dev, "used as clock source\n"); |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 52ff8aa63f84..1b128702d300 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
| @@ -143,7 +143,7 @@ static inline int which_bucket(unsigned int duration) | |||
| 143 | * This allows us to calculate | 143 | * This allows us to calculate |
| 144 | * E(duration)|iowait | 144 | * E(duration)|iowait |
| 145 | */ | 145 | */ |
| 146 | if (nr_iowait_cpu()) | 146 | if (nr_iowait_cpu(smp_processor_id())) |
| 147 | bucket = BUCKETS/2; | 147 | bucket = BUCKETS/2; |
| 148 | 148 | ||
| 149 | if (duration < 10) | 149 | if (duration < 10) |
| @@ -175,7 +175,7 @@ static inline int performance_multiplier(void) | |||
| 175 | mult += 2 * get_loadavg(); | 175 | mult += 2 * get_loadavg(); |
| 176 | 176 | ||
| 177 | /* for IO wait tasks (per cpu!) we add 5x each */ | 177 | /* for IO wait tasks (per cpu!) we add 5x each */ |
| 178 | mult += 10 * nr_iowait_cpu(); | 178 | mult += 10 * nr_iowait_cpu(smp_processor_id()); |
| 179 | 179 | ||
| 180 | return mult; | 180 | return mult; |
| 181 | } | 181 | } |
diff --git a/drivers/dma/ppc4xx/adma.c b/drivers/dma/ppc4xx/adma.c index 5a22ca6927e5..7c3747902a37 100644 --- a/drivers/dma/ppc4xx/adma.c +++ b/drivers/dma/ppc4xx/adma.c | |||
| @@ -4257,10 +4257,12 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, | |||
| 4257 | struct ppc440spe_adma_chan *chan, | 4257 | struct ppc440spe_adma_chan *chan, |
| 4258 | int *initcode) | 4258 | int *initcode) |
| 4259 | { | 4259 | { |
| 4260 | struct of_device *ofdev; | ||
| 4260 | struct device_node *np; | 4261 | struct device_node *np; |
| 4261 | int ret; | 4262 | int ret; |
| 4262 | 4263 | ||
| 4263 | np = container_of(adev->dev, struct of_device, dev)->node; | 4264 | ofdev = container_of(adev->dev, struct of_device, dev); |
| 4265 | np = ofdev->dev.of_node; | ||
| 4264 | if (adev->id != PPC440SPE_XOR_ID) { | 4266 | if (adev->id != PPC440SPE_XOR_ID) { |
| 4265 | adev->err_irq = irq_of_parse_and_map(np, 1); | 4267 | adev->err_irq = irq_of_parse_and_map(np, 1); |
| 4266 | if (adev->err_irq == NO_IRQ) { | 4268 | if (adev->err_irq == NO_IRQ) { |
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index cf17dbb8014f..ac9f7985096d 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
| @@ -1958,20 +1958,20 @@ static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome) | |||
| 1958 | u32 value = 0; | 1958 | u32 value = 0; |
| 1959 | int err_sym = 0; | 1959 | int err_sym = 0; |
| 1960 | 1960 | ||
| 1961 | amd64_read_pci_cfg(pvt->misc_f3_ctl, 0x180, &value); | 1961 | if (boot_cpu_data.x86 == 0x10) { |
| 1962 | 1962 | ||
| 1963 | /* F3x180[EccSymbolSize]=1, x8 symbols */ | 1963 | amd64_read_pci_cfg(pvt->misc_f3_ctl, 0x180, &value); |
| 1964 | if (boot_cpu_data.x86 == 0x10 && | 1964 | |
| 1965 | boot_cpu_data.x86_model > 7 && | 1965 | /* F3x180[EccSymbolSize]=1 => x8 symbols */ |
| 1966 | value & BIT(25)) { | 1966 | if (boot_cpu_data.x86_model > 7 && |
| 1967 | err_sym = decode_syndrome(syndrome, x8_vectors, | 1967 | value & BIT(25)) { |
| 1968 | ARRAY_SIZE(x8_vectors), 8); | 1968 | err_sym = decode_syndrome(syndrome, x8_vectors, |
| 1969 | return map_err_sym_to_channel(err_sym, 8); | 1969 | ARRAY_SIZE(x8_vectors), 8); |
| 1970 | } else { | 1970 | return map_err_sym_to_channel(err_sym, 8); |
| 1971 | err_sym = decode_syndrome(syndrome, x4_vectors, | 1971 | } |
| 1972 | ARRAY_SIZE(x4_vectors), 4); | ||
| 1973 | return map_err_sym_to_channel(err_sym, 4); | ||
| 1974 | } | 1972 | } |
| 1973 | err_sym = decode_syndrome(syndrome, x4_vectors, ARRAY_SIZE(x4_vectors), 4); | ||
| 1974 | return map_err_sym_to_channel(err_sym, 4); | ||
| 1975 | } | 1975 | } |
| 1976 | 1976 | ||
| 1977 | /* | 1977 | /* |
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 6b8b7b41ec5f..cc9357da0e34 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
| @@ -1233,10 +1233,28 @@ static void __init i7core_xeon_pci_fixup(struct pci_id_table *table) | |||
| 1233 | for (i = 0; i < MAX_SOCKET_BUSES; i++) | 1233 | for (i = 0; i < MAX_SOCKET_BUSES; i++) |
| 1234 | pcibios_scan_specific_bus(255-i); | 1234 | pcibios_scan_specific_bus(255-i); |
| 1235 | } | 1235 | } |
| 1236 | pci_dev_put(pdev); | ||
| 1236 | table++; | 1237 | table++; |
| 1237 | } | 1238 | } |
| 1238 | } | 1239 | } |
| 1239 | 1240 | ||
| 1241 | static unsigned i7core_pci_lastbus(void) | ||
| 1242 | { | ||
| 1243 | int last_bus = 0, bus; | ||
| 1244 | struct pci_bus *b = NULL; | ||
| 1245 | |||
| 1246 | while ((b = pci_find_next_bus(b)) != NULL) { | ||
| 1247 | bus = b->number; | ||
| 1248 | debugf0("Found bus %d\n", bus); | ||
| 1249 | if (bus > last_bus) | ||
| 1250 | last_bus = bus; | ||
| 1251 | } | ||
| 1252 | |||
| 1253 | debugf0("Last bus %d\n", last_bus); | ||
| 1254 | |||
| 1255 | return last_bus; | ||
| 1256 | } | ||
| 1257 | |||
| 1240 | /* | 1258 | /* |
| 1241 | * i7core_get_devices Find and perform 'get' operation on the MCH's | 1259 | * i7core_get_devices Find and perform 'get' operation on the MCH's |
| 1242 | * device/functions we want to reference for this driver | 1260 | * device/functions we want to reference for this driver |
| @@ -1244,7 +1262,8 @@ static void __init i7core_xeon_pci_fixup(struct pci_id_table *table) | |||
| 1244 | * Need to 'get' device 16 func 1 and func 2 | 1262 | * Need to 'get' device 16 func 1 and func 2 |
| 1245 | */ | 1263 | */ |
| 1246 | int i7core_get_onedevice(struct pci_dev **prev, int devno, | 1264 | int i7core_get_onedevice(struct pci_dev **prev, int devno, |
| 1247 | struct pci_id_descr *dev_descr, unsigned n_devs) | 1265 | struct pci_id_descr *dev_descr, unsigned n_devs, |
| 1266 | unsigned last_bus) | ||
| 1248 | { | 1267 | { |
| 1249 | struct i7core_dev *i7core_dev; | 1268 | struct i7core_dev *i7core_dev; |
| 1250 | 1269 | ||
| @@ -1291,10 +1310,7 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno, | |||
| 1291 | } | 1310 | } |
| 1292 | bus = pdev->bus->number; | 1311 | bus = pdev->bus->number; |
| 1293 | 1312 | ||
| 1294 | if (bus == 0x3f) | 1313 | socket = last_bus - bus; |
| 1295 | socket = 0; | ||
| 1296 | else | ||
| 1297 | socket = 255 - bus; | ||
| 1298 | 1314 | ||
| 1299 | i7core_dev = get_i7core_dev(socket); | 1315 | i7core_dev = get_i7core_dev(socket); |
| 1300 | if (!i7core_dev) { | 1316 | if (!i7core_dev) { |
| @@ -1358,17 +1374,21 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno, | |||
| 1358 | 1374 | ||
| 1359 | static int i7core_get_devices(struct pci_id_table *table) | 1375 | static int i7core_get_devices(struct pci_id_table *table) |
| 1360 | { | 1376 | { |
| 1361 | int i, rc; | 1377 | int i, rc, last_bus; |
| 1362 | struct pci_dev *pdev = NULL; | 1378 | struct pci_dev *pdev = NULL; |
| 1363 | struct pci_id_descr *dev_descr; | 1379 | struct pci_id_descr *dev_descr; |
| 1364 | 1380 | ||
| 1381 | last_bus = i7core_pci_lastbus(); | ||
| 1382 | |||
| 1365 | while (table && table->descr) { | 1383 | while (table && table->descr) { |
| 1366 | dev_descr = table->descr; | 1384 | dev_descr = table->descr; |
| 1367 | for (i = 0; i < table->n_devs; i++) { | 1385 | for (i = 0; i < table->n_devs; i++) { |
| 1368 | pdev = NULL; | 1386 | pdev = NULL; |
| 1369 | do { | 1387 | do { |
| 1370 | rc = i7core_get_onedevice(&pdev, i, &dev_descr[i], | 1388 | rc = i7core_get_onedevice(&pdev, i, |
| 1371 | table->n_devs); | 1389 | &dev_descr[i], |
| 1390 | table->n_devs, | ||
| 1391 | last_bus); | ||
| 1372 | if (rc < 0) { | 1392 | if (rc < 0) { |
| 1373 | if (i == 0) { | 1393 | if (i == 0) { |
| 1374 | i = table->n_devs; | 1394 | i = table->n_devs; |
| @@ -1927,21 +1947,26 @@ fail: | |||
| 1927 | * 0 for FOUND a device | 1947 | * 0 for FOUND a device |
| 1928 | * < 0 for error code | 1948 | * < 0 for error code |
| 1929 | */ | 1949 | */ |
| 1950 | |||
| 1951 | static int probed = 0; | ||
| 1952 | |||
| 1930 | static int __devinit i7core_probe(struct pci_dev *pdev, | 1953 | static int __devinit i7core_probe(struct pci_dev *pdev, |
| 1931 | const struct pci_device_id *id) | 1954 | const struct pci_device_id *id) |
| 1932 | { | 1955 | { |
| 1933 | int dev_idx = id->driver_data; | ||
| 1934 | int rc; | 1956 | int rc; |
| 1935 | struct i7core_dev *i7core_dev; | 1957 | struct i7core_dev *i7core_dev; |
| 1936 | 1958 | ||
| 1959 | /* get the pci devices we want to reserve for our use */ | ||
| 1960 | mutex_lock(&i7core_edac_lock); | ||
| 1961 | |||
| 1937 | /* | 1962 | /* |
| 1938 | * All memory controllers are allocated at the first pass. | 1963 | * All memory controllers are allocated at the first pass. |
| 1939 | */ | 1964 | */ |
| 1940 | if (unlikely(dev_idx >= 1)) | 1965 | if (unlikely(probed >= 1)) { |
| 1966 | mutex_unlock(&i7core_edac_lock); | ||
| 1941 | return -EINVAL; | 1967 | return -EINVAL; |
| 1942 | 1968 | } | |
| 1943 | /* get the pci devices we want to reserve for our use */ | 1969 | probed++; |
| 1944 | mutex_lock(&i7core_edac_lock); | ||
| 1945 | 1970 | ||
| 1946 | rc = i7core_get_devices(pci_dev_table); | 1971 | rc = i7core_get_devices(pci_dev_table); |
| 1947 | if (unlikely(rc < 0)) | 1972 | if (unlikely(rc < 0)) |
| @@ -2013,6 +2038,8 @@ static void __devexit i7core_remove(struct pci_dev *pdev) | |||
| 2013 | i7core_dev->socket); | 2038 | i7core_dev->socket); |
| 2014 | } | 2039 | } |
| 2015 | } | 2040 | } |
| 2041 | probed--; | ||
| 2042 | |||
| 2016 | mutex_unlock(&i7core_edac_lock); | 2043 | mutex_unlock(&i7core_edac_lock); |
| 2017 | } | 2044 | } |
| 2018 | 2045 | ||
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 724038dab4ca..7face915b963 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | # | 1 | # |
| 2 | # GPIO infrastructure and expanders | 2 | # platform-neutral GPIO infrastructure and expanders |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | config ARCH_WANT_OPTIONAL_GPIOLIB | 5 | config ARCH_WANT_OPTIONAL_GPIOLIB |
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 51c3cdd41b5a..e53dcff49b4f 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile | |||
| @@ -1,4 +1,8 @@ | |||
| 1 | # gpio support: dedicated expander chips, etc | 1 | # generic gpio support: dedicated expander chips, etc |
| 2 | # | ||
| 3 | # NOTE: platform-specific GPIO drivers don't belong in the | ||
| 4 | # drivers/gpio directory; put them with other platform setup | ||
| 5 | # code, IRQ controllers, board init, etc. | ||
| 2 | 6 | ||
| 3 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG | 7 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG |
| 4 | 8 | ||
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 08c4c926e65f..1f2cc6b09623 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -146,7 +146,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_fb_helper_conn | |||
| 146 | cvt = 1; | 146 | cvt = 1; |
| 147 | break; | 147 | break; |
| 148 | case 'R': | 148 | case 'R': |
| 149 | if (!cvt) | 149 | if (cvt) |
| 150 | rb = 1; | 150 | rb = 1; |
| 151 | break; | 151 | break; |
| 152 | case 'm': | 152 | case 'm': |
| @@ -1024,11 +1024,18 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne | |||
| 1024 | } | 1024 | } |
| 1025 | 1025 | ||
| 1026 | create_mode: | 1026 | create_mode: |
| 1027 | mode = drm_cvt_mode(fb_helper_conn->connector->dev, cmdline_mode->xres, | 1027 | if (cmdline_mode->cvt) |
| 1028 | cmdline_mode->yres, | 1028 | mode = drm_cvt_mode(fb_helper_conn->connector->dev, |
| 1029 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, | 1029 | cmdline_mode->xres, cmdline_mode->yres, |
| 1030 | cmdline_mode->rb, cmdline_mode->interlace, | 1030 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, |
| 1031 | cmdline_mode->margins); | 1031 | cmdline_mode->rb, cmdline_mode->interlace, |
| 1032 | cmdline_mode->margins); | ||
| 1033 | else | ||
| 1034 | mode = drm_gtf_mode(fb_helper_conn->connector->dev, | ||
| 1035 | cmdline_mode->xres, cmdline_mode->yres, | ||
| 1036 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, | ||
| 1037 | cmdline_mode->interlace, | ||
| 1038 | cmdline_mode->margins); | ||
| 1032 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); | 1039 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
| 1033 | list_add(&mode->head, &fb_helper_conn->connector->modes); | 1040 | list_add(&mode->head, &fb_helper_conn->connector->modes); |
| 1034 | return mode; | 1041 | return mode; |
diff --git a/drivers/gpu/drm/i915/dvo_tfp410.c b/drivers/gpu/drm/i915/dvo_tfp410.c index 66c697bc9b22..56f66426207f 100644 --- a/drivers/gpu/drm/i915/dvo_tfp410.c +++ b/drivers/gpu/drm/i915/dvo_tfp410.c | |||
| @@ -208,7 +208,7 @@ static enum drm_connector_status tfp410_detect(struct intel_dvo_device *dvo) | |||
| 208 | uint8_t ctl2; | 208 | uint8_t ctl2; |
| 209 | 209 | ||
| 210 | if (tfp410_readb(dvo, TFP410_CTL_2, &ctl2)) { | 210 | if (tfp410_readb(dvo, TFP410_CTL_2, &ctl2)) { |
| 211 | if (ctl2 & TFP410_CTL_2_HTPLG) | 211 | if (ctl2 & TFP410_CTL_2_RSEN) |
| 212 | ret = connector_status_connected; | 212 | ret = connector_status_connected; |
| 213 | else | 213 | else |
| 214 | ret = connector_status_disconnected; | 214 | ret = connector_status_disconnected; |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 52510ad8b25d..aee83fa178f6 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -620,7 +620,7 @@ static int i915_sr_status(struct seq_file *m, void *unused) | |||
| 620 | drm_i915_private_t *dev_priv = dev->dev_private; | 620 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 621 | bool sr_enabled = false; | 621 | bool sr_enabled = false; |
| 622 | 622 | ||
| 623 | if (IS_I965G(dev) || IS_I945G(dev) || IS_I945GM(dev)) | 623 | if (IS_I965GM(dev) || IS_I945G(dev) || IS_I945GM(dev)) |
| 624 | sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; | 624 | sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; |
| 625 | else if (IS_I915GM(dev)) | 625 | else if (IS_I915GM(dev)) |
| 626 | sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; | 626 | sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 59a2bf8592ec..f00c5ae9556c 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -128,9 +128,11 @@ static int i915_dma_cleanup(struct drm_device * dev) | |||
| 128 | if (dev->irq_enabled) | 128 | if (dev->irq_enabled) |
| 129 | drm_irq_uninstall(dev); | 129 | drm_irq_uninstall(dev); |
| 130 | 130 | ||
| 131 | mutex_lock(&dev->struct_mutex); | ||
| 131 | intel_cleanup_ring_buffer(dev, &dev_priv->render_ring); | 132 | intel_cleanup_ring_buffer(dev, &dev_priv->render_ring); |
| 132 | if (HAS_BSD(dev)) | 133 | if (HAS_BSD(dev)) |
| 133 | intel_cleanup_ring_buffer(dev, &dev_priv->bsd_ring); | 134 | intel_cleanup_ring_buffer(dev, &dev_priv->bsd_ring); |
| 135 | mutex_unlock(&dev->struct_mutex); | ||
| 134 | 136 | ||
| 135 | /* Clear the HWS virtual address at teardown */ | 137 | /* Clear the HWS virtual address at teardown */ |
| 136 | if (I915_NEED_GFX_HWS(dev)) | 138 | if (I915_NEED_GFX_HWS(dev)) |
| @@ -1229,7 +1231,7 @@ static void i915_warn_stolen(struct drm_device *dev) | |||
| 1229 | static void i915_setup_compression(struct drm_device *dev, int size) | 1231 | static void i915_setup_compression(struct drm_device *dev, int size) |
| 1230 | { | 1232 | { |
| 1231 | struct drm_i915_private *dev_priv = dev->dev_private; | 1233 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 1232 | struct drm_mm_node *compressed_fb, *compressed_llb; | 1234 | struct drm_mm_node *compressed_fb, *uninitialized_var(compressed_llb); |
| 1233 | unsigned long cfb_base; | 1235 | unsigned long cfb_base; |
| 1234 | unsigned long ll_base = 0; | 1236 | unsigned long ll_base = 0; |
| 1235 | 1237 | ||
| @@ -1410,6 +1412,10 @@ static int i915_load_modeset_init(struct drm_device *dev, | |||
| 1410 | if (ret) | 1412 | if (ret) |
| 1411 | goto cleanup_vga_client; | 1413 | goto cleanup_vga_client; |
| 1412 | 1414 | ||
| 1415 | /* IIR "flip pending" bit means done if this bit is set */ | ||
| 1416 | if (IS_GEN3(dev) && (I915_READ(ECOSKPD) & ECO_FLIP_DONE)) | ||
| 1417 | dev_priv->flip_pending_is_done = true; | ||
| 1418 | |||
| 1413 | intel_modeset_init(dev); | 1419 | intel_modeset_init(dev); |
| 1414 | 1420 | ||
| 1415 | ret = drm_irq_install(dev); | 1421 | ret = drm_irq_install(dev); |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 276583159847..d147ab2f5bfc 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -596,6 +596,7 @@ typedef struct drm_i915_private { | |||
| 596 | struct drm_crtc *plane_to_crtc_mapping[2]; | 596 | struct drm_crtc *plane_to_crtc_mapping[2]; |
| 597 | struct drm_crtc *pipe_to_crtc_mapping[2]; | 597 | struct drm_crtc *pipe_to_crtc_mapping[2]; |
| 598 | wait_queue_head_t pending_flip_queue; | 598 | wait_queue_head_t pending_flip_queue; |
| 599 | bool flip_pending_is_done; | ||
| 599 | 600 | ||
| 600 | /* Reclocking support */ | 601 | /* Reclocking support */ |
| 601 | bool render_reclock_avail; | 602 | bool render_reclock_avail; |
| @@ -1076,7 +1077,7 @@ extern int intel_trans_dp_port_sel (struct drm_crtc *crtc); | |||
| 1076 | drm_i915_private_t *dev_priv = dev->dev_private; \ | 1077 | drm_i915_private_t *dev_priv = dev->dev_private; \ |
| 1077 | if (I915_VERBOSE) \ | 1078 | if (I915_VERBOSE) \ |
| 1078 | DRM_DEBUG(" BEGIN_LP_RING %x\n", (int)(n)); \ | 1079 | DRM_DEBUG(" BEGIN_LP_RING %x\n", (int)(n)); \ |
| 1079 | intel_ring_begin(dev, &dev_priv->render_ring, 4*(n)); \ | 1080 | intel_ring_begin(dev, &dev_priv->render_ring, (n)); \ |
| 1080 | } while (0) | 1081 | } while (0) |
| 1081 | 1082 | ||
| 1082 | 1083 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 9ded3dae6c87..074385882ccf 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2239,7 +2239,7 @@ i915_gem_object_get_pages(struct drm_gem_object *obj, | |||
| 2239 | mapping = inode->i_mapping; | 2239 | mapping = inode->i_mapping; |
| 2240 | for (i = 0; i < page_count; i++) { | 2240 | for (i = 0; i < page_count; i++) { |
| 2241 | page = read_cache_page_gfp(mapping, i, | 2241 | page = read_cache_page_gfp(mapping, i, |
| 2242 | mapping_gfp_mask (mapping) | | 2242 | GFP_HIGHUSER | |
| 2243 | __GFP_COLD | | 2243 | __GFP_COLD | |
| 2244 | gfpmask); | 2244 | gfpmask); |
| 2245 | if (IS_ERR(page)) | 2245 | if (IS_ERR(page)) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2479be001e40..dba53d4b9fb3 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -940,22 +940,30 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 940 | if (HAS_BSD(dev) && (iir & I915_BSD_USER_INTERRUPT)) | 940 | if (HAS_BSD(dev) && (iir & I915_BSD_USER_INTERRUPT)) |
| 941 | DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue); | 941 | DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue); |
| 942 | 942 | ||
| 943 | if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) | 943 | if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) { |
| 944 | intel_prepare_page_flip(dev, 0); | 944 | intel_prepare_page_flip(dev, 0); |
| 945 | if (dev_priv->flip_pending_is_done) | ||
| 946 | intel_finish_page_flip_plane(dev, 0); | ||
| 947 | } | ||
| 945 | 948 | ||
| 946 | if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) | 949 | if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) { |
| 947 | intel_prepare_page_flip(dev, 1); | 950 | intel_prepare_page_flip(dev, 1); |
| 951 | if (dev_priv->flip_pending_is_done) | ||
| 952 | intel_finish_page_flip_plane(dev, 1); | ||
| 953 | } | ||
| 948 | 954 | ||
| 949 | if (pipea_stats & vblank_status) { | 955 | if (pipea_stats & vblank_status) { |
| 950 | vblank++; | 956 | vblank++; |
| 951 | drm_handle_vblank(dev, 0); | 957 | drm_handle_vblank(dev, 0); |
| 952 | intel_finish_page_flip(dev, 0); | 958 | if (!dev_priv->flip_pending_is_done) |
| 959 | intel_finish_page_flip(dev, 0); | ||
| 953 | } | 960 | } |
| 954 | 961 | ||
| 955 | if (pipeb_stats & vblank_status) { | 962 | if (pipeb_stats & vblank_status) { |
| 956 | vblank++; | 963 | vblank++; |
| 957 | drm_handle_vblank(dev, 1); | 964 | drm_handle_vblank(dev, 1); |
| 958 | intel_finish_page_flip(dev, 1); | 965 | if (!dev_priv->flip_pending_is_done) |
| 966 | intel_finish_page_flip(dev, 1); | ||
| 959 | } | 967 | } |
| 960 | 968 | ||
| 961 | if ((pipea_stats & I915_LEGACY_BLC_EVENT_STATUS) || | 969 | if ((pipea_stats & I915_LEGACY_BLC_EVENT_STATUS) || |
| @@ -1387,29 +1395,10 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
| 1387 | dev_priv->pipestat[1] = 0; | 1395 | dev_priv->pipestat[1] = 0; |
| 1388 | 1396 | ||
| 1389 | if (I915_HAS_HOTPLUG(dev)) { | 1397 | if (I915_HAS_HOTPLUG(dev)) { |
| 1390 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); | ||
| 1391 | |||
| 1392 | /* Note HDMI and DP share bits */ | ||
| 1393 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) | ||
| 1394 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; | ||
| 1395 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) | ||
| 1396 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; | ||
| 1397 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) | ||
| 1398 | hotplug_en |= HDMID_HOTPLUG_INT_EN; | ||
| 1399 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) | ||
| 1400 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
| 1401 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) | ||
| 1402 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
| 1403 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) | ||
| 1404 | hotplug_en |= CRT_HOTPLUG_INT_EN; | ||
| 1405 | /* Ignore TV since it's buggy */ | ||
| 1406 | |||
| 1407 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); | ||
| 1408 | |||
| 1409 | /* Enable in IER... */ | 1398 | /* Enable in IER... */ |
| 1410 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; | 1399 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; |
| 1411 | /* and unmask in IMR */ | 1400 | /* and unmask in IMR */ |
| 1412 | i915_enable_irq(dev_priv, I915_DISPLAY_PORT_INTERRUPT); | 1401 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PORT_INTERRUPT; |
| 1413 | } | 1402 | } |
| 1414 | 1403 | ||
| 1415 | /* | 1404 | /* |
| @@ -1427,16 +1416,41 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
| 1427 | } | 1416 | } |
| 1428 | I915_WRITE(EMR, error_mask); | 1417 | I915_WRITE(EMR, error_mask); |
| 1429 | 1418 | ||
| 1430 | /* Disable pipe interrupt enables, clear pending pipe status */ | ||
| 1431 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | ||
| 1432 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | ||
| 1433 | /* Clear pending interrupt status */ | ||
| 1434 | I915_WRITE(IIR, I915_READ(IIR)); | ||
| 1435 | |||
| 1436 | I915_WRITE(IER, enable_mask); | ||
| 1437 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | 1419 | I915_WRITE(IMR, dev_priv->irq_mask_reg); |
| 1420 | I915_WRITE(IER, enable_mask); | ||
| 1438 | (void) I915_READ(IER); | 1421 | (void) I915_READ(IER); |
| 1439 | 1422 | ||
| 1423 | if (I915_HAS_HOTPLUG(dev)) { | ||
| 1424 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); | ||
| 1425 | |||
| 1426 | /* Note HDMI and DP share bits */ | ||
| 1427 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) | ||
| 1428 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; | ||
| 1429 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) | ||
| 1430 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; | ||
| 1431 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) | ||
| 1432 | hotplug_en |= HDMID_HOTPLUG_INT_EN; | ||
| 1433 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) | ||
| 1434 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
| 1435 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) | ||
| 1436 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
| 1437 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { | ||
| 1438 | hotplug_en |= CRT_HOTPLUG_INT_EN; | ||
| 1439 | |||
| 1440 | /* Programming the CRT detection parameters tends | ||
| 1441 | to generate a spurious hotplug event about three | ||
| 1442 | seconds later. So just do it once. | ||
| 1443 | */ | ||
| 1444 | if (IS_G4X(dev)) | ||
| 1445 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; | ||
| 1446 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; | ||
| 1447 | } | ||
| 1448 | |||
| 1449 | /* Ignore TV since it's buggy */ | ||
| 1450 | |||
| 1451 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); | ||
| 1452 | } | ||
| 1453 | |||
| 1440 | opregion_enable_asle(dev); | 1454 | opregion_enable_asle(dev); |
| 1441 | 1455 | ||
| 1442 | return 0; | 1456 | return 0; |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 64b0a3afd92b..150400f40534 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -178,6 +178,7 @@ | |||
| 178 | #define MI_OVERLAY_OFF (0x2<<21) | 178 | #define MI_OVERLAY_OFF (0x2<<21) |
| 179 | #define MI_LOAD_SCAN_LINES_INCL MI_INSTR(0x12, 0) | 179 | #define MI_LOAD_SCAN_LINES_INCL MI_INSTR(0x12, 0) |
| 180 | #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) | 180 | #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) |
| 181 | #define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1) | ||
| 181 | #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) | 182 | #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) |
| 182 | #define MI_STORE_DWORD_IMM MI_INSTR(0x20, 1) | 183 | #define MI_STORE_DWORD_IMM MI_INSTR(0x20, 1) |
| 183 | #define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */ | 184 | #define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */ |
| @@ -368,6 +369,9 @@ | |||
| 368 | #define CM0_RC_OP_FLUSH_DISABLE (1<<0) | 369 | #define CM0_RC_OP_FLUSH_DISABLE (1<<0) |
| 369 | #define BB_ADDR 0x02140 /* 8 bytes */ | 370 | #define BB_ADDR 0x02140 /* 8 bytes */ |
| 370 | #define GFX_FLSH_CNTL 0x02170 /* 915+ only */ | 371 | #define GFX_FLSH_CNTL 0x02170 /* 915+ only */ |
| 372 | #define ECOSKPD 0x021d0 | ||
| 373 | #define ECO_GATING_CX_ONLY (1<<3) | ||
| 374 | #define ECO_FLIP_DONE (1<<0) | ||
| 371 | 375 | ||
| 372 | /* GEN6 interrupt control */ | 376 | /* GEN6 interrupt control */ |
| 373 | #define GEN6_RENDER_HWSTAM 0x2098 | 377 | #define GEN6_RENDER_HWSTAM 0x2098 |
| @@ -1130,7 +1134,6 @@ | |||
| 1130 | #define CRT_HOTPLUG_DETECT_DELAY_2G (1 << 4) | 1134 | #define CRT_HOTPLUG_DETECT_DELAY_2G (1 << 4) |
| 1131 | #define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) | 1135 | #define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) |
| 1132 | #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) | 1136 | #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) |
| 1133 | #define CRT_HOTPLUG_MASK (0x3fc) /* Bits 9-2 */ | ||
| 1134 | 1137 | ||
| 1135 | #define PORT_HOTPLUG_STAT 0x61114 | 1138 | #define PORT_HOTPLUG_STAT 0x61114 |
| 1136 | #define HDMIB_HOTPLUG_INT_STATUS (1 << 29) | 1139 | #define HDMIB_HOTPLUG_INT_STATUS (1 << 29) |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 22ff38455731..ee0732b222a1 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -234,14 +234,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector) | |||
| 234 | else | 234 | else |
| 235 | tries = 1; | 235 | tries = 1; |
| 236 | hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN); | 236 | hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN); |
| 237 | hotplug_en &= CRT_HOTPLUG_MASK; | ||
| 238 | hotplug_en |= CRT_HOTPLUG_FORCE_DETECT; | 237 | hotplug_en |= CRT_HOTPLUG_FORCE_DETECT; |
| 239 | 238 | ||
| 240 | if (IS_G4X(dev)) | ||
| 241 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; | ||
| 242 | |||
| 243 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; | ||
| 244 | |||
| 245 | for (i = 0; i < tries ; i++) { | 239 | for (i = 0; i < tries ; i++) { |
| 246 | unsigned long timeout; | 240 | unsigned long timeout; |
| 247 | /* turn on the FORCE_DETECT */ | 241 | /* turn on the FORCE_DETECT */ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index cc8131ff319f..68dcf36e2793 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2970,11 +2970,13 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2970 | if (srwm < 0) | 2970 | if (srwm < 0) |
| 2971 | srwm = 1; | 2971 | srwm = 1; |
| 2972 | srwm &= 0x3f; | 2972 | srwm &= 0x3f; |
| 2973 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 2973 | if (IS_I965GM(dev)) |
| 2974 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | ||
| 2974 | } else { | 2975 | } else { |
| 2975 | /* Turn off self refresh if both pipes are enabled */ | 2976 | /* Turn off self refresh if both pipes are enabled */ |
| 2976 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | 2977 | if (IS_I965GM(dev)) |
| 2977 | & ~FW_BLC_SELF_EN); | 2978 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) |
| 2979 | & ~FW_BLC_SELF_EN); | ||
| 2978 | } | 2980 | } |
| 2979 | 2981 | ||
| 2980 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", | 2982 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", |
| @@ -4483,6 +4485,7 @@ static void intel_idle_update(struct work_struct *work) | |||
| 4483 | struct drm_device *dev = dev_priv->dev; | 4485 | struct drm_device *dev = dev_priv->dev; |
| 4484 | struct drm_crtc *crtc; | 4486 | struct drm_crtc *crtc; |
| 4485 | struct intel_crtc *intel_crtc; | 4487 | struct intel_crtc *intel_crtc; |
| 4488 | int enabled = 0; | ||
| 4486 | 4489 | ||
| 4487 | if (!i915_powersave) | 4490 | if (!i915_powersave) |
| 4488 | return; | 4491 | return; |
| @@ -4491,21 +4494,22 @@ static void intel_idle_update(struct work_struct *work) | |||
| 4491 | 4494 | ||
| 4492 | i915_update_gfx_val(dev_priv); | 4495 | i915_update_gfx_val(dev_priv); |
| 4493 | 4496 | ||
| 4494 | if (IS_I945G(dev) || IS_I945GM(dev)) { | ||
| 4495 | DRM_DEBUG_DRIVER("enable memory self refresh on 945\n"); | ||
| 4496 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); | ||
| 4497 | } | ||
| 4498 | |||
| 4499 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 4497 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| 4500 | /* Skip inactive CRTCs */ | 4498 | /* Skip inactive CRTCs */ |
| 4501 | if (!crtc->fb) | 4499 | if (!crtc->fb) |
| 4502 | continue; | 4500 | continue; |
| 4503 | 4501 | ||
| 4502 | enabled++; | ||
| 4504 | intel_crtc = to_intel_crtc(crtc); | 4503 | intel_crtc = to_intel_crtc(crtc); |
| 4505 | if (!intel_crtc->busy) | 4504 | if (!intel_crtc->busy) |
| 4506 | intel_decrease_pllclock(crtc); | 4505 | intel_decrease_pllclock(crtc); |
| 4507 | } | 4506 | } |
| 4508 | 4507 | ||
| 4508 | if ((enabled == 1) && (IS_I945G(dev) || IS_I945GM(dev))) { | ||
| 4509 | DRM_DEBUG_DRIVER("enable memory self refresh on 945\n"); | ||
| 4510 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); | ||
| 4511 | } | ||
| 4512 | |||
| 4509 | mutex_unlock(&dev->struct_mutex); | 4513 | mutex_unlock(&dev->struct_mutex); |
| 4510 | } | 4514 | } |
| 4511 | 4515 | ||
| @@ -4601,10 +4605,10 @@ static void intel_unpin_work_fn(struct work_struct *__work) | |||
| 4601 | kfree(work); | 4605 | kfree(work); |
| 4602 | } | 4606 | } |
| 4603 | 4607 | ||
| 4604 | void intel_finish_page_flip(struct drm_device *dev, int pipe) | 4608 | static void do_intel_finish_page_flip(struct drm_device *dev, |
| 4609 | struct drm_crtc *crtc) | ||
| 4605 | { | 4610 | { |
| 4606 | drm_i915_private_t *dev_priv = dev->dev_private; | 4611 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 4607 | struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; | ||
| 4608 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 4612 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
| 4609 | struct intel_unpin_work *work; | 4613 | struct intel_unpin_work *work; |
| 4610 | struct drm_i915_gem_object *obj_priv; | 4614 | struct drm_i915_gem_object *obj_priv; |
| @@ -4648,6 +4652,22 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe) | |||
| 4648 | schedule_work(&work->work); | 4652 | schedule_work(&work->work); |
| 4649 | } | 4653 | } |
| 4650 | 4654 | ||
| 4655 | void intel_finish_page_flip(struct drm_device *dev, int pipe) | ||
| 4656 | { | ||
| 4657 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 4658 | struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; | ||
| 4659 | |||
| 4660 | do_intel_finish_page_flip(dev, crtc); | ||
| 4661 | } | ||
| 4662 | |||
| 4663 | void intel_finish_page_flip_plane(struct drm_device *dev, int plane) | ||
| 4664 | { | ||
| 4665 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 4666 | struct drm_crtc *crtc = dev_priv->plane_to_crtc_mapping[plane]; | ||
| 4667 | |||
| 4668 | do_intel_finish_page_flip(dev, crtc); | ||
| 4669 | } | ||
| 4670 | |||
| 4651 | void intel_prepare_page_flip(struct drm_device *dev, int plane) | 4671 | void intel_prepare_page_flip(struct drm_device *dev, int plane) |
| 4652 | { | 4672 | { |
| 4653 | drm_i915_private_t *dev_priv = dev->dev_private; | 4673 | drm_i915_private_t *dev_priv = dev->dev_private; |
| @@ -4678,6 +4698,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4678 | unsigned long flags; | 4698 | unsigned long flags; |
| 4679 | int pipesrc_reg = (intel_crtc->pipe == 0) ? PIPEASRC : PIPEBSRC; | 4699 | int pipesrc_reg = (intel_crtc->pipe == 0) ? PIPEASRC : PIPEBSRC; |
| 4680 | int ret, pipesrc; | 4700 | int ret, pipesrc; |
| 4701 | u32 flip_mask; | ||
| 4681 | 4702 | ||
| 4682 | work = kzalloc(sizeof *work, GFP_KERNEL); | 4703 | work = kzalloc(sizeof *work, GFP_KERNEL); |
| 4683 | if (work == NULL) | 4704 | if (work == NULL) |
| @@ -4731,15 +4752,28 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4731 | atomic_inc(&obj_priv->pending_flip); | 4752 | atomic_inc(&obj_priv->pending_flip); |
| 4732 | work->pending_flip_obj = obj; | 4753 | work->pending_flip_obj = obj; |
| 4733 | 4754 | ||
| 4755 | if (intel_crtc->plane) | ||
| 4756 | flip_mask = I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; | ||
| 4757 | else | ||
| 4758 | flip_mask = I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT; | ||
| 4759 | |||
| 4760 | /* Wait for any previous flip to finish */ | ||
| 4761 | if (IS_GEN3(dev)) | ||
| 4762 | while (I915_READ(ISR) & flip_mask) | ||
| 4763 | ; | ||
| 4764 | |||
| 4734 | BEGIN_LP_RING(4); | 4765 | BEGIN_LP_RING(4); |
| 4735 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 4736 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 4737 | OUT_RING(fb->pitch); | ||
| 4738 | if (IS_I965G(dev)) { | 4766 | if (IS_I965G(dev)) { |
| 4767 | OUT_RING(MI_DISPLAY_FLIP | | ||
| 4768 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 4769 | OUT_RING(fb->pitch); | ||
| 4739 | OUT_RING(obj_priv->gtt_offset | obj_priv->tiling_mode); | 4770 | OUT_RING(obj_priv->gtt_offset | obj_priv->tiling_mode); |
| 4740 | pipesrc = I915_READ(pipesrc_reg); | 4771 | pipesrc = I915_READ(pipesrc_reg); |
| 4741 | OUT_RING(pipesrc & 0x0fff0fff); | 4772 | OUT_RING(pipesrc & 0x0fff0fff); |
| 4742 | } else { | 4773 | } else { |
| 4774 | OUT_RING(MI_DISPLAY_FLIP_I915 | | ||
| 4775 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); | ||
| 4776 | OUT_RING(fb->pitch); | ||
| 4743 | OUT_RING(obj_priv->gtt_offset); | 4777 | OUT_RING(obj_priv->gtt_offset); |
| 4744 | OUT_RING(MI_NOOP); | 4778 | OUT_RING(MI_NOOP); |
| 4745 | } | 4779 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 49b54f05d3cf..1aac59e83bff 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -136,6 +136,12 @@ intel_dp_link_required(struct drm_device *dev, | |||
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | static int | 138 | static int |
| 139 | intel_dp_max_data_rate(int max_link_clock, int max_lanes) | ||
| 140 | { | ||
| 141 | return (max_link_clock * max_lanes * 8) / 10; | ||
| 142 | } | ||
| 143 | |||
| 144 | static int | ||
| 139 | intel_dp_mode_valid(struct drm_connector *connector, | 145 | intel_dp_mode_valid(struct drm_connector *connector, |
| 140 | struct drm_display_mode *mode) | 146 | struct drm_display_mode *mode) |
| 141 | { | 147 | { |
| @@ -144,8 +150,11 @@ intel_dp_mode_valid(struct drm_connector *connector, | |||
| 144 | int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_encoder)); | 150 | int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_encoder)); |
| 145 | int max_lanes = intel_dp_max_lane_count(intel_encoder); | 151 | int max_lanes = intel_dp_max_lane_count(intel_encoder); |
| 146 | 152 | ||
| 147 | if (intel_dp_link_required(connector->dev, intel_encoder, mode->clock) | 153 | /* only refuse the mode on non eDP since we have seen some wierd eDP panels |
| 148 | > max_link_clock * max_lanes) | 154 | which are outside spec tolerances but somehow work by magic */ |
| 155 | if (!IS_eDP(intel_encoder) && | ||
| 156 | (intel_dp_link_required(connector->dev, intel_encoder, mode->clock) | ||
| 157 | > intel_dp_max_data_rate(max_link_clock, max_lanes))) | ||
| 149 | return MODE_CLOCK_HIGH; | 158 | return MODE_CLOCK_HIGH; |
| 150 | 159 | ||
| 151 | if (mode->clock < 10000) | 160 | if (mode->clock < 10000) |
| @@ -506,7 +515,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 506 | 515 | ||
| 507 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { | 516 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { |
| 508 | for (clock = 0; clock <= max_clock; clock++) { | 517 | for (clock = 0; clock <= max_clock; clock++) { |
| 509 | int link_avail = intel_dp_link_clock(bws[clock]) * lane_count; | 518 | int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count); |
| 510 | 519 | ||
| 511 | if (intel_dp_link_required(encoder->dev, intel_encoder, mode->clock) | 520 | if (intel_dp_link_required(encoder->dev, intel_encoder, mode->clock) |
| 512 | <= link_avail) { | 521 | <= link_avail) { |
| @@ -521,6 +530,18 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 521 | } | 530 | } |
| 522 | } | 531 | } |
| 523 | } | 532 | } |
| 533 | |||
| 534 | if (IS_eDP(intel_encoder)) { | ||
| 535 | /* okay we failed just pick the highest */ | ||
| 536 | dp_priv->lane_count = max_lane_count; | ||
| 537 | dp_priv->link_bw = bws[max_clock]; | ||
| 538 | adjusted_mode->clock = intel_dp_link_clock(dp_priv->link_bw); | ||
| 539 | DRM_DEBUG_KMS("Force picking display port link bw %02x lane " | ||
| 540 | "count %d clock %d\n", | ||
| 541 | dp_priv->link_bw, dp_priv->lane_count, | ||
| 542 | adjusted_mode->clock); | ||
| 543 | return true; | ||
| 544 | } | ||
| 524 | return false; | 545 | return false; |
| 525 | } | 546 | } |
| 526 | 547 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index df931f787665..72206f37c4fb 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -224,6 +224,7 @@ extern void intel_fbdev_fini(struct drm_device *dev); | |||
| 224 | 224 | ||
| 225 | extern void intel_prepare_page_flip(struct drm_device *dev, int plane); | 225 | extern void intel_prepare_page_flip(struct drm_device *dev, int plane); |
| 226 | extern void intel_finish_page_flip(struct drm_device *dev, int pipe); | 226 | extern void intel_finish_page_flip(struct drm_device *dev, int pipe); |
| 227 | extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); | ||
| 227 | 228 | ||
| 228 | extern void intel_setup_overlay(struct drm_device *dev); | 229 | extern void intel_setup_overlay(struct drm_device *dev); |
| 229 | extern void intel_cleanup_overlay(struct drm_device *dev); | 230 | extern void intel_cleanup_overlay(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 6a1accd83aec..31df55f0a0a7 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -983,8 +983,8 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 983 | 983 | ||
| 984 | drm_connector_attach_property(&intel_connector->base, | 984 | drm_connector_attach_property(&intel_connector->base, |
| 985 | dev->mode_config.scaling_mode_property, | 985 | dev->mode_config.scaling_mode_property, |
| 986 | DRM_MODE_SCALE_FULLSCREEN); | 986 | DRM_MODE_SCALE_ASPECT); |
| 987 | lvds_priv->fitting_mode = DRM_MODE_SCALE_FULLSCREEN; | 987 | lvds_priv->fitting_mode = DRM_MODE_SCALE_ASPECT; |
| 988 | /* | 988 | /* |
| 989 | * LVDS discovery: | 989 | * LVDS discovery: |
| 990 | * 1) check for EDID on DDC | 990 | * 1) check for EDID on DDC |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index cea4f1a8709e..26362f8495a8 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -94,7 +94,7 @@ render_ring_flush(struct drm_device *dev, | |||
| 94 | #if WATCH_EXEC | 94 | #if WATCH_EXEC |
| 95 | DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd); | 95 | DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd); |
| 96 | #endif | 96 | #endif |
| 97 | intel_ring_begin(dev, ring, 8); | 97 | intel_ring_begin(dev, ring, 2); |
| 98 | intel_ring_emit(dev, ring, cmd); | 98 | intel_ring_emit(dev, ring, cmd); |
| 99 | intel_ring_emit(dev, ring, MI_NOOP); | 99 | intel_ring_emit(dev, ring, MI_NOOP); |
| 100 | intel_ring_advance(dev, ring); | 100 | intel_ring_advance(dev, ring); |
| @@ -358,7 +358,7 @@ bsd_ring_flush(struct drm_device *dev, | |||
| 358 | u32 invalidate_domains, | 358 | u32 invalidate_domains, |
| 359 | u32 flush_domains) | 359 | u32 flush_domains) |
| 360 | { | 360 | { |
| 361 | intel_ring_begin(dev, ring, 8); | 361 | intel_ring_begin(dev, ring, 2); |
| 362 | intel_ring_emit(dev, ring, MI_FLUSH); | 362 | intel_ring_emit(dev, ring, MI_FLUSH); |
| 363 | intel_ring_emit(dev, ring, MI_NOOP); | 363 | intel_ring_emit(dev, ring, MI_NOOP); |
| 364 | intel_ring_advance(dev, ring); | 364 | intel_ring_advance(dev, ring); |
| @@ -687,6 +687,7 @@ int intel_wrap_ring_buffer(struct drm_device *dev, | |||
| 687 | *virt++ = MI_NOOP; | 687 | *virt++ = MI_NOOP; |
| 688 | 688 | ||
| 689 | ring->tail = 0; | 689 | ring->tail = 0; |
| 690 | ring->space = ring->head - 8; | ||
| 690 | 691 | ||
| 691 | return 0; | 692 | return 0; |
| 692 | } | 693 | } |
| @@ -721,8 +722,9 @@ int intel_wait_ring_buffer(struct drm_device *dev, | |||
| 721 | } | 722 | } |
| 722 | 723 | ||
| 723 | void intel_ring_begin(struct drm_device *dev, | 724 | void intel_ring_begin(struct drm_device *dev, |
| 724 | struct intel_ring_buffer *ring, int n) | 725 | struct intel_ring_buffer *ring, int num_dwords) |
| 725 | { | 726 | { |
| 727 | int n = 4*num_dwords; | ||
| 726 | if (unlikely(ring->tail + n > ring->size)) | 728 | if (unlikely(ring->tail + n > ring->size)) |
| 727 | intel_wrap_ring_buffer(dev, ring); | 729 | intel_wrap_ring_buffer(dev, ring); |
| 728 | if (unlikely(ring->space < n)) | 730 | if (unlikely(ring->space < n)) |
| @@ -752,7 +754,7 @@ void intel_fill_struct(struct drm_device *dev, | |||
| 752 | { | 754 | { |
| 753 | unsigned int *virt = ring->virtual_start + ring->tail; | 755 | unsigned int *virt = ring->virtual_start + ring->tail; |
| 754 | BUG_ON((len&~(4-1)) != 0); | 756 | BUG_ON((len&~(4-1)) != 0); |
| 755 | intel_ring_begin(dev, ring, len); | 757 | intel_ring_begin(dev, ring, len/4); |
| 756 | memcpy(virt, data, len); | 758 | memcpy(virt, data, len); |
| 757 | ring->tail += len; | 759 | ring->tail += len; |
| 758 | ring->tail &= ring->size - 1; | 760 | ring->tail &= ring->size - 1; |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index f3f2827017ef..8c2d6478a221 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -498,7 +498,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 498 | if ((rdev->family == CHIP_RS600) || | 498 | if ((rdev->family == CHIP_RS600) || |
| 499 | (rdev->family == CHIP_RS690) || | 499 | (rdev->family == CHIP_RS690) || |
| 500 | (rdev->family == CHIP_RS740)) | 500 | (rdev->family == CHIP_RS740)) |
| 501 | pll->flags |= (RADEON_PLL_USE_FRAC_FB_DIV | | 501 | pll->flags |= (/*RADEON_PLL_USE_FRAC_FB_DIV |*/ |
| 502 | RADEON_PLL_PREFER_CLOSEST_LOWER); | 502 | RADEON_PLL_PREFER_CLOSEST_LOWER); |
| 503 | 503 | ||
| 504 | if (ASIC_IS_DCE32(rdev) && mode->clock > 200000) /* range limits??? */ | 504 | if (ASIC_IS_DCE32(rdev) && mode->clock > 200000) /* range limits??? */ |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 4b6623df3b96..1caf625e472b 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -607,7 +607,7 @@ static void evergreen_mc_program(struct radeon_device *rdev) | |||
| 607 | WREG32(MC_VM_FB_LOCATION, tmp); | 607 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 608 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 608 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 609 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 609 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 610 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 610 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 611 | if (rdev->flags & RADEON_IS_AGP) { | 611 | if (rdev->flags & RADEON_IS_AGP) { |
| 612 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); | 612 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
| 613 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 613 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
| @@ -1222,11 +1222,11 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1222 | ps_thread_count = 128; | 1222 | ps_thread_count = 128; |
| 1223 | 1223 | ||
| 1224 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); | 1224 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); |
| 1225 | sq_thread_resource_mgmt |= NUM_VS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1225 | sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1226 | sq_thread_resource_mgmt |= NUM_GS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1226 | sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1227 | sq_thread_resource_mgmt |= NUM_ES_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1227 | sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1228 | sq_thread_resource_mgmt_2 = NUM_HS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1228 | sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1229 | sq_thread_resource_mgmt_2 |= NUM_LS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1229 | sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1230 | 1230 | ||
| 1231 | sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); | 1231 | sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); |
| 1232 | sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); | 1232 | sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); |
| @@ -1260,6 +1260,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1260 | WREG32(VGT_GS_VERTEX_REUSE, 16); | 1260 | WREG32(VGT_GS_VERTEX_REUSE, 16); |
| 1261 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); | 1261 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); |
| 1262 | 1262 | ||
| 1263 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); | ||
| 1264 | WREG32(VGT_OUT_DEALLOC_CNTL, 16); | ||
| 1265 | |||
| 1263 | WREG32(CB_PERF_CTR0_SEL_0, 0); | 1266 | WREG32(CB_PERF_CTR0_SEL_0, 0); |
| 1264 | WREG32(CB_PERF_CTR0_SEL_1, 0); | 1267 | WREG32(CB_PERF_CTR0_SEL_1, 0); |
| 1265 | WREG32(CB_PERF_CTR1_SEL_0, 0); | 1268 | WREG32(CB_PERF_CTR1_SEL_0, 0); |
| @@ -1269,6 +1272,26 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1269 | WREG32(CB_PERF_CTR3_SEL_0, 0); | 1272 | WREG32(CB_PERF_CTR3_SEL_0, 0); |
| 1270 | WREG32(CB_PERF_CTR3_SEL_1, 0); | 1273 | WREG32(CB_PERF_CTR3_SEL_1, 0); |
| 1271 | 1274 | ||
| 1275 | /* clear render buffer base addresses */ | ||
| 1276 | WREG32(CB_COLOR0_BASE, 0); | ||
| 1277 | WREG32(CB_COLOR1_BASE, 0); | ||
| 1278 | WREG32(CB_COLOR2_BASE, 0); | ||
| 1279 | WREG32(CB_COLOR3_BASE, 0); | ||
| 1280 | WREG32(CB_COLOR4_BASE, 0); | ||
| 1281 | WREG32(CB_COLOR5_BASE, 0); | ||
| 1282 | WREG32(CB_COLOR6_BASE, 0); | ||
| 1283 | WREG32(CB_COLOR7_BASE, 0); | ||
| 1284 | WREG32(CB_COLOR8_BASE, 0); | ||
| 1285 | WREG32(CB_COLOR9_BASE, 0); | ||
| 1286 | WREG32(CB_COLOR10_BASE, 0); | ||
| 1287 | WREG32(CB_COLOR11_BASE, 0); | ||
| 1288 | |||
| 1289 | /* set the shader const cache sizes to 0 */ | ||
| 1290 | for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4) | ||
| 1291 | WREG32(i, 0); | ||
| 1292 | for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4) | ||
| 1293 | WREG32(i, 0); | ||
| 1294 | |||
| 1272 | hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); | 1295 | hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); |
| 1273 | WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); | 1296 | WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); |
| 1274 | 1297 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 64516b950891..010963d4570f 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
| @@ -1197,7 +1197,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
| 1197 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); | 1197 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); |
| 1198 | return -EINVAL; | 1198 | return -EINVAL; |
| 1199 | } | 1199 | } |
| 1200 | ib[idx+1+(i*8)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1200 | ib[idx+1+(i*8)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
| 1201 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) | 1201 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
| 1202 | ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); | 1202 | ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); |
| 1203 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 1203 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
| @@ -1209,7 +1209,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
| 1209 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); | 1209 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); |
| 1210 | return -EINVAL; | 1210 | return -EINVAL; |
| 1211 | } | 1211 | } |
| 1212 | ib[idx+1+(i*8)+4] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1212 | ib[idx+1+(i*8)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
| 1213 | mipmap = reloc->robj; | 1213 | mipmap = reloc->robj; |
| 1214 | r = evergreen_check_texture_resource(p, idx+1+(i*8), | 1214 | r = evergreen_check_texture_resource(p, idx+1+(i*8), |
| 1215 | texture, mipmap); | 1215 | texture, mipmap); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 79683f6b4452..a1cd621780e2 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -713,6 +713,9 @@ | |||
| 713 | #define SQ_GSVS_RING_OFFSET_2 0x28930 | 713 | #define SQ_GSVS_RING_OFFSET_2 0x28930 |
| 714 | #define SQ_GSVS_RING_OFFSET_3 0x28934 | 714 | #define SQ_GSVS_RING_OFFSET_3 0x28934 |
| 715 | 715 | ||
| 716 | #define SQ_ALU_CONST_BUFFER_SIZE_PS_0 0x28140 | ||
| 717 | #define SQ_ALU_CONST_BUFFER_SIZE_HS_0 0x28f80 | ||
| 718 | |||
| 716 | #define SQ_ALU_CONST_CACHE_PS_0 0x28940 | 719 | #define SQ_ALU_CONST_CACHE_PS_0 0x28940 |
| 717 | #define SQ_ALU_CONST_CACHE_PS_1 0x28944 | 720 | #define SQ_ALU_CONST_CACHE_PS_1 0x28944 |
| 718 | #define SQ_ALU_CONST_CACHE_PS_2 0x28948 | 721 | #define SQ_ALU_CONST_CACHE_PS_2 0x28948 |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index cf89aa2eb28c..3970e62eaab8 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1628,6 +1628,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1628 | case RADEON_TXFORMAT_RGB332: | 1628 | case RADEON_TXFORMAT_RGB332: |
| 1629 | case RADEON_TXFORMAT_Y8: | 1629 | case RADEON_TXFORMAT_Y8: |
| 1630 | track->textures[i].cpp = 1; | 1630 | track->textures[i].cpp = 1; |
| 1631 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1631 | break; | 1632 | break; |
| 1632 | case RADEON_TXFORMAT_AI88: | 1633 | case RADEON_TXFORMAT_AI88: |
| 1633 | case RADEON_TXFORMAT_ARGB1555: | 1634 | case RADEON_TXFORMAT_ARGB1555: |
| @@ -1639,12 +1640,14 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1639 | case RADEON_TXFORMAT_LDUDV655: | 1640 | case RADEON_TXFORMAT_LDUDV655: |
| 1640 | case RADEON_TXFORMAT_DUDV88: | 1641 | case RADEON_TXFORMAT_DUDV88: |
| 1641 | track->textures[i].cpp = 2; | 1642 | track->textures[i].cpp = 2; |
| 1643 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1642 | break; | 1644 | break; |
| 1643 | case RADEON_TXFORMAT_ARGB8888: | 1645 | case RADEON_TXFORMAT_ARGB8888: |
| 1644 | case RADEON_TXFORMAT_RGBA8888: | 1646 | case RADEON_TXFORMAT_RGBA8888: |
| 1645 | case RADEON_TXFORMAT_SHADOW32: | 1647 | case RADEON_TXFORMAT_SHADOW32: |
| 1646 | case RADEON_TXFORMAT_LDUDUV8888: | 1648 | case RADEON_TXFORMAT_LDUDUV8888: |
| 1647 | track->textures[i].cpp = 4; | 1649 | track->textures[i].cpp = 4; |
| 1650 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1648 | break; | 1651 | break; |
| 1649 | case RADEON_TXFORMAT_DXT1: | 1652 | case RADEON_TXFORMAT_DXT1: |
| 1650 | track->textures[i].cpp = 1; | 1653 | track->textures[i].cpp = 1; |
| @@ -2604,12 +2607,6 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 2604 | int surf_index = reg * 16; | 2607 | int surf_index = reg * 16; |
| 2605 | int flags = 0; | 2608 | int flags = 0; |
| 2606 | 2609 | ||
| 2607 | /* r100/r200 divide by 16 */ | ||
| 2608 | if (rdev->family < CHIP_R300) | ||
| 2609 | flags = pitch / 16; | ||
| 2610 | else | ||
| 2611 | flags = pitch / 8; | ||
| 2612 | |||
| 2613 | if (rdev->family <= CHIP_RS200) { | 2610 | if (rdev->family <= CHIP_RS200) { |
| 2614 | if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) | 2611 | if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) |
| 2615 | == (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) | 2612 | == (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) |
| @@ -2633,6 +2630,20 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 2633 | if (tiling_flags & RADEON_TILING_SWAP_32BIT) | 2630 | if (tiling_flags & RADEON_TILING_SWAP_32BIT) |
| 2634 | flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP; | 2631 | flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP; |
| 2635 | 2632 | ||
| 2633 | /* when we aren't tiling the pitch seems to needs to be furtherdivided down. - tested on power5 + rn50 server */ | ||
| 2634 | if (tiling_flags & (RADEON_TILING_SWAP_16BIT | RADEON_TILING_SWAP_32BIT)) { | ||
| 2635 | if (!(tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) | ||
| 2636 | if (ASIC_IS_RN50(rdev)) | ||
| 2637 | pitch /= 16; | ||
| 2638 | } | ||
| 2639 | |||
| 2640 | /* r100/r200 divide by 16 */ | ||
| 2641 | if (rdev->family < CHIP_R300) | ||
| 2642 | flags |= pitch / 16; | ||
| 2643 | else | ||
| 2644 | flags |= pitch / 8; | ||
| 2645 | |||
| 2646 | |||
| 2636 | DRM_DEBUG("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1); | 2647 | DRM_DEBUG("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1); |
| 2637 | WREG32(RADEON_SURFACE0_INFO + surf_index, flags); | 2648 | WREG32(RADEON_SURFACE0_INFO + surf_index, flags); |
| 2638 | WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset); | 2649 | WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset); |
| @@ -3147,33 +3158,6 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | |||
| 3147 | DRM_ERROR("compress format %d\n", t->compress_format); | 3158 | DRM_ERROR("compress format %d\n", t->compress_format); |
| 3148 | } | 3159 | } |
| 3149 | 3160 | ||
| 3150 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
| 3151 | struct r100_cs_track *track, unsigned idx) | ||
| 3152 | { | ||
| 3153 | unsigned face, w, h; | ||
| 3154 | struct radeon_bo *cube_robj; | ||
| 3155 | unsigned long size; | ||
| 3156 | |||
| 3157 | for (face = 0; face < 5; face++) { | ||
| 3158 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
| 3159 | w = track->textures[idx].cube_info[face].width; | ||
| 3160 | h = track->textures[idx].cube_info[face].height; | ||
| 3161 | |||
| 3162 | size = w * h; | ||
| 3163 | size *= track->textures[idx].cpp; | ||
| 3164 | |||
| 3165 | size += track->textures[idx].cube_info[face].offset; | ||
| 3166 | |||
| 3167 | if (size > radeon_bo_size(cube_robj)) { | ||
| 3168 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
| 3169 | size, radeon_bo_size(cube_robj)); | ||
| 3170 | r100_cs_track_texture_print(&track->textures[idx]); | ||
| 3171 | return -1; | ||
| 3172 | } | ||
| 3173 | } | ||
| 3174 | return 0; | ||
| 3175 | } | ||
| 3176 | |||
| 3177 | static int r100_track_compress_size(int compress_format, int w, int h) | 3161 | static int r100_track_compress_size(int compress_format, int w, int h) |
| 3178 | { | 3162 | { |
| 3179 | int block_width, block_height, block_bytes; | 3163 | int block_width, block_height, block_bytes; |
| @@ -3204,6 +3188,37 @@ static int r100_track_compress_size(int compress_format, int w, int h) | |||
| 3204 | return sz; | 3188 | return sz; |
| 3205 | } | 3189 | } |
| 3206 | 3190 | ||
| 3191 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
| 3192 | struct r100_cs_track *track, unsigned idx) | ||
| 3193 | { | ||
| 3194 | unsigned face, w, h; | ||
| 3195 | struct radeon_bo *cube_robj; | ||
| 3196 | unsigned long size; | ||
| 3197 | unsigned compress_format = track->textures[idx].compress_format; | ||
| 3198 | |||
| 3199 | for (face = 0; face < 5; face++) { | ||
| 3200 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
| 3201 | w = track->textures[idx].cube_info[face].width; | ||
| 3202 | h = track->textures[idx].cube_info[face].height; | ||
| 3203 | |||
| 3204 | if (compress_format) { | ||
| 3205 | size = r100_track_compress_size(compress_format, w, h); | ||
| 3206 | } else | ||
| 3207 | size = w * h; | ||
| 3208 | size *= track->textures[idx].cpp; | ||
| 3209 | |||
| 3210 | size += track->textures[idx].cube_info[face].offset; | ||
| 3211 | |||
| 3212 | if (size > radeon_bo_size(cube_robj)) { | ||
| 3213 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
| 3214 | size, radeon_bo_size(cube_robj)); | ||
| 3215 | r100_cs_track_texture_print(&track->textures[idx]); | ||
| 3216 | return -1; | ||
| 3217 | } | ||
| 3218 | } | ||
| 3219 | return 0; | ||
| 3220 | } | ||
| 3221 | |||
| 3207 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | 3222 | static int r100_cs_track_texture_check(struct radeon_device *rdev, |
| 3208 | struct r100_cs_track *track) | 3223 | struct r100_cs_track *track) |
| 3209 | { | 3224 | { |
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index 85617c311212..0266d72e0a4c 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c | |||
| @@ -415,6 +415,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 415 | /* 2D, 3D, CUBE */ | 415 | /* 2D, 3D, CUBE */ |
| 416 | switch (tmp) { | 416 | switch (tmp) { |
| 417 | case 0: | 417 | case 0: |
| 418 | case 3: | ||
| 419 | case 4: | ||
| 418 | case 5: | 420 | case 5: |
| 419 | case 6: | 421 | case 6: |
| 420 | case 7: | 422 | case 7: |
| @@ -450,6 +452,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 450 | case R200_TXFORMAT_RGB332: | 452 | case R200_TXFORMAT_RGB332: |
| 451 | case R200_TXFORMAT_Y8: | 453 | case R200_TXFORMAT_Y8: |
| 452 | track->textures[i].cpp = 1; | 454 | track->textures[i].cpp = 1; |
| 455 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 453 | break; | 456 | break; |
| 454 | case R200_TXFORMAT_AI88: | 457 | case R200_TXFORMAT_AI88: |
| 455 | case R200_TXFORMAT_ARGB1555: | 458 | case R200_TXFORMAT_ARGB1555: |
| @@ -461,6 +464,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 461 | case R200_TXFORMAT_DVDU88: | 464 | case R200_TXFORMAT_DVDU88: |
| 462 | case R200_TXFORMAT_AVYU4444: | 465 | case R200_TXFORMAT_AVYU4444: |
| 463 | track->textures[i].cpp = 2; | 466 | track->textures[i].cpp = 2; |
| 467 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 464 | break; | 468 | break; |
| 465 | case R200_TXFORMAT_ARGB8888: | 469 | case R200_TXFORMAT_ARGB8888: |
| 466 | case R200_TXFORMAT_RGBA8888: | 470 | case R200_TXFORMAT_RGBA8888: |
| @@ -468,6 +472,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 468 | case R200_TXFORMAT_BGR111110: | 472 | case R200_TXFORMAT_BGR111110: |
| 469 | case R200_TXFORMAT_LDVDU8888: | 473 | case R200_TXFORMAT_LDVDU8888: |
| 470 | track->textures[i].cpp = 4; | 474 | track->textures[i].cpp = 4; |
| 475 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 471 | break; | 476 | break; |
| 472 | case R200_TXFORMAT_DXT1: | 477 | case R200_TXFORMAT_DXT1: |
| 473 | track->textures[i].cpp = 1; | 478 | track->textures[i].cpp = 1; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index b2f9efe2897c..7e81db5eb804 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -881,6 +881,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 881 | case R300_TX_FORMAT_Y4X4: | 881 | case R300_TX_FORMAT_Y4X4: |
| 882 | case R300_TX_FORMAT_Z3Y3X2: | 882 | case R300_TX_FORMAT_Z3Y3X2: |
| 883 | track->textures[i].cpp = 1; | 883 | track->textures[i].cpp = 1; |
| 884 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 884 | break; | 885 | break; |
| 885 | case R300_TX_FORMAT_X16: | 886 | case R300_TX_FORMAT_X16: |
| 886 | case R300_TX_FORMAT_Y8X8: | 887 | case R300_TX_FORMAT_Y8X8: |
| @@ -892,6 +893,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 892 | case R300_TX_FORMAT_B8G8_B8G8: | 893 | case R300_TX_FORMAT_B8G8_B8G8: |
| 893 | case R300_TX_FORMAT_G8R8_G8B8: | 894 | case R300_TX_FORMAT_G8R8_G8B8: |
| 894 | track->textures[i].cpp = 2; | 895 | track->textures[i].cpp = 2; |
| 896 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 895 | break; | 897 | break; |
| 896 | case R300_TX_FORMAT_Y16X16: | 898 | case R300_TX_FORMAT_Y16X16: |
| 897 | case R300_TX_FORMAT_Z11Y11X10: | 899 | case R300_TX_FORMAT_Z11Y11X10: |
| @@ -902,14 +904,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 902 | case R300_TX_FORMAT_FL_I32: | 904 | case R300_TX_FORMAT_FL_I32: |
| 903 | case 0x1e: | 905 | case 0x1e: |
| 904 | track->textures[i].cpp = 4; | 906 | track->textures[i].cpp = 4; |
| 907 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 905 | break; | 908 | break; |
| 906 | case R300_TX_FORMAT_W16Z16Y16X16: | 909 | case R300_TX_FORMAT_W16Z16Y16X16: |
| 907 | case R300_TX_FORMAT_FL_R16G16B16A16: | 910 | case R300_TX_FORMAT_FL_R16G16B16A16: |
| 908 | case R300_TX_FORMAT_FL_I32A32: | 911 | case R300_TX_FORMAT_FL_I32A32: |
| 909 | track->textures[i].cpp = 8; | 912 | track->textures[i].cpp = 8; |
| 913 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 910 | break; | 914 | break; |
| 911 | case R300_TX_FORMAT_FL_R32G32B32A32: | 915 | case R300_TX_FORMAT_FL_R32G32B32A32: |
| 912 | track->textures[i].cpp = 16; | 916 | track->textures[i].cpp = 16; |
| 917 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 913 | break; | 918 | break; |
| 914 | case R300_TX_FORMAT_DXT1: | 919 | case R300_TX_FORMAT_DXT1: |
| 915 | track->textures[i].cpp = 1; | 920 | track->textures[i].cpp = 1; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0e91871f45be..3d6645ce2151 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -130,9 +130,14 @@ void r600_pm_get_dynpm_state(struct radeon_device *rdev) | |||
| 130 | break; | 130 | break; |
| 131 | } | 131 | } |
| 132 | } | 132 | } |
| 133 | } else | 133 | } else { |
| 134 | rdev->pm.requested_power_state_index = | 134 | if (rdev->pm.current_power_state_index == 0) |
| 135 | rdev->pm.current_power_state_index - 1; | 135 | rdev->pm.requested_power_state_index = |
| 136 | rdev->pm.num_power_states - 1; | ||
| 137 | else | ||
| 138 | rdev->pm.requested_power_state_index = | ||
| 139 | rdev->pm.current_power_state_index - 1; | ||
| 140 | } | ||
| 136 | } | 141 | } |
| 137 | rdev->pm.requested_clock_mode_index = 0; | 142 | rdev->pm.requested_clock_mode_index = 0; |
| 138 | /* don't use the power state if crtcs are active and no display flag is set */ | 143 | /* don't use the power state if crtcs are active and no display flag is set */ |
| @@ -1097,7 +1102,7 @@ static void r600_mc_program(struct radeon_device *rdev) | |||
| 1097 | WREG32(MC_VM_FB_LOCATION, tmp); | 1102 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 1098 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 1103 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 1099 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 1104 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 1100 | WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF); | 1105 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 1101 | if (rdev->flags & RADEON_IS_AGP) { | 1106 | if (rdev->flags & RADEON_IS_AGP) { |
| 1102 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); | 1107 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); |
| 1103 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); | 1108 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); |
| @@ -1219,8 +1224,10 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 1219 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 1224 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
| 1220 | r600_vram_gtt_location(rdev, &rdev->mc); | 1225 | r600_vram_gtt_location(rdev, &rdev->mc); |
| 1221 | 1226 | ||
| 1222 | if (rdev->flags & RADEON_IS_IGP) | 1227 | if (rdev->flags & RADEON_IS_IGP) { |
| 1228 | rs690_pm_info(rdev); | ||
| 1223 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 1229 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 1230 | } | ||
| 1224 | radeon_update_bandwidth_info(rdev); | 1231 | radeon_update_bandwidth_info(rdev); |
| 1225 | return 0; | 1232 | return 0; |
| 1226 | } | 1233 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8e1d44ca26ec..ab61aaa887bb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -177,6 +177,7 @@ void radeon_pm_resume(struct radeon_device *rdev); | |||
| 177 | void radeon_combios_get_power_modes(struct radeon_device *rdev); | 177 | void radeon_combios_get_power_modes(struct radeon_device *rdev); |
| 178 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 178 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
| 179 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); | 179 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); |
| 180 | void rs690_pm_info(struct radeon_device *rdev); | ||
| 180 | 181 | ||
| 181 | /* | 182 | /* |
| 182 | * Fences. | 183 | * Fences. |
| @@ -619,7 +620,8 @@ enum radeon_dynpm_state { | |||
| 619 | DYNPM_STATE_DISABLED, | 620 | DYNPM_STATE_DISABLED, |
| 620 | DYNPM_STATE_MINIMUM, | 621 | DYNPM_STATE_MINIMUM, |
| 621 | DYNPM_STATE_PAUSED, | 622 | DYNPM_STATE_PAUSED, |
| 622 | DYNPM_STATE_ACTIVE | 623 | DYNPM_STATE_ACTIVE, |
| 624 | DYNPM_STATE_SUSPENDED, | ||
| 623 | }; | 625 | }; |
| 624 | enum radeon_dynpm_action { | 626 | enum radeon_dynpm_action { |
| 625 | DYNPM_ACTION_NONE, | 627 | DYNPM_ACTION_NONE, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 87f7e2cc52d4..646f96f97c77 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -780,6 +780,13 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
| 780 | case CHIP_R423: | 780 | case CHIP_R423: |
| 781 | case CHIP_RV410: | 781 | case CHIP_RV410: |
| 782 | rdev->asic = &r420_asic; | 782 | rdev->asic = &r420_asic; |
| 783 | /* handle macs */ | ||
| 784 | if (rdev->bios == NULL) { | ||
| 785 | rdev->asic->get_engine_clock = &radeon_legacy_get_engine_clock; | ||
| 786 | rdev->asic->set_engine_clock = &radeon_legacy_set_engine_clock; | ||
| 787 | rdev->asic->get_memory_clock = &radeon_legacy_get_memory_clock; | ||
| 788 | rdev->asic->set_memory_clock = NULL; | ||
| 789 | } | ||
| 783 | break; | 790 | break; |
| 784 | case CHIP_RS400: | 791 | case CHIP_RS400: |
| 785 | case CHIP_RS480: | 792 | case CHIP_RS480: |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index fbba938f8048..2c9213739999 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -48,6 +48,10 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev) | |||
| 48 | resource_size_t vram_base; | 48 | resource_size_t vram_base; |
| 49 | resource_size_t size = 256 * 1024; /* ??? */ | 49 | resource_size_t size = 256 * 1024; /* ??? */ |
| 50 | 50 | ||
| 51 | if (!(rdev->flags & RADEON_IS_IGP)) | ||
| 52 | if (!radeon_card_posted(rdev)) | ||
| 53 | return false; | ||
| 54 | |||
| 51 | rdev->bios = NULL; | 55 | rdev->bios = NULL; |
| 52 | vram_base = drm_get_resource_start(rdev->ddev, 0); | 56 | vram_base = drm_get_resource_start(rdev->ddev, 0); |
| 53 | bios = ioremap(vram_base, size); | 57 | bios = ioremap(vram_base, size); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 1bee2f9e24a5..d1c1d8dd93ce 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -1411,6 +1411,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 1411 | rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; | 1411 | rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; |
| 1412 | } else | 1412 | } else |
| 1413 | #endif /* CONFIG_PPC_PMAC */ | 1413 | #endif /* CONFIG_PPC_PMAC */ |
| 1414 | #ifdef CONFIG_PPC64 | ||
| 1415 | if (ASIC_IS_RN50(rdev)) | ||
| 1416 | rdev->mode_info.connector_table = CT_RN50_POWER; | ||
| 1417 | else | ||
| 1418 | #endif | ||
| 1414 | rdev->mode_info.connector_table = CT_GENERIC; | 1419 | rdev->mode_info.connector_table = CT_GENERIC; |
| 1415 | } | 1420 | } |
| 1416 | 1421 | ||
| @@ -1853,6 +1858,33 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 1853 | CONNECTOR_OBJECT_ID_SVIDEO, | 1858 | CONNECTOR_OBJECT_ID_SVIDEO, |
| 1854 | &hpd); | 1859 | &hpd); |
| 1855 | break; | 1860 | break; |
| 1861 | case CT_RN50_POWER: | ||
| 1862 | DRM_INFO("Connector Table: %d (rn50-power)\n", | ||
| 1863 | rdev->mode_info.connector_table); | ||
| 1864 | /* VGA - primary dac */ | ||
| 1865 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); | ||
| 1866 | hpd.hpd = RADEON_HPD_NONE; | ||
| 1867 | radeon_add_legacy_encoder(dev, | ||
| 1868 | radeon_get_encoder_id(dev, | ||
| 1869 | ATOM_DEVICE_CRT1_SUPPORT, | ||
| 1870 | 1), | ||
| 1871 | ATOM_DEVICE_CRT1_SUPPORT); | ||
| 1872 | radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_CRT1_SUPPORT, | ||
| 1873 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
| 1874 | CONNECTOR_OBJECT_ID_VGA, | ||
| 1875 | &hpd); | ||
| 1876 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); | ||
| 1877 | hpd.hpd = RADEON_HPD_NONE; | ||
| 1878 | radeon_add_legacy_encoder(dev, | ||
| 1879 | radeon_get_encoder_id(dev, | ||
| 1880 | ATOM_DEVICE_CRT2_SUPPORT, | ||
| 1881 | 2), | ||
| 1882 | ATOM_DEVICE_CRT2_SUPPORT); | ||
| 1883 | radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT, | ||
| 1884 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
| 1885 | CONNECTOR_OBJECT_ID_VGA, | ||
| 1886 | &hpd); | ||
| 1887 | break; | ||
| 1856 | default: | 1888 | default: |
| 1857 | DRM_INFO("Connector table: %d (invalid)\n", | 1889 | DRM_INFO("Connector table: %d (invalid)\n", |
| 1858 | rdev->mode_info.connector_table); | 1890 | rdev->mode_info.connector_table); |
| @@ -1906,15 +1938,6 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev, | |||
| 1906 | return false; | 1938 | return false; |
| 1907 | } | 1939 | } |
| 1908 | 1940 | ||
| 1909 | /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */ | ||
| 1910 | if (dev->pdev->device == 0x5159 && | ||
| 1911 | dev->pdev->subsystem_vendor == 0x1002 && | ||
| 1912 | dev->pdev->subsystem_device == 0x013a) { | ||
| 1913 | if (*legacy_connector == CONNECTOR_DVI_I_LEGACY) | ||
| 1914 | *legacy_connector = CONNECTOR_CRT_LEGACY; | ||
| 1915 | |||
| 1916 | } | ||
| 1917 | |||
| 1918 | /* X300 card with extra non-existent DVI port */ | 1941 | /* X300 card with extra non-existent DVI port */ |
| 1919 | if (dev->pdev->device == 0x5B60 && | 1942 | if (dev->pdev->device == 0x5B60 && |
| 1920 | dev->pdev->subsystem_vendor == 0x17af && | 1943 | dev->pdev->subsystem_vendor == 0x17af && |
| @@ -3019,6 +3042,14 @@ void radeon_combios_asic_init(struct drm_device *dev) | |||
| 3019 | combios_write_ram_size(dev); | 3042 | combios_write_ram_size(dev); |
| 3020 | } | 3043 | } |
| 3021 | 3044 | ||
| 3045 | /* quirk for rs4xx HP nx6125 laptop to make it resume | ||
| 3046 | * - it hangs on resume inside the dynclk 1 table. | ||
| 3047 | */ | ||
| 3048 | if (rdev->family == CHIP_RS480 && | ||
| 3049 | rdev->pdev->subsystem_vendor == 0x103c && | ||
| 3050 | rdev->pdev->subsystem_device == 0x308b) | ||
| 3051 | return; | ||
| 3052 | |||
| 3022 | /* DYN CLK 1 */ | 3053 | /* DYN CLK 1 */ |
| 3023 | table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); | 3054 | table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); |
| 3024 | if (table) | 3055 | if (table) |
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index b7023fff89eb..4eb67c0e0996 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
| @@ -194,7 +194,7 @@ unpin: | |||
| 194 | fail: | 194 | fail: |
| 195 | drm_gem_object_unreference_unlocked(obj); | 195 | drm_gem_object_unreference_unlocked(obj); |
| 196 | 196 | ||
| 197 | return 0; | 197 | return ret; |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | int radeon_crtc_cursor_move(struct drm_crtc *crtc, | 200 | int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index f10faed21567..5f317317aba2 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -779,6 +779,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
| 779 | 779 | ||
| 780 | int radeon_resume_kms(struct drm_device *dev) | 780 | int radeon_resume_kms(struct drm_device *dev) |
| 781 | { | 781 | { |
| 782 | struct drm_connector *connector; | ||
| 782 | struct radeon_device *rdev = dev->dev_private; | 783 | struct radeon_device *rdev = dev->dev_private; |
| 783 | 784 | ||
| 784 | if (rdev->powered_down) | 785 | if (rdev->powered_down) |
| @@ -797,6 +798,12 @@ int radeon_resume_kms(struct drm_device *dev) | |||
| 797 | radeon_resume(rdev); | 798 | radeon_resume(rdev); |
| 798 | radeon_pm_resume(rdev); | 799 | radeon_pm_resume(rdev); |
| 799 | radeon_restore_bios_scratch_regs(rdev); | 800 | radeon_restore_bios_scratch_regs(rdev); |
| 801 | |||
| 802 | /* turn on display hw */ | ||
| 803 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
| 804 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
| 805 | } | ||
| 806 | |||
| 800 | radeon_fbdev_set_suspend(rdev, 0); | 807 | radeon_fbdev_set_suspend(rdev, 0); |
| 801 | release_console_sem(); | 808 | release_console_sem(); |
| 802 | 809 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 1ebb100015b7..e0b30b264c28 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -1072,6 +1072,8 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1072 | if (is_dig) { | 1072 | if (is_dig) { |
| 1073 | switch (mode) { | 1073 | switch (mode) { |
| 1074 | case DRM_MODE_DPMS_ON: | 1074 | case DRM_MODE_DPMS_ON: |
| 1075 | if (!ASIC_IS_DCE4(rdev)) | ||
| 1076 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1075 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { | 1077 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
| 1076 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1078 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1077 | 1079 | ||
| @@ -1079,8 +1081,6 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1079 | if (ASIC_IS_DCE4(rdev)) | 1081 | if (ASIC_IS_DCE4(rdev)) |
| 1080 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON); | 1082 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON); |
| 1081 | } | 1083 | } |
| 1082 | if (!ASIC_IS_DCE4(rdev)) | ||
| 1083 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1084 | break; | 1084 | break; |
| 1085 | case DRM_MODE_DPMS_STANDBY: | 1085 | case DRM_MODE_DPMS_STANDBY: |
| 1086 | case DRM_MODE_DPMS_SUSPEND: | 1086 | case DRM_MODE_DPMS_SUSPEND: |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 5b07b8848e09..bad77f40a9da 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -928,16 +928,14 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 928 | if (ASIC_IS_R300(rdev)) { | 928 | if (ASIC_IS_R300(rdev)) { |
| 929 | gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1; | 929 | gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1; |
| 930 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); | 930 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); |
| 931 | } | 931 | } else if (rdev->family != CHIP_R200) |
| 932 | |||
| 933 | if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) | ||
| 934 | disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); | ||
| 935 | else | ||
| 936 | disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); | 932 | disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); |
| 937 | 933 | else if (rdev->family == CHIP_R200) | |
| 938 | if (rdev->family == CHIP_R200) | ||
| 939 | fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); | 934 | fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); |
| 940 | 935 | ||
| 936 | if (rdev->family >= CHIP_R200) | ||
| 937 | disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); | ||
| 938 | |||
| 941 | if (is_tv) { | 939 | if (is_tv) { |
| 942 | uint32_t dac_cntl; | 940 | uint32_t dac_cntl; |
| 943 | 941 | ||
| @@ -1002,15 +1000,13 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 1002 | if (ASIC_IS_R300(rdev)) { | 1000 | if (ASIC_IS_R300(rdev)) { |
| 1003 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); | 1001 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); |
| 1004 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); | 1002 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); |
| 1005 | } | 1003 | } else if (rdev->family != CHIP_R200) |
| 1004 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); | ||
| 1005 | else if (rdev->family == CHIP_R200) | ||
| 1006 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); | ||
| 1006 | 1007 | ||
| 1007 | if (rdev->family >= CHIP_R200) | 1008 | if (rdev->family >= CHIP_R200) |
| 1008 | WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); | 1009 | WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); |
| 1009 | else | ||
| 1010 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); | ||
| 1011 | |||
| 1012 | if (rdev->family == CHIP_R200) | ||
| 1013 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); | ||
| 1014 | 1010 | ||
| 1015 | if (is_tv) | 1011 | if (is_tv) |
| 1016 | radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); | 1012 | radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 67358baf28b2..95696aa57ac8 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -206,6 +206,7 @@ enum radeon_connector_table { | |||
| 206 | CT_MINI_INTERNAL, | 206 | CT_MINI_INTERNAL, |
| 207 | CT_IMAC_G5_ISIGHT, | 207 | CT_IMAC_G5_ISIGHT, |
| 208 | CT_EMAC, | 208 | CT_EMAC, |
| 209 | CT_RN50_POWER, | ||
| 209 | }; | 210 | }; |
| 210 | 211 | ||
| 211 | enum radeon_dvo_chip { | 212 | enum radeon_dvo_chip { |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 63f679a04b25..115d26b762cc 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -397,13 +397,20 @@ static ssize_t radeon_set_pm_method(struct device *dev, | |||
| 397 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; | 397 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
| 398 | mutex_unlock(&rdev->pm.mutex); | 398 | mutex_unlock(&rdev->pm.mutex); |
| 399 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { | 399 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { |
| 400 | bool flush_wq = false; | ||
| 401 | |||
| 400 | mutex_lock(&rdev->pm.mutex); | 402 | mutex_lock(&rdev->pm.mutex); |
| 401 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 403 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 404 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | ||
| 405 | flush_wq = true; | ||
| 406 | } | ||
| 402 | /* disable dynpm */ | 407 | /* disable dynpm */ |
| 403 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; | 408 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
| 404 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; | 409 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
| 405 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | 410 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
| 406 | mutex_unlock(&rdev->pm.mutex); | 411 | mutex_unlock(&rdev->pm.mutex); |
| 412 | if (flush_wq) | ||
| 413 | flush_workqueue(rdev->wq); | ||
| 407 | } else { | 414 | } else { |
| 408 | DRM_ERROR("invalid power method!\n"); | 415 | DRM_ERROR("invalid power method!\n"); |
| 409 | goto fail; | 416 | goto fail; |
| @@ -418,9 +425,18 @@ static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon | |||
| 418 | 425 | ||
| 419 | void radeon_pm_suspend(struct radeon_device *rdev) | 426 | void radeon_pm_suspend(struct radeon_device *rdev) |
| 420 | { | 427 | { |
| 428 | bool flush_wq = false; | ||
| 429 | |||
| 421 | mutex_lock(&rdev->pm.mutex); | 430 | mutex_lock(&rdev->pm.mutex); |
| 422 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | 431 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 432 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | ||
| 433 | if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) | ||
| 434 | rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; | ||
| 435 | flush_wq = true; | ||
| 436 | } | ||
| 423 | mutex_unlock(&rdev->pm.mutex); | 437 | mutex_unlock(&rdev->pm.mutex); |
| 438 | if (flush_wq) | ||
| 439 | flush_workqueue(rdev->wq); | ||
| 424 | } | 440 | } |
| 425 | 441 | ||
| 426 | void radeon_pm_resume(struct radeon_device *rdev) | 442 | void radeon_pm_resume(struct radeon_device *rdev) |
| @@ -432,6 +448,12 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
| 432 | rdev->pm.current_sclk = rdev->clock.default_sclk; | 448 | rdev->pm.current_sclk = rdev->clock.default_sclk; |
| 433 | rdev->pm.current_mclk = rdev->clock.default_mclk; | 449 | rdev->pm.current_mclk = rdev->clock.default_mclk; |
| 434 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; | 450 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
| 451 | if (rdev->pm.pm_method == PM_METHOD_DYNPM | ||
| 452 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { | ||
| 453 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; | ||
| 454 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 455 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 456 | } | ||
| 435 | mutex_unlock(&rdev->pm.mutex); | 457 | mutex_unlock(&rdev->pm.mutex); |
| 436 | radeon_pm_compute_clocks(rdev); | 458 | radeon_pm_compute_clocks(rdev); |
| 437 | } | 459 | } |
| @@ -486,6 +508,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
| 486 | void radeon_pm_fini(struct radeon_device *rdev) | 508 | void radeon_pm_fini(struct radeon_device *rdev) |
| 487 | { | 509 | { |
| 488 | if (rdev->pm.num_power_states > 1) { | 510 | if (rdev->pm.num_power_states > 1) { |
| 511 | bool flush_wq = false; | ||
| 512 | |||
| 489 | mutex_lock(&rdev->pm.mutex); | 513 | mutex_lock(&rdev->pm.mutex); |
| 490 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { | 514 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
| 491 | rdev->pm.profile = PM_PROFILE_DEFAULT; | 515 | rdev->pm.profile = PM_PROFILE_DEFAULT; |
| @@ -493,13 +517,16 @@ void radeon_pm_fini(struct radeon_device *rdev) | |||
| 493 | radeon_pm_set_clocks(rdev); | 517 | radeon_pm_set_clocks(rdev); |
| 494 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { | 518 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 495 | /* cancel work */ | 519 | /* cancel work */ |
| 496 | cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); | 520 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); |
| 521 | flush_wq = true; | ||
| 497 | /* reset default clocks */ | 522 | /* reset default clocks */ |
| 498 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; | 523 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
| 499 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; | 524 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
| 500 | radeon_pm_set_clocks(rdev); | 525 | radeon_pm_set_clocks(rdev); |
| 501 | } | 526 | } |
| 502 | mutex_unlock(&rdev->pm.mutex); | 527 | mutex_unlock(&rdev->pm.mutex); |
| 528 | if (flush_wq) | ||
| 529 | flush_workqueue(rdev->wq); | ||
| 503 | 530 | ||
| 504 | device_remove_file(rdev->dev, &dev_attr_power_profile); | 531 | device_remove_file(rdev->dev, &dev_attr_power_profile); |
| 505 | device_remove_file(rdev->dev, &dev_attr_power_method); | 532 | device_remove_file(rdev->dev, &dev_attr_power_method); |
| @@ -720,12 +747,12 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work) | |||
| 720 | radeon_pm_get_dynpm_state(rdev); | 747 | radeon_pm_get_dynpm_state(rdev); |
| 721 | radeon_pm_set_clocks(rdev); | 748 | radeon_pm_set_clocks(rdev); |
| 722 | } | 749 | } |
| 750 | |||
| 751 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 752 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 723 | } | 753 | } |
| 724 | mutex_unlock(&rdev->pm.mutex); | 754 | mutex_unlock(&rdev->pm.mutex); |
| 725 | ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); | 755 | ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); |
| 726 | |||
| 727 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 728 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 729 | } | 756 | } |
| 730 | 757 | ||
| 731 | /* | 758 | /* |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen b/drivers/gpu/drm/radeon/reg_srcs/evergreen index b5c757f68d3c..f78fd592544d 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/evergreen +++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen | |||
| @@ -80,8 +80,8 @@ evergreen 0x9400 | |||
| 80 | 0x00028010 DB_RENDER_OVERRIDE2 | 80 | 0x00028010 DB_RENDER_OVERRIDE2 |
| 81 | 0x00028028 DB_STENCIL_CLEAR | 81 | 0x00028028 DB_STENCIL_CLEAR |
| 82 | 0x0002802C DB_DEPTH_CLEAR | 82 | 0x0002802C DB_DEPTH_CLEAR |
| 83 | 0x00028034 PA_SC_SCREEN_SCISSOR_BR | ||
| 84 | 0x00028030 PA_SC_SCREEN_SCISSOR_TL | 83 | 0x00028030 PA_SC_SCREEN_SCISSOR_TL |
| 84 | 0x00028034 PA_SC_SCREEN_SCISSOR_BR | ||
| 85 | 0x0002805C DB_DEPTH_SLICE | 85 | 0x0002805C DB_DEPTH_SLICE |
| 86 | 0x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0 | 86 | 0x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0 |
| 87 | 0x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1 | 87 | 0x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1 |
| @@ -460,8 +460,8 @@ evergreen 0x9400 | |||
| 460 | 0x00028844 SQ_PGM_RESOURCES_PS | 460 | 0x00028844 SQ_PGM_RESOURCES_PS |
| 461 | 0x00028848 SQ_PGM_RESOURCES_2_PS | 461 | 0x00028848 SQ_PGM_RESOURCES_2_PS |
| 462 | 0x0002884C SQ_PGM_EXPORTS_PS | 462 | 0x0002884C SQ_PGM_EXPORTS_PS |
| 463 | 0x0002885C SQ_PGM_RESOURCES_VS | 463 | 0x00028860 SQ_PGM_RESOURCES_VS |
| 464 | 0x00028860 SQ_PGM_RESOURCES_2_VS | 464 | 0x00028864 SQ_PGM_RESOURCES_2_VS |
| 465 | 0x00028878 SQ_PGM_RESOURCES_GS | 465 | 0x00028878 SQ_PGM_RESOURCES_GS |
| 466 | 0x0002887C SQ_PGM_RESOURCES_2_GS | 466 | 0x0002887C SQ_PGM_RESOURCES_2_GS |
| 467 | 0x00028890 SQ_PGM_RESOURCES_ES | 467 | 0x00028890 SQ_PGM_RESOURCES_ES |
| @@ -469,8 +469,8 @@ evergreen 0x9400 | |||
| 469 | 0x000288A8 SQ_PGM_RESOURCES_FS | 469 | 0x000288A8 SQ_PGM_RESOURCES_FS |
| 470 | 0x000288BC SQ_PGM_RESOURCES_HS | 470 | 0x000288BC SQ_PGM_RESOURCES_HS |
| 471 | 0x000288C0 SQ_PGM_RESOURCES_2_HS | 471 | 0x000288C0 SQ_PGM_RESOURCES_2_HS |
| 472 | 0x000288D0 SQ_PGM_RESOURCES_LS | 472 | 0x000288D4 SQ_PGM_RESOURCES_LS |
| 473 | 0x000288D4 SQ_PGM_RESOURCES_2_LS | 473 | 0x000288D8 SQ_PGM_RESOURCES_2_LS |
| 474 | 0x000288E8 SQ_LDS_ALLOC | 474 | 0x000288E8 SQ_LDS_ALLOC |
| 475 | 0x000288EC SQ_LDS_ALLOC_PS | 475 | 0x000288EC SQ_LDS_ALLOC_PS |
| 476 | 0x000288F0 SQ_VTX_SEMANTIC_CLEAR | 476 | 0x000288F0 SQ_VTX_SEMANTIC_CLEAR |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index bcc33195ebc2..f4f0a61bcdce 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -79,7 +79,13 @@ void rs690_pm_info(struct radeon_device *rdev) | |||
| 79 | tmp.full = dfixed_const(100); | 79 | tmp.full = dfixed_const(100); |
| 80 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock); | 80 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock); |
| 81 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); | 81 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); |
| 82 | rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock)); | 82 | if (info->info.usK8MemoryClock) |
| 83 | rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock)); | ||
| 84 | else if (rdev->clock.default_mclk) { | ||
| 85 | rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); | ||
| 86 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 87 | } else | ||
| 88 | rdev->pm.igp_system_mclk.full = dfixed_const(400); | ||
| 83 | rdev->pm.igp_ht_link_clk.full = dfixed_const(le16_to_cpu(info->info.usFSBClock)); | 89 | rdev->pm.igp_ht_link_clk.full = dfixed_const(le16_to_cpu(info->info.usFSBClock)); |
| 84 | rdev->pm.igp_ht_link_width.full = dfixed_const(info->info.ucHTLinkWidth); | 90 | rdev->pm.igp_ht_link_width.full = dfixed_const(info->info.ucHTLinkWidth); |
| 85 | break; | 91 | break; |
| @@ -87,34 +93,31 @@ void rs690_pm_info(struct radeon_device *rdev) | |||
| 87 | tmp.full = dfixed_const(100); | 93 | tmp.full = dfixed_const(100); |
| 88 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock); | 94 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock); |
| 89 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); | 95 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); |
| 90 | rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock); | 96 | if (info->info_v2.ulBootUpUMAClock) |
| 97 | rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock); | ||
| 98 | else if (rdev->clock.default_mclk) | ||
| 99 | rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); | ||
| 100 | else | ||
| 101 | rdev->pm.igp_system_mclk.full = dfixed_const(66700); | ||
| 91 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | 102 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); |
| 92 | rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq); | 103 | rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq); |
| 93 | rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp); | 104 | rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp); |
| 94 | rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth)); | 105 | rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth)); |
| 95 | break; | 106 | break; |
| 96 | default: | 107 | default: |
| 97 | tmp.full = dfixed_const(100); | ||
| 98 | /* We assume the slower possible clock ie worst case */ | 108 | /* We assume the slower possible clock ie worst case */ |
| 99 | /* DDR 333Mhz */ | 109 | rdev->pm.igp_sideport_mclk.full = dfixed_const(200); |
| 100 | rdev->pm.igp_sideport_mclk.full = dfixed_const(333); | 110 | rdev->pm.igp_system_mclk.full = dfixed_const(200); |
| 101 | /* FIXME: system clock ? */ | 111 | rdev->pm.igp_ht_link_clk.full = dfixed_const(1000); |
| 102 | rdev->pm.igp_system_mclk.full = dfixed_const(100); | ||
| 103 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 104 | rdev->pm.igp_ht_link_clk.full = dfixed_const(200); | ||
| 105 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); | 112 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); |
| 106 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); | 113 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); |
| 107 | break; | 114 | break; |
| 108 | } | 115 | } |
| 109 | } else { | 116 | } else { |
| 110 | tmp.full = dfixed_const(100); | ||
| 111 | /* We assume the slower possible clock ie worst case */ | 117 | /* We assume the slower possible clock ie worst case */ |
| 112 | /* DDR 333Mhz */ | 118 | rdev->pm.igp_sideport_mclk.full = dfixed_const(200); |
| 113 | rdev->pm.igp_sideport_mclk.full = dfixed_const(333); | 119 | rdev->pm.igp_system_mclk.full = dfixed_const(200); |
| 114 | /* FIXME: system clock ? */ | 120 | rdev->pm.igp_ht_link_clk.full = dfixed_const(1000); |
| 115 | rdev->pm.igp_system_mclk.full = dfixed_const(100); | ||
| 116 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 117 | rdev->pm.igp_ht_link_clk.full = dfixed_const(200); | ||
| 118 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); | 121 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); |
| 119 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); | 122 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); |
| 120 | } | 123 | } |
| @@ -228,10 +231,6 @@ void rs690_crtc_bandwidth_compute(struct radeon_device *rdev, | |||
| 228 | fixed20_12 a, b, c; | 231 | fixed20_12 a, b, c; |
| 229 | fixed20_12 pclk, request_fifo_depth, tolerable_latency, estimated_width; | 232 | fixed20_12 pclk, request_fifo_depth, tolerable_latency, estimated_width; |
| 230 | fixed20_12 consumption_time, line_time, chunk_time, read_delay_latency; | 233 | fixed20_12 consumption_time, line_time, chunk_time, read_delay_latency; |
| 231 | /* FIXME: detect IGP with sideport memory, i don't think there is any | ||
| 232 | * such product available | ||
| 233 | */ | ||
| 234 | bool sideport = false; | ||
| 235 | 234 | ||
| 236 | if (!crtc->base.enabled) { | 235 | if (!crtc->base.enabled) { |
| 237 | /* FIXME: wouldn't it better to set priority mark to maximum */ | 236 | /* FIXME: wouldn't it better to set priority mark to maximum */ |
| @@ -300,7 +299,7 @@ void rs690_crtc_bandwidth_compute(struct radeon_device *rdev, | |||
| 300 | 299 | ||
| 301 | /* Maximun bandwidth is the minimun bandwidth of all component */ | 300 | /* Maximun bandwidth is the minimun bandwidth of all component */ |
| 302 | rdev->pm.max_bandwidth = rdev->pm.core_bandwidth; | 301 | rdev->pm.max_bandwidth = rdev->pm.core_bandwidth; |
| 303 | if (sideport) { | 302 | if (rdev->mc.igp_sideport_enabled) { |
| 304 | if (rdev->pm.max_bandwidth.full > rdev->pm.sideport_bandwidth.full && | 303 | if (rdev->pm.max_bandwidth.full > rdev->pm.sideport_bandwidth.full && |
| 305 | rdev->pm.sideport_bandwidth.full) | 304 | rdev->pm.sideport_bandwidth.full) |
| 306 | rdev->pm.max_bandwidth = rdev->pm.sideport_bandwidth; | 305 | rdev->pm.max_bandwidth = rdev->pm.sideport_bandwidth; |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index cec536c222c5..b7fd82064922 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -224,7 +224,7 @@ static void rv770_mc_program(struct radeon_device *rdev) | |||
| 224 | WREG32(MC_VM_FB_LOCATION, tmp); | 224 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 225 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 225 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 226 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 226 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 227 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 227 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 228 | if (rdev->flags & RADEON_IS_AGP) { | 228 | if (rdev->flags & RADEON_IS_AGP) { |
| 229 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); | 229 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
| 230 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 230 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index ef910694bd63..2f047577b1e3 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
| @@ -667,7 +667,7 @@ int ttm_get_pages(struct list_head *pages, int flags, | |||
| 667 | { | 667 | { |
| 668 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); | 668 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); |
| 669 | struct page *p = NULL; | 669 | struct page *p = NULL; |
| 670 | int gfp_flags = 0; | 670 | int gfp_flags = GFP_USER; |
| 671 | int r; | 671 | int r; |
| 672 | 672 | ||
| 673 | /* set zero flag for page allocation if required */ | 673 | /* set zero flag for page allocation if required */ |
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c index e880e2c3871d..937983407e2a 100644 --- a/drivers/hwmon/i5k_amb.c +++ b/drivers/hwmon/i5k_amb.c | |||
| @@ -289,6 +289,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 289 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | 289 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; |
| 290 | iattr->s_attr.dev_attr.show = show_label; | 290 | iattr->s_attr.dev_attr.show = show_label; |
| 291 | iattr->s_attr.index = k; | 291 | iattr->s_attr.index = k; |
| 292 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 292 | res = device_create_file(&pdev->dev, | 293 | res = device_create_file(&pdev->dev, |
| 293 | &iattr->s_attr.dev_attr); | 294 | &iattr->s_attr.dev_attr); |
| 294 | if (res) | 295 | if (res) |
| @@ -303,6 +304,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 303 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | 304 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; |
| 304 | iattr->s_attr.dev_attr.show = show_amb_temp; | 305 | iattr->s_attr.dev_attr.show = show_amb_temp; |
| 305 | iattr->s_attr.index = k; | 306 | iattr->s_attr.index = k; |
| 307 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 306 | res = device_create_file(&pdev->dev, | 308 | res = device_create_file(&pdev->dev, |
| 307 | &iattr->s_attr.dev_attr); | 309 | &iattr->s_attr.dev_attr); |
| 308 | if (res) | 310 | if (res) |
| @@ -318,6 +320,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 318 | iattr->s_attr.dev_attr.show = show_amb_min; | 320 | iattr->s_attr.dev_attr.show = show_amb_min; |
| 319 | iattr->s_attr.dev_attr.store = store_amb_min; | 321 | iattr->s_attr.dev_attr.store = store_amb_min; |
| 320 | iattr->s_attr.index = k; | 322 | iattr->s_attr.index = k; |
| 323 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 321 | res = device_create_file(&pdev->dev, | 324 | res = device_create_file(&pdev->dev, |
| 322 | &iattr->s_attr.dev_attr); | 325 | &iattr->s_attr.dev_attr); |
| 323 | if (res) | 326 | if (res) |
| @@ -333,6 +336,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 333 | iattr->s_attr.dev_attr.show = show_amb_mid; | 336 | iattr->s_attr.dev_attr.show = show_amb_mid; |
| 334 | iattr->s_attr.dev_attr.store = store_amb_mid; | 337 | iattr->s_attr.dev_attr.store = store_amb_mid; |
| 335 | iattr->s_attr.index = k; | 338 | iattr->s_attr.index = k; |
| 339 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 336 | res = device_create_file(&pdev->dev, | 340 | res = device_create_file(&pdev->dev, |
| 337 | &iattr->s_attr.dev_attr); | 341 | &iattr->s_attr.dev_attr); |
| 338 | if (res) | 342 | if (res) |
| @@ -348,6 +352,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 348 | iattr->s_attr.dev_attr.show = show_amb_max; | 352 | iattr->s_attr.dev_attr.show = show_amb_max; |
| 349 | iattr->s_attr.dev_attr.store = store_amb_max; | 353 | iattr->s_attr.dev_attr.store = store_amb_max; |
| 350 | iattr->s_attr.index = k; | 354 | iattr->s_attr.index = k; |
| 355 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 351 | res = device_create_file(&pdev->dev, | 356 | res = device_create_file(&pdev->dev, |
| 352 | &iattr->s_attr.dev_attr); | 357 | &iattr->s_attr.dev_attr); |
| 353 | if (res) | 358 | if (res) |
| @@ -362,6 +367,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 362 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | 367 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; |
| 363 | iattr->s_attr.dev_attr.show = show_amb_alarm; | 368 | iattr->s_attr.dev_attr.show = show_amb_alarm; |
| 364 | iattr->s_attr.index = k; | 369 | iattr->s_attr.index = k; |
| 370 | sysfs_attr_init(&iattr->s_attr.dev_attr.attr); | ||
| 365 | res = device_create_file(&pdev->dev, | 371 | res = device_create_file(&pdev->dev, |
| 366 | &iattr->s_attr.dev_attr); | 372 | &iattr->s_attr.dev_attr); |
| 367 | if (res) | 373 | if (res) |
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c index 099a2138cdf6..da5a2404cd3e 100644 --- a/drivers/hwmon/k10temp.c +++ b/drivers/hwmon/k10temp.c | |||
| @@ -112,11 +112,21 @@ static bool __devinit has_erratum_319(struct pci_dev *pdev) | |||
| 112 | if (pkg_type != CPUID_PKGTYPE_AM2R2_AM3) | 112 | if (pkg_type != CPUID_PKGTYPE_AM2R2_AM3) |
| 113 | return false; | 113 | return false; |
| 114 | 114 | ||
| 115 | /* Differentiate between AM2+ (bad) and AM3 (good) */ | 115 | /* DDR3 memory implies socket AM3, which is good */ |
| 116 | pci_bus_read_config_dword(pdev->bus, | 116 | pci_bus_read_config_dword(pdev->bus, |
| 117 | PCI_DEVFN(PCI_SLOT(pdev->devfn), 2), | 117 | PCI_DEVFN(PCI_SLOT(pdev->devfn), 2), |
| 118 | REG_DCT0_CONFIG_HIGH, ®_dram_cfg); | 118 | REG_DCT0_CONFIG_HIGH, ®_dram_cfg); |
| 119 | return !(reg_dram_cfg & DDR3_MODE); | 119 | if (reg_dram_cfg & DDR3_MODE) |
| 120 | return false; | ||
| 121 | |||
| 122 | /* | ||
| 123 | * Unfortunately it is possible to run a socket AM3 CPU with DDR2 | ||
| 124 | * memory. We blacklist all the cores which do exist in socket AM2+ | ||
| 125 | * format. It still isn't perfect, as RB-C2 cores exist in both AM2+ | ||
| 126 | * and AM3 formats, but that's the best we can do. | ||
| 127 | */ | ||
| 128 | return boot_cpu_data.x86_model < 4 || | ||
| 129 | (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask <= 2); | ||
| 120 | } | 130 | } |
| 121 | 131 | ||
| 122 | static int __devinit k10temp_probe(struct pci_dev *pdev, | 132 | static int __devinit k10temp_probe(struct pci_dev *pdev, |
diff --git a/drivers/hwmon/k8temp.c b/drivers/hwmon/k8temp.c index 0ceb6d6200a3..f26acdb11681 100644 --- a/drivers/hwmon/k8temp.c +++ b/drivers/hwmon/k8temp.c | |||
| @@ -120,7 +120,7 @@ static ssize_t show_temp(struct device *dev, | |||
| 120 | int temp; | 120 | int temp; |
| 121 | struct k8temp_data *data = k8temp_update_device(dev); | 121 | struct k8temp_data *data = k8temp_update_device(dev); |
| 122 | 122 | ||
| 123 | if (data->swap_core_select) | 123 | if (data->swap_core_select && (data->sensorsp & SEL_CORE)) |
| 124 | core = core ? 0 : 1; | 124 | core = core ? 0 : 1; |
| 125 | 125 | ||
| 126 | temp = TEMP_FROM_REG(data->temp[core][place]) + data->temp_offset; | 126 | temp = TEMP_FROM_REG(data->temp[core][place]) + data->temp_offset; |
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index d8fa5d724c57..0f9a4785d798 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig | |||
| @@ -69,7 +69,7 @@ config KEYBOARD_ATARI | |||
| 69 | module will be called atakbd. | 69 | module will be called atakbd. |
| 70 | 70 | ||
| 71 | config KEYBOARD_ATKBD | 71 | config KEYBOARD_ATKBD |
| 72 | tristate "AT keyboard" if EMBEDDED || !X86 | 72 | tristate "AT keyboard" if EMBEDDED || !X86 || X86_MRST |
| 73 | default y | 73 | default y |
| 74 | select SERIO | 74 | select SERIO |
| 75 | select SERIO_LIBPS2 | 75 | select SERIO_LIBPS2 |
diff --git a/drivers/input/misc/pcf8574_keypad.c b/drivers/input/misc/pcf8574_keypad.c index 0ac47d2898ec..4b42ffc0532a 100644 --- a/drivers/input/misc/pcf8574_keypad.c +++ b/drivers/input/misc/pcf8574_keypad.c | |||
| @@ -69,7 +69,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id) | |||
| 69 | unsigned char nextstate = read_state(lp); | 69 | unsigned char nextstate = read_state(lp); |
| 70 | 70 | ||
| 71 | if (lp->laststate != nextstate) { | 71 | if (lp->laststate != nextstate) { |
| 72 | int key_down = nextstate <= ARRAY_SIZE(lp->btncode); | 72 | int key_down = nextstate < ARRAY_SIZE(lp->btncode); |
| 73 | unsigned short keycode = key_down ? | 73 | unsigned short keycode = key_down ? |
| 74 | lp->btncode[nextstate] : lp->btncode[lp->laststate]; | 74 | lp->btncode[nextstate] : lp->btncode[lp->laststate]; |
| 75 | 75 | ||
diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index 3bfe8fafc6ad..256b9e9394dc 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig | |||
| @@ -22,7 +22,7 @@ config SERIO_I8042 | |||
| 22 | tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86 | 22 | tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86 |
| 23 | default y | 23 | default y |
| 24 | depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \ | 24 | depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \ |
| 25 | (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN | 25 | (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !X86_MRST |
| 26 | help | 26 | help |
| 27 | i8042 is the chip over which the standard AT keyboard and PS/2 | 27 | i8042 is the chip over which the standard AT keyboard and PS/2 |
| 28 | mouse are connected to the computer. If you use these devices, | 28 | mouse are connected to the computer. If you use these devices, |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index d564af58175c..415f6306105d 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -284,12 +284,13 @@ static int wacom_intuos_inout(struct wacom_wac *wacom) | |||
| 284 | (data[4] << 20) + (data[5] << 12) + | 284 | (data[4] << 20) + (data[5] << 12) + |
| 285 | (data[6] << 4) + (data[7] >> 4); | 285 | (data[6] << 4) + (data[7] >> 4); |
| 286 | 286 | ||
| 287 | wacom->id[idx] = (data[2] << 4) | (data[3] >> 4); | 287 | wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) | |
| 288 | ((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12); | ||
| 288 | 289 | ||
| 289 | switch (wacom->id[idx]) { | 290 | switch (wacom->id[idx] & 0xfffff) { |
| 290 | case 0x812: /* Inking pen */ | 291 | case 0x812: /* Inking pen */ |
| 291 | case 0x801: /* Intuos3 Inking pen */ | 292 | case 0x801: /* Intuos3 Inking pen */ |
| 292 | case 0x20802: /* Intuos4 Classic Pen */ | 293 | case 0x20802: /* Intuos4 Inking Pen */ |
| 293 | case 0x012: | 294 | case 0x012: |
| 294 | wacom->tool[idx] = BTN_TOOL_PENCIL; | 295 | wacom->tool[idx] = BTN_TOOL_PENCIL; |
| 295 | break; | 296 | break; |
| @@ -513,7 +514,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom) | |||
| 513 | input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); | 514 | input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); |
| 514 | input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); | 515 | input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); |
| 515 | 516 | ||
| 516 | if ((data[5] & 0x1f) | (data[6] & 0x1f) | (data[1] & 0x1f) | | 517 | if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) | |
| 517 | data[2] | (data[3] & 0x1f) | data[4] | data[8] | | 518 | data[2] | (data[3] & 0x1f) | data[4] | data[8] | |
| 518 | (data[7] & 0x01)) { | 519 | (data[7] & 0x01)) { |
| 519 | input_report_key(input, wacom->tool[1], 1); | 520 | input_report_key(input, wacom->tool[1], 1); |
diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c index 0d2d7e54b465..5f0221cffef9 100644 --- a/drivers/input/touchscreen/ad7877.c +++ b/drivers/input/touchscreen/ad7877.c | |||
| @@ -679,6 +679,13 @@ static int __devinit ad7877_probe(struct spi_device *spi) | |||
| 679 | return -EINVAL; | 679 | return -EINVAL; |
| 680 | } | 680 | } |
| 681 | 681 | ||
| 682 | spi->bits_per_word = 16; | ||
| 683 | err = spi_setup(spi); | ||
| 684 | if (err) { | ||
| 685 | dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); | ||
| 686 | return err; | ||
| 687 | } | ||
| 688 | |||
| 682 | ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL); | 689 | ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL); |
| 683 | input_dev = input_allocate_device(); | 690 | input_dev = input_allocate_device(); |
| 684 | if (!ts || !input_dev) { | 691 | if (!ts || !input_dev) { |
diff --git a/drivers/isdn/gigaset/asyncdata.c b/drivers/isdn/gigaset/asyncdata.c index c5016bd2d94f..c3b1dc3a13a0 100644 --- a/drivers/isdn/gigaset/asyncdata.c +++ b/drivers/isdn/gigaset/asyncdata.c | |||
| @@ -126,26 +126,6 @@ static unsigned lock_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 126 | return numbytes; | 126 | return numbytes; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | /* set up next receive skb for data mode | ||
| 130 | */ | ||
| 131 | static void new_rcv_skb(struct bc_state *bcs) | ||
| 132 | { | ||
| 133 | struct cardstate *cs = bcs->cs; | ||
| 134 | unsigned short hw_hdr_len = cs->hw_hdr_len; | ||
| 135 | |||
| 136 | if (bcs->ignore) { | ||
| 137 | bcs->skb = NULL; | ||
| 138 | return; | ||
| 139 | } | ||
| 140 | |||
| 141 | bcs->skb = dev_alloc_skb(SBUFSIZE + hw_hdr_len); | ||
| 142 | if (bcs->skb == NULL) { | ||
| 143 | dev_warn(cs->dev, "could not allocate new skb\n"); | ||
| 144 | return; | ||
| 145 | } | ||
| 146 | skb_reserve(bcs->skb, hw_hdr_len); | ||
| 147 | } | ||
| 148 | |||
| 149 | /* process a block of received bytes in HDLC data mode | 129 | /* process a block of received bytes in HDLC data mode |
| 150 | * (mstate != MS_LOCKED && !(inputstate & INS_command) && proto2 == L2_HDLC) | 130 | * (mstate != MS_LOCKED && !(inputstate & INS_command) && proto2 == L2_HDLC) |
| 151 | * Collect HDLC frames, undoing byte stuffing and watching for DLE escapes. | 131 | * Collect HDLC frames, undoing byte stuffing and watching for DLE escapes. |
| @@ -159,8 +139,8 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 159 | struct cardstate *cs = inbuf->cs; | 139 | struct cardstate *cs = inbuf->cs; |
| 160 | struct bc_state *bcs = cs->bcs; | 140 | struct bc_state *bcs = cs->bcs; |
| 161 | int inputstate = bcs->inputstate; | 141 | int inputstate = bcs->inputstate; |
| 162 | __u16 fcs = bcs->fcs; | 142 | __u16 fcs = bcs->rx_fcs; |
| 163 | struct sk_buff *skb = bcs->skb; | 143 | struct sk_buff *skb = bcs->rx_skb; |
| 164 | unsigned char *src = inbuf->data + inbuf->head; | 144 | unsigned char *src = inbuf->data + inbuf->head; |
| 165 | unsigned procbytes = 0; | 145 | unsigned procbytes = 0; |
| 166 | unsigned char c; | 146 | unsigned char c; |
| @@ -245,8 +225,7 @@ byte_stuff: | |||
| 245 | 225 | ||
| 246 | /* prepare reception of next frame */ | 226 | /* prepare reception of next frame */ |
| 247 | inputstate &= ~INS_have_data; | 227 | inputstate &= ~INS_have_data; |
| 248 | new_rcv_skb(bcs); | 228 | skb = gigaset_new_rx_skb(bcs); |
| 249 | skb = bcs->skb; | ||
| 250 | } else { | 229 | } else { |
| 251 | /* empty frame (7E 7E) */ | 230 | /* empty frame (7E 7E) */ |
| 252 | #ifdef CONFIG_GIGASET_DEBUG | 231 | #ifdef CONFIG_GIGASET_DEBUG |
| @@ -255,8 +234,7 @@ byte_stuff: | |||
| 255 | if (!skb) { | 234 | if (!skb) { |
| 256 | /* skipped (?) */ | 235 | /* skipped (?) */ |
| 257 | gigaset_isdn_rcv_err(bcs); | 236 | gigaset_isdn_rcv_err(bcs); |
| 258 | new_rcv_skb(bcs); | 237 | skb = gigaset_new_rx_skb(bcs); |
| 259 | skb = bcs->skb; | ||
| 260 | } | 238 | } |
| 261 | } | 239 | } |
| 262 | 240 | ||
| @@ -279,11 +257,11 @@ byte_stuff: | |||
| 279 | #endif | 257 | #endif |
| 280 | inputstate |= INS_have_data; | 258 | inputstate |= INS_have_data; |
| 281 | if (skb) { | 259 | if (skb) { |
| 282 | if (skb->len == SBUFSIZE) { | 260 | if (skb->len >= bcs->rx_bufsize) { |
| 283 | dev_warn(cs->dev, "received packet too long\n"); | 261 | dev_warn(cs->dev, "received packet too long\n"); |
| 284 | dev_kfree_skb_any(skb); | 262 | dev_kfree_skb_any(skb); |
| 285 | /* skip remainder of packet */ | 263 | /* skip remainder of packet */ |
| 286 | bcs->skb = skb = NULL; | 264 | bcs->rx_skb = skb = NULL; |
| 287 | } else { | 265 | } else { |
| 288 | *__skb_put(skb, 1) = c; | 266 | *__skb_put(skb, 1) = c; |
| 289 | fcs = crc_ccitt_byte(fcs, c); | 267 | fcs = crc_ccitt_byte(fcs, c); |
| @@ -292,7 +270,7 @@ byte_stuff: | |||
| 292 | } | 270 | } |
| 293 | 271 | ||
| 294 | bcs->inputstate = inputstate; | 272 | bcs->inputstate = inputstate; |
| 295 | bcs->fcs = fcs; | 273 | bcs->rx_fcs = fcs; |
| 296 | return procbytes; | 274 | return procbytes; |
| 297 | } | 275 | } |
| 298 | 276 | ||
| @@ -308,18 +286,18 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 308 | struct cardstate *cs = inbuf->cs; | 286 | struct cardstate *cs = inbuf->cs; |
| 309 | struct bc_state *bcs = cs->bcs; | 287 | struct bc_state *bcs = cs->bcs; |
| 310 | int inputstate = bcs->inputstate; | 288 | int inputstate = bcs->inputstate; |
| 311 | struct sk_buff *skb = bcs->skb; | 289 | struct sk_buff *skb = bcs->rx_skb; |
| 312 | unsigned char *src = inbuf->data + inbuf->head; | 290 | unsigned char *src = inbuf->data + inbuf->head; |
| 313 | unsigned procbytes = 0; | 291 | unsigned procbytes = 0; |
| 314 | unsigned char c; | 292 | unsigned char c; |
| 315 | 293 | ||
| 316 | if (!skb) { | 294 | if (!skb) { |
| 317 | /* skip this block */ | 295 | /* skip this block */ |
| 318 | new_rcv_skb(bcs); | 296 | gigaset_new_rx_skb(bcs); |
| 319 | return numbytes; | 297 | return numbytes; |
| 320 | } | 298 | } |
| 321 | 299 | ||
| 322 | while (procbytes < numbytes && skb->len < SBUFSIZE) { | 300 | while (procbytes < numbytes && skb->len < bcs->rx_bufsize) { |
| 323 | c = *src++; | 301 | c = *src++; |
| 324 | procbytes++; | 302 | procbytes++; |
| 325 | 303 | ||
| @@ -343,7 +321,7 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 343 | if (inputstate & INS_have_data) { | 321 | if (inputstate & INS_have_data) { |
| 344 | gigaset_skb_rcvd(bcs, skb); | 322 | gigaset_skb_rcvd(bcs, skb); |
| 345 | inputstate &= ~INS_have_data; | 323 | inputstate &= ~INS_have_data; |
| 346 | new_rcv_skb(bcs); | 324 | gigaset_new_rx_skb(bcs); |
| 347 | } | 325 | } |
| 348 | 326 | ||
| 349 | bcs->inputstate = inputstate; | 327 | bcs->inputstate = inputstate; |
diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c index 8f78f15c8ef7..6fbe8999c419 100644 --- a/drivers/isdn/gigaset/capi.c +++ b/drivers/isdn/gigaset/capi.c | |||
| @@ -70,7 +70,7 @@ | |||
| 70 | #define MAX_NUMBER_DIGITS 20 | 70 | #define MAX_NUMBER_DIGITS 20 |
| 71 | #define MAX_FMT_IE_LEN 20 | 71 | #define MAX_FMT_IE_LEN 20 |
| 72 | 72 | ||
| 73 | /* values for gigaset_capi_appl.connected */ | 73 | /* values for bcs->apconnstate */ |
| 74 | #define APCONN_NONE 0 /* inactive/listening */ | 74 | #define APCONN_NONE 0 /* inactive/listening */ |
| 75 | #define APCONN_SETUP 1 /* connecting */ | 75 | #define APCONN_SETUP 1 /* connecting */ |
| 76 | #define APCONN_ACTIVE 2 /* B channel up */ | 76 | #define APCONN_ACTIVE 2 /* B channel up */ |
| @@ -80,10 +80,10 @@ struct gigaset_capi_appl { | |||
| 80 | struct list_head ctrlist; | 80 | struct list_head ctrlist; |
| 81 | struct gigaset_capi_appl *bcnext; | 81 | struct gigaset_capi_appl *bcnext; |
| 82 | u16 id; | 82 | u16 id; |
| 83 | struct capi_register_params rp; | ||
| 83 | u16 nextMessageNumber; | 84 | u16 nextMessageNumber; |
| 84 | u32 listenInfoMask; | 85 | u32 listenInfoMask; |
| 85 | u32 listenCIPmask; | 86 | u32 listenCIPmask; |
| 86 | int connected; | ||
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | /* CAPI specific controller data structure */ | 89 | /* CAPI specific controller data structure */ |
| @@ -319,6 +319,39 @@ static const char *format_ie(const char *ie) | |||
| 319 | return result; | 319 | return result; |
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | /* | ||
| 323 | * emit DATA_B3_CONF message | ||
| 324 | */ | ||
| 325 | static void send_data_b3_conf(struct cardstate *cs, struct capi_ctr *ctr, | ||
| 326 | u16 appl, u16 msgid, int channel, | ||
| 327 | u16 handle, u16 info) | ||
| 328 | { | ||
| 329 | struct sk_buff *cskb; | ||
| 330 | u8 *msg; | ||
| 331 | |||
| 332 | cskb = alloc_skb(CAPI_DATA_B3_CONF_LEN, GFP_ATOMIC); | ||
| 333 | if (!cskb) { | ||
| 334 | dev_err(cs->dev, "%s: out of memory\n", __func__); | ||
| 335 | return; | ||
| 336 | } | ||
| 337 | /* frequent message, avoid _cmsg overhead */ | ||
| 338 | msg = __skb_put(cskb, CAPI_DATA_B3_CONF_LEN); | ||
| 339 | CAPIMSG_SETLEN(msg, CAPI_DATA_B3_CONF_LEN); | ||
| 340 | CAPIMSG_SETAPPID(msg, appl); | ||
| 341 | CAPIMSG_SETCOMMAND(msg, CAPI_DATA_B3); | ||
| 342 | CAPIMSG_SETSUBCOMMAND(msg, CAPI_CONF); | ||
| 343 | CAPIMSG_SETMSGID(msg, msgid); | ||
| 344 | CAPIMSG_SETCONTROLLER(msg, ctr->cnr); | ||
| 345 | CAPIMSG_SETPLCI_PART(msg, channel); | ||
| 346 | CAPIMSG_SETNCCI_PART(msg, 1); | ||
| 347 | CAPIMSG_SETHANDLE_CONF(msg, handle); | ||
| 348 | CAPIMSG_SETINFO_CONF(msg, info); | ||
| 349 | |||
| 350 | /* emit message */ | ||
| 351 | dump_rawmsg(DEBUG_MCMD, __func__, msg); | ||
| 352 | capi_ctr_handle_message(ctr, appl, cskb); | ||
| 353 | } | ||
| 354 | |||
| 322 | 355 | ||
| 323 | /* | 356 | /* |
| 324 | * driver interface functions | 357 | * driver interface functions |
| @@ -339,7 +372,6 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb) | |||
| 339 | struct gigaset_capi_ctr *iif = cs->iif; | 372 | struct gigaset_capi_ctr *iif = cs->iif; |
| 340 | struct gigaset_capi_appl *ap = bcs->ap; | 373 | struct gigaset_capi_appl *ap = bcs->ap; |
| 341 | unsigned char *req = skb_mac_header(dskb); | 374 | unsigned char *req = skb_mac_header(dskb); |
| 342 | struct sk_buff *cskb; | ||
| 343 | u16 flags; | 375 | u16 flags; |
| 344 | 376 | ||
| 345 | /* update statistics */ | 377 | /* update statistics */ |
| @@ -351,39 +383,22 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb) | |||
| 351 | } | 383 | } |
| 352 | 384 | ||
| 353 | /* don't send further B3 messages if disconnected */ | 385 | /* don't send further B3 messages if disconnected */ |
| 354 | if (ap->connected < APCONN_ACTIVE) { | 386 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 355 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding ack"); | 387 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding ack"); |
| 356 | return; | 388 | return; |
| 357 | } | 389 | } |
| 358 | 390 | ||
| 359 | /* ToDo: honor unset "delivery confirmation" bit */ | 391 | /* |
| 392 | * send DATA_B3_CONF if "delivery confirmation" bit was set in request; | ||
| 393 | * otherwise it has already been sent by do_data_b3_req() | ||
| 394 | */ | ||
| 360 | flags = CAPIMSG_FLAGS(req); | 395 | flags = CAPIMSG_FLAGS(req); |
| 361 | 396 | if (flags & CAPI_FLAGS_DELIVERY_CONFIRMATION) | |
| 362 | /* build DATA_B3_CONF message */ | 397 | send_data_b3_conf(cs, &iif->ctr, ap->id, CAPIMSG_MSGID(req), |
| 363 | cskb = alloc_skb(CAPI_DATA_B3_CONF_LEN, GFP_ATOMIC); | 398 | bcs->channel + 1, CAPIMSG_HANDLE_REQ(req), |
| 364 | if (!cskb) { | 399 | (flags & ~CAPI_FLAGS_DELIVERY_CONFIRMATION) ? |
| 365 | dev_err(cs->dev, "%s: out of memory\n", __func__); | 400 | CapiFlagsNotSupportedByProtocol : |
| 366 | return; | 401 | CAPI_NOERROR); |
| 367 | } | ||
| 368 | /* frequent message, avoid _cmsg overhead */ | ||
| 369 | CAPIMSG_SETLEN(cskb->data, CAPI_DATA_B3_CONF_LEN); | ||
| 370 | CAPIMSG_SETAPPID(cskb->data, ap->id); | ||
| 371 | CAPIMSG_SETCOMMAND(cskb->data, CAPI_DATA_B3); | ||
| 372 | CAPIMSG_SETSUBCOMMAND(cskb->data, CAPI_CONF); | ||
| 373 | CAPIMSG_SETMSGID(cskb->data, CAPIMSG_MSGID(req)); | ||
| 374 | CAPIMSG_SETCONTROLLER(cskb->data, iif->ctr.cnr); | ||
| 375 | CAPIMSG_SETPLCI_PART(cskb->data, bcs->channel + 1); | ||
| 376 | CAPIMSG_SETNCCI_PART(cskb->data, 1); | ||
| 377 | CAPIMSG_SETHANDLE_CONF(cskb->data, CAPIMSG_HANDLE_REQ(req)); | ||
| 378 | if (flags & ~CAPI_FLAGS_DELIVERY_CONFIRMATION) | ||
| 379 | CAPIMSG_SETINFO_CONF(cskb->data, | ||
| 380 | CapiFlagsNotSupportedByProtocol); | ||
| 381 | else | ||
| 382 | CAPIMSG_SETINFO_CONF(cskb->data, CAPI_NOERROR); | ||
| 383 | |||
| 384 | /* emit message */ | ||
| 385 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_CONF", cskb->data); | ||
| 386 | capi_ctr_handle_message(&iif->ctr, ap->id, cskb); | ||
| 387 | } | 402 | } |
| 388 | EXPORT_SYMBOL_GPL(gigaset_skb_sent); | 403 | EXPORT_SYMBOL_GPL(gigaset_skb_sent); |
| 389 | 404 | ||
| @@ -412,7 +427,7 @@ void gigaset_skb_rcvd(struct bc_state *bcs, struct sk_buff *skb) | |||
| 412 | } | 427 | } |
| 413 | 428 | ||
| 414 | /* don't send further B3 messages if disconnected */ | 429 | /* don't send further B3 messages if disconnected */ |
| 415 | if (ap->connected < APCONN_ACTIVE) { | 430 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 416 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding data"); | 431 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding data"); |
| 417 | dev_kfree_skb_any(skb); | 432 | dev_kfree_skb_any(skb); |
| 418 | return; | 433 | return; |
| @@ -484,6 +499,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 484 | u32 actCIPmask; | 499 | u32 actCIPmask; |
| 485 | struct sk_buff *skb; | 500 | struct sk_buff *skb; |
| 486 | unsigned int msgsize; | 501 | unsigned int msgsize; |
| 502 | unsigned long flags; | ||
| 487 | int i; | 503 | int i; |
| 488 | 504 | ||
| 489 | /* | 505 | /* |
| @@ -608,7 +624,14 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 608 | format_ie(iif->hcmsg.CalledPartyNumber)); | 624 | format_ie(iif->hcmsg.CalledPartyNumber)); |
| 609 | 625 | ||
| 610 | /* scan application list for matching listeners */ | 626 | /* scan application list for matching listeners */ |
| 611 | bcs->ap = NULL; | 627 | spin_lock_irqsave(&bcs->aplock, flags); |
| 628 | if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) { | ||
| 629 | dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", | ||
| 630 | __func__, bcs->ap, bcs->apconnstate); | ||
| 631 | bcs->ap = NULL; | ||
| 632 | bcs->apconnstate = APCONN_NONE; | ||
| 633 | } | ||
| 634 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 612 | actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); | 635 | actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); |
| 613 | list_for_each_entry(ap, &iif->appls, ctrlist) | 636 | list_for_each_entry(ap, &iif->appls, ctrlist) |
| 614 | if (actCIPmask & ap->listenCIPmask) { | 637 | if (actCIPmask & ap->listenCIPmask) { |
| @@ -626,10 +649,12 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 626 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 649 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 627 | 650 | ||
| 628 | /* add to listeners on this B channel, update state */ | 651 | /* add to listeners on this B channel, update state */ |
| 652 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 629 | ap->bcnext = bcs->ap; | 653 | ap->bcnext = bcs->ap; |
| 630 | bcs->ap = ap; | 654 | bcs->ap = ap; |
| 631 | bcs->chstate |= CHS_NOTIFY_LL; | 655 | bcs->chstate |= CHS_NOTIFY_LL; |
| 632 | ap->connected = APCONN_SETUP; | 656 | bcs->apconnstate = APCONN_SETUP; |
| 657 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 633 | 658 | ||
| 634 | /* emit message */ | 659 | /* emit message */ |
| 635 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 660 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| @@ -654,7 +679,7 @@ static void send_disconnect_ind(struct bc_state *bcs, | |||
| 654 | struct gigaset_capi_ctr *iif = cs->iif; | 679 | struct gigaset_capi_ctr *iif = cs->iif; |
| 655 | struct sk_buff *skb; | 680 | struct sk_buff *skb; |
| 656 | 681 | ||
| 657 | if (ap->connected == APCONN_NONE) | 682 | if (bcs->apconnstate == APCONN_NONE) |
| 658 | return; | 683 | return; |
| 659 | 684 | ||
| 660 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, | 685 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, |
| @@ -668,7 +693,6 @@ static void send_disconnect_ind(struct bc_state *bcs, | |||
| 668 | } | 693 | } |
| 669 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, CAPI_DISCONNECT_IND_LEN)); | 694 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, CAPI_DISCONNECT_IND_LEN)); |
| 670 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 695 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 671 | ap->connected = APCONN_NONE; | ||
| 672 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 696 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| 673 | } | 697 | } |
| 674 | 698 | ||
| @@ -685,9 +709,9 @@ static void send_disconnect_b3_ind(struct bc_state *bcs, | |||
| 685 | struct sk_buff *skb; | 709 | struct sk_buff *skb; |
| 686 | 710 | ||
| 687 | /* nothing to do if no logical connection active */ | 711 | /* nothing to do if no logical connection active */ |
| 688 | if (ap->connected < APCONN_ACTIVE) | 712 | if (bcs->apconnstate < APCONN_ACTIVE) |
| 689 | return; | 713 | return; |
| 690 | ap->connected = APCONN_SETUP; | 714 | bcs->apconnstate = APCONN_SETUP; |
| 691 | 715 | ||
| 692 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, | 716 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, |
| 693 | ap->nextMessageNumber++, | 717 | ap->nextMessageNumber++, |
| @@ -714,14 +738,25 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 714 | { | 738 | { |
| 715 | struct cardstate *cs = bcs->cs; | 739 | struct cardstate *cs = bcs->cs; |
| 716 | struct gigaset_capi_ctr *iif = cs->iif; | 740 | struct gigaset_capi_ctr *iif = cs->iif; |
| 717 | struct gigaset_capi_appl *ap = bcs->ap; | 741 | struct gigaset_capi_appl *ap; |
| 718 | struct sk_buff *skb; | 742 | struct sk_buff *skb; |
| 719 | unsigned int msgsize; | 743 | unsigned int msgsize; |
| 744 | unsigned long flags; | ||
| 720 | 745 | ||
| 746 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 747 | ap = bcs->ap; | ||
| 721 | if (!ap) { | 748 | if (!ap) { |
| 749 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 722 | dev_err(cs->dev, "%s: no application\n", __func__); | 750 | dev_err(cs->dev, "%s: no application\n", __func__); |
| 723 | return; | 751 | return; |
| 724 | } | 752 | } |
| 753 | if (bcs->apconnstate == APCONN_NONE) { | ||
| 754 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 755 | dev_warn(cs->dev, "%s: application %u not connected\n", | ||
| 756 | __func__, ap->id); | ||
| 757 | return; | ||
| 758 | } | ||
| 759 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 725 | while (ap->bcnext) { | 760 | while (ap->bcnext) { |
| 726 | /* this should never happen */ | 761 | /* this should never happen */ |
| 727 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | 762 | dev_warn(cs->dev, "%s: dropping extra application %u\n", |
| @@ -730,11 +765,6 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 730 | CapiCallGivenToOtherApplication); | 765 | CapiCallGivenToOtherApplication); |
| 731 | ap->bcnext = ap->bcnext->bcnext; | 766 | ap->bcnext = ap->bcnext->bcnext; |
| 732 | } | 767 | } |
| 733 | if (ap->connected == APCONN_NONE) { | ||
| 734 | dev_warn(cs->dev, "%s: application %u not connected\n", | ||
| 735 | __func__, ap->id); | ||
| 736 | return; | ||
| 737 | } | ||
| 738 | 768 | ||
| 739 | /* prepare CONNECT_ACTIVE_IND message | 769 | /* prepare CONNECT_ACTIVE_IND message |
| 740 | * Note: LLC not supported by device | 770 | * Note: LLC not supported by device |
| @@ -772,17 +802,24 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 772 | void gigaset_isdn_hupD(struct bc_state *bcs) | 802 | void gigaset_isdn_hupD(struct bc_state *bcs) |
| 773 | { | 803 | { |
| 774 | struct gigaset_capi_appl *ap; | 804 | struct gigaset_capi_appl *ap; |
| 805 | unsigned long flags; | ||
| 775 | 806 | ||
| 776 | /* | 807 | /* |
| 777 | * ToDo: pass on reason code reported by device | 808 | * ToDo: pass on reason code reported by device |
| 778 | * (requires ev-layer state machine extension to collect | 809 | * (requires ev-layer state machine extension to collect |
| 779 | * ZCAU device reply) | 810 | * ZCAU device reply) |
| 780 | */ | 811 | */ |
| 781 | for (ap = bcs->ap; ap != NULL; ap = ap->bcnext) { | 812 | spin_lock_irqsave(&bcs->aplock, flags); |
| 813 | while (bcs->ap != NULL) { | ||
| 814 | ap = bcs->ap; | ||
| 815 | bcs->ap = ap->bcnext; | ||
| 816 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 782 | send_disconnect_b3_ind(bcs, ap); | 817 | send_disconnect_b3_ind(bcs, ap); |
| 783 | send_disconnect_ind(bcs, ap, 0); | 818 | send_disconnect_ind(bcs, ap, 0); |
| 819 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 784 | } | 820 | } |
| 785 | bcs->ap = NULL; | 821 | bcs->apconnstate = APCONN_NONE; |
| 822 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 786 | } | 823 | } |
| 787 | 824 | ||
| 788 | /** | 825 | /** |
| @@ -796,24 +833,21 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 796 | { | 833 | { |
| 797 | struct cardstate *cs = bcs->cs; | 834 | struct cardstate *cs = bcs->cs; |
| 798 | struct gigaset_capi_ctr *iif = cs->iif; | 835 | struct gigaset_capi_ctr *iif = cs->iif; |
| 799 | struct gigaset_capi_appl *ap = bcs->ap; | 836 | struct gigaset_capi_appl *ap; |
| 800 | struct sk_buff *skb; | 837 | struct sk_buff *skb; |
| 838 | unsigned long flags; | ||
| 801 | unsigned int msgsize; | 839 | unsigned int msgsize; |
| 802 | u8 command; | 840 | u8 command; |
| 803 | 841 | ||
| 842 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 843 | ap = bcs->ap; | ||
| 804 | if (!ap) { | 844 | if (!ap) { |
| 845 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 805 | dev_err(cs->dev, "%s: no application\n", __func__); | 846 | dev_err(cs->dev, "%s: no application\n", __func__); |
| 806 | return; | 847 | return; |
| 807 | } | 848 | } |
| 808 | while (ap->bcnext) { | 849 | if (!bcs->apconnstate) { |
| 809 | /* this should never happen */ | 850 | spin_unlock_irqrestore(&bcs->aplock, flags); |
| 810 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | ||
| 811 | __func__, ap->bcnext->id); | ||
| 812 | send_disconnect_ind(bcs, ap->bcnext, | ||
| 813 | CapiCallGivenToOtherApplication); | ||
| 814 | ap->bcnext = ap->bcnext->bcnext; | ||
| 815 | } | ||
| 816 | if (!ap->connected) { | ||
| 817 | dev_warn(cs->dev, "%s: application %u not connected\n", | 851 | dev_warn(cs->dev, "%s: application %u not connected\n", |
| 818 | __func__, ap->id); | 852 | __func__, ap->id); |
| 819 | return; | 853 | return; |
| @@ -825,13 +859,26 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 825 | * CONNECT_B3_ACTIVE_IND in reply to CONNECT_B3_RESP | 859 | * CONNECT_B3_ACTIVE_IND in reply to CONNECT_B3_RESP |
| 826 | * Parameters in both cases always: NCCI = 1, NCPI empty | 860 | * Parameters in both cases always: NCCI = 1, NCPI empty |
| 827 | */ | 861 | */ |
| 828 | if (ap->connected >= APCONN_ACTIVE) { | 862 | if (bcs->apconnstate >= APCONN_ACTIVE) { |
| 829 | command = CAPI_CONNECT_B3_ACTIVE; | 863 | command = CAPI_CONNECT_B3_ACTIVE; |
| 830 | msgsize = CAPI_CONNECT_B3_ACTIVE_IND_BASELEN; | 864 | msgsize = CAPI_CONNECT_B3_ACTIVE_IND_BASELEN; |
| 831 | } else { | 865 | } else { |
| 832 | command = CAPI_CONNECT_B3; | 866 | command = CAPI_CONNECT_B3; |
| 833 | msgsize = CAPI_CONNECT_B3_IND_BASELEN; | 867 | msgsize = CAPI_CONNECT_B3_IND_BASELEN; |
| 834 | } | 868 | } |
| 869 | bcs->apconnstate = APCONN_ACTIVE; | ||
| 870 | |||
| 871 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 872 | |||
| 873 | while (ap->bcnext) { | ||
| 874 | /* this should never happen */ | ||
| 875 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | ||
| 876 | __func__, ap->bcnext->id); | ||
| 877 | send_disconnect_ind(bcs, ap->bcnext, | ||
| 878 | CapiCallGivenToOtherApplication); | ||
| 879 | ap->bcnext = ap->bcnext->bcnext; | ||
| 880 | } | ||
| 881 | |||
| 835 | capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, | 882 | capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, |
| 836 | ap->nextMessageNumber++, | 883 | ap->nextMessageNumber++, |
| 837 | iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); | 884 | iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); |
| @@ -842,7 +889,6 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 842 | } | 889 | } |
| 843 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); | 890 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); |
| 844 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 891 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 845 | ap->connected = APCONN_ACTIVE; | ||
| 846 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 892 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| 847 | } | 893 | } |
| 848 | 894 | ||
| @@ -945,8 +991,64 @@ static void gigaset_register_appl(struct capi_ctr *ctr, u16 appl, | |||
| 945 | return; | 991 | return; |
| 946 | } | 992 | } |
| 947 | ap->id = appl; | 993 | ap->id = appl; |
| 994 | ap->rp = *rp; | ||
| 948 | 995 | ||
| 949 | list_add(&ap->ctrlist, &iif->appls); | 996 | list_add(&ap->ctrlist, &iif->appls); |
| 997 | dev_info(cs->dev, "application %u registered\n", ap->id); | ||
| 998 | } | ||
| 999 | |||
| 1000 | /* | ||
| 1001 | * remove CAPI application from channel | ||
| 1002 | * helper function to keep indentation levels down and stay in 80 columns | ||
| 1003 | */ | ||
| 1004 | |||
| 1005 | static inline void remove_appl_from_channel(struct bc_state *bcs, | ||
| 1006 | struct gigaset_capi_appl *ap) | ||
| 1007 | { | ||
| 1008 | struct cardstate *cs = bcs->cs; | ||
| 1009 | struct gigaset_capi_appl *bcap; | ||
| 1010 | unsigned long flags; | ||
| 1011 | int prevconnstate; | ||
| 1012 | |||
| 1013 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1014 | bcap = bcs->ap; | ||
| 1015 | if (bcap == NULL) { | ||
| 1016 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1017 | return; | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | /* check first application on channel */ | ||
| 1021 | if (bcap == ap) { | ||
| 1022 | bcs->ap = ap->bcnext; | ||
| 1023 | if (bcs->ap != NULL) { | ||
| 1024 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1025 | return; | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | /* none left, clear channel state */ | ||
| 1029 | prevconnstate = bcs->apconnstate; | ||
| 1030 | bcs->apconnstate = APCONN_NONE; | ||
| 1031 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1032 | |||
| 1033 | if (prevconnstate == APCONN_ACTIVE) { | ||
| 1034 | dev_notice(cs->dev, "%s: hanging up channel %u\n", | ||
| 1035 | __func__, bcs->channel); | ||
| 1036 | gigaset_add_event(cs, &bcs->at_state, | ||
| 1037 | EV_HUP, NULL, 0, NULL); | ||
| 1038 | gigaset_schedule_event(cs); | ||
| 1039 | } | ||
| 1040 | return; | ||
| 1041 | } | ||
| 1042 | |||
| 1043 | /* check remaining list */ | ||
| 1044 | do { | ||
| 1045 | if (bcap->bcnext == ap) { | ||
| 1046 | bcap->bcnext = bcap->bcnext->bcnext; | ||
| 1047 | return; | ||
| 1048 | } | ||
| 1049 | bcap = bcap->bcnext; | ||
| 1050 | } while (bcap != NULL); | ||
| 1051 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 950 | } | 1052 | } |
| 951 | 1053 | ||
| 952 | /* | 1054 | /* |
| @@ -958,19 +1060,19 @@ static void gigaset_release_appl(struct capi_ctr *ctr, u16 appl) | |||
| 958 | = container_of(ctr, struct gigaset_capi_ctr, ctr); | 1060 | = container_of(ctr, struct gigaset_capi_ctr, ctr); |
| 959 | struct cardstate *cs = iif->ctr.driverdata; | 1061 | struct cardstate *cs = iif->ctr.driverdata; |
| 960 | struct gigaset_capi_appl *ap, *tmp; | 1062 | struct gigaset_capi_appl *ap, *tmp; |
| 1063 | unsigned ch; | ||
| 961 | 1064 | ||
| 962 | list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) | 1065 | list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) |
| 963 | if (ap->id == appl) { | 1066 | if (ap->id == appl) { |
| 964 | if (ap->connected != APCONN_NONE) { | 1067 | /* remove from any channels */ |
| 965 | dev_err(cs->dev, | 1068 | for (ch = 0; ch < cs->channels; ch++) |
| 966 | "%s: application %u still connected\n", | 1069 | remove_appl_from_channel(&cs->bcs[ch], ap); |
| 967 | __func__, ap->id); | 1070 | |
| 968 | /* ToDo: clear active connection */ | 1071 | /* remove from registration list */ |
| 969 | } | ||
| 970 | list_del(&ap->ctrlist); | 1072 | list_del(&ap->ctrlist); |
| 971 | kfree(ap); | 1073 | kfree(ap); |
| 1074 | dev_info(cs->dev, "application %u released\n", appl); | ||
| 972 | } | 1075 | } |
| 973 | |||
| 974 | } | 1076 | } |
| 975 | 1077 | ||
| 976 | /* | 1078 | /* |
| @@ -1149,7 +1251,8 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1149 | char **commands; | 1251 | char **commands; |
| 1150 | char *s; | 1252 | char *s; |
| 1151 | u8 *pp; | 1253 | u8 *pp; |
| 1152 | int i, l; | 1254 | unsigned long flags; |
| 1255 | int i, l, lbc, lhlc; | ||
| 1153 | u16 info; | 1256 | u16 info; |
| 1154 | 1257 | ||
| 1155 | /* decode message */ | 1258 | /* decode message */ |
| @@ -1164,8 +1267,18 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1164 | send_conf(iif, ap, skb, CapiNoPlciAvailable); | 1267 | send_conf(iif, ap, skb, CapiNoPlciAvailable); |
| 1165 | return; | 1268 | return; |
| 1166 | } | 1269 | } |
| 1270 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1271 | if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) | ||
| 1272 | dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", | ||
| 1273 | __func__, bcs->ap, bcs->apconnstate); | ||
| 1167 | ap->bcnext = NULL; | 1274 | ap->bcnext = NULL; |
| 1168 | bcs->ap = ap; | 1275 | bcs->ap = ap; |
| 1276 | bcs->apconnstate = APCONN_SETUP; | ||
| 1277 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1278 | |||
| 1279 | bcs->rx_bufsize = ap->rp.datablklen; | ||
| 1280 | dev_kfree_skb(bcs->rx_skb); | ||
| 1281 | gigaset_new_rx_skb(bcs); | ||
| 1169 | cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; | 1282 | cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; |
| 1170 | 1283 | ||
| 1171 | /* build command table */ | 1284 | /* build command table */ |
| @@ -1273,42 +1386,59 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1273 | goto error; | 1386 | goto error; |
| 1274 | } | 1387 | } |
| 1275 | 1388 | ||
| 1276 | /* check/encode parameter: BC */ | 1389 | /* |
| 1277 | if (cmsg->BC && cmsg->BC[0]) { | 1390 | * check/encode parameters: BC & HLC |
| 1278 | /* explicit BC overrides CIP */ | 1391 | * must be encoded together as device doesn't accept HLC separately |
| 1279 | l = 2*cmsg->BC[0] + 7; | 1392 | * explicit parameters override values derived from CIP |
| 1393 | */ | ||
| 1394 | |||
| 1395 | /* determine lengths */ | ||
| 1396 | if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ | ||
| 1397 | lbc = 2*cmsg->BC[0]; | ||
| 1398 | else if (cip2bchlc[cmsg->CIPValue].bc) /* BC derived from CIP */ | ||
| 1399 | lbc = strlen(cip2bchlc[cmsg->CIPValue].bc); | ||
| 1400 | else /* no BC */ | ||
| 1401 | lbc = 0; | ||
| 1402 | if (cmsg->HLC && cmsg->HLC[0]) /* HLC specified explicitly */ | ||
| 1403 | lhlc = 2*cmsg->HLC[0]; | ||
| 1404 | else if (cip2bchlc[cmsg->CIPValue].hlc) /* HLC derived from CIP */ | ||
| 1405 | lhlc = strlen(cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1406 | else /* no HLC */ | ||
| 1407 | lhlc = 0; | ||
| 1408 | |||
| 1409 | if (lbc) { | ||
| 1410 | /* have BC: allocate and assemble command string */ | ||
| 1411 | l = lbc + 7; /* "^SBC=" + value + "\r" + null byte */ | ||
| 1412 | if (lhlc) | ||
| 1413 | l += lhlc + 7; /* ";^SHLC=" + value */ | ||
| 1280 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); | 1414 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); |
| 1281 | if (!commands[AT_BC]) | 1415 | if (!commands[AT_BC]) |
| 1282 | goto oom; | 1416 | goto oom; |
| 1283 | strcpy(commands[AT_BC], "^SBC="); | 1417 | strcpy(commands[AT_BC], "^SBC="); |
| 1284 | decode_ie(cmsg->BC, commands[AT_BC]+5); | 1418 | if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ |
| 1419 | decode_ie(cmsg->BC, commands[AT_BC] + 5); | ||
| 1420 | else /* BC derived from CIP */ | ||
| 1421 | strcpy(commands[AT_BC] + 5, | ||
| 1422 | cip2bchlc[cmsg->CIPValue].bc); | ||
| 1423 | if (lhlc) { | ||
| 1424 | strcpy(commands[AT_BC] + lbc + 5, ";^SHLC="); | ||
| 1425 | if (cmsg->HLC && cmsg->HLC[0]) | ||
| 1426 | /* HLC specified explicitly */ | ||
| 1427 | decode_ie(cmsg->HLC, | ||
| 1428 | commands[AT_BC] + lbc + 12); | ||
| 1429 | else /* HLC derived from CIP */ | ||
| 1430 | strcpy(commands[AT_BC] + lbc + 12, | ||
| 1431 | cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1432 | } | ||
| 1285 | strcpy(commands[AT_BC] + l - 2, "\r"); | 1433 | strcpy(commands[AT_BC] + l - 2, "\r"); |
| 1286 | } else if (cip2bchlc[cmsg->CIPValue].bc) { | 1434 | } else { |
| 1287 | l = strlen(cip2bchlc[cmsg->CIPValue].bc) + 7; | 1435 | /* no BC */ |
| 1288 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); | 1436 | if (lhlc) { |
| 1289 | if (!commands[AT_BC]) | 1437 | dev_notice(cs->dev, "%s: cannot set HLC without BC\n", |
| 1290 | goto oom; | 1438 | "CONNECT_REQ"); |
| 1291 | snprintf(commands[AT_BC], l, "^SBC=%s\r", | 1439 | info = CapiIllMessageParmCoding; /* ? */ |
| 1292 | cip2bchlc[cmsg->CIPValue].bc); | 1440 | goto error; |
| 1293 | } | 1441 | } |
| 1294 | |||
| 1295 | /* check/encode parameter: HLC */ | ||
| 1296 | if (cmsg->HLC && cmsg->HLC[0]) { | ||
| 1297 | /* explicit HLC overrides CIP */ | ||
| 1298 | l = 2*cmsg->HLC[0] + 7; | ||
| 1299 | commands[AT_HLC] = kmalloc(l, GFP_KERNEL); | ||
| 1300 | if (!commands[AT_HLC]) | ||
| 1301 | goto oom; | ||
| 1302 | strcpy(commands[AT_HLC], "^SHLC="); | ||
| 1303 | decode_ie(cmsg->HLC, commands[AT_HLC]+5); | ||
| 1304 | strcpy(commands[AT_HLC] + l - 2, "\r"); | ||
| 1305 | } else if (cip2bchlc[cmsg->CIPValue].hlc) { | ||
| 1306 | l = strlen(cip2bchlc[cmsg->CIPValue].hlc) + 7; | ||
| 1307 | commands[AT_HLC] = kmalloc(l, GFP_KERNEL); | ||
| 1308 | if (!commands[AT_HLC]) | ||
| 1309 | goto oom; | ||
| 1310 | snprintf(commands[AT_HLC], l, "^SHLC=%s\r", | ||
| 1311 | cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1312 | } | 1442 | } |
| 1313 | 1443 | ||
| 1314 | /* check/encode parameter: B Protocol */ | 1444 | /* check/encode parameter: B Protocol */ |
| @@ -1322,13 +1452,13 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1322 | bcs->proto2 = L2_HDLC; | 1452 | bcs->proto2 = L2_HDLC; |
| 1323 | break; | 1453 | break; |
| 1324 | case 1: | 1454 | case 1: |
| 1325 | bcs->proto2 = L2_BITSYNC; | 1455 | bcs->proto2 = L2_VOICE; |
| 1326 | break; | 1456 | break; |
| 1327 | default: | 1457 | default: |
| 1328 | dev_warn(cs->dev, | 1458 | dev_warn(cs->dev, |
| 1329 | "B1 Protocol %u unsupported, using Transparent\n", | 1459 | "B1 Protocol %u unsupported, using Transparent\n", |
| 1330 | cmsg->B1protocol); | 1460 | cmsg->B1protocol); |
| 1331 | bcs->proto2 = L2_BITSYNC; | 1461 | bcs->proto2 = L2_VOICE; |
| 1332 | } | 1462 | } |
| 1333 | if (cmsg->B2protocol != 1) | 1463 | if (cmsg->B2protocol != 1) |
| 1334 | dev_warn(cs->dev, | 1464 | dev_warn(cs->dev, |
| @@ -1382,7 +1512,6 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1382 | goto error; | 1512 | goto error; |
| 1383 | } | 1513 | } |
| 1384 | gigaset_schedule_event(cs); | 1514 | gigaset_schedule_event(cs); |
| 1385 | ap->connected = APCONN_SETUP; | ||
| 1386 | send_conf(iif, ap, skb, CapiSuccess); | 1515 | send_conf(iif, ap, skb, CapiSuccess); |
| 1387 | return; | 1516 | return; |
| 1388 | 1517 | ||
| @@ -1410,6 +1539,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1410 | _cmsg *cmsg = &iif->acmsg; | 1539 | _cmsg *cmsg = &iif->acmsg; |
| 1411 | struct bc_state *bcs; | 1540 | struct bc_state *bcs; |
| 1412 | struct gigaset_capi_appl *oap; | 1541 | struct gigaset_capi_appl *oap; |
| 1542 | unsigned long flags; | ||
| 1413 | int channel; | 1543 | int channel; |
| 1414 | 1544 | ||
| 1415 | /* decode message */ | 1545 | /* decode message */ |
| @@ -1429,12 +1559,24 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1429 | switch (cmsg->Reject) { | 1559 | switch (cmsg->Reject) { |
| 1430 | case 0: /* Accept */ | 1560 | case 0: /* Accept */ |
| 1431 | /* drop all competing applications, keep only this one */ | 1561 | /* drop all competing applications, keep only this one */ |
| 1432 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) | 1562 | spin_lock_irqsave(&bcs->aplock, flags); |
| 1433 | if (oap != ap) | 1563 | while (bcs->ap != NULL) { |
| 1564 | oap = bcs->ap; | ||
| 1565 | bcs->ap = oap->bcnext; | ||
| 1566 | if (oap != ap) { | ||
| 1567 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1434 | send_disconnect_ind(bcs, oap, | 1568 | send_disconnect_ind(bcs, oap, |
| 1435 | CapiCallGivenToOtherApplication); | 1569 | CapiCallGivenToOtherApplication); |
| 1570 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1571 | } | ||
| 1572 | } | ||
| 1436 | ap->bcnext = NULL; | 1573 | ap->bcnext = NULL; |
| 1437 | bcs->ap = ap; | 1574 | bcs->ap = ap; |
| 1575 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1576 | |||
| 1577 | bcs->rx_bufsize = ap->rp.datablklen; | ||
| 1578 | dev_kfree_skb(bcs->rx_skb); | ||
| 1579 | gigaset_new_rx_skb(bcs); | ||
| 1438 | bcs->chstate |= CHS_NOTIFY_LL; | 1580 | bcs->chstate |= CHS_NOTIFY_LL; |
| 1439 | 1581 | ||
| 1440 | /* check/encode B channel protocol */ | 1582 | /* check/encode B channel protocol */ |
| @@ -1448,13 +1590,13 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1448 | bcs->proto2 = L2_HDLC; | 1590 | bcs->proto2 = L2_HDLC; |
| 1449 | break; | 1591 | break; |
| 1450 | case 1: | 1592 | case 1: |
| 1451 | bcs->proto2 = L2_BITSYNC; | 1593 | bcs->proto2 = L2_VOICE; |
| 1452 | break; | 1594 | break; |
| 1453 | default: | 1595 | default: |
| 1454 | dev_warn(cs->dev, | 1596 | dev_warn(cs->dev, |
| 1455 | "B1 Protocol %u unsupported, using Transparent\n", | 1597 | "B1 Protocol %u unsupported, using Transparent\n", |
| 1456 | cmsg->B1protocol); | 1598 | cmsg->B1protocol); |
| 1457 | bcs->proto2 = L2_BITSYNC; | 1599 | bcs->proto2 = L2_VOICE; |
| 1458 | } | 1600 | } |
| 1459 | if (cmsg->B2protocol != 1) | 1601 | if (cmsg->B2protocol != 1) |
| 1460 | dev_warn(cs->dev, | 1602 | dev_warn(cs->dev, |
| @@ -1502,31 +1644,45 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1502 | send_disconnect_ind(bcs, ap, 0); | 1644 | send_disconnect_ind(bcs, ap, 0); |
| 1503 | 1645 | ||
| 1504 | /* remove it from the list of listening apps */ | 1646 | /* remove it from the list of listening apps */ |
| 1647 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1505 | if (bcs->ap == ap) { | 1648 | if (bcs->ap == ap) { |
| 1506 | bcs->ap = ap->bcnext; | 1649 | bcs->ap = ap->bcnext; |
| 1507 | if (bcs->ap == NULL) | 1650 | if (bcs->ap == NULL) { |
| 1508 | /* last one: stop ev-layer hupD notifications */ | 1651 | /* last one: stop ev-layer hupD notifications */ |
| 1652 | bcs->apconnstate = APCONN_NONE; | ||
| 1509 | bcs->chstate &= ~CHS_NOTIFY_LL; | 1653 | bcs->chstate &= ~CHS_NOTIFY_LL; |
| 1654 | } | ||
| 1655 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1510 | return; | 1656 | return; |
| 1511 | } | 1657 | } |
| 1512 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { | 1658 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { |
| 1513 | if (oap->bcnext == ap) { | 1659 | if (oap->bcnext == ap) { |
| 1514 | oap->bcnext = oap->bcnext->bcnext; | 1660 | oap->bcnext = oap->bcnext->bcnext; |
| 1661 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1515 | return; | 1662 | return; |
| 1516 | } | 1663 | } |
| 1517 | } | 1664 | } |
| 1665 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1518 | dev_err(cs->dev, "%s: application %u not found\n", | 1666 | dev_err(cs->dev, "%s: application %u not found\n", |
| 1519 | __func__, ap->id); | 1667 | __func__, ap->id); |
| 1520 | return; | 1668 | return; |
| 1521 | 1669 | ||
| 1522 | default: /* Reject */ | 1670 | default: /* Reject */ |
| 1523 | /* drop all competing applications, keep only this one */ | 1671 | /* drop all competing applications, keep only this one */ |
| 1524 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) | 1672 | spin_lock_irqsave(&bcs->aplock, flags); |
| 1525 | if (oap != ap) | 1673 | while (bcs->ap != NULL) { |
| 1674 | oap = bcs->ap; | ||
| 1675 | bcs->ap = oap->bcnext; | ||
| 1676 | if (oap != ap) { | ||
| 1677 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1526 | send_disconnect_ind(bcs, oap, | 1678 | send_disconnect_ind(bcs, oap, |
| 1527 | CapiCallGivenToOtherApplication); | 1679 | CapiCallGivenToOtherApplication); |
| 1680 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1681 | } | ||
| 1682 | } | ||
| 1528 | ap->bcnext = NULL; | 1683 | ap->bcnext = NULL; |
| 1529 | bcs->ap = ap; | 1684 | bcs->ap = ap; |
| 1685 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1530 | 1686 | ||
| 1531 | /* reject call - will trigger DISCONNECT_IND for this app */ | 1687 | /* reject call - will trigger DISCONNECT_IND for this app */ |
| 1532 | dev_info(cs->dev, "%s: Reject=%x\n", | 1688 | dev_info(cs->dev, "%s: Reject=%x\n", |
| @@ -1549,6 +1705,7 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1549 | { | 1705 | { |
| 1550 | struct cardstate *cs = iif->ctr.driverdata; | 1706 | struct cardstate *cs = iif->ctr.driverdata; |
| 1551 | _cmsg *cmsg = &iif->acmsg; | 1707 | _cmsg *cmsg = &iif->acmsg; |
| 1708 | struct bc_state *bcs; | ||
| 1552 | int channel; | 1709 | int channel; |
| 1553 | 1710 | ||
| 1554 | /* decode message */ | 1711 | /* decode message */ |
| @@ -1563,9 +1720,10 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1563 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1720 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1564 | return; | 1721 | return; |
| 1565 | } | 1722 | } |
| 1723 | bcs = &cs->bcs[channel-1]; | ||
| 1566 | 1724 | ||
| 1567 | /* mark logical connection active */ | 1725 | /* mark logical connection active */ |
| 1568 | ap->connected = APCONN_ACTIVE; | 1726 | bcs->apconnstate = APCONN_ACTIVE; |
| 1569 | 1727 | ||
| 1570 | /* build NCCI: always 1 (one B3 connection only) */ | 1728 | /* build NCCI: always 1 (one B3 connection only) */ |
| 1571 | cmsg->adr.adrNCCI |= 1 << 16; | 1729 | cmsg->adr.adrNCCI |= 1 << 16; |
| @@ -1611,7 +1769,7 @@ static void do_connect_b3_resp(struct gigaset_capi_ctr *iif, | |||
| 1611 | 1769 | ||
| 1612 | if (cmsg->Reject) { | 1770 | if (cmsg->Reject) { |
| 1613 | /* Reject: clear B3 connect received flag */ | 1771 | /* Reject: clear B3 connect received flag */ |
| 1614 | ap->connected = APCONN_SETUP; | 1772 | bcs->apconnstate = APCONN_SETUP; |
| 1615 | 1773 | ||
| 1616 | /* trigger hangup, causing eventual DISCONNECT_IND */ | 1774 | /* trigger hangup, causing eventual DISCONNECT_IND */ |
| 1617 | if (!gigaset_add_event(cs, &bcs->at_state, | 1775 | if (!gigaset_add_event(cs, &bcs->at_state, |
| @@ -1683,11 +1841,11 @@ static void do_disconnect_req(struct gigaset_capi_ctr *iif, | |||
| 1683 | } | 1841 | } |
| 1684 | 1842 | ||
| 1685 | /* skip if DISCONNECT_IND already sent */ | 1843 | /* skip if DISCONNECT_IND already sent */ |
| 1686 | if (!ap->connected) | 1844 | if (!bcs->apconnstate) |
| 1687 | return; | 1845 | return; |
| 1688 | 1846 | ||
| 1689 | /* check for active logical connection */ | 1847 | /* check for active logical connection */ |
| 1690 | if (ap->connected >= APCONN_ACTIVE) { | 1848 | if (bcs->apconnstate >= APCONN_ACTIVE) { |
| 1691 | /* | 1849 | /* |
| 1692 | * emit DISCONNECT_B3_IND with cause 0x3301 | 1850 | * emit DISCONNECT_B3_IND with cause 0x3301 |
| 1693 | * use separate cmsg structure, as the content of iif->acmsg | 1851 | * use separate cmsg structure, as the content of iif->acmsg |
| @@ -1736,6 +1894,7 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1736 | { | 1894 | { |
| 1737 | struct cardstate *cs = iif->ctr.driverdata; | 1895 | struct cardstate *cs = iif->ctr.driverdata; |
| 1738 | _cmsg *cmsg = &iif->acmsg; | 1896 | _cmsg *cmsg = &iif->acmsg; |
| 1897 | struct bc_state *bcs; | ||
| 1739 | int channel; | 1898 | int channel; |
| 1740 | 1899 | ||
| 1741 | /* decode message */ | 1900 | /* decode message */ |
| @@ -1751,17 +1910,17 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1751 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1910 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1752 | return; | 1911 | return; |
| 1753 | } | 1912 | } |
| 1913 | bcs = &cs->bcs[channel-1]; | ||
| 1754 | 1914 | ||
| 1755 | /* reject if logical connection not active */ | 1915 | /* reject if logical connection not active */ |
| 1756 | if (ap->connected < APCONN_ACTIVE) { | 1916 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 1757 | send_conf(iif, ap, skb, | 1917 | send_conf(iif, ap, skb, |
| 1758 | CapiMessageNotSupportedInCurrentState); | 1918 | CapiMessageNotSupportedInCurrentState); |
| 1759 | return; | 1919 | return; |
| 1760 | } | 1920 | } |
| 1761 | 1921 | ||
| 1762 | /* trigger hangup, causing eventual DISCONNECT_B3_IND */ | 1922 | /* trigger hangup, causing eventual DISCONNECT_B3_IND */ |
| 1763 | if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state, | 1923 | if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { |
| 1764 | EV_HUP, NULL, 0, NULL)) { | ||
| 1765 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); | 1924 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); |
| 1766 | return; | 1925 | return; |
| 1767 | } | 1926 | } |
| @@ -1782,11 +1941,14 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1782 | struct sk_buff *skb) | 1941 | struct sk_buff *skb) |
| 1783 | { | 1942 | { |
| 1784 | struct cardstate *cs = iif->ctr.driverdata; | 1943 | struct cardstate *cs = iif->ctr.driverdata; |
| 1944 | struct bc_state *bcs; | ||
| 1785 | int channel = CAPIMSG_PLCI_PART(skb->data); | 1945 | int channel = CAPIMSG_PLCI_PART(skb->data); |
| 1786 | u16 ncci = CAPIMSG_NCCI_PART(skb->data); | 1946 | u16 ncci = CAPIMSG_NCCI_PART(skb->data); |
| 1787 | u16 msglen = CAPIMSG_LEN(skb->data); | 1947 | u16 msglen = CAPIMSG_LEN(skb->data); |
| 1788 | u16 datalen = CAPIMSG_DATALEN(skb->data); | 1948 | u16 datalen = CAPIMSG_DATALEN(skb->data); |
| 1789 | u16 flags = CAPIMSG_FLAGS(skb->data); | 1949 | u16 flags = CAPIMSG_FLAGS(skb->data); |
| 1950 | u16 msgid = CAPIMSG_MSGID(skb->data); | ||
| 1951 | u16 handle = CAPIMSG_HANDLE_REQ(skb->data); | ||
| 1790 | 1952 | ||
| 1791 | /* frequent message, avoid _cmsg overhead */ | 1953 | /* frequent message, avoid _cmsg overhead */ |
| 1792 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_REQ", skb->data); | 1954 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_REQ", skb->data); |
| @@ -1802,6 +1964,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1802 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1964 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1803 | return; | 1965 | return; |
| 1804 | } | 1966 | } |
| 1967 | bcs = &cs->bcs[channel-1]; | ||
| 1805 | if (msglen != CAPI_DATA_B3_REQ_LEN && msglen != CAPI_DATA_B3_REQ_LEN64) | 1968 | if (msglen != CAPI_DATA_B3_REQ_LEN && msglen != CAPI_DATA_B3_REQ_LEN64) |
| 1806 | dev_notice(cs->dev, "%s: unexpected length %d\n", | 1969 | dev_notice(cs->dev, "%s: unexpected length %d\n", |
| 1807 | "DATA_B3_REQ", msglen); | 1970 | "DATA_B3_REQ", msglen); |
| @@ -1821,7 +1984,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1821 | } | 1984 | } |
| 1822 | 1985 | ||
| 1823 | /* reject if logical connection not active */ | 1986 | /* reject if logical connection not active */ |
| 1824 | if (ap->connected < APCONN_ACTIVE) { | 1987 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 1825 | send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState); | 1988 | send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState); |
| 1826 | return; | 1989 | return; |
| 1827 | } | 1990 | } |
| @@ -1832,17 +1995,19 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1832 | skb_pull(skb, msglen); | 1995 | skb_pull(skb, msglen); |
| 1833 | 1996 | ||
| 1834 | /* pass to device-specific module */ | 1997 | /* pass to device-specific module */ |
| 1835 | if (cs->ops->send_skb(&cs->bcs[channel-1], skb) < 0) { | 1998 | if (cs->ops->send_skb(bcs, skb) < 0) { |
| 1836 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); | 1999 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); |
| 1837 | return; | 2000 | return; |
| 1838 | } | 2001 | } |
| 1839 | 2002 | ||
| 1840 | /* DATA_B3_CONF reply will be sent by gigaset_skb_sent() */ | ||
| 1841 | |||
| 1842 | /* | 2003 | /* |
| 1843 | * ToDo: honor unset "delivery confirmation" bit | 2004 | * DATA_B3_CONF will be sent by gigaset_skb_sent() only if "delivery |
| 1844 | * (send DATA_B3_CONF immediately?) | 2005 | * confirmation" bit is set; otherwise we have to send it now |
| 1845 | */ | 2006 | */ |
| 2007 | if (!(flags & CAPI_FLAGS_DELIVERY_CONFIRMATION)) | ||
| 2008 | send_data_b3_conf(cs, &iif->ctr, ap->id, msgid, channel, handle, | ||
| 2009 | flags ? CapiFlagsNotSupportedByProtocol | ||
| 2010 | : CAPI_NOERROR); | ||
| 1846 | } | 2011 | } |
| 1847 | 2012 | ||
| 1848 | /* | 2013 | /* |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index f6f45f221920..5d4befb81057 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
| @@ -399,8 +399,8 @@ static void gigaset_freebcs(struct bc_state *bcs) | |||
| 399 | gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel); | 399 | gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel); |
| 400 | clear_at_state(&bcs->at_state); | 400 | clear_at_state(&bcs->at_state); |
| 401 | gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel); | 401 | gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel); |
| 402 | dev_kfree_skb(bcs->skb); | 402 | dev_kfree_skb(bcs->rx_skb); |
| 403 | bcs->skb = NULL; | 403 | bcs->rx_skb = NULL; |
| 404 | 404 | ||
| 405 | for (i = 0; i < AT_NUM; ++i) { | 405 | for (i = 0; i < AT_NUM; ++i) { |
| 406 | kfree(bcs->commands[i]); | 406 | kfree(bcs->commands[i]); |
| @@ -634,19 +634,10 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
| 634 | bcs->emptycount = 0; | 634 | bcs->emptycount = 0; |
| 635 | #endif | 635 | #endif |
| 636 | 636 | ||
| 637 | gig_dbg(DEBUG_INIT, "allocating bcs[%d]->skb", channel); | 637 | bcs->rx_bufsize = 0; |
| 638 | bcs->fcs = PPP_INITFCS; | 638 | bcs->rx_skb = NULL; |
| 639 | bcs->rx_fcs = PPP_INITFCS; | ||
| 639 | bcs->inputstate = 0; | 640 | bcs->inputstate = 0; |
| 640 | if (cs->ignoreframes) { | ||
| 641 | bcs->skb = NULL; | ||
| 642 | } else { | ||
| 643 | bcs->skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | ||
| 644 | if (bcs->skb != NULL) | ||
| 645 | skb_reserve(bcs->skb, cs->hw_hdr_len); | ||
| 646 | else | ||
| 647 | pr_err("out of memory\n"); | ||
| 648 | } | ||
| 649 | |||
| 650 | bcs->channel = channel; | 641 | bcs->channel = channel; |
| 651 | bcs->cs = cs; | 642 | bcs->cs = cs; |
| 652 | 643 | ||
| @@ -658,16 +649,15 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
| 658 | for (i = 0; i < AT_NUM; ++i) | 649 | for (i = 0; i < AT_NUM; ++i) |
| 659 | bcs->commands[i] = NULL; | 650 | bcs->commands[i] = NULL; |
| 660 | 651 | ||
| 652 | spin_lock_init(&bcs->aplock); | ||
| 653 | bcs->ap = NULL; | ||
| 654 | bcs->apconnstate = 0; | ||
| 655 | |||
| 661 | gig_dbg(DEBUG_INIT, " setting up bcs[%d]->hw", channel); | 656 | gig_dbg(DEBUG_INIT, " setting up bcs[%d]->hw", channel); |
| 662 | if (cs->ops->initbcshw(bcs)) | 657 | if (cs->ops->initbcshw(bcs)) |
| 663 | return bcs; | 658 | return bcs; |
| 664 | 659 | ||
| 665 | gig_dbg(DEBUG_INIT, " failed"); | 660 | gig_dbg(DEBUG_INIT, " failed"); |
| 666 | |||
| 667 | gig_dbg(DEBUG_INIT, " freeing bcs[%d]->skb", channel); | ||
| 668 | dev_kfree_skb(bcs->skb); | ||
| 669 | bcs->skb = NULL; | ||
| 670 | |||
| 671 | return NULL; | 661 | return NULL; |
| 672 | } | 662 | } |
| 673 | 663 | ||
| @@ -839,14 +829,12 @@ void gigaset_bcs_reinit(struct bc_state *bcs) | |||
| 839 | bcs->emptycount = 0; | 829 | bcs->emptycount = 0; |
| 840 | #endif | 830 | #endif |
| 841 | 831 | ||
| 842 | bcs->fcs = PPP_INITFCS; | 832 | bcs->rx_fcs = PPP_INITFCS; |
| 843 | bcs->chstate = 0; | 833 | bcs->chstate = 0; |
| 844 | 834 | ||
| 845 | bcs->ignore = cs->ignoreframes; | 835 | bcs->ignore = cs->ignoreframes; |
| 846 | if (bcs->ignore) { | 836 | dev_kfree_skb(bcs->rx_skb); |
| 847 | dev_kfree_skb(bcs->skb); | 837 | bcs->rx_skb = NULL; |
| 848 | bcs->skb = NULL; | ||
| 849 | } | ||
| 850 | 838 | ||
| 851 | cs->ops->reinitbcshw(bcs); | 839 | cs->ops->reinitbcshw(bcs); |
| 852 | } | 840 | } |
diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index 206c380c5235..ceaef9a04a42 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c | |||
| @@ -282,9 +282,7 @@ struct reply_t gigaset_tab_cid[] = | |||
| 282 | /* dial */ | 282 | /* dial */ |
| 283 | {EV_DIAL, -1, -1, -1, -1, -1, {ACT_DIAL} }, | 283 | {EV_DIAL, -1, -1, -1, -1, -1, {ACT_DIAL} }, |
| 284 | {RSP_INIT, 0, 0, SEQ_DIAL, 601, 5, {ACT_CMD+AT_BC} }, | 284 | {RSP_INIT, 0, 0, SEQ_DIAL, 601, 5, {ACT_CMD+AT_BC} }, |
| 285 | {RSP_OK, 601, 601, -1, 602, 5, {ACT_CMD+AT_HLC} }, | 285 | {RSP_OK, 601, 601, -1, 603, 5, {ACT_CMD+AT_PROTO} }, |
| 286 | {RSP_NULL, 602, 602, -1, 603, 5, {ACT_CMD+AT_PROTO} }, | ||
| 287 | {RSP_OK, 602, 602, -1, 603, 5, {ACT_CMD+AT_PROTO} }, | ||
| 288 | {RSP_OK, 603, 603, -1, 604, 5, {ACT_CMD+AT_TYPE} }, | 286 | {RSP_OK, 603, 603, -1, 604, 5, {ACT_CMD+AT_TYPE} }, |
| 289 | {RSP_OK, 604, 604, -1, 605, 5, {ACT_CMD+AT_MSN} }, | 287 | {RSP_OK, 604, 604, -1, 605, 5, {ACT_CMD+AT_MSN} }, |
| 290 | {RSP_NULL, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} }, | 288 | {RSP_NULL, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} }, |
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index 05947f9c1849..8738b0821fc9 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h | |||
| @@ -45,10 +45,6 @@ | |||
| 45 | #define MAX_EVENTS 64 /* size of event queue */ | 45 | #define MAX_EVENTS 64 /* size of event queue */ |
| 46 | 46 | ||
| 47 | #define RBUFSIZE 8192 | 47 | #define RBUFSIZE 8192 |
| 48 | #define SBUFSIZE 4096 /* sk_buff payload size */ | ||
| 49 | |||
| 50 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ | ||
| 51 | #define MAX_BUF_SIZE (SBUFSIZE - 2) /* Max. size of a data packet from LL */ | ||
| 52 | 48 | ||
| 53 | /* compile time options */ | 49 | /* compile time options */ |
| 54 | #define GIG_MAJOR 0 | 50 | #define GIG_MAJOR 0 |
| @@ -190,10 +186,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
| 190 | #define AT_BC 3 | 186 | #define AT_BC 3 |
| 191 | #define AT_PROTO 4 | 187 | #define AT_PROTO 4 |
| 192 | #define AT_TYPE 5 | 188 | #define AT_TYPE 5 |
| 193 | #define AT_HLC 6 | 189 | #define AT_CLIP 6 |
| 194 | #define AT_CLIP 7 | ||
| 195 | /* total number */ | 190 | /* total number */ |
| 196 | #define AT_NUM 8 | 191 | #define AT_NUM 7 |
| 197 | 192 | ||
| 198 | /* variables in struct at_state_t */ | 193 | /* variables in struct at_state_t */ |
| 199 | #define VAR_ZSAU 0 | 194 | #define VAR_ZSAU 0 |
| @@ -380,8 +375,10 @@ struct bc_state { | |||
| 380 | 375 | ||
| 381 | struct at_state_t at_state; | 376 | struct at_state_t at_state; |
| 382 | 377 | ||
| 383 | __u16 fcs; | 378 | /* receive buffer */ |
| 384 | struct sk_buff *skb; | 379 | unsigned rx_bufsize; /* max size accepted by application */ |
| 380 | struct sk_buff *rx_skb; | ||
| 381 | __u16 rx_fcs; | ||
| 385 | int inputstate; /* see INS_XXXX */ | 382 | int inputstate; /* see INS_XXXX */ |
| 386 | 383 | ||
| 387 | int channel; | 384 | int channel; |
| @@ -406,7 +403,9 @@ struct bc_state { | |||
| 406 | struct bas_bc_state *bas; /* usb hardware driver (base) */ | 403 | struct bas_bc_state *bas; /* usb hardware driver (base) */ |
| 407 | } hw; | 404 | } hw; |
| 408 | 405 | ||
| 409 | void *ap; /* LL application structure */ | 406 | void *ap; /* associated LL application */ |
| 407 | int apconnstate; /* LL application connection state */ | ||
| 408 | spinlock_t aplock; | ||
| 410 | }; | 409 | }; |
| 411 | 410 | ||
| 412 | struct cardstate { | 411 | struct cardstate { |
| @@ -801,8 +800,23 @@ static inline void gigaset_bchannel_up(struct bc_state *bcs) | |||
| 801 | gigaset_schedule_event(bcs->cs); | 800 | gigaset_schedule_event(bcs->cs); |
| 802 | } | 801 | } |
| 803 | 802 | ||
| 804 | /* handling routines for sk_buff */ | 803 | /* set up next receive skb for data mode */ |
| 805 | /* ============================= */ | 804 | static inline struct sk_buff *gigaset_new_rx_skb(struct bc_state *bcs) |
| 805 | { | ||
| 806 | struct cardstate *cs = bcs->cs; | ||
| 807 | unsigned short hw_hdr_len = cs->hw_hdr_len; | ||
| 808 | |||
| 809 | if (bcs->ignore) { | ||
| 810 | bcs->rx_skb = NULL; | ||
| 811 | } else { | ||
| 812 | bcs->rx_skb = dev_alloc_skb(bcs->rx_bufsize + hw_hdr_len); | ||
| 813 | if (bcs->rx_skb == NULL) | ||
| 814 | dev_warn(cs->dev, "could not allocate skb\n"); | ||
| 815 | else | ||
| 816 | skb_reserve(bcs->rx_skb, hw_hdr_len); | ||
| 817 | } | ||
| 818 | return bcs->rx_skb; | ||
| 819 | } | ||
| 806 | 820 | ||
| 807 | /* append received bytes to inbuf */ | 821 | /* append received bytes to inbuf */ |
| 808 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, | 822 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, |
diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c index c22e5ace8276..f01c3c2e2e46 100644 --- a/drivers/isdn/gigaset/i4l.c +++ b/drivers/isdn/gigaset/i4l.c | |||
| @@ -16,7 +16,10 @@ | |||
| 16 | #include "gigaset.h" | 16 | #include "gigaset.h" |
| 17 | #include <linux/isdnif.h> | 17 | #include <linux/isdnif.h> |
| 18 | 18 | ||
| 19 | #define SBUFSIZE 4096 /* sk_buff payload size */ | ||
| 20 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ | ||
| 19 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ | 21 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ |
| 22 | #define MAX_BUF_SIZE (SBUFSIZE - HW_HDR_LEN) /* max data packet from LL */ | ||
| 20 | 23 | ||
| 21 | /* == Handling of I4L IO =====================================================*/ | 24 | /* == Handling of I4L IO =====================================================*/ |
| 22 | 25 | ||
| @@ -231,6 +234,15 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
| 231 | dev_err(cs->dev, "ISDN_CMD_DIAL: channel not free\n"); | 234 | dev_err(cs->dev, "ISDN_CMD_DIAL: channel not free\n"); |
| 232 | return -EBUSY; | 235 | return -EBUSY; |
| 233 | } | 236 | } |
| 237 | switch (bcs->proto2) { | ||
| 238 | case L2_HDLC: | ||
| 239 | bcs->rx_bufsize = SBUFSIZE; | ||
| 240 | break; | ||
| 241 | default: /* assume transparent */ | ||
| 242 | bcs->rx_bufsize = TRANSBUFSIZE; | ||
| 243 | } | ||
| 244 | dev_kfree_skb(bcs->rx_skb); | ||
| 245 | gigaset_new_rx_skb(bcs); | ||
| 234 | 246 | ||
| 235 | commands = kzalloc(AT_NUM*(sizeof *commands), GFP_ATOMIC); | 247 | commands = kzalloc(AT_NUM*(sizeof *commands), GFP_ATOMIC); |
| 236 | if (!commands) { | 248 | if (!commands) { |
| @@ -314,6 +326,15 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
| 314 | return -EINVAL; | 326 | return -EINVAL; |
| 315 | } | 327 | } |
| 316 | bcs = cs->bcs + ch; | 328 | bcs = cs->bcs + ch; |
| 329 | switch (bcs->proto2) { | ||
| 330 | case L2_HDLC: | ||
| 331 | bcs->rx_bufsize = SBUFSIZE; | ||
| 332 | break; | ||
| 333 | default: /* assume transparent */ | ||
| 334 | bcs->rx_bufsize = TRANSBUFSIZE; | ||
| 335 | } | ||
| 336 | dev_kfree_skb(bcs->rx_skb); | ||
| 337 | gigaset_new_rx_skb(bcs); | ||
| 317 | if (!gigaset_add_event(cs, &bcs->at_state, | 338 | if (!gigaset_add_event(cs, &bcs->at_state, |
| 318 | EV_ACCEPT, NULL, 0, NULL)) | 339 | EV_ACCEPT, NULL, 0, NULL)) |
| 319 | return -ENOMEM; | 340 | return -ENOMEM; |
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index 16fd3bd48883..2dfd346fc889 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
| @@ -500,19 +500,18 @@ int gigaset_isoc_buildframe(struct bc_state *bcs, unsigned char *in, int len) | |||
| 500 | */ | 500 | */ |
| 501 | static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) | 501 | static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) |
| 502 | { | 502 | { |
| 503 | bcs->fcs = crc_ccitt_byte(bcs->fcs, c); | 503 | bcs->rx_fcs = crc_ccitt_byte(bcs->rx_fcs, c); |
| 504 | if (unlikely(bcs->skb == NULL)) { | 504 | if (bcs->rx_skb == NULL) |
| 505 | /* skipping */ | 505 | /* skipping */ |
| 506 | return; | 506 | return; |
| 507 | } | 507 | if (bcs->rx_skb->len >= bcs->rx_bufsize) { |
| 508 | if (unlikely(bcs->skb->len == SBUFSIZE)) { | ||
| 509 | dev_warn(bcs->cs->dev, "received oversized packet discarded\n"); | 508 | dev_warn(bcs->cs->dev, "received oversized packet discarded\n"); |
| 510 | bcs->hw.bas->giants++; | 509 | bcs->hw.bas->giants++; |
| 511 | dev_kfree_skb_any(bcs->skb); | 510 | dev_kfree_skb_any(bcs->rx_skb); |
| 512 | bcs->skb = NULL; | 511 | bcs->rx_skb = NULL; |
| 513 | return; | 512 | return; |
| 514 | } | 513 | } |
| 515 | *__skb_put(bcs->skb, 1) = c; | 514 | *__skb_put(bcs->rx_skb, 1) = c; |
| 516 | } | 515 | } |
| 517 | 516 | ||
| 518 | /* hdlc_flush | 517 | /* hdlc_flush |
| @@ -521,18 +520,13 @@ static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) | |||
| 521 | static inline void hdlc_flush(struct bc_state *bcs) | 520 | static inline void hdlc_flush(struct bc_state *bcs) |
| 522 | { | 521 | { |
| 523 | /* clear skb or allocate new if not skipping */ | 522 | /* clear skb or allocate new if not skipping */ |
| 524 | if (likely(bcs->skb != NULL)) | 523 | if (bcs->rx_skb != NULL) |
| 525 | skb_trim(bcs->skb, 0); | 524 | skb_trim(bcs->rx_skb, 0); |
| 526 | else if (!bcs->ignore) { | 525 | else |
| 527 | bcs->skb = dev_alloc_skb(SBUFSIZE + bcs->cs->hw_hdr_len); | 526 | gigaset_new_rx_skb(bcs); |
| 528 | if (bcs->skb) | ||
| 529 | skb_reserve(bcs->skb, bcs->cs->hw_hdr_len); | ||
| 530 | else | ||
| 531 | dev_err(bcs->cs->dev, "could not allocate skb\n"); | ||
| 532 | } | ||
| 533 | 527 | ||
| 534 | /* reset packet state */ | 528 | /* reset packet state */ |
| 535 | bcs->fcs = PPP_INITFCS; | 529 | bcs->rx_fcs = PPP_INITFCS; |
| 536 | } | 530 | } |
| 537 | 531 | ||
| 538 | /* hdlc_done | 532 | /* hdlc_done |
| @@ -549,7 +543,7 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 549 | hdlc_flush(bcs); | 543 | hdlc_flush(bcs); |
| 550 | return; | 544 | return; |
| 551 | } | 545 | } |
| 552 | procskb = bcs->skb; | 546 | procskb = bcs->rx_skb; |
| 553 | if (procskb == NULL) { | 547 | if (procskb == NULL) { |
| 554 | /* previous error */ | 548 | /* previous error */ |
| 555 | gig_dbg(DEBUG_ISO, "%s: skb=NULL", __func__); | 549 | gig_dbg(DEBUG_ISO, "%s: skb=NULL", __func__); |
| @@ -560,8 +554,8 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 560 | bcs->hw.bas->runts++; | 554 | bcs->hw.bas->runts++; |
| 561 | dev_kfree_skb_any(procskb); | 555 | dev_kfree_skb_any(procskb); |
| 562 | gigaset_isdn_rcv_err(bcs); | 556 | gigaset_isdn_rcv_err(bcs); |
| 563 | } else if (bcs->fcs != PPP_GOODFCS) { | 557 | } else if (bcs->rx_fcs != PPP_GOODFCS) { |
| 564 | dev_notice(cs->dev, "frame check error (0x%04x)\n", bcs->fcs); | 558 | dev_notice(cs->dev, "frame check error\n"); |
| 565 | bcs->hw.bas->fcserrs++; | 559 | bcs->hw.bas->fcserrs++; |
| 566 | dev_kfree_skb_any(procskb); | 560 | dev_kfree_skb_any(procskb); |
| 567 | gigaset_isdn_rcv_err(bcs); | 561 | gigaset_isdn_rcv_err(bcs); |
| @@ -574,13 +568,8 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 574 | bcs->hw.bas->goodbytes += len; | 568 | bcs->hw.bas->goodbytes += len; |
| 575 | gigaset_skb_rcvd(bcs, procskb); | 569 | gigaset_skb_rcvd(bcs, procskb); |
| 576 | } | 570 | } |
| 577 | 571 | gigaset_new_rx_skb(bcs); | |
| 578 | bcs->skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 572 | bcs->rx_fcs = PPP_INITFCS; |
| 579 | if (bcs->skb) | ||
| 580 | skb_reserve(bcs->skb, cs->hw_hdr_len); | ||
| 581 | else | ||
| 582 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 583 | bcs->fcs = PPP_INITFCS; | ||
| 584 | } | 573 | } |
| 585 | 574 | ||
| 586 | /* hdlc_frag | 575 | /* hdlc_frag |
| @@ -597,8 +586,8 @@ static inline void hdlc_frag(struct bc_state *bcs, unsigned inbits) | |||
| 597 | dev_notice(bcs->cs->dev, "received partial byte (%d bits)\n", inbits); | 586 | dev_notice(bcs->cs->dev, "received partial byte (%d bits)\n", inbits); |
| 598 | bcs->hw.bas->alignerrs++; | 587 | bcs->hw.bas->alignerrs++; |
| 599 | gigaset_isdn_rcv_err(bcs); | 588 | gigaset_isdn_rcv_err(bcs); |
| 600 | __skb_trim(bcs->skb, 0); | 589 | __skb_trim(bcs->rx_skb, 0); |
| 601 | bcs->fcs = PPP_INITFCS; | 590 | bcs->rx_fcs = PPP_INITFCS; |
| 602 | } | 591 | } |
| 603 | 592 | ||
| 604 | /* bit counts lookup table for HDLC bit unstuffing | 593 | /* bit counts lookup table for HDLC bit unstuffing |
| @@ -847,7 +836,6 @@ static inline void hdlc_unpack(unsigned char *src, unsigned count, | |||
| 847 | static inline void trans_receive(unsigned char *src, unsigned count, | 836 | static inline void trans_receive(unsigned char *src, unsigned count, |
| 848 | struct bc_state *bcs) | 837 | struct bc_state *bcs) |
| 849 | { | 838 | { |
| 850 | struct cardstate *cs = bcs->cs; | ||
| 851 | struct sk_buff *skb; | 839 | struct sk_buff *skb; |
| 852 | int dobytes; | 840 | int dobytes; |
| 853 | unsigned char *dst; | 841 | unsigned char *dst; |
| @@ -857,17 +845,11 @@ static inline void trans_receive(unsigned char *src, unsigned count, | |||
| 857 | hdlc_flush(bcs); | 845 | hdlc_flush(bcs); |
| 858 | return; | 846 | return; |
| 859 | } | 847 | } |
| 860 | skb = bcs->skb; | 848 | skb = bcs->rx_skb; |
| 861 | if (unlikely(skb == NULL)) { | 849 | if (skb == NULL) |
| 862 | bcs->skb = skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 850 | skb = gigaset_new_rx_skb(bcs); |
| 863 | if (!skb) { | ||
| 864 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 865 | return; | ||
| 866 | } | ||
| 867 | skb_reserve(skb, cs->hw_hdr_len); | ||
| 868 | } | ||
| 869 | bcs->hw.bas->goodbytes += skb->len; | 851 | bcs->hw.bas->goodbytes += skb->len; |
| 870 | dobytes = TRANSBUFSIZE - skb->len; | 852 | dobytes = bcs->rx_bufsize - skb->len; |
| 871 | while (count > 0) { | 853 | while (count > 0) { |
| 872 | dst = skb_put(skb, count < dobytes ? count : dobytes); | 854 | dst = skb_put(skb, count < dobytes ? count : dobytes); |
| 873 | while (count > 0 && dobytes > 0) { | 855 | while (count > 0 && dobytes > 0) { |
| @@ -879,14 +861,10 @@ static inline void trans_receive(unsigned char *src, unsigned count, | |||
| 879 | dump_bytes(DEBUG_STREAM_DUMP, | 861 | dump_bytes(DEBUG_STREAM_DUMP, |
| 880 | "rcv data", skb->data, skb->len); | 862 | "rcv data", skb->data, skb->len); |
| 881 | gigaset_skb_rcvd(bcs, skb); | 863 | gigaset_skb_rcvd(bcs, skb); |
| 882 | bcs->skb = skb = | 864 | skb = gigaset_new_rx_skb(bcs); |
| 883 | dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 865 | if (skb == NULL) |
| 884 | if (!skb) { | ||
| 885 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 886 | return; | 866 | return; |
| 887 | } | 867 | dobytes = bcs->rx_bufsize; |
| 888 | skb_reserve(skb, cs->hw_hdr_len); | ||
| 889 | dobytes = TRANSBUFSIZE; | ||
| 890 | } | 868 | } |
| 891 | } | 869 | } |
| 892 | } | 870 | } |
diff --git a/drivers/isdn/hysdn/hysdn_net.c b/drivers/isdn/hysdn/hysdn_net.c index 72eb92647c1b..feec8d89d719 100644 --- a/drivers/isdn/hysdn/hysdn_net.c +++ b/drivers/isdn/hysdn/hysdn_net.c | |||
| @@ -187,12 +187,13 @@ void | |||
| 187 | hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len) | 187 | hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len) |
| 188 | { | 188 | { |
| 189 | struct net_local *lp = card->netif; | 189 | struct net_local *lp = card->netif; |
| 190 | struct net_device *dev = lp->dev; | 190 | struct net_device *dev; |
| 191 | struct sk_buff *skb; | 191 | struct sk_buff *skb; |
| 192 | 192 | ||
| 193 | if (!lp) | 193 | if (!lp) |
| 194 | return; /* non existing device */ | 194 | return; /* non existing device */ |
| 195 | 195 | ||
| 196 | dev = lp->dev; | ||
| 196 | dev->stats.rx_bytes += len; | 197 | dev->stats.rx_bytes += len; |
| 197 | 198 | ||
| 198 | skb = dev_alloc_skb(len); | 199 | skb = dev_alloc_skb(len); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 46b3a044eadf..cb20d0b0555a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -2087,6 +2087,7 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
| 2087 | /* First make sure individual recovery_offsets are correct */ | 2087 | /* First make sure individual recovery_offsets are correct */ |
| 2088 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2088 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 2089 | if (rdev->raid_disk >= 0 && | 2089 | if (rdev->raid_disk >= 0 && |
| 2090 | mddev->delta_disks >= 0 && | ||
| 2090 | !test_bit(In_sync, &rdev->flags) && | 2091 | !test_bit(In_sync, &rdev->flags) && |
| 2091 | mddev->curr_resync_completed > rdev->recovery_offset) | 2092 | mddev->curr_resync_completed > rdev->recovery_offset) |
| 2092 | rdev->recovery_offset = mddev->curr_resync_completed; | 2093 | rdev->recovery_offset = mddev->curr_resync_completed; |
| @@ -3001,6 +3002,9 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3001 | return -EINVAL; | 3002 | return -EINVAL; |
| 3002 | } | 3003 | } |
| 3003 | 3004 | ||
| 3005 | list_for_each_entry(rdev, &mddev->disks, same_set) | ||
| 3006 | rdev->new_raid_disk = rdev->raid_disk; | ||
| 3007 | |||
| 3004 | /* ->takeover must set new_* and/or delta_disks | 3008 | /* ->takeover must set new_* and/or delta_disks |
| 3005 | * if it succeeds, and may set them when it fails. | 3009 | * if it succeeds, and may set them when it fails. |
| 3006 | */ | 3010 | */ |
| @@ -3051,13 +3055,35 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3051 | mddev->safemode = 0; | 3055 | mddev->safemode = 0; |
| 3052 | } | 3056 | } |
| 3053 | 3057 | ||
| 3054 | module_put(mddev->pers->owner); | 3058 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 3055 | /* Invalidate devices that are now superfluous */ | 3059 | char nm[20]; |
| 3056 | list_for_each_entry(rdev, &mddev->disks, same_set) | 3060 | if (rdev->raid_disk < 0) |
| 3057 | if (rdev->raid_disk >= mddev->raid_disks) { | 3061 | continue; |
| 3058 | rdev->raid_disk = -1; | 3062 | if (rdev->new_raid_disk > mddev->raid_disks) |
| 3063 | rdev->new_raid_disk = -1; | ||
| 3064 | if (rdev->new_raid_disk == rdev->raid_disk) | ||
| 3065 | continue; | ||
| 3066 | sprintf(nm, "rd%d", rdev->raid_disk); | ||
| 3067 | sysfs_remove_link(&mddev->kobj, nm); | ||
| 3068 | } | ||
| 3069 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 3070 | if (rdev->raid_disk < 0) | ||
| 3071 | continue; | ||
| 3072 | if (rdev->new_raid_disk == rdev->raid_disk) | ||
| 3073 | continue; | ||
| 3074 | rdev->raid_disk = rdev->new_raid_disk; | ||
| 3075 | if (rdev->raid_disk < 0) | ||
| 3059 | clear_bit(In_sync, &rdev->flags); | 3076 | clear_bit(In_sync, &rdev->flags); |
| 3077 | else { | ||
| 3078 | char nm[20]; | ||
| 3079 | sprintf(nm, "rd%d", rdev->raid_disk); | ||
| 3080 | if(sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) | ||
| 3081 | printk("md: cannot register %s for %s after level change\n", | ||
| 3082 | nm, mdname(mddev)); | ||
| 3060 | } | 3083 | } |
| 3084 | } | ||
| 3085 | |||
| 3086 | module_put(mddev->pers->owner); | ||
| 3061 | mddev->pers = pers; | 3087 | mddev->pers = pers; |
| 3062 | mddev->private = priv; | 3088 | mddev->private = priv; |
| 3063 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); | 3089 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); |
| @@ -5895,6 +5921,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5895 | atomic_inc(&mddev->openers); | 5921 | atomic_inc(&mddev->openers); |
| 5896 | mutex_unlock(&mddev->open_mutex); | 5922 | mutex_unlock(&mddev->open_mutex); |
| 5897 | 5923 | ||
| 5924 | check_disk_size_change(mddev->gendisk, bdev); | ||
| 5898 | out: | 5925 | out: |
| 5899 | return err; | 5926 | return err; |
| 5900 | } | 5927 | } |
| @@ -6846,6 +6873,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6846 | rcu_read_lock(); | 6873 | rcu_read_lock(); |
| 6847 | list_for_each_entry_rcu(rdev, &mddev->disks, same_set) | 6874 | list_for_each_entry_rcu(rdev, &mddev->disks, same_set) |
| 6848 | if (rdev->raid_disk >= 0 && | 6875 | if (rdev->raid_disk >= 0 && |
| 6876 | mddev->delta_disks >= 0 && | ||
| 6849 | !test_bit(Faulty, &rdev->flags) && | 6877 | !test_bit(Faulty, &rdev->flags) && |
| 6850 | !test_bit(In_sync, &rdev->flags) && | 6878 | !test_bit(In_sync, &rdev->flags) && |
| 6851 | rdev->recovery_offset < mddev->curr_resync) | 6879 | rdev->recovery_offset < mddev->curr_resync) |
diff --git a/drivers/md/md.h b/drivers/md/md.h index 7ab5ea155452..10597bfec000 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
| @@ -78,6 +78,9 @@ struct mdk_rdev_s | |||
| 78 | 78 | ||
| 79 | int desc_nr; /* descriptor index in the superblock */ | 79 | int desc_nr; /* descriptor index in the superblock */ |
| 80 | int raid_disk; /* role of device in array */ | 80 | int raid_disk; /* role of device in array */ |
| 81 | int new_raid_disk; /* role that the device will have in | ||
| 82 | * the array after a level-change completes. | ||
| 83 | */ | ||
| 81 | int saved_raid_disk; /* role that device used to have in the | 84 | int saved_raid_disk; /* role that device used to have in the |
| 82 | * array and could again if we did a partial | 85 | * array and could again if we did a partial |
| 83 | * resync from the bitmap | 86 | * resync from the bitmap |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index e70f004c99e8..563abed5a2cb 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
| @@ -173,9 +173,11 @@ static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf) | |||
| 173 | list_for_each_entry(rdev1, &mddev->disks, same_set) { | 173 | list_for_each_entry(rdev1, &mddev->disks, same_set) { |
| 174 | int j = rdev1->raid_disk; | 174 | int j = rdev1->raid_disk; |
| 175 | 175 | ||
| 176 | if (mddev->level == 10) | 176 | if (mddev->level == 10) { |
| 177 | /* taking over a raid10-n2 array */ | 177 | /* taking over a raid10-n2 array */ |
| 178 | j /= 2; | 178 | j /= 2; |
| 179 | rdev1->new_raid_disk = j; | ||
| 180 | } | ||
| 179 | 181 | ||
| 180 | if (j < 0 || j >= mddev->raid_disks) { | 182 | if (j < 0 || j >= mddev->raid_disks) { |
| 181 | printk(KERN_ERR "md/raid0:%s: bad disk number %d - " | 183 | printk(KERN_ERR "md/raid0:%s: bad disk number %d - " |
| @@ -361,12 +363,6 @@ static int raid0_run(mddev_t *mddev) | |||
| 361 | mddev->private = conf; | 363 | mddev->private = conf; |
| 362 | } | 364 | } |
| 363 | conf = mddev->private; | 365 | conf = mddev->private; |
| 364 | if (conf->scale_raid_disks) { | ||
| 365 | int i; | ||
| 366 | for (i=0; i < conf->strip_zone[0].nb_dev; i++) | ||
| 367 | conf->devlist[i]->raid_disk /= conf->scale_raid_disks; | ||
| 368 | /* FIXME update sysfs rd links */ | ||
| 369 | } | ||
| 370 | 366 | ||
| 371 | /* calculate array device size */ | 367 | /* calculate array device size */ |
| 372 | md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); | 368 | md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); |
| @@ -573,7 +569,7 @@ static void raid0_status(struct seq_file *seq, mddev_t *mddev) | |||
| 573 | return; | 569 | return; |
| 574 | } | 570 | } |
| 575 | 571 | ||
| 576 | static void *raid0_takeover_raid5(mddev_t *mddev) | 572 | static void *raid0_takeover_raid45(mddev_t *mddev) |
| 577 | { | 573 | { |
| 578 | mdk_rdev_t *rdev; | 574 | mdk_rdev_t *rdev; |
| 579 | raid0_conf_t *priv_conf; | 575 | raid0_conf_t *priv_conf; |
| @@ -596,6 +592,7 @@ static void *raid0_takeover_raid5(mddev_t *mddev) | |||
| 596 | 592 | ||
| 597 | /* Set new parameters */ | 593 | /* Set new parameters */ |
| 598 | mddev->new_level = 0; | 594 | mddev->new_level = 0; |
| 595 | mddev->new_layout = 0; | ||
| 599 | mddev->new_chunk_sectors = mddev->chunk_sectors; | 596 | mddev->new_chunk_sectors = mddev->chunk_sectors; |
| 600 | mddev->raid_disks--; | 597 | mddev->raid_disks--; |
| 601 | mddev->delta_disks = -1; | 598 | mddev->delta_disks = -1; |
| @@ -635,6 +632,7 @@ static void *raid0_takeover_raid10(mddev_t *mddev) | |||
| 635 | 632 | ||
| 636 | /* Set new parameters */ | 633 | /* Set new parameters */ |
| 637 | mddev->new_level = 0; | 634 | mddev->new_level = 0; |
| 635 | mddev->new_layout = 0; | ||
| 638 | mddev->new_chunk_sectors = mddev->chunk_sectors; | 636 | mddev->new_chunk_sectors = mddev->chunk_sectors; |
| 639 | mddev->delta_disks = - mddev->raid_disks / 2; | 637 | mddev->delta_disks = - mddev->raid_disks / 2; |
| 640 | mddev->raid_disks += mddev->delta_disks; | 638 | mddev->raid_disks += mddev->delta_disks; |
| @@ -643,19 +641,22 @@ static void *raid0_takeover_raid10(mddev_t *mddev) | |||
| 643 | mddev->recovery_cp = MaxSector; | 641 | mddev->recovery_cp = MaxSector; |
| 644 | 642 | ||
| 645 | create_strip_zones(mddev, &priv_conf); | 643 | create_strip_zones(mddev, &priv_conf); |
| 646 | priv_conf->scale_raid_disks = 2; | ||
| 647 | return priv_conf; | 644 | return priv_conf; |
| 648 | } | 645 | } |
| 649 | 646 | ||
| 650 | static void *raid0_takeover(mddev_t *mddev) | 647 | static void *raid0_takeover(mddev_t *mddev) |
| 651 | { | 648 | { |
| 652 | /* raid0 can take over: | 649 | /* raid0 can take over: |
| 650 | * raid4 - if all data disks are active. | ||
| 653 | * raid5 - providing it is Raid4 layout and one disk is faulty | 651 | * raid5 - providing it is Raid4 layout and one disk is faulty |
| 654 | * raid10 - assuming we have all necessary active disks | 652 | * raid10 - assuming we have all necessary active disks |
| 655 | */ | 653 | */ |
| 654 | if (mddev->level == 4) | ||
| 655 | return raid0_takeover_raid45(mddev); | ||
| 656 | |||
| 656 | if (mddev->level == 5) { | 657 | if (mddev->level == 5) { |
| 657 | if (mddev->layout == ALGORITHM_PARITY_N) | 658 | if (mddev->layout == ALGORITHM_PARITY_N) |
| 658 | return raid0_takeover_raid5(mddev); | 659 | return raid0_takeover_raid45(mddev); |
| 659 | 660 | ||
| 660 | printk(KERN_ERR "md/raid0:%s: Raid can only takeover Raid5 with layout: %d\n", | 661 | printk(KERN_ERR "md/raid0:%s: Raid can only takeover Raid5 with layout: %d\n", |
| 661 | mdname(mddev), ALGORITHM_PARITY_N); | 662 | mdname(mddev), ALGORITHM_PARITY_N); |
diff --git a/drivers/md/raid0.h b/drivers/md/raid0.h index d724e664ca4d..91f8e876ee64 100644 --- a/drivers/md/raid0.h +++ b/drivers/md/raid0.h | |||
| @@ -13,9 +13,6 @@ struct raid0_private_data | |||
| 13 | struct strip_zone *strip_zone; | 13 | struct strip_zone *strip_zone; |
| 14 | mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */ | 14 | mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */ |
| 15 | int nr_strip_zones; | 15 | int nr_strip_zones; |
| 16 | int scale_raid_disks; /* divide rdev->raid_disks by this in run() | ||
| 17 | * to handle conversion from raid10 | ||
| 18 | */ | ||
| 19 | }; | 16 | }; |
| 20 | 17 | ||
| 21 | typedef struct raid0_private_data raid0_conf_t; | 18 | typedef struct raid0_private_data raid0_conf_t; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 03724992cdf2..42e64e4e5e25 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -1482,14 +1482,14 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1482 | int sectors = r10_bio->sectors; | 1482 | int sectors = r10_bio->sectors; |
| 1483 | mdk_rdev_t*rdev; | 1483 | mdk_rdev_t*rdev; |
| 1484 | int max_read_errors = atomic_read(&mddev->max_corr_read_errors); | 1484 | int max_read_errors = atomic_read(&mddev->max_corr_read_errors); |
| 1485 | int d = r10_bio->devs[r10_bio->read_slot].devnum; | ||
| 1485 | 1486 | ||
| 1486 | rcu_read_lock(); | 1487 | rcu_read_lock(); |
| 1487 | { | 1488 | rdev = rcu_dereference(conf->mirrors[d].rdev); |
| 1488 | int d = r10_bio->devs[r10_bio->read_slot].devnum; | 1489 | if (rdev) { /* If rdev is not NULL */ |
| 1489 | char b[BDEVNAME_SIZE]; | 1490 | char b[BDEVNAME_SIZE]; |
| 1490 | int cur_read_error_count = 0; | 1491 | int cur_read_error_count = 0; |
| 1491 | 1492 | ||
| 1492 | rdev = rcu_dereference(conf->mirrors[d].rdev); | ||
| 1493 | bdevname(rdev->bdev, b); | 1493 | bdevname(rdev->bdev, b); |
| 1494 | 1494 | ||
| 1495 | if (test_bit(Faulty, &rdev->flags)) { | 1495 | if (test_bit(Faulty, &rdev->flags)) { |
| @@ -1530,7 +1530,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1530 | 1530 | ||
| 1531 | rcu_read_lock(); | 1531 | rcu_read_lock(); |
| 1532 | do { | 1532 | do { |
| 1533 | int d = r10_bio->devs[sl].devnum; | 1533 | d = r10_bio->devs[sl].devnum; |
| 1534 | rdev = rcu_dereference(conf->mirrors[d].rdev); | 1534 | rdev = rcu_dereference(conf->mirrors[d].rdev); |
| 1535 | if (rdev && | 1535 | if (rdev && |
| 1536 | test_bit(In_sync, &rdev->flags)) { | 1536 | test_bit(In_sync, &rdev->flags)) { |
| @@ -1564,7 +1564,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1564 | rcu_read_lock(); | 1564 | rcu_read_lock(); |
| 1565 | while (sl != r10_bio->read_slot) { | 1565 | while (sl != r10_bio->read_slot) { |
| 1566 | char b[BDEVNAME_SIZE]; | 1566 | char b[BDEVNAME_SIZE]; |
| 1567 | int d; | 1567 | |
| 1568 | if (sl==0) | 1568 | if (sl==0) |
| 1569 | sl = conf->copies; | 1569 | sl = conf->copies; |
| 1570 | sl--; | 1570 | sl--; |
| @@ -1601,7 +1601,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1601 | } | 1601 | } |
| 1602 | sl = start; | 1602 | sl = start; |
| 1603 | while (sl != r10_bio->read_slot) { | 1603 | while (sl != r10_bio->read_slot) { |
| 1604 | int d; | 1604 | |
| 1605 | if (sl==0) | 1605 | if (sl==0) |
| 1606 | sl = conf->copies; | 1606 | sl = conf->copies; |
| 1607 | sl--; | 1607 | sl--; |
| @@ -2161,22 +2161,22 @@ static conf_t *setup_conf(mddev_t *mddev) | |||
| 2161 | sector_t stride, size; | 2161 | sector_t stride, size; |
| 2162 | int err = -EINVAL; | 2162 | int err = -EINVAL; |
| 2163 | 2163 | ||
| 2164 | if (mddev->chunk_sectors < (PAGE_SIZE >> 9) || | 2164 | if (mddev->new_chunk_sectors < (PAGE_SIZE >> 9) || |
| 2165 | !is_power_of_2(mddev->chunk_sectors)) { | 2165 | !is_power_of_2(mddev->new_chunk_sectors)) { |
| 2166 | printk(KERN_ERR "md/raid10:%s: chunk size must be " | 2166 | printk(KERN_ERR "md/raid10:%s: chunk size must be " |
| 2167 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", | 2167 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", |
| 2168 | mdname(mddev), PAGE_SIZE); | 2168 | mdname(mddev), PAGE_SIZE); |
| 2169 | goto out; | 2169 | goto out; |
| 2170 | } | 2170 | } |
| 2171 | 2171 | ||
| 2172 | nc = mddev->layout & 255; | 2172 | nc = mddev->new_layout & 255; |
| 2173 | fc = (mddev->layout >> 8) & 255; | 2173 | fc = (mddev->new_layout >> 8) & 255; |
| 2174 | fo = mddev->layout & (1<<16); | 2174 | fo = mddev->new_layout & (1<<16); |
| 2175 | 2175 | ||
| 2176 | if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || | 2176 | if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || |
| 2177 | (mddev->layout >> 17)) { | 2177 | (mddev->new_layout >> 17)) { |
| 2178 | printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n", | 2178 | printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n", |
| 2179 | mdname(mddev), mddev->layout); | 2179 | mdname(mddev), mddev->new_layout); |
| 2180 | goto out; | 2180 | goto out; |
| 2181 | } | 2181 | } |
| 2182 | 2182 | ||
| @@ -2241,7 +2241,6 @@ static conf_t *setup_conf(mddev_t *mddev) | |||
| 2241 | if (!conf->thread) | 2241 | if (!conf->thread) |
| 2242 | goto out; | 2242 | goto out; |
| 2243 | 2243 | ||
| 2244 | conf->scale_disks = 0; | ||
| 2245 | conf->mddev = mddev; | 2244 | conf->mddev = mddev; |
| 2246 | return conf; | 2245 | return conf; |
| 2247 | 2246 | ||
| @@ -2300,11 +2299,6 @@ static int run(mddev_t *mddev) | |||
| 2300 | if (disk_idx >= conf->raid_disks | 2299 | if (disk_idx >= conf->raid_disks |
| 2301 | || disk_idx < 0) | 2300 | || disk_idx < 0) |
| 2302 | continue; | 2301 | continue; |
| 2303 | if (conf->scale_disks) { | ||
| 2304 | disk_idx *= conf->scale_disks; | ||
| 2305 | rdev->raid_disk = disk_idx; | ||
| 2306 | /* MOVE 'rd%d' link !! */ | ||
| 2307 | } | ||
| 2308 | disk = conf->mirrors + disk_idx; | 2302 | disk = conf->mirrors + disk_idx; |
| 2309 | 2303 | ||
| 2310 | disk->rdev = rdev; | 2304 | disk->rdev = rdev; |
| @@ -2435,26 +2429,22 @@ static void *raid10_takeover_raid0(mddev_t *mddev) | |||
| 2435 | return ERR_PTR(-EINVAL); | 2429 | return ERR_PTR(-EINVAL); |
| 2436 | } | 2430 | } |
| 2437 | 2431 | ||
| 2438 | /* Update slot numbers to obtain | ||
| 2439 | * degraded raid10 with missing mirrors | ||
| 2440 | */ | ||
| 2441 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2442 | rdev->raid_disk *= 2; | ||
| 2443 | } | ||
| 2444 | |||
| 2445 | /* Set new parameters */ | 2432 | /* Set new parameters */ |
| 2446 | mddev->new_level = 10; | 2433 | mddev->new_level = 10; |
| 2447 | /* new layout: far_copies = 1, near_copies = 2 */ | 2434 | /* new layout: far_copies = 1, near_copies = 2 */ |
| 2448 | mddev->new_layout = (1<<8) + 2; | 2435 | mddev->new_layout = (1<<8) + 2; |
| 2449 | mddev->new_chunk_sectors = mddev->chunk_sectors; | 2436 | mddev->new_chunk_sectors = mddev->chunk_sectors; |
| 2450 | mddev->delta_disks = mddev->raid_disks; | 2437 | mddev->delta_disks = mddev->raid_disks; |
| 2451 | mddev->degraded = mddev->raid_disks; | ||
| 2452 | mddev->raid_disks *= 2; | 2438 | mddev->raid_disks *= 2; |
| 2453 | /* make sure it will be not marked as dirty */ | 2439 | /* make sure it will be not marked as dirty */ |
| 2454 | mddev->recovery_cp = MaxSector; | 2440 | mddev->recovery_cp = MaxSector; |
| 2455 | 2441 | ||
| 2456 | conf = setup_conf(mddev); | 2442 | conf = setup_conf(mddev); |
| 2457 | conf->scale_disks = 2; | 2443 | if (!IS_ERR(conf)) |
| 2444 | list_for_each_entry(rdev, &mddev->disks, same_set) | ||
| 2445 | if (rdev->raid_disk >= 0) | ||
| 2446 | rdev->new_raid_disk = rdev->raid_disk * 2; | ||
| 2447 | |||
| 2458 | return conf; | 2448 | return conf; |
| 2459 | } | 2449 | } |
| 2460 | 2450 | ||
diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h index 3824a087e17c..2316ac2e8e21 100644 --- a/drivers/md/raid10.h +++ b/drivers/md/raid10.h | |||
| @@ -38,11 +38,6 @@ struct r10_private_data_s { | |||
| 38 | int chunk_shift; /* shift from chunks to sectors */ | 38 | int chunk_shift; /* shift from chunks to sectors */ |
| 39 | sector_t chunk_mask; | 39 | sector_t chunk_mask; |
| 40 | 40 | ||
| 41 | int scale_disks; /* When starting array, multiply | ||
| 42 | * each ->raid_disk by this. | ||
| 43 | * Need for raid0->raid10 migration | ||
| 44 | */ | ||
| 45 | |||
| 46 | struct list_head retry_list; | 41 | struct list_head retry_list; |
| 47 | /* queue pending writes and submit them on unplug */ | 42 | /* queue pending writes and submit them on unplug */ |
| 48 | struct bio_list pending_bio_list; | 43 | struct bio_list pending_bio_list; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index d2c0f94fa37d..96c690279fc6 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -277,12 +277,13 @@ out: | |||
| 277 | return sh; | 277 | return sh; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static void shrink_buffers(struct stripe_head *sh, int num) | 280 | static void shrink_buffers(struct stripe_head *sh) |
| 281 | { | 281 | { |
| 282 | struct page *p; | 282 | struct page *p; |
| 283 | int i; | 283 | int i; |
| 284 | int num = sh->raid_conf->pool_size; | ||
| 284 | 285 | ||
| 285 | for (i=0; i<num ; i++) { | 286 | for (i = 0; i < num ; i++) { |
| 286 | p = sh->dev[i].page; | 287 | p = sh->dev[i].page; |
| 287 | if (!p) | 288 | if (!p) |
| 288 | continue; | 289 | continue; |
| @@ -291,11 +292,12 @@ static void shrink_buffers(struct stripe_head *sh, int num) | |||
| 291 | } | 292 | } |
| 292 | } | 293 | } |
| 293 | 294 | ||
| 294 | static int grow_buffers(struct stripe_head *sh, int num) | 295 | static int grow_buffers(struct stripe_head *sh) |
| 295 | { | 296 | { |
| 296 | int i; | 297 | int i; |
| 298 | int num = sh->raid_conf->pool_size; | ||
| 297 | 299 | ||
| 298 | for (i=0; i<num; i++) { | 300 | for (i = 0; i < num; i++) { |
| 299 | struct page *page; | 301 | struct page *page; |
| 300 | 302 | ||
| 301 | if (!(page = alloc_page(GFP_KERNEL))) { | 303 | if (!(page = alloc_page(GFP_KERNEL))) { |
| @@ -364,6 +366,73 @@ static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector, | |||
| 364 | return NULL; | 366 | return NULL; |
| 365 | } | 367 | } |
| 366 | 368 | ||
| 369 | /* | ||
| 370 | * Need to check if array has failed when deciding whether to: | ||
| 371 | * - start an array | ||
| 372 | * - remove non-faulty devices | ||
| 373 | * - add a spare | ||
| 374 | * - allow a reshape | ||
| 375 | * This determination is simple when no reshape is happening. | ||
| 376 | * However if there is a reshape, we need to carefully check | ||
| 377 | * both the before and after sections. | ||
| 378 | * This is because some failed devices may only affect one | ||
| 379 | * of the two sections, and some non-in_sync devices may | ||
| 380 | * be insync in the section most affected by failed devices. | ||
| 381 | */ | ||
| 382 | static int has_failed(raid5_conf_t *conf) | ||
| 383 | { | ||
| 384 | int degraded; | ||
| 385 | int i; | ||
| 386 | if (conf->mddev->reshape_position == MaxSector) | ||
| 387 | return conf->mddev->degraded > conf->max_degraded; | ||
| 388 | |||
| 389 | rcu_read_lock(); | ||
| 390 | degraded = 0; | ||
| 391 | for (i = 0; i < conf->previous_raid_disks; i++) { | ||
| 392 | mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev); | ||
| 393 | if (!rdev || test_bit(Faulty, &rdev->flags)) | ||
| 394 | degraded++; | ||
| 395 | else if (test_bit(In_sync, &rdev->flags)) | ||
| 396 | ; | ||
| 397 | else | ||
| 398 | /* not in-sync or faulty. | ||
| 399 | * If the reshape increases the number of devices, | ||
| 400 | * this is being recovered by the reshape, so | ||
| 401 | * this 'previous' section is not in_sync. | ||
| 402 | * If the number of devices is being reduced however, | ||
| 403 | * the device can only be part of the array if | ||
| 404 | * we are reverting a reshape, so this section will | ||
| 405 | * be in-sync. | ||
| 406 | */ | ||
| 407 | if (conf->raid_disks >= conf->previous_raid_disks) | ||
| 408 | degraded++; | ||
| 409 | } | ||
| 410 | rcu_read_unlock(); | ||
| 411 | if (degraded > conf->max_degraded) | ||
| 412 | return 1; | ||
| 413 | rcu_read_lock(); | ||
| 414 | degraded = 0; | ||
| 415 | for (i = 0; i < conf->raid_disks; i++) { | ||
| 416 | mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev); | ||
| 417 | if (!rdev || test_bit(Faulty, &rdev->flags)) | ||
| 418 | degraded++; | ||
| 419 | else if (test_bit(In_sync, &rdev->flags)) | ||
| 420 | ; | ||
| 421 | else | ||
| 422 | /* not in-sync or faulty. | ||
| 423 | * If reshape increases the number of devices, this | ||
| 424 | * section has already been recovered, else it | ||
| 425 | * almost certainly hasn't. | ||
| 426 | */ | ||
| 427 | if (conf->raid_disks <= conf->previous_raid_disks) | ||
| 428 | degraded++; | ||
| 429 | } | ||
| 430 | rcu_read_unlock(); | ||
| 431 | if (degraded > conf->max_degraded) | ||
| 432 | return 1; | ||
| 433 | return 0; | ||
| 434 | } | ||
| 435 | |||
| 367 | static void unplug_slaves(mddev_t *mddev); | 436 | static void unplug_slaves(mddev_t *mddev); |
| 368 | static void raid5_unplug_device(struct request_queue *q); | 437 | static void raid5_unplug_device(struct request_queue *q); |
| 369 | 438 | ||
| @@ -1240,19 +1309,18 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) | |||
| 1240 | static int grow_one_stripe(raid5_conf_t *conf) | 1309 | static int grow_one_stripe(raid5_conf_t *conf) |
| 1241 | { | 1310 | { |
| 1242 | struct stripe_head *sh; | 1311 | struct stripe_head *sh; |
| 1243 | int disks = max(conf->raid_disks, conf->previous_raid_disks); | ||
| 1244 | sh = kmem_cache_alloc(conf->slab_cache, GFP_KERNEL); | 1312 | sh = kmem_cache_alloc(conf->slab_cache, GFP_KERNEL); |
| 1245 | if (!sh) | 1313 | if (!sh) |
| 1246 | return 0; | 1314 | return 0; |
| 1247 | memset(sh, 0, sizeof(*sh) + (disks-1)*sizeof(struct r5dev)); | 1315 | memset(sh, 0, sizeof(*sh) + (conf->pool_size-1)*sizeof(struct r5dev)); |
| 1248 | sh->raid_conf = conf; | 1316 | sh->raid_conf = conf; |
| 1249 | spin_lock_init(&sh->lock); | 1317 | spin_lock_init(&sh->lock); |
| 1250 | #ifdef CONFIG_MULTICORE_RAID456 | 1318 | #ifdef CONFIG_MULTICORE_RAID456 |
| 1251 | init_waitqueue_head(&sh->ops.wait_for_ops); | 1319 | init_waitqueue_head(&sh->ops.wait_for_ops); |
| 1252 | #endif | 1320 | #endif |
| 1253 | 1321 | ||
| 1254 | if (grow_buffers(sh, disks)) { | 1322 | if (grow_buffers(sh)) { |
| 1255 | shrink_buffers(sh, disks); | 1323 | shrink_buffers(sh); |
| 1256 | kmem_cache_free(conf->slab_cache, sh); | 1324 | kmem_cache_free(conf->slab_cache, sh); |
| 1257 | return 0; | 1325 | return 0; |
| 1258 | } | 1326 | } |
| @@ -1468,7 +1536,7 @@ static int drop_one_stripe(raid5_conf_t *conf) | |||
| 1468 | if (!sh) | 1536 | if (!sh) |
| 1469 | return 0; | 1537 | return 0; |
| 1470 | BUG_ON(atomic_read(&sh->count)); | 1538 | BUG_ON(atomic_read(&sh->count)); |
| 1471 | shrink_buffers(sh, conf->pool_size); | 1539 | shrink_buffers(sh); |
| 1472 | kmem_cache_free(conf->slab_cache, sh); | 1540 | kmem_cache_free(conf->slab_cache, sh); |
| 1473 | atomic_dec(&conf->active_stripes); | 1541 | atomic_dec(&conf->active_stripes); |
| 1474 | return 1; | 1542 | return 1; |
| @@ -2963,7 +3031,6 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2963 | mdk_rdev_t *rdev; | 3031 | mdk_rdev_t *rdev; |
| 2964 | 3032 | ||
| 2965 | dev = &sh->dev[i]; | 3033 | dev = &sh->dev[i]; |
| 2966 | clear_bit(R5_Insync, &dev->flags); | ||
| 2967 | 3034 | ||
| 2968 | pr_debug("check %d: state 0x%lx toread %p read %p write %p " | 3035 | pr_debug("check %d: state 0x%lx toread %p read %p write %p " |
| 2969 | "written %p\n", i, dev->flags, dev->toread, dev->read, | 3036 | "written %p\n", i, dev->flags, dev->toread, dev->read, |
| @@ -3000,17 +3067,27 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 3000 | blocked_rdev = rdev; | 3067 | blocked_rdev = rdev; |
| 3001 | atomic_inc(&rdev->nr_pending); | 3068 | atomic_inc(&rdev->nr_pending); |
| 3002 | } | 3069 | } |
| 3003 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 3070 | clear_bit(R5_Insync, &dev->flags); |
| 3071 | if (!rdev) | ||
| 3072 | /* Not in-sync */; | ||
| 3073 | else if (test_bit(In_sync, &rdev->flags)) | ||
| 3074 | set_bit(R5_Insync, &dev->flags); | ||
| 3075 | else { | ||
| 3076 | /* could be in-sync depending on recovery/reshape status */ | ||
| 3077 | if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset) | ||
| 3078 | set_bit(R5_Insync, &dev->flags); | ||
| 3079 | } | ||
| 3080 | if (!test_bit(R5_Insync, &dev->flags)) { | ||
| 3004 | /* The ReadError flag will just be confusing now */ | 3081 | /* The ReadError flag will just be confusing now */ |
| 3005 | clear_bit(R5_ReadError, &dev->flags); | 3082 | clear_bit(R5_ReadError, &dev->flags); |
| 3006 | clear_bit(R5_ReWrite, &dev->flags); | 3083 | clear_bit(R5_ReWrite, &dev->flags); |
| 3007 | } | 3084 | } |
| 3008 | if (!rdev || !test_bit(In_sync, &rdev->flags) | 3085 | if (test_bit(R5_ReadError, &dev->flags)) |
| 3009 | || test_bit(R5_ReadError, &dev->flags)) { | 3086 | clear_bit(R5_Insync, &dev->flags); |
| 3087 | if (!test_bit(R5_Insync, &dev->flags)) { | ||
| 3010 | s.failed++; | 3088 | s.failed++; |
| 3011 | s.failed_num = i; | 3089 | s.failed_num = i; |
| 3012 | } else | 3090 | } |
| 3013 | set_bit(R5_Insync, &dev->flags); | ||
| 3014 | } | 3091 | } |
| 3015 | rcu_read_unlock(); | 3092 | rcu_read_unlock(); |
| 3016 | 3093 | ||
| @@ -3244,7 +3321,6 @@ static void handle_stripe6(struct stripe_head *sh) | |||
| 3244 | for (i=disks; i--; ) { | 3321 | for (i=disks; i--; ) { |
| 3245 | mdk_rdev_t *rdev; | 3322 | mdk_rdev_t *rdev; |
| 3246 | dev = &sh->dev[i]; | 3323 | dev = &sh->dev[i]; |
| 3247 | clear_bit(R5_Insync, &dev->flags); | ||
| 3248 | 3324 | ||
| 3249 | pr_debug("check %d: state 0x%lx read %p write %p written %p\n", | 3325 | pr_debug("check %d: state 0x%lx read %p write %p written %p\n", |
| 3250 | i, dev->flags, dev->toread, dev->towrite, dev->written); | 3326 | i, dev->flags, dev->toread, dev->towrite, dev->written); |
| @@ -3282,18 +3358,28 @@ static void handle_stripe6(struct stripe_head *sh) | |||
| 3282 | blocked_rdev = rdev; | 3358 | blocked_rdev = rdev; |
| 3283 | atomic_inc(&rdev->nr_pending); | 3359 | atomic_inc(&rdev->nr_pending); |
| 3284 | } | 3360 | } |
| 3285 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 3361 | clear_bit(R5_Insync, &dev->flags); |
| 3362 | if (!rdev) | ||
| 3363 | /* Not in-sync */; | ||
| 3364 | else if (test_bit(In_sync, &rdev->flags)) | ||
| 3365 | set_bit(R5_Insync, &dev->flags); | ||
| 3366 | else { | ||
| 3367 | /* in sync if before recovery_offset */ | ||
| 3368 | if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset) | ||
| 3369 | set_bit(R5_Insync, &dev->flags); | ||
| 3370 | } | ||
| 3371 | if (!test_bit(R5_Insync, &dev->flags)) { | ||
| 3286 | /* The ReadError flag will just be confusing now */ | 3372 | /* The ReadError flag will just be confusing now */ |
| 3287 | clear_bit(R5_ReadError, &dev->flags); | 3373 | clear_bit(R5_ReadError, &dev->flags); |
| 3288 | clear_bit(R5_ReWrite, &dev->flags); | 3374 | clear_bit(R5_ReWrite, &dev->flags); |
| 3289 | } | 3375 | } |
| 3290 | if (!rdev || !test_bit(In_sync, &rdev->flags) | 3376 | if (test_bit(R5_ReadError, &dev->flags)) |
| 3291 | || test_bit(R5_ReadError, &dev->flags)) { | 3377 | clear_bit(R5_Insync, &dev->flags); |
| 3378 | if (!test_bit(R5_Insync, &dev->flags)) { | ||
| 3292 | if (s.failed < 2) | 3379 | if (s.failed < 2) |
| 3293 | r6s.failed_num[s.failed] = i; | 3380 | r6s.failed_num[s.failed] = i; |
| 3294 | s.failed++; | 3381 | s.failed++; |
| 3295 | } else | 3382 | } |
| 3296 | set_bit(R5_Insync, &dev->flags); | ||
| 3297 | } | 3383 | } |
| 3298 | rcu_read_unlock(); | 3384 | rcu_read_unlock(); |
| 3299 | 3385 | ||
| @@ -4971,8 +5057,10 @@ static int run(mddev_t *mddev) | |||
| 4971 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 5057 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 4972 | if (rdev->raid_disk < 0) | 5058 | if (rdev->raid_disk < 0) |
| 4973 | continue; | 5059 | continue; |
| 4974 | if (test_bit(In_sync, &rdev->flags)) | 5060 | if (test_bit(In_sync, &rdev->flags)) { |
| 4975 | working_disks++; | 5061 | working_disks++; |
| 5062 | continue; | ||
| 5063 | } | ||
| 4976 | /* This disc is not fully in-sync. However if it | 5064 | /* This disc is not fully in-sync. However if it |
| 4977 | * just stored parity (beyond the recovery_offset), | 5065 | * just stored parity (beyond the recovery_offset), |
| 4978 | * when we don't need to be concerned about the | 5066 | * when we don't need to be concerned about the |
| @@ -5005,7 +5093,7 @@ static int run(mddev_t *mddev) | |||
| 5005 | mddev->degraded = (max(conf->raid_disks, conf->previous_raid_disks) | 5093 | mddev->degraded = (max(conf->raid_disks, conf->previous_raid_disks) |
| 5006 | - working_disks); | 5094 | - working_disks); |
| 5007 | 5095 | ||
| 5008 | if (mddev->degraded > conf->max_degraded) { | 5096 | if (has_failed(conf)) { |
| 5009 | printk(KERN_ERR "md/raid:%s: not enough operational devices" | 5097 | printk(KERN_ERR "md/raid:%s: not enough operational devices" |
| 5010 | " (%d/%d failed)\n", | 5098 | " (%d/%d failed)\n", |
| 5011 | mdname(mddev), mddev->degraded, conf->raid_disks); | 5099 | mdname(mddev), mddev->degraded, conf->raid_disks); |
| @@ -5207,6 +5295,7 @@ static int raid5_spare_active(mddev_t *mddev) | |||
| 5207 | for (i = 0; i < conf->raid_disks; i++) { | 5295 | for (i = 0; i < conf->raid_disks; i++) { |
| 5208 | tmp = conf->disks + i; | 5296 | tmp = conf->disks + i; |
| 5209 | if (tmp->rdev | 5297 | if (tmp->rdev |
| 5298 | && tmp->rdev->recovery_offset == MaxSector | ||
| 5210 | && !test_bit(Faulty, &tmp->rdev->flags) | 5299 | && !test_bit(Faulty, &tmp->rdev->flags) |
| 5211 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { | 5300 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
| 5212 | unsigned long flags; | 5301 | unsigned long flags; |
| @@ -5242,7 +5331,7 @@ static int raid5_remove_disk(mddev_t *mddev, int number) | |||
| 5242 | * isn't possible. | 5331 | * isn't possible. |
| 5243 | */ | 5332 | */ |
| 5244 | if (!test_bit(Faulty, &rdev->flags) && | 5333 | if (!test_bit(Faulty, &rdev->flags) && |
| 5245 | mddev->degraded <= conf->max_degraded && | 5334 | !has_failed(conf) && |
| 5246 | number < conf->raid_disks) { | 5335 | number < conf->raid_disks) { |
| 5247 | err = -EBUSY; | 5336 | err = -EBUSY; |
| 5248 | goto abort; | 5337 | goto abort; |
| @@ -5270,7 +5359,7 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 5270 | int first = 0; | 5359 | int first = 0; |
| 5271 | int last = conf->raid_disks - 1; | 5360 | int last = conf->raid_disks - 1; |
| 5272 | 5361 | ||
| 5273 | if (mddev->degraded > conf->max_degraded) | 5362 | if (has_failed(conf)) |
| 5274 | /* no point adding a device */ | 5363 | /* no point adding a device */ |
| 5275 | return -EINVAL; | 5364 | return -EINVAL; |
| 5276 | 5365 | ||
| @@ -5362,7 +5451,7 @@ static int check_reshape(mddev_t *mddev) | |||
| 5362 | if (mddev->bitmap) | 5451 | if (mddev->bitmap) |
| 5363 | /* Cannot grow a bitmap yet */ | 5452 | /* Cannot grow a bitmap yet */ |
| 5364 | return -EBUSY; | 5453 | return -EBUSY; |
| 5365 | if (mddev->degraded > conf->max_degraded) | 5454 | if (has_failed(conf)) |
| 5366 | return -EINVAL; | 5455 | return -EINVAL; |
| 5367 | if (mddev->delta_disks < 0) { | 5456 | if (mddev->delta_disks < 0) { |
| 5368 | /* We might be able to shrink, but the devices must | 5457 | /* We might be able to shrink, but the devices must |
| @@ -5437,8 +5526,13 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
| 5437 | 5526 | ||
| 5438 | /* Add some new drives, as many as will fit. | 5527 | /* Add some new drives, as many as will fit. |
| 5439 | * We know there are enough to make the newly sized array work. | 5528 | * We know there are enough to make the newly sized array work. |
| 5529 | * Don't add devices if we are reducing the number of | ||
| 5530 | * devices in the array. This is because it is not possible | ||
| 5531 | * to correctly record the "partially reconstructed" state of | ||
| 5532 | * such devices during the reshape and confusion could result. | ||
| 5440 | */ | 5533 | */ |
| 5441 | list_for_each_entry(rdev, &mddev->disks, same_set) | 5534 | if (mddev->delta_disks >= 0) |
| 5535 | list_for_each_entry(rdev, &mddev->disks, same_set) | ||
| 5442 | if (rdev->raid_disk < 0 && | 5536 | if (rdev->raid_disk < 0 && |
| 5443 | !test_bit(Faulty, &rdev->flags)) { | 5537 | !test_bit(Faulty, &rdev->flags)) { |
| 5444 | if (raid5_add_disk(mddev, rdev) == 0) { | 5538 | if (raid5_add_disk(mddev, rdev) == 0) { |
| @@ -5460,7 +5554,7 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
| 5460 | } | 5554 | } |
| 5461 | 5555 | ||
| 5462 | /* When a reshape changes the number of devices, ->degraded | 5556 | /* When a reshape changes the number of devices, ->degraded |
| 5463 | * is measured against the large of the pre and post number of | 5557 | * is measured against the larger of the pre and post number of |
| 5464 | * devices.*/ | 5558 | * devices.*/ |
| 5465 | if (mddev->delta_disks > 0) { | 5559 | if (mddev->delta_disks > 0) { |
| 5466 | spin_lock_irqsave(&conf->device_lock, flags); | 5560 | spin_lock_irqsave(&conf->device_lock, flags); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 2decc597bda7..ce2fcdd4ab90 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -2754,6 +2754,7 @@ config MYRI10GE_DCA | |||
| 2754 | config NETXEN_NIC | 2754 | config NETXEN_NIC |
| 2755 | tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC" | 2755 | tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC" |
| 2756 | depends on PCI | 2756 | depends on PCI |
| 2757 | select FW_LOADER | ||
| 2757 | help | 2758 | help |
| 2758 | This enables the support for NetXen's Gigabit Ethernet card. | 2759 | This enables the support for NetXen's Gigabit Ethernet card. |
| 2759 | 2760 | ||
| @@ -2819,6 +2820,7 @@ config BNX2X | |||
| 2819 | config QLCNIC | 2820 | config QLCNIC |
| 2820 | tristate "QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support" | 2821 | tristate "QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support" |
| 2821 | depends on PCI | 2822 | depends on PCI |
| 2823 | select FW_LOADER | ||
| 2822 | help | 2824 | help |
| 2823 | This driver supports QLogic QLE8240 and QLE8242 Converged Ethernet | 2825 | This driver supports QLogic QLE8240 and QLE8242 Converged Ethernet |
| 2824 | devices. | 2826 | devices. |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 949d7a9dcf92..117432222a09 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -3073,7 +3073,6 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
| 3073 | u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; | 3073 | u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; |
| 3074 | struct l2_fhdr *rx_hdr; | 3074 | struct l2_fhdr *rx_hdr; |
| 3075 | int rx_pkt = 0, pg_ring_used = 0; | 3075 | int rx_pkt = 0, pg_ring_used = 0; |
| 3076 | struct pci_dev *pdev = bp->pdev; | ||
| 3077 | 3076 | ||
| 3078 | hw_cons = bnx2_get_hw_rx_cons(bnapi); | 3077 | hw_cons = bnx2_get_hw_rx_cons(bnapi); |
| 3079 | sw_cons = rxr->rx_cons; | 3078 | sw_cons = rxr->rx_cons; |
| @@ -3099,12 +3098,10 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
| 3099 | skb = rx_buf->skb; | 3098 | skb = rx_buf->skb; |
| 3100 | prefetchw(skb); | 3099 | prefetchw(skb); |
| 3101 | 3100 | ||
| 3102 | if (!get_dma_ops(&pdev->dev)->sync_single_for_cpu) { | 3101 | next_rx_buf = |
| 3103 | next_rx_buf = | 3102 | &rxr->rx_buf_ring[RX_RING_IDX(NEXT_RX_BD(sw_cons))]; |
| 3104 | &rxr->rx_buf_ring[ | 3103 | prefetch(next_rx_buf->desc); |
| 3105 | RX_RING_IDX(NEXT_RX_BD(sw_cons))]; | 3104 | |
| 3106 | prefetch(next_rx_buf->desc); | ||
| 3107 | } | ||
| 3108 | rx_buf->skb = NULL; | 3105 | rx_buf->skb = NULL; |
| 3109 | 3106 | ||
| 3110 | dma_addr = dma_unmap_addr(rx_buf, mapping); | 3107 | dma_addr = dma_unmap_addr(rx_buf, mapping); |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index fe925663d39a..80471269977a 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
| @@ -3919,8 +3919,9 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev) | |||
| 3919 | HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS; | 3919 | HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS; |
| 3920 | context->cstorm_st_context.status_block_id = BNX2X_DEF_SB_ID; | 3920 | context->cstorm_st_context.status_block_id = BNX2X_DEF_SB_ID; |
| 3921 | 3921 | ||
| 3922 | context->xstorm_st_context.statistics_data = (cli | | 3922 | if (cli < MAX_X_STAT_COUNTER_ID) |
| 3923 | XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE); | 3923 | context->xstorm_st_context.statistics_data = cli | |
| 3924 | XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE; | ||
| 3924 | 3925 | ||
| 3925 | context->xstorm_ag_context.cdu_reserved = | 3926 | context->xstorm_ag_context.cdu_reserved = |
| 3926 | CDU_RSRVD_VALUE_TYPE_A(BNX2X_HW_CID(BNX2X_ISCSI_L2_CID, func), | 3927 | CDU_RSRVD_VALUE_TYPE_A(BNX2X_HW_CID(BNX2X_ISCSI_L2_CID, func), |
| @@ -3928,10 +3929,12 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev) | |||
| 3928 | ETH_CONNECTION_TYPE); | 3929 | ETH_CONNECTION_TYPE); |
| 3929 | 3930 | ||
| 3930 | /* reset xstorm per client statistics */ | 3931 | /* reset xstorm per client statistics */ |
| 3931 | val = BAR_XSTRORM_INTMEM + | 3932 | if (cli < MAX_X_STAT_COUNTER_ID) { |
| 3932 | XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 3933 | val = BAR_XSTRORM_INTMEM + |
| 3933 | for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) | 3934 | XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 3934 | CNIC_WR(dev, val + i * 4, 0); | 3935 | for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) |
| 3936 | CNIC_WR(dev, val + i * 4, 0); | ||
| 3937 | } | ||
| 3935 | 3938 | ||
| 3936 | cp->tx_cons_ptr = | 3939 | cp->tx_cons_ptr = |
| 3937 | &cp->bnx2x_def_status_blk->c_def_status_block.index_values[ | 3940 | &cp->bnx2x_def_status_blk->c_def_status_block.index_values[ |
| @@ -3978,9 +3981,11 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 3978 | BNX2X_ISCSI_RX_SB_INDEX_NUM; | 3981 | BNX2X_ISCSI_RX_SB_INDEX_NUM; |
| 3979 | context->ustorm_st_context.common.clientId = cli; | 3982 | context->ustorm_st_context.common.clientId = cli; |
| 3980 | context->ustorm_st_context.common.status_block_id = BNX2X_DEF_SB_ID; | 3983 | context->ustorm_st_context.common.status_block_id = BNX2X_DEF_SB_ID; |
| 3981 | context->ustorm_st_context.common.flags = | 3984 | if (cli < MAX_U_STAT_COUNTER_ID) { |
| 3982 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS; | 3985 | context->ustorm_st_context.common.flags = |
| 3983 | context->ustorm_st_context.common.statistics_counter_id = cli; | 3986 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS; |
| 3987 | context->ustorm_st_context.common.statistics_counter_id = cli; | ||
| 3988 | } | ||
| 3984 | context->ustorm_st_context.common.mc_alignment_log_size = 0; | 3989 | context->ustorm_st_context.common.mc_alignment_log_size = 0; |
| 3985 | context->ustorm_st_context.common.bd_buff_size = | 3990 | context->ustorm_st_context.common.bd_buff_size = |
| 3986 | cp->l2_single_buf_size; | 3991 | cp->l2_single_buf_size; |
| @@ -4011,10 +4016,13 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 4011 | 4016 | ||
| 4012 | /* client tstorm info */ | 4017 | /* client tstorm info */ |
| 4013 | tstorm_client.mtu = cp->l2_single_buf_size - 14; | 4018 | tstorm_client.mtu = cp->l2_single_buf_size - 14; |
| 4014 | tstorm_client.config_flags = | 4019 | tstorm_client.config_flags = TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE; |
| 4015 | (TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE | | 4020 | |
| 4016 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE); | 4021 | if (cli < MAX_T_STAT_COUNTER_ID) { |
| 4017 | tstorm_client.statistics_counter_id = cli; | 4022 | tstorm_client.config_flags |= |
| 4023 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE; | ||
| 4024 | tstorm_client.statistics_counter_id = cli; | ||
| 4025 | } | ||
| 4018 | 4026 | ||
| 4019 | CNIC_WR(dev, BAR_TSTRORM_INTMEM + | 4027 | CNIC_WR(dev, BAR_TSTRORM_INTMEM + |
| 4020 | TSTORM_CLIENT_CONFIG_OFFSET(port, cli), | 4028 | TSTORM_CLIENT_CONFIG_OFFSET(port, cli), |
| @@ -4024,16 +4032,21 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 4024 | ((u32 *)&tstorm_client)[1]); | 4032 | ((u32 *)&tstorm_client)[1]); |
| 4025 | 4033 | ||
| 4026 | /* reset tstorm per client statistics */ | 4034 | /* reset tstorm per client statistics */ |
| 4027 | val = BAR_TSTRORM_INTMEM + | 4035 | if (cli < MAX_T_STAT_COUNTER_ID) { |
| 4028 | TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 4036 | |
| 4029 | for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) | 4037 | val = BAR_TSTRORM_INTMEM + |
| 4030 | CNIC_WR(dev, val + i * 4, 0); | 4038 | TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 4039 | for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) | ||
| 4040 | CNIC_WR(dev, val + i * 4, 0); | ||
| 4041 | } | ||
| 4031 | 4042 | ||
| 4032 | /* reset ustorm per client statistics */ | 4043 | /* reset ustorm per client statistics */ |
| 4033 | val = BAR_USTRORM_INTMEM + | 4044 | if (cli < MAX_U_STAT_COUNTER_ID) { |
| 4034 | USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 4045 | val = BAR_USTRORM_INTMEM + |
| 4035 | for (i = 0; i < sizeof(struct ustorm_per_client_stats) / 4; i++) | 4046 | USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 4036 | CNIC_WR(dev, val + i * 4, 0); | 4047 | for (i = 0; i < sizeof(struct ustorm_per_client_stats) / 4; i++) |
| 4048 | CNIC_WR(dev, val + i * 4, 0); | ||
| 4049 | } | ||
| 4037 | 4050 | ||
| 4038 | cp->rx_cons_ptr = | 4051 | cp->rx_cons_ptr = |
| 4039 | &cp->bnx2x_def_status_blk->u_def_status_block.index_values[ | 4052 | &cp->bnx2x_def_status_blk->u_def_status_block.index_values[ |
diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c index 3c58db595285..23786ee34bed 100644 --- a/drivers/net/cpmac.c +++ b/drivers/net/cpmac.c | |||
| @@ -1181,7 +1181,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1181 | if (netif_msg_drv(priv)) | 1181 | if (netif_msg_drv(priv)) |
| 1182 | printk(KERN_ERR "%s: Could not attach to PHY\n", | 1182 | printk(KERN_ERR "%s: Could not attach to PHY\n", |
| 1183 | dev->name); | 1183 | dev->name); |
| 1184 | return PTR_ERR(priv->phy); | 1184 | rc = PTR_ERR(priv->phy); |
| 1185 | goto fail; | ||
| 1185 | } | 1186 | } |
| 1186 | 1187 | ||
| 1187 | if ((rc = register_netdev(dev))) { | 1188 | if ((rc = register_netdev(dev))) { |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index ebdea0891665..68a80893dce1 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -1047,15 +1047,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 1047 | goto err_register; | 1047 | goto err_register; |
| 1048 | 1048 | ||
| 1049 | /* print bus type/speed/width info */ | 1049 | /* print bus type/speed/width info */ |
| 1050 | e_info("(PCI%s:%s:%s) ", | 1050 | e_info("(PCI%s:%dMHz:%d-bit) %pM\n", |
| 1051 | ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""), | 1051 | ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""), |
| 1052 | ((hw->bus_speed == e1000_bus_speed_133) ? "133MHz" : | 1052 | ((hw->bus_speed == e1000_bus_speed_133) ? 133 : |
| 1053 | (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" : | 1053 | (hw->bus_speed == e1000_bus_speed_120) ? 120 : |
| 1054 | (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" : | 1054 | (hw->bus_speed == e1000_bus_speed_100) ? 100 : |
| 1055 | (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"), | 1055 | (hw->bus_speed == e1000_bus_speed_66) ? 66 : 33), |
| 1056 | ((hw->bus_width == e1000_bus_width_64) ? "64-bit" : "32-bit")); | 1056 | ((hw->bus_width == e1000_bus_width_64) ? 64 : 32), |
| 1057 | 1057 | netdev->dev_addr); | |
| 1058 | e_info("%pM\n", netdev->dev_addr); | ||
| 1059 | 1058 | ||
| 1060 | /* carrier off reporting is important to ethtool even BEFORE open */ | 1059 | /* carrier off reporting is important to ethtool even BEFORE open */ |
| 1061 | netif_carrier_off(netdev); | 1060 | netif_carrier_off(netdev); |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 0630980a2722..0060e422f171 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | 41 | ||
| 42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
| 43 | #define DRV_VERSION "EHEA_0103" | 43 | #define DRV_VERSION "EHEA_0105" |
| 44 | 44 | ||
| 45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
| 46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index f547894ff48f..8b92acb448c2 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -867,6 +867,7 @@ static int ehea_poll(struct napi_struct *napi, int budget) | |||
| 867 | ehea_reset_cq_ep(pr->send_cq); | 867 | ehea_reset_cq_ep(pr->send_cq); |
| 868 | ehea_reset_cq_n1(pr->recv_cq); | 868 | ehea_reset_cq_n1(pr->recv_cq); |
| 869 | ehea_reset_cq_n1(pr->send_cq); | 869 | ehea_reset_cq_n1(pr->send_cq); |
| 870 | rmb(); | ||
| 870 | cqe = ehea_poll_rq1(pr->qp, &wqe_index); | 871 | cqe = ehea_poll_rq1(pr->qp, &wqe_index); |
| 871 | cqe_skb = ehea_poll_cq(pr->send_cq); | 872 | cqe_skb = ehea_poll_cq(pr->send_cq); |
| 872 | 873 | ||
| @@ -2859,6 +2860,7 @@ static void ehea_reset_port(struct work_struct *work) | |||
| 2859 | container_of(work, struct ehea_port, reset_task); | 2860 | container_of(work, struct ehea_port, reset_task); |
| 2860 | struct net_device *dev = port->netdev; | 2861 | struct net_device *dev = port->netdev; |
| 2861 | 2862 | ||
| 2863 | mutex_lock(&dlpar_mem_lock); | ||
| 2862 | port->resets++; | 2864 | port->resets++; |
| 2863 | mutex_lock(&port->port_lock); | 2865 | mutex_lock(&port->port_lock); |
| 2864 | netif_stop_queue(dev); | 2866 | netif_stop_queue(dev); |
| @@ -2881,6 +2883,7 @@ static void ehea_reset_port(struct work_struct *work) | |||
| 2881 | netif_wake_queue(dev); | 2883 | netif_wake_queue(dev); |
| 2882 | out: | 2884 | out: |
| 2883 | mutex_unlock(&port->port_lock); | 2885 | mutex_unlock(&port->port_lock); |
| 2886 | mutex_unlock(&dlpar_mem_lock); | ||
| 2884 | } | 2887 | } |
| 2885 | 2888 | ||
| 2886 | static void ehea_rereg_mrs(struct work_struct *work) | 2889 | static void ehea_rereg_mrs(struct work_struct *work) |
| @@ -3542,10 +3545,7 @@ static int ehea_mem_notifier(struct notifier_block *nb, | |||
| 3542 | int ret = NOTIFY_BAD; | 3545 | int ret = NOTIFY_BAD; |
| 3543 | struct memory_notify *arg = data; | 3546 | struct memory_notify *arg = data; |
| 3544 | 3547 | ||
| 3545 | if (!mutex_trylock(&dlpar_mem_lock)) { | 3548 | mutex_lock(&dlpar_mem_lock); |
| 3546 | ehea_info("ehea_mem_notifier must not be called parallelized"); | ||
| 3547 | goto out; | ||
| 3548 | } | ||
| 3549 | 3549 | ||
| 3550 | switch (action) { | 3550 | switch (action) { |
| 3551 | case MEM_CANCEL_OFFLINE: | 3551 | case MEM_CANCEL_OFFLINE: |
| @@ -3574,7 +3574,6 @@ static int ehea_mem_notifier(struct notifier_block *nb, | |||
| 3574 | 3574 | ||
| 3575 | out_unlock: | 3575 | out_unlock: |
| 3576 | mutex_unlock(&dlpar_mem_lock); | 3576 | mutex_unlock(&dlpar_mem_lock); |
| 3577 | out: | ||
| 3578 | return ret; | 3577 | return ret; |
| 3579 | } | 3578 | } |
| 3580 | 3579 | ||
diff --git a/drivers/net/enic/vnic_dev.c b/drivers/net/enic/vnic_dev.c index 2b3e16db5c82..e0d33281ec98 100644 --- a/drivers/net/enic/vnic_dev.c +++ b/drivers/net/enic/vnic_dev.c | |||
| @@ -709,7 +709,7 @@ int vnic_dev_init_prov(struct vnic_dev *vdev, u8 *buf, u32 len) | |||
| 709 | { | 709 | { |
| 710 | u64 a0, a1 = len; | 710 | u64 a0, a1 = len; |
| 711 | int wait = 1000; | 711 | int wait = 1000; |
| 712 | u64 prov_pa; | 712 | dma_addr_t prov_pa; |
| 713 | void *prov_buf; | 713 | void *prov_buf; |
| 714 | int ret; | 714 | int ret; |
| 715 | 715 | ||
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 46c69cd06553..28b53d1cd4f1 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -381,10 +381,14 @@ static void gfar_init_mac(struct net_device *ndev) | |||
| 381 | /* Insert receive time stamps into padding alignment bytes */ | 381 | /* Insert receive time stamps into padding alignment bytes */ |
| 382 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER) { | 382 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER) { |
| 383 | rctrl &= ~RCTRL_PAL_MASK; | 383 | rctrl &= ~RCTRL_PAL_MASK; |
| 384 | rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE | RCTRL_PADDING(8); | 384 | rctrl |= RCTRL_PADDING(8); |
| 385 | priv->padding = 8; | 385 | priv->padding = 8; |
| 386 | } | 386 | } |
| 387 | 387 | ||
| 388 | /* Enable HW time stamping if requested from user space */ | ||
| 389 | if (priv->hwts_rx_en) | ||
| 390 | rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE; | ||
| 391 | |||
| 388 | /* keep vlan related bits if it's enabled */ | 392 | /* keep vlan related bits if it's enabled */ |
| 389 | if (priv->vlgrp) { | 393 | if (priv->vlgrp) { |
| 390 | rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT; | 394 | rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT; |
| @@ -747,7 +751,8 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
| 747 | FSL_GIANFAR_DEV_HAS_CSUM | | 751 | FSL_GIANFAR_DEV_HAS_CSUM | |
| 748 | FSL_GIANFAR_DEV_HAS_VLAN | | 752 | FSL_GIANFAR_DEV_HAS_VLAN | |
| 749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | | 753 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | |
| 750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; | 754 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH | |
| 755 | FSL_GIANFAR_DEV_HAS_TIMER; | ||
| 751 | 756 | ||
| 752 | ctype = of_get_property(np, "phy-connection-type", NULL); | 757 | ctype = of_get_property(np, "phy-connection-type", NULL); |
| 753 | 758 | ||
| @@ -805,12 +810,20 @@ static int gfar_hwtstamp_ioctl(struct net_device *netdev, | |||
| 805 | 810 | ||
| 806 | switch (config.rx_filter) { | 811 | switch (config.rx_filter) { |
| 807 | case HWTSTAMP_FILTER_NONE: | 812 | case HWTSTAMP_FILTER_NONE: |
| 808 | priv->hwts_rx_en = 0; | 813 | if (priv->hwts_rx_en) { |
| 814 | stop_gfar(netdev); | ||
| 815 | priv->hwts_rx_en = 0; | ||
| 816 | startup_gfar(netdev); | ||
| 817 | } | ||
| 809 | break; | 818 | break; |
| 810 | default: | 819 | default: |
| 811 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) | 820 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) |
| 812 | return -ERANGE; | 821 | return -ERANGE; |
| 813 | priv->hwts_rx_en = 1; | 822 | if (!priv->hwts_rx_en) { |
| 823 | stop_gfar(netdev); | ||
| 824 | priv->hwts_rx_en = 1; | ||
| 825 | startup_gfar(netdev); | ||
| 826 | } | ||
| 814 | config.rx_filter = HWTSTAMP_FILTER_ALL; | 827 | config.rx_filter = HWTSTAMP_FILTER_ALL; |
| 815 | break; | 828 | break; |
| 816 | } | 829 | } |
| @@ -2642,6 +2655,10 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit) | |||
| 2642 | dma_unmap_single(&priv->ofdev->dev, bdp->bufPtr, | 2655 | dma_unmap_single(&priv->ofdev->dev, bdp->bufPtr, |
| 2643 | priv->rx_buffer_size, DMA_FROM_DEVICE); | 2656 | priv->rx_buffer_size, DMA_FROM_DEVICE); |
| 2644 | 2657 | ||
| 2658 | if (unlikely(!(bdp->status & RXBD_ERR) && | ||
| 2659 | bdp->length > priv->rx_buffer_size)) | ||
| 2660 | bdp->status = RXBD_LARGE; | ||
| 2661 | |||
| 2645 | /* We drop the frame if we failed to allocate a new buffer */ | 2662 | /* We drop the frame if we failed to allocate a new buffer */ |
| 2646 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || | 2663 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || |
| 2647 | bdp->status & RXBD_ERR)) { | 2664 | bdp->status & RXBD_ERR)) { |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index c50a7541ffec..3a93a81872b8 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
| @@ -2077,25 +2077,6 @@ static int ixgbe_get_coalesce(struct net_device *netdev, | |||
| 2077 | return 0; | 2077 | return 0; |
| 2078 | } | 2078 | } |
| 2079 | 2079 | ||
| 2080 | /* | ||
| 2081 | * this function must be called before setting the new value of | ||
| 2082 | * rx_itr_setting | ||
| 2083 | */ | ||
| 2084 | static bool ixgbe_reenable_rsc(struct ixgbe_adapter *adapter, | ||
| 2085 | struct ethtool_coalesce *ec) | ||
| 2086 | { | ||
| 2087 | /* check the old value and enable RSC if necessary */ | ||
| 2088 | if ((adapter->rx_itr_setting == 0) && | ||
| 2089 | (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)) { | ||
| 2090 | adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; | ||
| 2091 | adapter->netdev->features |= NETIF_F_LRO; | ||
| 2092 | DPRINTK(PROBE, INFO, "rx-usecs set to %d, re-enabling RSC\n", | ||
| 2093 | ec->rx_coalesce_usecs); | ||
| 2094 | return true; | ||
| 2095 | } | ||
| 2096 | return false; | ||
| 2097 | } | ||
| 2098 | |||
| 2099 | static int ixgbe_set_coalesce(struct net_device *netdev, | 2080 | static int ixgbe_set_coalesce(struct net_device *netdev, |
| 2100 | struct ethtool_coalesce *ec) | 2081 | struct ethtool_coalesce *ec) |
| 2101 | { | 2082 | { |
| @@ -2124,9 +2105,6 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2124 | (1000000/ec->rx_coalesce_usecs < IXGBE_MIN_INT_RATE)) | 2105 | (1000000/ec->rx_coalesce_usecs < IXGBE_MIN_INT_RATE)) |
| 2125 | return -EINVAL; | 2106 | return -EINVAL; |
| 2126 | 2107 | ||
| 2127 | /* check the old value and enable RSC if necessary */ | ||
| 2128 | need_reset = ixgbe_reenable_rsc(adapter, ec); | ||
| 2129 | |||
| 2130 | /* store the value in ints/second */ | 2108 | /* store the value in ints/second */ |
| 2131 | adapter->rx_eitr_param = 1000000/ec->rx_coalesce_usecs; | 2109 | adapter->rx_eitr_param = 1000000/ec->rx_coalesce_usecs; |
| 2132 | 2110 | ||
| @@ -2135,9 +2113,6 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2135 | /* clear the lower bit as its used for dynamic state */ | 2113 | /* clear the lower bit as its used for dynamic state */ |
| 2136 | adapter->rx_itr_setting &= ~1; | 2114 | adapter->rx_itr_setting &= ~1; |
| 2137 | } else if (ec->rx_coalesce_usecs == 1) { | 2115 | } else if (ec->rx_coalesce_usecs == 1) { |
| 2138 | /* check the old value and enable RSC if necessary */ | ||
| 2139 | need_reset = ixgbe_reenable_rsc(adapter, ec); | ||
| 2140 | |||
| 2141 | /* 1 means dynamic mode */ | 2116 | /* 1 means dynamic mode */ |
| 2142 | adapter->rx_eitr_param = 20000; | 2117 | adapter->rx_eitr_param = 20000; |
| 2143 | adapter->rx_itr_setting = 1; | 2118 | adapter->rx_itr_setting = 1; |
| @@ -2157,10 +2132,11 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2157 | */ | 2132 | */ |
| 2158 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { | 2133 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 2159 | adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; | 2134 | adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; |
| 2160 | netdev->features &= ~NETIF_F_LRO; | 2135 | if (netdev->features & NETIF_F_LRO) { |
| 2161 | DPRINTK(PROBE, INFO, | 2136 | netdev->features &= ~NETIF_F_LRO; |
| 2162 | "rx-usecs set to 0, disabling RSC\n"); | 2137 | DPRINTK(PROBE, INFO, "rx-usecs set to 0, " |
| 2163 | 2138 | "disabling LRO/RSC\n"); | |
| 2139 | } | ||
| 2164 | need_reset = true; | 2140 | need_reset = true; |
| 2165 | } | 2141 | } |
| 2166 | } | 2142 | } |
| @@ -2255,6 +2231,9 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data) | |||
| 2255 | } | 2231 | } |
| 2256 | } else if (!adapter->rx_itr_setting) { | 2232 | } else if (!adapter->rx_itr_setting) { |
| 2257 | netdev->features &= ~ETH_FLAG_LRO; | 2233 | netdev->features &= ~ETH_FLAG_LRO; |
| 2234 | if (data & ETH_FLAG_LRO) | ||
| 2235 | DPRINTK(PROBE, INFO, "rx-usecs set to 0, " | ||
| 2236 | "LRO/RSC cannot be enabled.\n"); | ||
| 2258 | } | 2237 | } |
| 2259 | } | 2238 | } |
| 2260 | 2239 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index b2af2f67f604..ce30c62a97f7 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -5282,6 +5282,10 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) | |||
| 5282 | u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot; | 5282 | u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot; |
| 5283 | u64 non_eop_descs = 0, restart_queue = 0; | 5283 | u64 non_eop_descs = 0, restart_queue = 0; |
| 5284 | 5284 | ||
| 5285 | if (test_bit(__IXGBE_DOWN, &adapter->state) || | ||
| 5286 | test_bit(__IXGBE_RESETTING, &adapter->state)) | ||
| 5287 | return; | ||
| 5288 | |||
| 5285 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { | 5289 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 5286 | u64 rsc_count = 0; | 5290 | u64 rsc_count = 0; |
| 5287 | u64 rsc_flush = 0; | 5291 | u64 rsc_flush = 0; |
diff --git a/drivers/net/ixgbe/ixgbe_phy.c b/drivers/net/ixgbe/ixgbe_phy.c index 09e1911ff510..48325a5beff2 100644 --- a/drivers/net/ixgbe/ixgbe_phy.c +++ b/drivers/net/ixgbe/ixgbe_phy.c | |||
| @@ -575,6 +575,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) | |||
| 575 | * 4 SFP_DA_CORE1 - 82599-specific | 575 | * 4 SFP_DA_CORE1 - 82599-specific |
| 576 | * 5 SFP_SR/LR_CORE0 - 82599-specific | 576 | * 5 SFP_SR/LR_CORE0 - 82599-specific |
| 577 | * 6 SFP_SR/LR_CORE1 - 82599-specific | 577 | * 6 SFP_SR/LR_CORE1 - 82599-specific |
| 578 | * 7 SFP_act_lmt_DA_CORE0 - 82599-specific | ||
| 579 | * 8 SFP_act_lmt_DA_CORE1 - 82599-specific | ||
| 578 | */ | 580 | */ |
| 579 | if (hw->mac.type == ixgbe_mac_82598EB) { | 581 | if (hw->mac.type == ixgbe_mac_82598EB) { |
| 580 | if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) | 582 | if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) |
diff --git a/drivers/net/lib82596.c b/drivers/net/lib82596.c index ce5d6e909218..c27f4291b350 100644 --- a/drivers/net/lib82596.c +++ b/drivers/net/lib82596.c | |||
| @@ -1343,7 +1343,7 @@ static void set_multicast_list(struct net_device *dev) | |||
| 1343 | DEB(DEB_MULTI, | 1343 | DEB(DEB_MULTI, |
| 1344 | printk(KERN_DEBUG | 1344 | printk(KERN_DEBUG |
| 1345 | "%s: set multicast list, %d entries, promisc %s, allmulti %s\n", | 1345 | "%s: set multicast list, %d entries, promisc %s, allmulti %s\n", |
| 1346 | dev->name, dev->mc_count, | 1346 | dev->name, netdev_mc_count(dev), |
| 1347 | dev->flags & IFF_PROMISC ? "ON" : "OFF", | 1347 | dev->flags & IFF_PROMISC ? "ON" : "OFF", |
| 1348 | dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); | 1348 | dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); |
| 1349 | 1349 | ||
diff --git a/drivers/net/mipsnet.c b/drivers/net/mipsnet.c index 8e9704f5c122..869f0ea43a5b 100644 --- a/drivers/net/mipsnet.c +++ b/drivers/net/mipsnet.c | |||
| @@ -247,7 +247,7 @@ static const struct net_device_ops mipsnet_netdev_ops = { | |||
| 247 | .ndo_set_mac_address = eth_mac_addr, | 247 | .ndo_set_mac_address = eth_mac_addr, |
| 248 | }; | 248 | }; |
| 249 | 249 | ||
| 250 | static int __init mipsnet_probe(struct platform_device *dev) | 250 | static int __devinit mipsnet_probe(struct platform_device *dev) |
| 251 | { | 251 | { |
| 252 | struct net_device *netdev; | 252 | struct net_device *netdev; |
| 253 | int err; | 253 | int err; |
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c index f26e54716c88..3a41b6a84a68 100644 --- a/drivers/net/netxen/netxen_nic_ctx.c +++ b/drivers/net/netxen/netxen_nic_ctx.c | |||
| @@ -629,7 +629,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) | |||
| 629 | if (addr == NULL) { | 629 | if (addr == NULL) { |
| 630 | dev_err(&pdev->dev, "%s: failed to allocate tx desc ring\n", | 630 | dev_err(&pdev->dev, "%s: failed to allocate tx desc ring\n", |
| 631 | netdev->name); | 631 | netdev->name); |
| 632 | return -ENOMEM; | 632 | err = -ENOMEM; |
| 633 | goto err_out_free; | ||
| 633 | } | 634 | } |
| 634 | 635 | ||
| 635 | tx_ring->desc_head = (struct cmd_desc_type0 *)addr; | 636 | tx_ring->desc_head = (struct cmd_desc_type0 *)addr; |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 5c496f8d7c49..29d7b93d0493 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -1159,9 +1159,6 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong off) | |||
| 1159 | 1159 | ||
| 1160 | window = CRB_HI(off); | 1160 | window = CRB_HI(off); |
| 1161 | 1161 | ||
| 1162 | if (adapter->ahw.crb_win == window) | ||
| 1163 | return; | ||
| 1164 | |||
| 1165 | writel(window, addr); | 1162 | writel(window, addr); |
| 1166 | if (readl(addr) != window) { | 1163 | if (readl(addr) != window) { |
| 1167 | if (printk_ratelimit()) | 1164 | if (printk_ratelimit()) |
| @@ -1169,7 +1166,6 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong off) | |||
| 1169 | "failed to set CRB window to %d off 0x%lx\n", | 1166 | "failed to set CRB window to %d off 0x%lx\n", |
| 1170 | window, off); | 1167 | window, off); |
| 1171 | } | 1168 | } |
| 1172 | adapter->ahw.crb_win = window; | ||
| 1173 | } | 1169 | } |
| 1174 | 1170 | ||
| 1175 | static void __iomem * | 1171 | static void __iomem * |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 045a7c8f5bdf..c865dda2adf1 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -218,7 +218,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | |||
| 218 | if (cmd_buf_arr == NULL) { | 218 | if (cmd_buf_arr == NULL) { |
| 219 | dev_err(&pdev->dev, "%s: failed to allocate cmd buffer ring\n", | 219 | dev_err(&pdev->dev, "%s: failed to allocate cmd buffer ring\n", |
| 220 | netdev->name); | 220 | netdev->name); |
| 221 | return -ENOMEM; | 221 | goto err_out; |
| 222 | } | 222 | } |
| 223 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); | 223 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); |
| 224 | tx_ring->cmd_buf_arr = cmd_buf_arr; | 224 | tx_ring->cmd_buf_arr = cmd_buf_arr; |
| @@ -230,7 +230,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | |||
| 230 | if (rds_ring == NULL) { | 230 | if (rds_ring == NULL) { |
| 231 | dev_err(&pdev->dev, "%s: failed to allocate rds ring struct\n", | 231 | dev_err(&pdev->dev, "%s: failed to allocate rds ring struct\n", |
| 232 | netdev->name); | 232 | netdev->name); |
| 233 | return -ENOMEM; | 233 | goto err_out; |
| 234 | } | 234 | } |
| 235 | recv_ctx->rds_rings = rds_ring; | 235 | recv_ctx->rds_rings = rds_ring; |
| 236 | 236 | ||
| @@ -1805,9 +1805,10 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1805 | netxen_ctx_msg msg = 0; | 1805 | netxen_ctx_msg msg = 0; |
| 1806 | struct list_head *head; | 1806 | struct list_head *head; |
| 1807 | 1807 | ||
| 1808 | spin_lock(&rds_ring->lock); | ||
| 1809 | |||
| 1808 | producer = rds_ring->producer; | 1810 | producer = rds_ring->producer; |
| 1809 | 1811 | ||
| 1810 | spin_lock(&rds_ring->lock); | ||
| 1811 | head = &rds_ring->free_list; | 1812 | head = &rds_ring->free_list; |
| 1812 | while (!list_empty(head)) { | 1813 | while (!list_empty(head)) { |
| 1813 | 1814 | ||
| @@ -1829,7 +1830,6 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1829 | 1830 | ||
| 1830 | producer = get_next_index(producer, rds_ring->num_desc); | 1831 | producer = get_next_index(producer, rds_ring->num_desc); |
| 1831 | } | 1832 | } |
| 1832 | spin_unlock(&rds_ring->lock); | ||
| 1833 | 1833 | ||
| 1834 | if (count) { | 1834 | if (count) { |
| 1835 | rds_ring->producer = producer; | 1835 | rds_ring->producer = producer; |
| @@ -1853,6 +1853,8 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); | 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); |
| 1854 | } | 1854 | } |
| 1855 | } | 1855 | } |
| 1856 | |||
| 1857 | spin_unlock(&rds_ring->lock); | ||
| 1856 | } | 1858 | } |
| 1857 | 1859 | ||
| 1858 | static void | 1860 | static void |
| @@ -1864,10 +1866,11 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, | |||
| 1864 | int producer, count = 0; | 1866 | int producer, count = 0; |
| 1865 | struct list_head *head; | 1867 | struct list_head *head; |
| 1866 | 1868 | ||
| 1867 | producer = rds_ring->producer; | ||
| 1868 | if (!spin_trylock(&rds_ring->lock)) | 1869 | if (!spin_trylock(&rds_ring->lock)) |
| 1869 | return; | 1870 | return; |
| 1870 | 1871 | ||
| 1872 | producer = rds_ring->producer; | ||
| 1873 | |||
| 1871 | head = &rds_ring->free_list; | 1874 | head = &rds_ring->free_list; |
| 1872 | while (!list_empty(head)) { | 1875 | while (!list_empty(head)) { |
| 1873 | 1876 | ||
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 6f77a768ba88..bfdef72c5d5e 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -1727,6 +1727,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1727 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 1727 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 1728 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 1728 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 1729 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 1729 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 1730 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"), | ||
| 1730 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 1731 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 1731 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 1732 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 1732 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), | 1733 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 64e6a84bbbbe..307cd1721e91 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
| @@ -1505,12 +1505,20 @@ irq_done: | |||
| 1505 | writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR); | 1505 | writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR); |
| 1506 | writeb(cor, smc->base + MOT_LAN + CISREG_COR); | 1506 | writeb(cor, smc->base + MOT_LAN + CISREG_COR); |
| 1507 | } | 1507 | } |
| 1508 | #ifdef DOES_NOT_WORK | 1508 | |
| 1509 | if (smc->base != NULL) { /* Megahertz MFC's */ | 1509 | if ((smc->base != NULL) && /* Megahertz MFC's */ |
| 1510 | readb(smc->base+MEGAHERTZ_ISR); | 1510 | (smc->manfid == MANFID_MEGAHERTZ) && |
| 1511 | readb(smc->base+MEGAHERTZ_ISR); | 1511 | (smc->cardid == PRODID_MEGAHERTZ_EM3288)) { |
| 1512 | |||
| 1513 | u_char tmp; | ||
| 1514 | tmp = readb(smc->base+MEGAHERTZ_ISR); | ||
| 1515 | tmp = readb(smc->base+MEGAHERTZ_ISR); | ||
| 1516 | |||
| 1517 | /* Retrigger interrupt if needed */ | ||
| 1518 | writeb(tmp, smc->base + MEGAHERTZ_ISR); | ||
| 1519 | writeb(tmp, smc->base + MEGAHERTZ_ISR); | ||
| 1512 | } | 1520 | } |
| 1513 | #endif | 1521 | |
| 1514 | spin_unlock(&smc->lock); | 1522 | spin_unlock(&smc->lock); |
| 1515 | return IRQ_RETVAL(handled); | 1523 | return IRQ_RETVAL(handled); |
| 1516 | } | 1524 | } |
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index dbd003453737..29c39ff85de5 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c | |||
| @@ -226,6 +226,7 @@ module_exit(lxt_exit); | |||
| 226 | static struct mdio_device_id lxt_tbl[] = { | 226 | static struct mdio_device_id lxt_tbl[] = { |
| 227 | { 0x78100000, 0xfffffff0 }, | 227 | { 0x78100000, 0xfffffff0 }, |
| 228 | { 0x001378e0, 0xfffffff0 }, | 228 | { 0x001378e0, 0xfffffff0 }, |
| 229 | { 0x00137a10, 0xfffffff0 }, | ||
| 229 | { } | 230 | { } |
| 230 | }; | 231 | }; |
| 231 | 232 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 2111c7bbf578..7985165e84fc 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -717,11 +717,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port) | |||
| 717 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 717 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); |
| 718 | } | 718 | } |
| 719 | 719 | ||
| 720 | /* Enable Rx/Tx */ | ||
| 721 | static void sky2_enable_rx_tx(struct sky2_port *sky2) | ||
| 722 | { | ||
| 723 | struct sky2_hw *hw = sky2->hw; | ||
| 724 | unsigned port = sky2->port; | ||
| 725 | u16 reg; | ||
| 726 | |||
| 727 | reg = gma_read16(hw, port, GM_GP_CTRL); | ||
| 728 | reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
| 729 | gma_write16(hw, port, GM_GP_CTRL, reg); | ||
| 730 | } | ||
| 731 | |||
| 720 | /* Force a renegotiation */ | 732 | /* Force a renegotiation */ |
| 721 | static void sky2_phy_reinit(struct sky2_port *sky2) | 733 | static void sky2_phy_reinit(struct sky2_port *sky2) |
| 722 | { | 734 | { |
| 723 | spin_lock_bh(&sky2->phy_lock); | 735 | spin_lock_bh(&sky2->phy_lock); |
| 724 | sky2_phy_init(sky2->hw, sky2->port); | 736 | sky2_phy_init(sky2->hw, sky2->port); |
| 737 | sky2_enable_rx_tx(sky2); | ||
| 725 | spin_unlock_bh(&sky2->phy_lock); | 738 | spin_unlock_bh(&sky2->phy_lock); |
| 726 | } | 739 | } |
| 727 | 740 | ||
| @@ -2040,7 +2053,6 @@ static void sky2_link_up(struct sky2_port *sky2) | |||
| 2040 | { | 2053 | { |
| 2041 | struct sky2_hw *hw = sky2->hw; | 2054 | struct sky2_hw *hw = sky2->hw; |
| 2042 | unsigned port = sky2->port; | 2055 | unsigned port = sky2->port; |
| 2043 | u16 reg; | ||
| 2044 | static const char *fc_name[] = { | 2056 | static const char *fc_name[] = { |
| 2045 | [FC_NONE] = "none", | 2057 | [FC_NONE] = "none", |
| 2046 | [FC_TX] = "tx", | 2058 | [FC_TX] = "tx", |
| @@ -2048,10 +2060,7 @@ static void sky2_link_up(struct sky2_port *sky2) | |||
| 2048 | [FC_BOTH] = "both", | 2060 | [FC_BOTH] = "both", |
| 2049 | }; | 2061 | }; |
| 2050 | 2062 | ||
| 2051 | /* enable Rx/Tx */ | 2063 | sky2_enable_rx_tx(sky2); |
| 2052 | reg = gma_read16(hw, port, GM_GP_CTRL); | ||
| 2053 | reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
| 2054 | gma_write16(hw, port, GM_GP_CTRL, reg); | ||
| 2055 | 2064 | ||
| 2056 | gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); | 2065 | gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); |
| 2057 | 2066 | ||
diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index c0e70006374e..06b552fca63d 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c | |||
| @@ -367,8 +367,8 @@ static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, }; | |||
| 367 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; | 367 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; |
| 368 | 368 | ||
| 369 | 369 | ||
| 370 | #define dr32(reg) readl(de->regs + (reg)) | 370 | #define dr32(reg) ioread32(de->regs + (reg)) |
| 371 | #define dw32(reg,val) writel((val), de->regs + (reg)) | 371 | #define dw32(reg, val) iowrite32((val), de->regs + (reg)) |
| 372 | 372 | ||
| 373 | 373 | ||
| 374 | static void de_rx_err_acct (struct de_private *de, unsigned rx_tail, | 374 | static void de_rx_err_acct (struct de_private *de, unsigned rx_tail, |
| @@ -1706,6 +1706,7 @@ static void __devinit de21040_get_mac_address (struct de_private *de) | |||
| 1706 | int value, boguscnt = 100000; | 1706 | int value, boguscnt = 100000; |
| 1707 | do { | 1707 | do { |
| 1708 | value = dr32(ROMCmd); | 1708 | value = dr32(ROMCmd); |
| 1709 | rmb(); | ||
| 1709 | } while (value < 0 && --boguscnt > 0); | 1710 | } while (value < 0 && --boguscnt > 0); |
| 1710 | de->dev->dev_addr[i] = value; | 1711 | de->dev->dev_addr[i] = value; |
| 1711 | udelay(1); | 1712 | udelay(1); |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 4a34833b85dd..807470e156af 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
| @@ -3215,6 +3215,8 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit | |||
| 3215 | __func__, __LINE__, (u32) skb); | 3215 | __func__, __LINE__, (u32) skb); |
| 3216 | if (skb) { | 3216 | if (skb) { |
| 3217 | skb->data = skb->head + NET_SKB_PAD; | 3217 | skb->data = skb->head + NET_SKB_PAD; |
| 3218 | skb->len = 0; | ||
| 3219 | skb_reset_tail_pointer(skb); | ||
| 3218 | __skb_queue_head(&ugeth->rx_recycle, skb); | 3220 | __skb_queue_head(&ugeth->rx_recycle, skb); |
| 3219 | } | 3221 | } |
| 3220 | 3222 | ||
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 0a3c41faea9c..4dd23513c5af 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
| @@ -1334,7 +1334,6 @@ static int hso_serial_open(struct tty_struct *tty, struct file *filp) | |||
| 1334 | /* check for port already opened, if not set the termios */ | 1334 | /* check for port already opened, if not set the termios */ |
| 1335 | serial->open_count++; | 1335 | serial->open_count++; |
| 1336 | if (serial->open_count == 1) { | 1336 | if (serial->open_count == 1) { |
| 1337 | tty->low_latency = 1; | ||
| 1338 | serial->rx_state = RX_IDLE; | 1337 | serial->rx_state = RX_IDLE; |
| 1339 | /* Force default termio settings */ | 1338 | /* Force default termio settings */ |
| 1340 | _hso_serial_set_termios(tty, NULL); | 1339 | _hso_serial_set_termios(tty, NULL); |
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index b504bd561362..d14e207de1df 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c | |||
| @@ -2262,7 +2262,8 @@ start: | |||
| 2262 | vxge_debug_init(VXGE_ERR, | 2262 | vxge_debug_init(VXGE_ERR, |
| 2263 | "%s: memory allocation failed", | 2263 | "%s: memory allocation failed", |
| 2264 | VXGE_DRIVER_NAME); | 2264 | VXGE_DRIVER_NAME); |
| 2265 | return -ENOMEM; | 2265 | ret = -ENOMEM; |
| 2266 | goto alloc_entries_failed; | ||
| 2266 | } | 2267 | } |
| 2267 | 2268 | ||
| 2268 | vdev->vxge_entries = | 2269 | vdev->vxge_entries = |
| @@ -2271,8 +2272,8 @@ start: | |||
| 2271 | if (!vdev->vxge_entries) { | 2272 | if (!vdev->vxge_entries) { |
| 2272 | vxge_debug_init(VXGE_ERR, "%s: memory allocation failed", | 2273 | vxge_debug_init(VXGE_ERR, "%s: memory allocation failed", |
| 2273 | VXGE_DRIVER_NAME); | 2274 | VXGE_DRIVER_NAME); |
| 2274 | kfree(vdev->entries); | 2275 | ret = -ENOMEM; |
| 2275 | return -ENOMEM; | 2276 | goto alloc_vxge_entries_failed; |
| 2276 | } | 2277 | } |
| 2277 | 2278 | ||
| 2278 | for (i = 0, j = 0; i < vdev->no_of_vpath; i++) { | 2279 | for (i = 0, j = 0; i < vdev->no_of_vpath; i++) { |
| @@ -2303,22 +2304,32 @@ start: | |||
| 2303 | vxge_debug_init(VXGE_ERR, | 2304 | vxge_debug_init(VXGE_ERR, |
| 2304 | "%s: MSI-X enable failed for %d vectors, ret: %d", | 2305 | "%s: MSI-X enable failed for %d vectors, ret: %d", |
| 2305 | VXGE_DRIVER_NAME, vdev->intr_cnt, ret); | 2306 | VXGE_DRIVER_NAME, vdev->intr_cnt, ret); |
| 2307 | if ((max_config_vpath != VXGE_USE_DEFAULT) || (ret < 3)) { | ||
| 2308 | ret = -ENODEV; | ||
| 2309 | goto enable_msix_failed; | ||
| 2310 | } | ||
| 2311 | |||
| 2306 | kfree(vdev->entries); | 2312 | kfree(vdev->entries); |
| 2307 | kfree(vdev->vxge_entries); | 2313 | kfree(vdev->vxge_entries); |
| 2308 | vdev->entries = NULL; | 2314 | vdev->entries = NULL; |
| 2309 | vdev->vxge_entries = NULL; | 2315 | vdev->vxge_entries = NULL; |
| 2310 | |||
| 2311 | if ((max_config_vpath != VXGE_USE_DEFAULT) || (ret < 3)) | ||
| 2312 | return -ENODEV; | ||
| 2313 | /* Try with less no of vector by reducing no of vpaths count */ | 2316 | /* Try with less no of vector by reducing no of vpaths count */ |
| 2314 | temp = (ret - 1)/2; | 2317 | temp = (ret - 1)/2; |
| 2315 | vxge_close_vpaths(vdev, temp); | 2318 | vxge_close_vpaths(vdev, temp); |
| 2316 | vdev->no_of_vpath = temp; | 2319 | vdev->no_of_vpath = temp; |
| 2317 | goto start; | 2320 | goto start; |
| 2318 | } else if (ret < 0) | 2321 | } else if (ret < 0) { |
| 2319 | return -ENODEV; | 2322 | ret = -ENODEV; |
| 2320 | 2323 | goto enable_msix_failed; | |
| 2324 | } | ||
| 2321 | return 0; | 2325 | return 0; |
| 2326 | |||
| 2327 | enable_msix_failed: | ||
| 2328 | kfree(vdev->vxge_entries); | ||
| 2329 | alloc_vxge_entries_failed: | ||
| 2330 | kfree(vdev->entries); | ||
| 2331 | alloc_entries_failed: | ||
| 2332 | return ret; | ||
| 2322 | } | 2333 | } |
| 2323 | 2334 | ||
| 2324 | static int vxge_enable_msix(struct vxgedev *vdev) | 2335 | static int vxge_enable_msix(struct vxgedev *vdev) |
diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c index e0c244b02f05..31c008042bfe 100644 --- a/drivers/net/wireless/ath/ath5k/attach.c +++ b/drivers/net/wireless/ath/ath5k/attach.c | |||
| @@ -126,6 +126,7 @@ int ath5k_hw_attach(struct ath5k_softc *sc) | |||
| 126 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; | 126 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; |
| 127 | ah->ah_noise_floor = -95; /* until first NF calibration is run */ | 127 | ah->ah_noise_floor = -95; /* until first NF calibration is run */ |
| 128 | sc->ani_state.ani_mode = ATH5K_ANI_MODE_AUTO; | 128 | sc->ani_state.ani_mode = ATH5K_ANI_MODE_AUTO; |
| 129 | ah->ah_current_channel = &sc->channels[0]; | ||
| 129 | 130 | ||
| 130 | /* | 131 | /* |
| 131 | * Find the mac version | 132 | * Find the mac version |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index db72461c486b..29b31a694b59 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -594,6 +594,7 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 594 | local_info_t *local; | 594 | local_info_t *local; |
| 595 | int ret = 1; | 595 | int ret = 1; |
| 596 | struct hostap_cs_priv *hw_priv; | 596 | struct hostap_cs_priv *hw_priv; |
| 597 | unsigned long flags; | ||
| 597 | 598 | ||
| 598 | PDEBUG(DEBUG_FLOW, "prism2_config()\n"); | 599 | PDEBUG(DEBUG_FLOW, "prism2_config()\n"); |
| 599 | 600 | ||
| @@ -625,9 +626,15 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 625 | local->hw_priv = hw_priv; | 626 | local->hw_priv = hw_priv; |
| 626 | hw_priv->link = link; | 627 | hw_priv->link = link; |
| 627 | 628 | ||
| 629 | /* | ||
| 630 | * Make sure the IRQ handler cannot proceed until at least | ||
| 631 | * dev->base_addr is initialized. | ||
| 632 | */ | ||
| 633 | spin_lock_irqsave(&local->irq_init_lock, flags); | ||
| 634 | |||
| 628 | ret = pcmcia_request_irq(link, prism2_interrupt); | 635 | ret = pcmcia_request_irq(link, prism2_interrupt); |
| 629 | if (ret) | 636 | if (ret) |
| 630 | goto failed; | 637 | goto failed_unlock; |
| 631 | 638 | ||
| 632 | /* | 639 | /* |
| 633 | * This actually configures the PCMCIA socket -- setting up | 640 | * This actually configures the PCMCIA socket -- setting up |
| @@ -636,11 +643,13 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 636 | */ | 643 | */ |
| 637 | ret = pcmcia_request_configuration(link, &link->conf); | 644 | ret = pcmcia_request_configuration(link, &link->conf); |
| 638 | if (ret) | 645 | if (ret) |
| 639 | goto failed; | 646 | goto failed_unlock; |
| 640 | 647 | ||
| 641 | dev->irq = link->irq; | 648 | dev->irq = link->irq; |
| 642 | dev->base_addr = link->io.BasePort1; | 649 | dev->base_addr = link->io.BasePort1; |
| 643 | 650 | ||
| 651 | spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
| 652 | |||
| 644 | /* Finally, report what we've done */ | 653 | /* Finally, report what we've done */ |
| 645 | printk(KERN_INFO "%s: index 0x%02x: ", | 654 | printk(KERN_INFO "%s: index 0x%02x: ", |
| 646 | dev_info, link->conf.ConfigIndex); | 655 | dev_info, link->conf.ConfigIndex); |
| @@ -667,6 +676,8 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 667 | 676 | ||
| 668 | return ret; | 677 | return ret; |
| 669 | 678 | ||
| 679 | failed_unlock: | ||
| 680 | spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
| 670 | failed: | 681 | failed: |
| 671 | kfree(hw_priv); | 682 | kfree(hw_priv); |
| 672 | prism2_release((u_long)link); | 683 | prism2_release((u_long)link); |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index ff9b5c882184..2f999fc94f60 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
| @@ -2621,6 +2621,18 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id) | |||
| 2621 | iface = netdev_priv(dev); | 2621 | iface = netdev_priv(dev); |
| 2622 | local = iface->local; | 2622 | local = iface->local; |
| 2623 | 2623 | ||
| 2624 | /* Detect early interrupt before driver is fully configued */ | ||
| 2625 | spin_lock(&local->irq_init_lock); | ||
| 2626 | if (!dev->base_addr) { | ||
| 2627 | if (net_ratelimit()) { | ||
| 2628 | printk(KERN_DEBUG "%s: Interrupt, but dev not configured\n", | ||
| 2629 | dev->name); | ||
| 2630 | } | ||
| 2631 | spin_unlock(&local->irq_init_lock); | ||
| 2632 | return IRQ_HANDLED; | ||
| 2633 | } | ||
| 2634 | spin_unlock(&local->irq_init_lock); | ||
| 2635 | |||
| 2624 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); | 2636 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); |
| 2625 | 2637 | ||
| 2626 | if (local->func->card_present && !local->func->card_present(local)) { | 2638 | if (local->func->card_present && !local->func->card_present(local)) { |
| @@ -3138,6 +3150,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, | |||
| 3138 | spin_lock_init(&local->cmdlock); | 3150 | spin_lock_init(&local->cmdlock); |
| 3139 | spin_lock_init(&local->baplock); | 3151 | spin_lock_init(&local->baplock); |
| 3140 | spin_lock_init(&local->lock); | 3152 | spin_lock_init(&local->lock); |
| 3153 | spin_lock_init(&local->irq_init_lock); | ||
| 3141 | mutex_init(&local->rid_bap_mtx); | 3154 | mutex_init(&local->rid_bap_mtx); |
| 3142 | 3155 | ||
| 3143 | if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES) | 3156 | if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES) |
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h index 3d238917af07..1ba33be98b25 100644 --- a/drivers/net/wireless/hostap/hostap_wlan.h +++ b/drivers/net/wireless/hostap/hostap_wlan.h | |||
| @@ -654,7 +654,7 @@ struct local_info { | |||
| 654 | rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock | 654 | rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock |
| 655 | * when removing entries from the list. | 655 | * when removing entries from the list. |
| 656 | * TX and RX paths can use read lock. */ | 656 | * TX and RX paths can use read lock. */ |
| 657 | spinlock_t cmdlock, baplock, lock; | 657 | spinlock_t cmdlock, baplock, lock, irq_init_lock; |
| 658 | struct mutex rid_bap_mtx; | 658 | struct mutex rid_bap_mtx; |
| 659 | u16 infofid; /* MAC buffer id for info frame */ | 659 | u16 infofid; /* MAC buffer id for info frame */ |
| 660 | /* txfid, intransmitfid, next_txtid, and next_alloc are protected by | 660 | /* txfid, intransmitfid, next_txtid, and next_alloc are protected by |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index a732f1094e5d..7d614c4d3c62 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
| @@ -1299,6 +1299,11 @@ void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
| 1299 | sta_id = ba_resp->sta_id; | 1299 | sta_id = ba_resp->sta_id; |
| 1300 | tid = ba_resp->tid; | 1300 | tid = ba_resp->tid; |
| 1301 | agg = &priv->stations[sta_id].tid[tid].agg; | 1301 | agg = &priv->stations[sta_id].tid[tid].agg; |
| 1302 | if (unlikely(agg->txq_id != scd_flow)) { | ||
| 1303 | IWL_ERR(priv, "BA scd_flow %d does not match txq_id %d\n", | ||
| 1304 | scd_flow, agg->txq_id); | ||
| 1305 | return; | ||
| 1306 | } | ||
| 1302 | 1307 | ||
| 1303 | /* Find index just before block-ack window */ | 1308 | /* Find index just before block-ack window */ |
| 1304 | index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); | 1309 | index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 7726e67044c0..24aff654fa9c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -3391,10 +3391,12 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3391 | int ret; | 3391 | int ret; |
| 3392 | u8 sta_id; | 3392 | u8 sta_id; |
| 3393 | 3393 | ||
| 3394 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3395 | |||
| 3396 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", | 3394 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", |
| 3397 | sta->addr); | 3395 | sta->addr); |
| 3396 | mutex_lock(&priv->mutex); | ||
| 3397 | IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n", | ||
| 3398 | sta->addr); | ||
| 3399 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3398 | 3400 | ||
| 3399 | atomic_set(&sta_priv->pending_frames, 0); | 3401 | atomic_set(&sta_priv->pending_frames, 0); |
| 3400 | if (vif->type == NL80211_IFTYPE_AP) | 3402 | if (vif->type == NL80211_IFTYPE_AP) |
| @@ -3406,6 +3408,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3406 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", | 3408 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", |
| 3407 | sta->addr, ret); | 3409 | sta->addr, ret); |
| 3408 | /* Should we return success if return code is EEXIST ? */ | 3410 | /* Should we return success if return code is EEXIST ? */ |
| 3411 | mutex_unlock(&priv->mutex); | ||
| 3409 | return ret; | 3412 | return ret; |
| 3410 | } | 3413 | } |
| 3411 | 3414 | ||
| @@ -3415,6 +3418,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3415 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", | 3418 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", |
| 3416 | sta->addr); | 3419 | sta->addr); |
| 3417 | iwl_rs_rate_init(priv, sta, sta_id); | 3420 | iwl_rs_rate_init(priv, sta, sta_id); |
| 3421 | mutex_unlock(&priv->mutex); | ||
| 3418 | 3422 | ||
| 3419 | return 0; | 3423 | return 0; |
| 3420 | } | 3424 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 5d3f51ff2f0d..386c5f96eff8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -491,6 +491,7 @@ void iwl_bg_abort_scan(struct work_struct *work) | |||
| 491 | 491 | ||
| 492 | mutex_lock(&priv->mutex); | 492 | mutex_lock(&priv->mutex); |
| 493 | 493 | ||
| 494 | cancel_delayed_work_sync(&priv->scan_check); | ||
| 494 | set_bit(STATUS_SCAN_ABORTING, &priv->status); | 495 | set_bit(STATUS_SCAN_ABORTING, &priv->status); |
| 495 | iwl_send_scan_abort(priv); | 496 | iwl_send_scan_abort(priv); |
| 496 | 497 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 83a26361a9b5..c27c13fbb1ae 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
| @@ -1373,10 +1373,14 @@ int iwl_mac_sta_remove(struct ieee80211_hw *hw, | |||
| 1373 | 1373 | ||
| 1374 | IWL_DEBUG_INFO(priv, "received request to remove station %pM\n", | 1374 | IWL_DEBUG_INFO(priv, "received request to remove station %pM\n", |
| 1375 | sta->addr); | 1375 | sta->addr); |
| 1376 | mutex_lock(&priv->mutex); | ||
| 1377 | IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n", | ||
| 1378 | sta->addr); | ||
| 1376 | ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr); | 1379 | ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr); |
| 1377 | if (ret) | 1380 | if (ret) |
| 1378 | IWL_ERR(priv, "Error removing station %pM\n", | 1381 | IWL_ERR(priv, "Error removing station %pM\n", |
| 1379 | sta->addr); | 1382 | sta->addr); |
| 1383 | mutex_unlock(&priv->mutex); | ||
| 1380 | return ret; | 1384 | return ret; |
| 1381 | } | 1385 | } |
| 1382 | EXPORT_SYMBOL(iwl_mac_sta_remove); | 1386 | EXPORT_SYMBOL(iwl_mac_sta_remove); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 6c353cacc8d6..a27872de4106 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -3437,10 +3437,13 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3437 | bool is_ap = vif->type == NL80211_IFTYPE_STATION; | 3437 | bool is_ap = vif->type == NL80211_IFTYPE_STATION; |
| 3438 | u8 sta_id; | 3438 | u8 sta_id; |
| 3439 | 3439 | ||
| 3440 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3441 | |||
| 3442 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", | 3440 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", |
| 3443 | sta->addr); | 3441 | sta->addr); |
| 3442 | mutex_lock(&priv->mutex); | ||
| 3443 | IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n", | ||
| 3444 | sta->addr); | ||
| 3445 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3446 | |||
| 3444 | 3447 | ||
| 3445 | ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap, | 3448 | ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap, |
| 3446 | &sta_id); | 3449 | &sta_id); |
| @@ -3448,6 +3451,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3448 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", | 3451 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", |
| 3449 | sta->addr, ret); | 3452 | sta->addr, ret); |
| 3450 | /* Should we return success if return code is EEXIST ? */ | 3453 | /* Should we return success if return code is EEXIST ? */ |
| 3454 | mutex_unlock(&priv->mutex); | ||
| 3451 | return ret; | 3455 | return ret; |
| 3452 | } | 3456 | } |
| 3453 | 3457 | ||
| @@ -3457,6 +3461,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3457 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", | 3461 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", |
| 3458 | sta->addr); | 3462 | sta->addr); |
| 3459 | iwl3945_rs_rate_init(priv, sta, sta_id); | 3463 | iwl3945_rs_rate_init(priv, sta, sta_id); |
| 3464 | mutex_unlock(&priv->mutex); | ||
| 3460 | 3465 | ||
| 3461 | return 0; | 3466 | return 0; |
| 3462 | } | 3467 | } |
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c index 6a04c2157f73..817fffc0de4b 100644 --- a/drivers/net/wireless/libertas_tf/main.c +++ b/drivers/net/wireless/libertas_tf/main.c | |||
| @@ -549,7 +549,7 @@ int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb) | |||
| 549 | 549 | ||
| 550 | prxpd = (struct rxpd *) skb->data; | 550 | prxpd = (struct rxpd *) skb->data; |
| 551 | 551 | ||
| 552 | stats.flag = 0; | 552 | memset(&stats, 0, sizeof(stats)); |
| 553 | if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) | 553 | if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) |
| 554 | stats.flag |= RX_FLAG_FAILED_FCS_CRC; | 554 | stats.flag |= RX_FLAG_FAILED_FCS_CRC; |
| 555 | stats.freq = priv->cur_freq; | 555 | stats.freq = priv->cur_freq; |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 07c4528f6e6b..a5ea89cde8c4 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
| @@ -41,6 +41,8 @@ static DEFINE_PCI_DEVICE_TABLE(p54p_table) = { | |||
| 41 | { PCI_DEVICE(0x1260, 0x3877) }, | 41 | { PCI_DEVICE(0x1260, 0x3877) }, |
| 42 | /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */ | 42 | /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */ |
| 43 | { PCI_DEVICE(0x1260, 0x3886) }, | 43 | { PCI_DEVICE(0x1260, 0x3886) }, |
| 44 | /* Intersil PRISM Xbow Wireless LAN adapter (Symbol AP-300) */ | ||
| 45 | { PCI_DEVICE(0x1260, 0xffff) }, | ||
| 44 | { }, | 46 | { }, |
| 45 | }; | 47 | }; |
| 46 | 48 | ||
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 796828fce34c..c9171be74564 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -340,7 +340,7 @@ int dmar_disabled = 0; | |||
| 340 | int dmar_disabled = 1; | 340 | int dmar_disabled = 1; |
| 341 | #endif /*CONFIG_DMAR_DEFAULT_ON*/ | 341 | #endif /*CONFIG_DMAR_DEFAULT_ON*/ |
| 342 | 342 | ||
| 343 | static int __initdata dmar_map_gfx = 1; | 343 | static int dmar_map_gfx = 1; |
| 344 | static int dmar_forcedac; | 344 | static int dmar_forcedac; |
| 345 | static int intel_iommu_strict; | 345 | static int intel_iommu_strict; |
| 346 | 346 | ||
| @@ -1874,14 +1874,15 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw) | |||
| 1874 | } | 1874 | } |
| 1875 | } | 1875 | } |
| 1876 | if (found) { | 1876 | if (found) { |
| 1877 | spin_unlock_irqrestore(&device_domain_lock, flags); | ||
| 1877 | free_devinfo_mem(info); | 1878 | free_devinfo_mem(info); |
| 1878 | domain_exit(domain); | 1879 | domain_exit(domain); |
| 1879 | domain = found; | 1880 | domain = found; |
| 1880 | } else { | 1881 | } else { |
| 1881 | list_add(&info->link, &domain->devices); | 1882 | list_add(&info->link, &domain->devices); |
| 1882 | list_add(&info->global, &device_domain_list); | 1883 | list_add(&info->global, &device_domain_list); |
| 1884 | spin_unlock_irqrestore(&device_domain_lock, flags); | ||
| 1883 | } | 1885 | } |
| 1884 | spin_unlock_irqrestore(&device_domain_lock, flags); | ||
| 1885 | } | 1886 | } |
| 1886 | 1887 | ||
| 1887 | found_domain: | 1888 | found_domain: |
| @@ -3603,7 +3604,8 @@ static int intel_iommu_attach_device(struct iommu_domain *domain, | |||
| 3603 | pte = dmar_domain->pgd; | 3604 | pte = dmar_domain->pgd; |
| 3604 | if (dma_pte_present(pte)) { | 3605 | if (dma_pte_present(pte)) { |
| 3605 | free_pgtable_page(dmar_domain->pgd); | 3606 | free_pgtable_page(dmar_domain->pgd); |
| 3606 | dmar_domain->pgd = (struct dma_pte *)dma_pte_addr(pte); | 3607 | dmar_domain->pgd = (struct dma_pte *) |
| 3608 | phys_to_virt(dma_pte_addr(pte)); | ||
| 3607 | } | 3609 | } |
| 3608 | dmar_domain->agaw--; | 3610 | dmar_domain->agaw--; |
| 3609 | } | 3611 | } |
| @@ -3719,6 +3721,12 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | |||
| 3719 | */ | 3721 | */ |
| 3720 | printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n"); | 3722 | printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n"); |
| 3721 | rwbf_quirk = 1; | 3723 | rwbf_quirk = 1; |
| 3724 | |||
| 3725 | /* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */ | ||
| 3726 | if (dev->revision == 0x07) { | ||
| 3727 | printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n"); | ||
| 3728 | dmar_map_gfx = 0; | ||
| 3729 | } | ||
| 3722 | } | 3730 | } |
| 3723 | 3731 | ||
| 3724 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); | 3732 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 60f30e7f1c8c..740fb4ea9669 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -2292,6 +2292,7 @@ void pci_msi_off(struct pci_dev *dev) | |||
| 2292 | pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); | 2292 | pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); |
| 2293 | } | 2293 | } |
| 2294 | } | 2294 | } |
| 2295 | EXPORT_SYMBOL_GPL(pci_msi_off); | ||
| 2295 | 2296 | ||
| 2296 | #ifndef HAVE_ARCH_PCI_SET_DMA_MAX_SEGMENT_SIZE | 2297 | #ifndef HAVE_ARCH_PCI_SET_DMA_MAX_SEGMENT_SIZE |
| 2297 | int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size) | 2298 | int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size) |
diff --git a/drivers/pci/pcie/pme/pcie_pme.c b/drivers/pci/pcie/pme/pcie_pme.c index aac285a16b62..d672a0a63816 100644 --- a/drivers/pci/pcie/pme/pcie_pme.c +++ b/drivers/pci/pcie/pme/pcie_pme.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | * being registered. Consequently, the interrupt-based PCIe PME signaling will | 34 | * being registered. Consequently, the interrupt-based PCIe PME signaling will |
| 35 | * not be used by any PCIe root ports in that case. | 35 | * not be used by any PCIe root ports in that case. |
| 36 | */ | 36 | */ |
| 37 | static bool pcie_pme_disabled; | 37 | static bool pcie_pme_disabled = true; |
| 38 | 38 | ||
| 39 | /* | 39 | /* |
| 40 | * The PCI Express Base Specification 2.0, Section 6.1.8, states the following: | 40 | * The PCI Express Base Specification 2.0, Section 6.1.8, states the following: |
| @@ -64,12 +64,19 @@ bool pcie_pme_msi_disabled; | |||
| 64 | 64 | ||
| 65 | static int __init pcie_pme_setup(char *str) | 65 | static int __init pcie_pme_setup(char *str) |
| 66 | { | 66 | { |
| 67 | if (!strcmp(str, "off")) | 67 | if (!strncmp(str, "auto", 4)) |
| 68 | pcie_pme_disabled = true; | 68 | pcie_pme_disabled = false; |
| 69 | else if (!strcmp(str, "force")) | 69 | else if (!strncmp(str, "force", 5)) |
| 70 | pcie_pme_force_enable = true; | 70 | pcie_pme_force_enable = true; |
| 71 | else if (!strcmp(str, "nomsi")) | 71 | |
| 72 | pcie_pme_msi_disabled = true; | 72 | str = strchr(str, ','); |
| 73 | if (str) { | ||
| 74 | str++; | ||
| 75 | str += strspn(str, " \t"); | ||
| 76 | if (*str && !strcmp(str, "nomsi")) | ||
| 77 | pcie_pme_msi_disabled = true; | ||
| 78 | } | ||
| 79 | |||
| 73 | return 1; | 80 | return 1; |
| 74 | } | 81 | } |
| 75 | __setup("pcie_pme=", pcie_pme_setup); | 82 | __setup("pcie_pme=", pcie_pme_setup); |
diff --git a/drivers/power/z2_battery.c b/drivers/power/z2_battery.c index 9cca465436e3..85064a9f649e 100644 --- a/drivers/power/z2_battery.c +++ b/drivers/power/z2_battery.c | |||
| @@ -9,19 +9,13 @@ | |||
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 15 | #include <linux/platform_device.h> | ||
| 16 | #include <linux/power_supply.h> | ||
| 17 | #include <linux/i2c.h> | ||
| 18 | #include <linux/spinlock.h> | ||
| 19 | #include <linux/interrupt.h> | ||
| 20 | #include <linux/gpio.h> | 13 | #include <linux/gpio.h> |
| 14 | #include <linux/i2c.h> | ||
| 21 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
| 22 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
| 23 | #include <asm/irq.h> | 17 | #include <linux/power_supply.h> |
| 24 | #include <asm/mach/irq.h> | 18 | #include <linux/slab.h> |
| 25 | #include <linux/z2_battery.h> | 19 | #include <linux/z2_battery.h> |
| 26 | 20 | ||
| 27 | #define Z2_DEFAULT_NAME "Z2" | 21 | #define Z2_DEFAULT_NAME "Z2" |
diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 92a8f6cacda9..34647fc1ee98 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/bcd.h> | 29 | #include <linux/bcd.h> |
| 30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
| 31 | #include <linux/io.h> | 31 | #include <linux/io.h> |
| 32 | #include <linux/slab.h> | ||
| 32 | 33 | ||
| 33 | /* | 34 | /* |
| 34 | * The DaVinci RTC is a simple RTC with the following | 35 | * The DaVinci RTC is a simple RTC with the following |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index de033b7ac21f..d827ce570a8c 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
| @@ -777,7 +777,7 @@ static int __devinit ds1307_probe(struct i2c_client *client, | |||
| 777 | 777 | ||
| 778 | read_rtc: | 778 | read_rtc: |
| 779 | /* read RTC registers */ | 779 | /* read RTC registers */ |
| 780 | tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf); | 780 | tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf); |
| 781 | if (tmp != 8) { | 781 | if (tmp != 8) { |
| 782 | pr_debug("read error %d\n", tmp); | 782 | pr_debug("read error %d\n", tmp); |
| 783 | err = -EIO; | 783 | err = -EIO; |
| @@ -862,7 +862,7 @@ read_rtc: | |||
| 862 | if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) | 862 | if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) |
| 863 | tmp += 12; | 863 | tmp += 12; |
| 864 | i2c_smbus_write_byte_data(client, | 864 | i2c_smbus_write_byte_data(client, |
| 865 | DS1307_REG_HOUR, | 865 | ds1307->offset + DS1307_REG_HOUR, |
| 866 | bin2bcd(tmp)); | 866 | bin2bcd(tmp)); |
| 867 | } | 867 | } |
| 868 | 868 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 9eb62a256e9a..cd6cf575902e 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
| @@ -930,6 +930,83 @@ static void cpm_uart_config_port(struct uart_port *port, int flags) | |||
| 930 | } | 930 | } |
| 931 | } | 931 | } |
| 932 | 932 | ||
| 933 | #if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_CPM_CONSOLE) | ||
| 934 | /* | ||
| 935 | * Write a string to the serial port | ||
| 936 | * Note that this is called with interrupts already disabled | ||
| 937 | */ | ||
| 938 | static void cpm_uart_early_write(struct uart_cpm_port *pinfo, | ||
| 939 | const char *string, u_int count) | ||
| 940 | { | ||
| 941 | unsigned int i; | ||
| 942 | cbd_t __iomem *bdp, *bdbase; | ||
| 943 | unsigned char *cpm_outp_addr; | ||
| 944 | |||
| 945 | /* Get the address of the host memory buffer. | ||
| 946 | */ | ||
| 947 | bdp = pinfo->tx_cur; | ||
| 948 | bdbase = pinfo->tx_bd_base; | ||
| 949 | |||
| 950 | /* | ||
| 951 | * Now, do each character. This is not as bad as it looks | ||
| 952 | * since this is a holding FIFO and not a transmitting FIFO. | ||
| 953 | * We could add the complexity of filling the entire transmit | ||
| 954 | * buffer, but we would just wait longer between accesses...... | ||
| 955 | */ | ||
| 956 | for (i = 0; i < count; i++, string++) { | ||
| 957 | /* Wait for transmitter fifo to empty. | ||
| 958 | * Ready indicates output is ready, and xmt is doing | ||
| 959 | * that, not that it is ready for us to send. | ||
| 960 | */ | ||
| 961 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 962 | ; | ||
| 963 | |||
| 964 | /* Send the character out. | ||
| 965 | * If the buffer address is in the CPM DPRAM, don't | ||
| 966 | * convert it. | ||
| 967 | */ | ||
| 968 | cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
| 969 | pinfo); | ||
| 970 | *cpm_outp_addr = *string; | ||
| 971 | |||
| 972 | out_be16(&bdp->cbd_datlen, 1); | ||
| 973 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 974 | |||
| 975 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 976 | bdp = bdbase; | ||
| 977 | else | ||
| 978 | bdp++; | ||
| 979 | |||
| 980 | /* if a LF, also do CR... */ | ||
| 981 | if (*string == 10) { | ||
| 982 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 983 | ; | ||
| 984 | |||
| 985 | cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
| 986 | pinfo); | ||
| 987 | *cpm_outp_addr = 13; | ||
| 988 | |||
| 989 | out_be16(&bdp->cbd_datlen, 1); | ||
| 990 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 991 | |||
| 992 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 993 | bdp = bdbase; | ||
| 994 | else | ||
| 995 | bdp++; | ||
| 996 | } | ||
| 997 | } | ||
| 998 | |||
| 999 | /* | ||
| 1000 | * Finally, Wait for transmitter & holding register to empty | ||
| 1001 | * and restore the IER | ||
| 1002 | */ | ||
| 1003 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1004 | ; | ||
| 1005 | |||
| 1006 | pinfo->tx_cur = bdp; | ||
| 1007 | } | ||
| 1008 | #endif | ||
| 1009 | |||
| 933 | #ifdef CONFIG_CONSOLE_POLL | 1010 | #ifdef CONFIG_CONSOLE_POLL |
| 934 | /* Serial polling routines for writing and reading from the uart while | 1011 | /* Serial polling routines for writing and reading from the uart while |
| 935 | * in an interrupt or debug context. | 1012 | * in an interrupt or debug context. |
| @@ -999,7 +1076,7 @@ static void cpm_put_poll_char(struct uart_port *port, | |||
| 999 | static char ch[2]; | 1076 | static char ch[2]; |
| 1000 | 1077 | ||
| 1001 | ch[0] = (char)c; | 1078 | ch[0] = (char)c; |
| 1002 | cpm_uart_early_write(pinfo->port.line, ch, 1); | 1079 | cpm_uart_early_write(pinfo, ch, 1); |
| 1003 | } | 1080 | } |
| 1004 | #endif /* CONFIG_CONSOLE_POLL */ | 1081 | #endif /* CONFIG_CONSOLE_POLL */ |
| 1005 | 1082 | ||
| @@ -1130,9 +1207,6 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 1130 | u_int count) | 1207 | u_int count) |
| 1131 | { | 1208 | { |
| 1132 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; | 1209 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; |
| 1133 | unsigned int i; | ||
| 1134 | cbd_t __iomem *bdp, *bdbase; | ||
| 1135 | unsigned char *cp; | ||
| 1136 | unsigned long flags; | 1210 | unsigned long flags; |
| 1137 | int nolock = oops_in_progress; | 1211 | int nolock = oops_in_progress; |
| 1138 | 1212 | ||
| @@ -1142,66 +1216,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 1142 | spin_lock_irqsave(&pinfo->port.lock, flags); | 1216 | spin_lock_irqsave(&pinfo->port.lock, flags); |
| 1143 | } | 1217 | } |
| 1144 | 1218 | ||
| 1145 | /* Get the address of the host memory buffer. | 1219 | cpm_uart_early_write(pinfo, s, count); |
| 1146 | */ | ||
| 1147 | bdp = pinfo->tx_cur; | ||
| 1148 | bdbase = pinfo->tx_bd_base; | ||
| 1149 | |||
| 1150 | /* | ||
| 1151 | * Now, do each character. This is not as bad as it looks | ||
| 1152 | * since this is a holding FIFO and not a transmitting FIFO. | ||
| 1153 | * We could add the complexity of filling the entire transmit | ||
| 1154 | * buffer, but we would just wait longer between accesses...... | ||
| 1155 | */ | ||
| 1156 | for (i = 0; i < count; i++, s++) { | ||
| 1157 | /* Wait for transmitter fifo to empty. | ||
| 1158 | * Ready indicates output is ready, and xmt is doing | ||
| 1159 | * that, not that it is ready for us to send. | ||
| 1160 | */ | ||
| 1161 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1162 | ; | ||
| 1163 | |||
| 1164 | /* Send the character out. | ||
| 1165 | * If the buffer address is in the CPM DPRAM, don't | ||
| 1166 | * convert it. | ||
| 1167 | */ | ||
| 1168 | cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
| 1169 | *cp = *s; | ||
| 1170 | |||
| 1171 | out_be16(&bdp->cbd_datlen, 1); | ||
| 1172 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 1173 | |||
| 1174 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 1175 | bdp = bdbase; | ||
| 1176 | else | ||
| 1177 | bdp++; | ||
| 1178 | |||
| 1179 | /* if a LF, also do CR... */ | ||
| 1180 | if (*s == 10) { | ||
| 1181 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1182 | ; | ||
| 1183 | |||
| 1184 | cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
| 1185 | *cp = 13; | ||
| 1186 | |||
| 1187 | out_be16(&bdp->cbd_datlen, 1); | ||
| 1188 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 1189 | |||
| 1190 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 1191 | bdp = bdbase; | ||
| 1192 | else | ||
| 1193 | bdp++; | ||
| 1194 | } | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | /* | ||
| 1198 | * Finally, Wait for transmitter & holding register to empty | ||
| 1199 | * and restore the IER | ||
| 1200 | */ | ||
| 1201 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1202 | ; | ||
| 1203 | |||
| 1204 | pinfo->tx_cur = bdp; | ||
| 1205 | 1220 | ||
| 1206 | if (unlikely(nolock)) { | 1221 | if (unlikely(nolock)) { |
| 1207 | local_irq_restore(flags); | 1222 | local_irq_restore(flags); |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 526307368f8b..ab17c08ddc03 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -821,6 +821,7 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 821 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 821 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 822 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 822 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 823 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 823 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 824 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"), | ||
| 824 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 825 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 825 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 826 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 826 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), | 827 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), |
diff --git a/drivers/staging/batman-adv/bat_sysfs.c b/drivers/staging/batman-adv/bat_sysfs.c index e2c000b80ca0..212bc21e6d68 100644 --- a/drivers/staging/batman-adv/bat_sysfs.c +++ b/drivers/staging/batman-adv/bat_sysfs.c | |||
| @@ -225,9 +225,9 @@ static struct bat_attribute *mesh_attrs[] = { | |||
| 225 | NULL, | 225 | NULL, |
| 226 | }; | 226 | }; |
| 227 | 227 | ||
| 228 | static ssize_t transtable_local_read(struct kobject *kobj, | 228 | static ssize_t transtable_local_read(struct file *filp, struct kobject *kobj, |
| 229 | struct bin_attribute *bin_attr, | 229 | struct bin_attribute *bin_attr, |
| 230 | char *buff, loff_t off, size_t count) | 230 | char *buff, loff_t off, size_t count) |
| 231 | { | 231 | { |
| 232 | struct device *dev = to_dev(kobj->parent); | 232 | struct device *dev = to_dev(kobj->parent); |
| 233 | struct net_device *net_dev = to_net_dev(dev); | 233 | struct net_device *net_dev = to_net_dev(dev); |
| @@ -235,9 +235,9 @@ static ssize_t transtable_local_read(struct kobject *kobj, | |||
| 235 | return hna_local_fill_buffer_text(net_dev, buff, count, off); | 235 | return hna_local_fill_buffer_text(net_dev, buff, count, off); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | static ssize_t transtable_global_read(struct kobject *kobj, | 238 | static ssize_t transtable_global_read(struct file *filp, struct kobject *kobj, |
| 239 | struct bin_attribute *bin_attr, | 239 | struct bin_attribute *bin_attr, |
| 240 | char *buff, loff_t off, size_t count) | 240 | char *buff, loff_t off, size_t count) |
| 241 | { | 241 | { |
| 242 | struct device *dev = to_dev(kobj->parent); | 242 | struct device *dev = to_dev(kobj->parent); |
| 243 | struct net_device *net_dev = to_net_dev(dev); | 243 | struct net_device *net_dev = to_net_dev(dev); |
| @@ -245,9 +245,9 @@ static ssize_t transtable_global_read(struct kobject *kobj, | |||
| 245 | return hna_global_fill_buffer_text(net_dev, buff, count, off); | 245 | return hna_global_fill_buffer_text(net_dev, buff, count, off); |
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | static ssize_t originators_read(struct kobject *kobj, | 248 | static ssize_t originators_read(struct file *filp, struct kobject *kobj, |
| 249 | struct bin_attribute *bin_attr, | 249 | struct bin_attribute *bin_attr, |
| 250 | char *buff, loff_t off, size_t count) | 250 | char *buff, loff_t off, size_t count) |
| 251 | { | 251 | { |
| 252 | struct device *dev = to_dev(kobj->parent); | 252 | struct device *dev = to_dev(kobj->parent); |
| 253 | struct net_device *net_dev = to_net_dev(dev); | 253 | struct net_device *net_dev = to_net_dev(dev); |
| @@ -255,9 +255,9 @@ static ssize_t originators_read(struct kobject *kobj, | |||
| 255 | return orig_fill_buffer_text(net_dev, buff, count, off); | 255 | return orig_fill_buffer_text(net_dev, buff, count, off); |
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | static ssize_t vis_data_read(struct kobject *kobj, | 258 | static ssize_t vis_data_read(struct file *filp, struct kobject *kobj, |
| 259 | struct bin_attribute *bin_attr, | 259 | struct bin_attribute *bin_attr, |
| 260 | char *buff, loff_t off, size_t count) | 260 | char *buff, loff_t off, size_t count) |
| 261 | { | 261 | { |
| 262 | struct device *dev = to_dev(kobj->parent); | 262 | struct device *dev = to_dev(kobj->parent); |
| 263 | struct net_device *net_dev = to_net_dev(dev); | 263 | struct net_device *net_dev = to_net_dev(dev); |
diff --git a/drivers/staging/batman-adv/device.c b/drivers/staging/batman-adv/device.c index 7eb6559e0315..32204b5572d0 100644 --- a/drivers/staging/batman-adv/device.c +++ b/drivers/staging/batman-adv/device.c | |||
| @@ -196,7 +196,7 @@ ssize_t bat_device_read(struct file *file, char __user *buf, size_t count, | |||
| 196 | kfree(device_packet); | 196 | kfree(device_packet); |
| 197 | 197 | ||
| 198 | if (error) | 198 | if (error) |
| 199 | return error; | 199 | return -EFAULT; |
| 200 | 200 | ||
| 201 | return sizeof(struct icmp_packet); | 201 | return sizeof(struct icmp_packet); |
| 202 | } | 202 | } |
diff --git a/drivers/staging/comedi/drivers/adl_pci9111.c b/drivers/staging/comedi/drivers/adl_pci9111.c index 36a254cd4413..39d112b708e3 100644 --- a/drivers/staging/comedi/drivers/adl_pci9111.c +++ b/drivers/staging/comedi/drivers/adl_pci9111.c | |||
| @@ -824,9 +824,12 @@ static int pci9111_ai_do_cmd(struct comedi_device *dev, | |||
| 824 | plx9050_interrupt_control(dev_private->lcr_io_base, true, true, | 824 | plx9050_interrupt_control(dev_private->lcr_io_base, true, true, |
| 825 | false, true, true); | 825 | false, true, true); |
| 826 | 826 | ||
| 827 | dev_private->scan_delay = | 827 | if (async_cmd->scan_begin_src == TRIG_TIMER) { |
| 828 | (async_cmd->scan_begin_arg / (async_cmd->convert_arg * | 828 | dev_private->scan_delay = |
| 829 | async_cmd->chanlist_len)) - 1; | 829 | (async_cmd->scan_begin_arg / |
| 830 | (async_cmd->convert_arg * | ||
| 831 | async_cmd->chanlist_len)) - 1; | ||
| 832 | } | ||
| 830 | 833 | ||
| 831 | break; | 834 | break; |
| 832 | 835 | ||
diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c b/drivers/staging/comedi/drivers/cb_pcidda.c index 81829d6fd287..c374bee25068 100644 --- a/drivers/staging/comedi/drivers/cb_pcidda.c +++ b/drivers/staging/comedi/drivers/cb_pcidda.c | |||
| @@ -52,7 +52,6 @@ Please report success/failure with other different cards to | |||
| 52 | #include "8255.h" | 52 | #include "8255.h" |
| 53 | 53 | ||
| 54 | #define PCI_VENDOR_ID_CB 0x1307 /* PCI vendor number of ComputerBoards */ | 54 | #define PCI_VENDOR_ID_CB 0x1307 /* PCI vendor number of ComputerBoards */ |
| 55 | #define N_BOARDS 10 /* Number of boards in cb_pcidda_boards */ | ||
| 56 | #define EEPROM_SIZE 128 /* number of entries in eeprom */ | 55 | #define EEPROM_SIZE 128 /* number of entries in eeprom */ |
| 57 | #define MAX_AO_CHANNELS 8 /* maximum number of ao channels for supported boards */ | 56 | #define MAX_AO_CHANNELS 8 /* maximum number of ao channels for supported boards */ |
| 58 | 57 | ||
| @@ -307,7 +306,7 @@ static int cb_pcidda_attach(struct comedi_device *dev, | |||
| 307 | continue; | 306 | continue; |
| 308 | } | 307 | } |
| 309 | } | 308 | } |
| 310 | for (index = 0; index < N_BOARDS; index++) { | 309 | for (index = 0; index < ARRAY_SIZE(cb_pcidda_boards); index++) { |
| 311 | if (cb_pcidda_boards[index].device_id == | 310 | if (cb_pcidda_boards[index].device_id == |
| 312 | pcidev->device) { | 311 | pcidev->device) { |
| 313 | goto found; | 312 | goto found; |
diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c index 3f53b4d1e4cf..12db555a3a5d 100644 --- a/drivers/staging/hv/channel_mgmt.c +++ b/drivers/staging/hv/channel_mgmt.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 26 | #include <linux/completion.h> | ||
| 26 | #include "osd.h" | 27 | #include "osd.h" |
| 27 | #include "logging.h" | 28 | #include "logging.h" |
| 28 | #include "vmbus_private.h" | 29 | #include "vmbus_private.h" |
| @@ -293,6 +294,25 @@ void FreeVmbusChannel(struct vmbus_channel *Channel) | |||
| 293 | Channel); | 294 | Channel); |
| 294 | } | 295 | } |
| 295 | 296 | ||
| 297 | |||
| 298 | DECLARE_COMPLETION(hv_channel_ready); | ||
| 299 | |||
| 300 | /* | ||
| 301 | * Count initialized channels, and ensure all channels are ready when hv_vmbus | ||
| 302 | * module loading completes. | ||
| 303 | */ | ||
| 304 | static void count_hv_channel(void) | ||
| 305 | { | ||
| 306 | static int counter; | ||
| 307 | unsigned long flags; | ||
| 308 | |||
| 309 | spin_lock_irqsave(&gVmbusConnection.channel_lock, flags); | ||
| 310 | if (++counter == MAX_MSG_TYPES) | ||
| 311 | complete(&hv_channel_ready); | ||
| 312 | spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags); | ||
| 313 | } | ||
| 314 | |||
| 315 | |||
| 296 | /* | 316 | /* |
| 297 | * VmbusChannelProcessOffer - Process the offer by creating a channel/device | 317 | * VmbusChannelProcessOffer - Process the offer by creating a channel/device |
| 298 | * associated with this offer | 318 | * associated with this offer |
| @@ -373,22 +393,21 @@ static void VmbusChannelProcessOffer(void *context) | |||
| 373 | * can cleanup properly | 393 | * can cleanup properly |
| 374 | */ | 394 | */ |
| 375 | newChannel->State = CHANNEL_OPEN_STATE; | 395 | newChannel->State = CHANNEL_OPEN_STATE; |
| 376 | cnt = 0; | ||
| 377 | 396 | ||
| 378 | while (cnt != MAX_MSG_TYPES) { | 397 | /* Open IC channels */ |
| 398 | for (cnt = 0; cnt < MAX_MSG_TYPES; cnt++) { | ||
| 379 | if (memcmp(&newChannel->OfferMsg.Offer.InterfaceType, | 399 | if (memcmp(&newChannel->OfferMsg.Offer.InterfaceType, |
| 380 | &hv_cb_utils[cnt].data, | 400 | &hv_cb_utils[cnt].data, |
| 381 | sizeof(struct hv_guid)) == 0) { | 401 | sizeof(struct hv_guid)) == 0 && |
| 402 | VmbusChannelOpen(newChannel, 2 * PAGE_SIZE, | ||
| 403 | 2 * PAGE_SIZE, NULL, 0, | ||
| 404 | hv_cb_utils[cnt].callback, | ||
| 405 | newChannel) == 0) { | ||
| 406 | hv_cb_utils[cnt].channel = newChannel; | ||
| 382 | DPRINT_INFO(VMBUS, "%s", | 407 | DPRINT_INFO(VMBUS, "%s", |
| 383 | hv_cb_utils[cnt].log_msg); | 408 | hv_cb_utils[cnt].log_msg); |
| 384 | 409 | count_hv_channel(); | |
| 385 | if (VmbusChannelOpen(newChannel, 2 * PAGE_SIZE, | ||
| 386 | 2 * PAGE_SIZE, NULL, 0, | ||
| 387 | hv_cb_utils[cnt].callback, | ||
| 388 | newChannel) == 0) | ||
| 389 | hv_cb_utils[cnt].channel = newChannel; | ||
| 390 | } | 410 | } |
| 391 | cnt++; | ||
| 392 | } | 411 | } |
| 393 | } | 412 | } |
| 394 | DPRINT_EXIT(VMBUS); | 413 | DPRINT_EXIT(VMBUS); |
diff --git a/drivers/staging/hv/hv_utils.c b/drivers/staging/hv/hv_utils.c index 8a49aafea37a..2adc9b48ca9c 100644 --- a/drivers/staging/hv/hv_utils.c +++ b/drivers/staging/hv/hv_utils.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
| 25 | #include <linux/sysctl.h> | 25 | #include <linux/sysctl.h> |
| 26 | #include <linux/reboot.h> | 26 | #include <linux/reboot.h> |
| 27 | #include <linux/dmi.h> | ||
| 28 | #include <linux/pci.h> | ||
| 27 | 29 | ||
| 28 | #include "logging.h" | 30 | #include "logging.h" |
| 29 | #include "osd.h" | 31 | #include "osd.h" |
| @@ -251,10 +253,36 @@ static void heartbeat_onchannelcallback(void *context) | |||
| 251 | DPRINT_EXIT(VMBUS); | 253 | DPRINT_EXIT(VMBUS); |
| 252 | } | 254 | } |
| 253 | 255 | ||
| 256 | static const struct pci_device_id __initconst | ||
| 257 | hv_utils_pci_table[] __maybe_unused = { | ||
| 258 | { PCI_DEVICE(0x1414, 0x5353) }, /* Hyper-V emulated VGA controller */ | ||
| 259 | { 0 } | ||
| 260 | }; | ||
| 261 | MODULE_DEVICE_TABLE(pci, hv_utils_pci_table); | ||
| 262 | |||
| 263 | |||
| 264 | static const struct dmi_system_id __initconst | ||
| 265 | hv_utils_dmi_table[] __maybe_unused = { | ||
| 266 | { | ||
| 267 | .ident = "Hyper-V", | ||
| 268 | .matches = { | ||
| 269 | DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), | ||
| 270 | DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), | ||
| 271 | DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"), | ||
| 272 | }, | ||
| 273 | }, | ||
| 274 | { }, | ||
| 275 | }; | ||
| 276 | MODULE_DEVICE_TABLE(dmi, hv_utils_dmi_table); | ||
| 277 | |||
| 278 | |||
| 254 | static int __init init_hyperv_utils(void) | 279 | static int __init init_hyperv_utils(void) |
| 255 | { | 280 | { |
| 256 | printk(KERN_INFO "Registering HyperV Utility Driver\n"); | 281 | printk(KERN_INFO "Registering HyperV Utility Driver\n"); |
| 257 | 282 | ||
| 283 | if (!dmi_check_system(hv_utils_dmi_table)) | ||
| 284 | return -ENODEV; | ||
| 285 | |||
| 258 | hv_cb_utils[HV_SHUTDOWN_MSG].channel->OnChannelCallback = | 286 | hv_cb_utils[HV_SHUTDOWN_MSG].channel->OnChannelCallback = |
| 259 | &shutdown_onchannelcallback; | 287 | &shutdown_onchannelcallback; |
| 260 | hv_cb_utils[HV_SHUTDOWN_MSG].callback = &shutdown_onchannelcallback; | 288 | hv_cb_utils[HV_SHUTDOWN_MSG].callback = &shutdown_onchannelcallback; |
diff --git a/drivers/staging/hv/vmbus.h b/drivers/staging/hv/vmbus.h index 0c6ee0f487f3..3c14b2926e00 100644 --- a/drivers/staging/hv/vmbus.h +++ b/drivers/staging/hv/vmbus.h | |||
| @@ -74,4 +74,6 @@ int vmbus_child_driver_register(struct driver_context *driver_ctx); | |||
| 74 | void vmbus_child_driver_unregister(struct driver_context *driver_ctx); | 74 | void vmbus_child_driver_unregister(struct driver_context *driver_ctx); |
| 75 | void vmbus_get_interface(struct vmbus_channel_interface *interface); | 75 | void vmbus_get_interface(struct vmbus_channel_interface *interface); |
| 76 | 76 | ||
| 77 | extern struct completion hv_channel_ready; | ||
| 78 | |||
| 77 | #endif /* _VMBUS_H_ */ | 79 | #endif /* _VMBUS_H_ */ |
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index c21731a12ca7..22c80ece6388 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
| 28 | #include <linux/dmi.h> | 28 | #include <linux/dmi.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <linux/completion.h> | ||
| 30 | #include "version_info.h" | 31 | #include "version_info.h" |
| 31 | #include "osd.h" | 32 | #include "osd.h" |
| 32 | #include "logging.h" | 33 | #include "logging.h" |
| @@ -356,6 +357,8 @@ static int vmbus_bus_init(int (*drv_init)(struct hv_driver *drv)) | |||
| 356 | 357 | ||
| 357 | vmbus_drv_obj->GetChannelOffers(); | 358 | vmbus_drv_obj->GetChannelOffers(); |
| 358 | 359 | ||
| 360 | wait_for_completion(&hv_channel_ready); | ||
| 361 | |||
| 359 | cleanup: | 362 | cleanup: |
| 360 | DPRINT_EXIT(VMBUS_DRV); | 363 | DPRINT_EXIT(VMBUS_DRV); |
| 361 | 364 | ||
diff --git a/drivers/staging/mrst-touchscreen/intel-mid-touch.c b/drivers/staging/mrst-touchscreen/intel-mid-touch.c index 1db00975a594..abba22f921be 100644 --- a/drivers/staging/mrst-touchscreen/intel-mid-touch.c +++ b/drivers/staging/mrst-touchscreen/intel-mid-touch.c | |||
| @@ -817,9 +817,9 @@ static int mrstouch_remove(struct spi_device *spi) | |||
| 817 | free_irq(mrstouchdevp->irq, mrstouchdevp); | 817 | free_irq(mrstouchdevp->irq, mrstouchdevp); |
| 818 | input_unregister_device(mrstouchdevp->input); | 818 | input_unregister_device(mrstouchdevp->input); |
| 819 | input_free_device(mrstouchdevp->input); | 819 | input_free_device(mrstouchdevp->input); |
| 820 | kfree(mrstouchdevp); | ||
| 821 | if (mrstouchdevp->pendet_thrd) | 820 | if (mrstouchdevp->pendet_thrd) |
| 822 | kthread_stop(mrstouchdevp->pendet_thrd); | 821 | kthread_stop(mrstouchdevp->pendet_thrd); |
| 822 | kfree(mrstouchdevp); | ||
| 823 | return 0; | 823 | return 0; |
| 824 | } | 824 | } |
| 825 | 825 | ||
diff --git a/drivers/staging/rt2860/usb_main_dev.c b/drivers/staging/rt2860/usb_main_dev.c index b740662d095a..674769d2b59b 100644 --- a/drivers/staging/rt2860/usb_main_dev.c +++ b/drivers/staging/rt2860/usb_main_dev.c | |||
| @@ -77,6 +77,7 @@ struct usb_device_id rtusb_usb_id[] = { | |||
| 77 | {USB_DEVICE(0x083A, 0x7522)}, /* Arcadyan */ | 77 | {USB_DEVICE(0x083A, 0x7522)}, /* Arcadyan */ |
| 78 | {USB_DEVICE(0x0CDE, 0x0022)}, /* ZCOM */ | 78 | {USB_DEVICE(0x0CDE, 0x0022)}, /* ZCOM */ |
| 79 | {USB_DEVICE(0x0586, 0x3416)}, /* Zyxel */ | 79 | {USB_DEVICE(0x0586, 0x3416)}, /* Zyxel */ |
| 80 | {USB_DEVICE(0x0586, 0x341a)}, /* Zyxel NWD-270N */ | ||
| 80 | {USB_DEVICE(0x0CDE, 0x0025)}, /* Zyxel */ | 81 | {USB_DEVICE(0x0CDE, 0x0025)}, /* Zyxel */ |
| 81 | {USB_DEVICE(0x1740, 0x9701)}, /* EnGenius */ | 82 | {USB_DEVICE(0x1740, 0x9701)}, /* EnGenius */ |
| 82 | {USB_DEVICE(0x1740, 0x9702)}, /* EnGenius */ | 83 | {USB_DEVICE(0x1740, 0x9702)}, /* EnGenius */ |
diff --git a/drivers/staging/rtl8187se/r8180_core.c b/drivers/staging/rtl8187se/r8180_core.c index dacefea78113..49ab9fa9ffa7 100644 --- a/drivers/staging/rtl8187se/r8180_core.c +++ b/drivers/staging/rtl8187se/r8180_core.c | |||
| @@ -66,8 +66,6 @@ static int hwseqnum = 0; | |||
| 66 | static int hwwep = 0; | 66 | static int hwwep = 0; |
| 67 | static int channels = 0x3fff; | 67 | static int channels = 0x3fff; |
| 68 | 68 | ||
| 69 | #define eqMacAddr(a, b) (((a)[0] == (b)[0] && (a)[1] == (b)[1] && (a)[2] == (b)[2] && (a)[3] == (b)[3] && (a)[4] == (b)[4] && (a)[5] == (b)[5]) ? 1 : 0) | ||
| 70 | #define cpMacAddr(des, src) ((des)[0] = (src)[0], (des)[1] = (src)[1], (des)[2] = (src)[2], (des)[3] = (src)[3], (des)[4] = (src)[4], (des)[5] = (src)[5]) | ||
| 71 | MODULE_LICENSE("GPL"); | 69 | MODULE_LICENSE("GPL"); |
| 72 | MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl); | 70 | MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl); |
| 73 | MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>"); | 71 | MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>"); |
diff --git a/drivers/staging/rtl8192su/r8192U_core.c b/drivers/staging/rtl8192su/r8192U_core.c index 447d6474a70c..1b6890611fb6 100644 --- a/drivers/staging/rtl8192su/r8192U_core.c +++ b/drivers/staging/rtl8192su/r8192U_core.c | |||
| @@ -112,28 +112,29 @@ u32 rt_global_debug_component = \ | |||
| 112 | #define CAM_CONTENT_COUNT 8 | 112 | #define CAM_CONTENT_COUNT 8 |
| 113 | 113 | ||
| 114 | static const struct usb_device_id rtl8192_usb_id_tbl[] = { | 114 | static const struct usb_device_id rtl8192_usb_id_tbl[] = { |
| 115 | /* Realtek */ | 115 | {USB_DEVICE(0x0bda, 0x8171)}, /* Realtek */ |
| 116 | {USB_DEVICE(0x0bda, 0x8171)}, | ||
| 117 | {USB_DEVICE(0x0bda, 0x8192)}, | ||
| 118 | {USB_DEVICE(0x0bda, 0x8709)}, | ||
| 119 | /* Corega */ | ||
| 120 | {USB_DEVICE(0x07aa, 0x0043)}, | ||
| 121 | /* Belkin */ | ||
| 122 | {USB_DEVICE(0x050d, 0x805E)}, | ||
| 123 | {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ | ||
| 124 | /* Sitecom */ | ||
| 125 | {USB_DEVICE(0x0df6, 0x0031)}, | ||
| 126 | {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ | ||
| 127 | /* EnGenius */ | ||
| 128 | {USB_DEVICE(0x1740, 0x9201)}, | ||
| 129 | /* Dlink */ | ||
| 130 | {USB_DEVICE(0x2001, 0x3301)}, | ||
| 131 | /* Zinwell */ | ||
| 132 | {USB_DEVICE(0x5a57, 0x0290)}, | ||
| 133 | /* Guillemot */ | ||
| 134 | {USB_DEVICE(0x06f8, 0xe031)}, | ||
| 135 | //92SU | ||
| 136 | {USB_DEVICE(0x0bda, 0x8172)}, | 116 | {USB_DEVICE(0x0bda, 0x8172)}, |
| 117 | {USB_DEVICE(0x0bda, 0x8173)}, | ||
| 118 | {USB_DEVICE(0x0bda, 0x8174)}, | ||
| 119 | {USB_DEVICE(0x0bda, 0x8712)}, | ||
| 120 | {USB_DEVICE(0x0bda, 0x8713)}, | ||
| 121 | {USB_DEVICE(0x07aa, 0x0047)}, | ||
| 122 | {USB_DEVICE(0x07d1, 0x3303)}, | ||
| 123 | {USB_DEVICE(0x07d1, 0x3302)}, | ||
| 124 | {USB_DEVICE(0x07d1, 0x3300)}, | ||
| 125 | {USB_DEVICE(0x1740, 0x9603)}, | ||
| 126 | {USB_DEVICE(0x1740, 0x9605)}, | ||
| 127 | {USB_DEVICE(0x050d, 0x815F)}, | ||
| 128 | {USB_DEVICE(0x06f8, 0xe031)}, | ||
| 129 | {USB_DEVICE(0x7392, 0x7611)}, | ||
| 130 | {USB_DEVICE(0x7392, 0x7612)}, | ||
| 131 | {USB_DEVICE(0x7392, 0x7622)}, | ||
| 132 | {USB_DEVICE(0x0DF6, 0x0045)}, | ||
| 133 | {USB_DEVICE(0x0E66, 0x0015)}, | ||
| 134 | {USB_DEVICE(0x0E66, 0x0016)}, | ||
| 135 | {USB_DEVICE(0x0b05, 0x1786)}, | ||
| 136 | /* these are not in the official list */ | ||
| 137 | {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ | ||
| 137 | {} | 138 | {} |
| 138 | }; | 139 | }; |
| 139 | 140 | ||
diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c index 2bede271a2f0..f38472c2e75c 100644 --- a/drivers/staging/rtl8192u/r8192U_core.c +++ b/drivers/staging/rtl8192u/r8192U_core.c | |||
| @@ -121,6 +121,8 @@ static const struct usb_device_id rtl8192_usb_id_tbl[] = { | |||
| 121 | {USB_DEVICE(0x2001, 0x3301)}, | 121 | {USB_DEVICE(0x2001, 0x3301)}, |
| 122 | /* Zinwell */ | 122 | /* Zinwell */ |
| 123 | {USB_DEVICE(0x5a57, 0x0290)}, | 123 | {USB_DEVICE(0x5a57, 0x0290)}, |
| 124 | /* LG */ | ||
| 125 | {USB_DEVICE(0x043e, 0x7a01)}, | ||
| 124 | {} | 126 | {} |
| 125 | }; | 127 | }; |
| 126 | 128 | ||
diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index ce081cd44ad4..273e26ede650 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
| 16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
| 17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
| 18 | #include <linux/slab.h> | ||
| 18 | 19 | ||
| 19 | #include <asm/delay.h> | 20 | #include <asm/delay.h> |
| 20 | #include <sound/core.h> | 21 | #include <sound/core.h> |
diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index cedd9044022f..6a9ae40c7c6d 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
| 25 | #include <linux/usb.h> | 25 | #include <linux/usb.h> |
| 26 | #include <linux/version.h> | 26 | #include <linux/version.h> |
| 27 | #include <linux/slab.h> | ||
| 27 | #include <media/v4l2-common.h> | 28 | #include <media/v4l2-common.h> |
| 28 | #include <media/tuner.h> | 29 | #include <media/tuner.h> |
| 29 | #include <media/tvaudio.h> | 30 | #include <media/tvaudio.h> |
diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c index 27f3f551b545..c3690e3580da 100644 --- a/drivers/staging/tm6000/tm6000-core.c +++ b/drivers/staging/tm6000/tm6000-core.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/slab.h> | ||
| 25 | #include <linux/usb.h> | 26 | #include <linux/usb.h> |
| 26 | #include <linux/i2c.h> | 27 | #include <linux/i2c.h> |
| 27 | #include "tm6000.h" | 28 | #include "tm6000.h" |
diff --git a/drivers/staging/tm6000/tm6000-dvb.c b/drivers/staging/tm6000/tm6000-dvb.c index 261e66acbe46..86c1c8b5f25a 100644 --- a/drivers/staging/tm6000/tm6000-dvb.c +++ b/drivers/staging/tm6000/tm6000-dvb.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
| 21 | #include <linux/slab.h> | ||
| 21 | #include <linux/usb.h> | 22 | #include <linux/usb.h> |
| 22 | 23 | ||
| 23 | #include "tm6000.h" | 24 | #include "tm6000.h" |
diff --git a/drivers/staging/usbip/usbip_common.c b/drivers/staging/usbip/usbip_common.c index 52408164036f..6a499f0eb594 100644 --- a/drivers/staging/usbip/usbip_common.c +++ b/drivers/staging/usbip/usbip_common.c | |||
| @@ -378,47 +378,67 @@ int usbip_thread(void *param) | |||
| 378 | complete_and_exit(&ut->thread_done, 0); | 378 | complete_and_exit(&ut->thread_done, 0); |
| 379 | } | 379 | } |
| 380 | 380 | ||
| 381 | static void stop_rx_thread(struct usbip_device *ud) | ||
| 382 | { | ||
| 383 | if (ud->tcp_rx.thread != NULL) { | ||
| 384 | send_sig(SIGKILL, ud->tcp_rx.thread, 1); | ||
| 385 | wait_for_completion(&ud->tcp_rx.thread_done); | ||
| 386 | usbip_udbg("rx_thread for ud %p has finished\n", ud); | ||
| 387 | } | ||
| 388 | } | ||
| 389 | |||
| 390 | static void stop_tx_thread(struct usbip_device *ud) | ||
| 391 | { | ||
| 392 | if (ud->tcp_tx.thread != NULL) { | ||
| 393 | send_sig(SIGKILL, ud->tcp_tx.thread, 1); | ||
| 394 | wait_for_completion(&ud->tcp_tx.thread_done); | ||
| 395 | usbip_udbg("tx_thread for ud %p has finished\n", ud); | ||
| 396 | } | ||
| 397 | } | ||
| 398 | |||
| 381 | int usbip_start_threads(struct usbip_device *ud) | 399 | int usbip_start_threads(struct usbip_device *ud) |
| 382 | { | 400 | { |
| 383 | /* | 401 | /* |
| 384 | * threads are invoked per one device (per one connection). | 402 | * threads are invoked per one device (per one connection). |
| 385 | */ | 403 | */ |
| 386 | struct task_struct *th; | 404 | struct task_struct *th; |
| 405 | int err = 0; | ||
| 387 | 406 | ||
| 388 | th = kthread_run(usbip_thread, (void *)&ud->tcp_rx, "usbip"); | 407 | th = kthread_run(usbip_thread, (void *)&ud->tcp_rx, "usbip"); |
| 389 | if (IS_ERR(th)) { | 408 | if (IS_ERR(th)) { |
| 390 | printk(KERN_WARNING | 409 | printk(KERN_WARNING |
| 391 | "Unable to start control thread\n"); | 410 | "Unable to start control thread\n"); |
| 392 | return PTR_ERR(th); | 411 | err = PTR_ERR(th); |
| 412 | goto ust_exit; | ||
| 393 | } | 413 | } |
| 414 | |||
| 394 | th = kthread_run(usbip_thread, (void *)&ud->tcp_tx, "usbip"); | 415 | th = kthread_run(usbip_thread, (void *)&ud->tcp_tx, "usbip"); |
| 395 | if (IS_ERR(th)) { | 416 | if (IS_ERR(th)) { |
| 396 | printk(KERN_WARNING | 417 | printk(KERN_WARNING |
| 397 | "Unable to start control thread\n"); | 418 | "Unable to start control thread\n"); |
| 398 | return PTR_ERR(th); | 419 | err = PTR_ERR(th); |
| 420 | goto tx_thread_err; | ||
| 399 | } | 421 | } |
| 400 | 422 | ||
| 401 | /* confirm threads are starting */ | 423 | /* confirm threads are starting */ |
| 402 | wait_for_completion(&ud->tcp_rx.thread_done); | 424 | wait_for_completion(&ud->tcp_rx.thread_done); |
| 403 | wait_for_completion(&ud->tcp_tx.thread_done); | 425 | wait_for_completion(&ud->tcp_tx.thread_done); |
| 426 | |||
| 404 | return 0; | 427 | return 0; |
| 428 | |||
| 429 | tx_thread_err: | ||
| 430 | stop_rx_thread(ud); | ||
| 431 | |||
| 432 | ust_exit: | ||
| 433 | return err; | ||
| 405 | } | 434 | } |
| 406 | EXPORT_SYMBOL_GPL(usbip_start_threads); | 435 | EXPORT_SYMBOL_GPL(usbip_start_threads); |
| 407 | 436 | ||
| 408 | void usbip_stop_threads(struct usbip_device *ud) | 437 | void usbip_stop_threads(struct usbip_device *ud) |
| 409 | { | 438 | { |
| 410 | /* kill threads related to this sdev, if v.c. exists */ | 439 | /* kill threads related to this sdev, if v.c. exists */ |
| 411 | if (ud->tcp_rx.thread != NULL) { | 440 | stop_rx_thread(ud); |
| 412 | send_sig(SIGKILL, ud->tcp_rx.thread, 1); | 441 | stop_tx_thread(ud); |
| 413 | wait_for_completion(&ud->tcp_rx.thread_done); | ||
| 414 | usbip_udbg("rx_thread for ud %p has finished\n", ud); | ||
| 415 | } | ||
| 416 | |||
| 417 | if (ud->tcp_tx.thread != NULL) { | ||
| 418 | send_sig(SIGKILL, ud->tcp_tx.thread, 1); | ||
| 419 | wait_for_completion(&ud->tcp_tx.thread_done); | ||
| 420 | usbip_udbg("tx_thread for ud %p has finished\n", ud); | ||
| 421 | } | ||
| 422 | } | 442 | } |
| 423 | EXPORT_SYMBOL_GPL(usbip_stop_threads); | 443 | EXPORT_SYMBOL_GPL(usbip_stop_threads); |
| 424 | 444 | ||
diff --git a/drivers/staging/wlags49_h2/wl_enc.c b/drivers/staging/wlags49_h2/wl_enc.c index 48c44c8fdb28..26cf5486edd6 100644 --- a/drivers/staging/wlags49_h2/wl_enc.c +++ b/drivers/staging/wlags49_h2/wl_enc.c | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | /******************************************************************************* | 62 | /******************************************************************************* |
| 63 | * include files | 63 | * include files |
| 64 | ******************************************************************************/ | 64 | ******************************************************************************/ |
| 65 | #include <linux/string.h> | ||
| 65 | #include <wl_version.h> | 66 | #include <wl_version.h> |
| 66 | 67 | ||
| 67 | #include <debug.h> | 68 | #include <debug.h> |
diff --git a/drivers/staging/wlags49_h2/wl_sysfs.h b/drivers/staging/wlags49_h2/wl_sysfs.h index 6d96d03cf490..fa658c38001e 100644 --- a/drivers/staging/wlags49_h2/wl_sysfs.h +++ b/drivers/staging/wlags49_h2/wl_sysfs.h | |||
| @@ -2,6 +2,6 @@ | |||
| 2 | extern void register_wlags_sysfs(struct net_device *); | 2 | extern void register_wlags_sysfs(struct net_device *); |
| 3 | extern void unregister_wlags_sysfs(struct net_device *); | 3 | extern void unregister_wlags_sysfs(struct net_device *); |
| 4 | #else | 4 | #else |
| 5 | static void register_wlags_sysfs(struct net_device *) { return; }; | 5 | static inline void register_wlags_sysfs(struct net_device *net) { } |
| 6 | static void unregister_wlags_sysfs(struct net_device *) { return; }; | 6 | static inline void unregister_wlags_sysfs(struct net_device *net) { } |
| 7 | #endif | 7 | #endif |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index de98a94d1853..a6bd53ace035 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -1272,8 +1272,7 @@ static int usb_resume_both(struct usb_device *udev, pm_message_t msg) | |||
| 1272 | 1272 | ||
| 1273 | static void choose_wakeup(struct usb_device *udev, pm_message_t msg) | 1273 | static void choose_wakeup(struct usb_device *udev, pm_message_t msg) |
| 1274 | { | 1274 | { |
| 1275 | int w, i; | 1275 | int w; |
| 1276 | struct usb_interface *intf; | ||
| 1277 | 1276 | ||
| 1278 | /* Remote wakeup is needed only when we actually go to sleep. | 1277 | /* Remote wakeup is needed only when we actually go to sleep. |
| 1279 | * For things like FREEZE and QUIESCE, if the device is already | 1278 | * For things like FREEZE and QUIESCE, if the device is already |
| @@ -1285,16 +1284,10 @@ static void choose_wakeup(struct usb_device *udev, pm_message_t msg) | |||
| 1285 | return; | 1284 | return; |
| 1286 | } | 1285 | } |
| 1287 | 1286 | ||
| 1288 | /* If remote wakeup is permitted, see whether any interface drivers | 1287 | /* Enable remote wakeup if it is allowed, even if no interface drivers |
| 1289 | * actually want it. | 1288 | * actually want it. |
| 1290 | */ | 1289 | */ |
| 1291 | w = 0; | 1290 | w = device_may_wakeup(&udev->dev); |
| 1292 | if (device_may_wakeup(&udev->dev) && udev->actconfig) { | ||
| 1293 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
| 1294 | intf = udev->actconfig->interface[i]; | ||
| 1295 | w |= intf->needs_remote_wakeup; | ||
| 1296 | } | ||
| 1297 | } | ||
| 1298 | 1291 | ||
| 1299 | /* If the device is autosuspended with the wrong wakeup setting, | 1292 | /* If the device is autosuspended with the wrong wakeup setting, |
| 1300 | * autoresume now so the setting can be changed. | 1293 | * autoresume now so the setting can be changed. |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index a73e08fdab36..fd4c36ea5e46 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -416,8 +416,11 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, | |||
| 416 | /* A length of zero means transfer the whole sg list */ | 416 | /* A length of zero means transfer the whole sg list */ |
| 417 | len = length; | 417 | len = length; |
| 418 | if (len == 0) { | 418 | if (len == 0) { |
| 419 | for_each_sg(sg, sg, nents, i) | 419 | struct scatterlist *sg2; |
| 420 | len += sg->length; | 420 | int j; |
| 421 | |||
| 422 | for_each_sg(sg, sg2, nents, j) | ||
| 423 | len += sg2->length; | ||
| 421 | } | 424 | } |
| 422 | } else { | 425 | } else { |
| 423 | /* | 426 | /* |
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c index 38226e9a371d..95dd4662d6a8 100644 --- a/drivers/usb/gadget/f_eem.c +++ b/drivers/usb/gadget/f_eem.c | |||
| @@ -469,8 +469,7 @@ static int eem_unwrap(struct gether *port, | |||
| 469 | crc = get_unaligned_le32(skb->data + len | 469 | crc = get_unaligned_le32(skb->data + len |
| 470 | - ETH_FCS_LEN); | 470 | - ETH_FCS_LEN); |
| 471 | crc2 = ~crc32_le(~0, | 471 | crc2 = ~crc32_le(~0, |
| 472 | skb->data, | 472 | skb->data, len - ETH_FCS_LEN); |
| 473 | skb->len - ETH_FCS_LEN); | ||
| 474 | } else { | 473 | } else { |
| 475 | crc = get_unaligned_be32(skb->data + len | 474 | crc = get_unaligned_be32(skb->data + len |
| 476 | - ETH_FCS_LEN); | 475 | - ETH_FCS_LEN); |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 7d05a0be5c60..4ce899c9b165 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
| @@ -321,8 +321,8 @@ struct fsg_dev; | |||
| 321 | /* Data shared by all the FSG instances. */ | 321 | /* Data shared by all the FSG instances. */ |
| 322 | struct fsg_common { | 322 | struct fsg_common { |
| 323 | struct usb_gadget *gadget; | 323 | struct usb_gadget *gadget; |
| 324 | struct fsg_dev *fsg; | 324 | struct fsg_dev *fsg, *new_fsg; |
| 325 | struct fsg_dev *prev_fsg; | 325 | wait_queue_head_t fsg_wait; |
| 326 | 326 | ||
| 327 | /* filesem protects: backing files in use */ | 327 | /* filesem protects: backing files in use */ |
| 328 | struct rw_semaphore filesem; | 328 | struct rw_semaphore filesem; |
| @@ -351,7 +351,6 @@ struct fsg_common { | |||
| 351 | enum fsg_state state; /* For exception handling */ | 351 | enum fsg_state state; /* For exception handling */ |
| 352 | unsigned int exception_req_tag; | 352 | unsigned int exception_req_tag; |
| 353 | 353 | ||
| 354 | u8 config, new_config; | ||
| 355 | enum data_direction data_dir; | 354 | enum data_direction data_dir; |
| 356 | u32 data_size; | 355 | u32 data_size; |
| 357 | u32 data_size_from_cmnd; | 356 | u32 data_size_from_cmnd; |
| @@ -595,7 +594,7 @@ static int fsg_setup(struct usb_function *f, | |||
| 595 | u16 w_value = le16_to_cpu(ctrl->wValue); | 594 | u16 w_value = le16_to_cpu(ctrl->wValue); |
| 596 | u16 w_length = le16_to_cpu(ctrl->wLength); | 595 | u16 w_length = le16_to_cpu(ctrl->wLength); |
| 597 | 596 | ||
| 598 | if (!fsg->common->config) | 597 | if (!fsg_is_set(fsg->common)) |
| 599 | return -EOPNOTSUPP; | 598 | return -EOPNOTSUPP; |
| 600 | 599 | ||
| 601 | switch (ctrl->bRequest) { | 600 | switch (ctrl->bRequest) { |
| @@ -2303,24 +2302,20 @@ static int alloc_request(struct fsg_common *common, struct usb_ep *ep, | |||
| 2303 | return -ENOMEM; | 2302 | return -ENOMEM; |
| 2304 | } | 2303 | } |
| 2305 | 2304 | ||
| 2306 | /* | 2305 | /* Reset interface setting and re-init endpoint state (toggle etc). */ |
| 2307 | * Reset interface setting and re-init endpoint state (toggle etc). | 2306 | static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg) |
| 2308 | * Call with altsetting < 0 to disable the interface. The only other | ||
| 2309 | * available altsetting is 0, which enables the interface. | ||
| 2310 | */ | ||
| 2311 | static int do_set_interface(struct fsg_common *common, int altsetting) | ||
| 2312 | { | 2307 | { |
| 2313 | int rc = 0; | 2308 | const struct usb_endpoint_descriptor *d; |
| 2314 | int i; | 2309 | struct fsg_dev *fsg; |
| 2315 | const struct usb_endpoint_descriptor *d; | 2310 | int i, rc = 0; |
| 2316 | 2311 | ||
| 2317 | if (common->running) | 2312 | if (common->running) |
| 2318 | DBG(common, "reset interface\n"); | 2313 | DBG(common, "reset interface\n"); |
| 2319 | 2314 | ||
| 2320 | reset: | 2315 | reset: |
| 2321 | /* Deallocate the requests */ | 2316 | /* Deallocate the requests */ |
| 2322 | if (common->prev_fsg) { | 2317 | if (common->fsg) { |
| 2323 | struct fsg_dev *fsg = common->prev_fsg; | 2318 | fsg = common->fsg; |
| 2324 | 2319 | ||
| 2325 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { | 2320 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { |
| 2326 | struct fsg_buffhd *bh = &common->buffhds[i]; | 2321 | struct fsg_buffhd *bh = &common->buffhds[i]; |
| @@ -2345,88 +2340,53 @@ reset: | |||
| 2345 | fsg->bulk_out_enabled = 0; | 2340 | fsg->bulk_out_enabled = 0; |
| 2346 | } | 2341 | } |
| 2347 | 2342 | ||
| 2348 | common->prev_fsg = 0; | 2343 | common->fsg = NULL; |
| 2344 | wake_up(&common->fsg_wait); | ||
| 2349 | } | 2345 | } |
| 2350 | 2346 | ||
| 2351 | common->running = 0; | 2347 | common->running = 0; |
| 2352 | if (altsetting < 0 || rc != 0) | 2348 | if (!new_fsg || rc) |
| 2353 | return rc; | 2349 | return rc; |
| 2354 | 2350 | ||
| 2355 | DBG(common, "set interface %d\n", altsetting); | 2351 | common->fsg = new_fsg; |
| 2352 | fsg = common->fsg; | ||
| 2356 | 2353 | ||
| 2357 | if (fsg_is_set(common)) { | 2354 | /* Enable the endpoints */ |
| 2358 | struct fsg_dev *fsg = common->fsg; | 2355 | d = fsg_ep_desc(common->gadget, |
| 2359 | common->prev_fsg = common->fsg; | 2356 | &fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); |
| 2357 | rc = enable_endpoint(common, fsg->bulk_in, d); | ||
| 2358 | if (rc) | ||
| 2359 | goto reset; | ||
| 2360 | fsg->bulk_in_enabled = 1; | ||
| 2361 | |||
| 2362 | d = fsg_ep_desc(common->gadget, | ||
| 2363 | &fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); | ||
| 2364 | rc = enable_endpoint(common, fsg->bulk_out, d); | ||
| 2365 | if (rc) | ||
| 2366 | goto reset; | ||
| 2367 | fsg->bulk_out_enabled = 1; | ||
| 2368 | common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); | ||
| 2369 | clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); | ||
| 2360 | 2370 | ||
| 2361 | /* Enable the endpoints */ | 2371 | /* Allocate the requests */ |
| 2362 | d = fsg_ep_desc(common->gadget, | 2372 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { |
| 2363 | &fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); | 2373 | struct fsg_buffhd *bh = &common->buffhds[i]; |
| 2364 | rc = enable_endpoint(common, fsg->bulk_in, d); | 2374 | |
| 2375 | rc = alloc_request(common, fsg->bulk_in, &bh->inreq); | ||
| 2365 | if (rc) | 2376 | if (rc) |
| 2366 | goto reset; | 2377 | goto reset; |
| 2367 | fsg->bulk_in_enabled = 1; | 2378 | rc = alloc_request(common, fsg->bulk_out, &bh->outreq); |
| 2368 | |||
| 2369 | d = fsg_ep_desc(common->gadget, | ||
| 2370 | &fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); | ||
| 2371 | rc = enable_endpoint(common, fsg->bulk_out, d); | ||
| 2372 | if (rc) | 2379 | if (rc) |
| 2373 | goto reset; | 2380 | goto reset; |
| 2374 | fsg->bulk_out_enabled = 1; | 2381 | bh->inreq->buf = bh->outreq->buf = bh->buf; |
| 2375 | common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); | 2382 | bh->inreq->context = bh->outreq->context = bh; |
| 2376 | clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); | 2383 | bh->inreq->complete = bulk_in_complete; |
| 2377 | 2384 | bh->outreq->complete = bulk_out_complete; | |
| 2378 | /* Allocate the requests */ | ||
| 2379 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { | ||
| 2380 | struct fsg_buffhd *bh = &common->buffhds[i]; | ||
| 2381 | |||
| 2382 | rc = alloc_request(common, fsg->bulk_in, &bh->inreq); | ||
| 2383 | if (rc) | ||
| 2384 | goto reset; | ||
| 2385 | rc = alloc_request(common, fsg->bulk_out, &bh->outreq); | ||
| 2386 | if (rc) | ||
| 2387 | goto reset; | ||
| 2388 | bh->inreq->buf = bh->outreq->buf = bh->buf; | ||
| 2389 | bh->inreq->context = bh->outreq->context = bh; | ||
| 2390 | bh->inreq->complete = bulk_in_complete; | ||
| 2391 | bh->outreq->complete = bulk_out_complete; | ||
| 2392 | } | ||
| 2393 | |||
| 2394 | common->running = 1; | ||
| 2395 | for (i = 0; i < common->nluns; ++i) | ||
| 2396 | common->luns[i].unit_attention_data = SS_RESET_OCCURRED; | ||
| 2397 | return rc; | ||
| 2398 | } else { | ||
| 2399 | return -EIO; | ||
| 2400 | } | ||
| 2401 | } | ||
| 2402 | |||
| 2403 | |||
| 2404 | /* | ||
| 2405 | * Change our operational configuration. This code must agree with the code | ||
| 2406 | * that returns config descriptors, and with interface altsetting code. | ||
| 2407 | * | ||
| 2408 | * It's also responsible for power management interactions. Some | ||
| 2409 | * configurations might not work with our current power sources. | ||
| 2410 | * For now we just assume the gadget is always self-powered. | ||
| 2411 | */ | ||
| 2412 | static int do_set_config(struct fsg_common *common, u8 new_config) | ||
| 2413 | { | ||
| 2414 | int rc = 0; | ||
| 2415 | |||
| 2416 | /* Disable the single interface */ | ||
| 2417 | if (common->config != 0) { | ||
| 2418 | DBG(common, "reset config\n"); | ||
| 2419 | common->config = 0; | ||
| 2420 | rc = do_set_interface(common, -1); | ||
| 2421 | } | 2385 | } |
| 2422 | 2386 | ||
| 2423 | /* Enable the interface */ | 2387 | common->running = 1; |
| 2424 | if (new_config != 0) { | 2388 | for (i = 0; i < common->nluns; ++i) |
| 2425 | common->config = new_config; | 2389 | common->luns[i].unit_attention_data = SS_RESET_OCCURRED; |
| 2426 | rc = do_set_interface(common, 0); | ||
| 2427 | if (rc != 0) | ||
| 2428 | common->config = 0; /* Reset on errors */ | ||
| 2429 | } | ||
| 2430 | return rc; | 2390 | return rc; |
| 2431 | } | 2391 | } |
| 2432 | 2392 | ||
| @@ -2437,9 +2397,7 @@ static int do_set_config(struct fsg_common *common, u8 new_config) | |||
| 2437 | static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | 2397 | static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) |
| 2438 | { | 2398 | { |
| 2439 | struct fsg_dev *fsg = fsg_from_func(f); | 2399 | struct fsg_dev *fsg = fsg_from_func(f); |
| 2440 | fsg->common->prev_fsg = fsg->common->fsg; | 2400 | fsg->common->new_fsg = fsg; |
| 2441 | fsg->common->fsg = fsg; | ||
| 2442 | fsg->common->new_config = 1; | ||
| 2443 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); | 2401 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); |
| 2444 | return 0; | 2402 | return 0; |
| 2445 | } | 2403 | } |
| @@ -2447,9 +2405,7 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
| 2447 | static void fsg_disable(struct usb_function *f) | 2405 | static void fsg_disable(struct usb_function *f) |
| 2448 | { | 2406 | { |
| 2449 | struct fsg_dev *fsg = fsg_from_func(f); | 2407 | struct fsg_dev *fsg = fsg_from_func(f); |
| 2450 | fsg->common->prev_fsg = fsg->common->fsg; | 2408 | fsg->common->new_fsg = NULL; |
| 2451 | fsg->common->fsg = fsg; | ||
| 2452 | fsg->common->new_config = 0; | ||
| 2453 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); | 2409 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); |
| 2454 | } | 2410 | } |
| 2455 | 2411 | ||
| @@ -2459,19 +2415,17 @@ static void fsg_disable(struct usb_function *f) | |||
| 2459 | static void handle_exception(struct fsg_common *common) | 2415 | static void handle_exception(struct fsg_common *common) |
| 2460 | { | 2416 | { |
| 2461 | siginfo_t info; | 2417 | siginfo_t info; |
| 2462 | int sig; | ||
| 2463 | int i; | 2418 | int i; |
| 2464 | struct fsg_buffhd *bh; | 2419 | struct fsg_buffhd *bh; |
| 2465 | enum fsg_state old_state; | 2420 | enum fsg_state old_state; |
| 2466 | u8 new_config; | ||
| 2467 | struct fsg_lun *curlun; | 2421 | struct fsg_lun *curlun; |
| 2468 | unsigned int exception_req_tag; | 2422 | unsigned int exception_req_tag; |
| 2469 | int rc; | ||
| 2470 | 2423 | ||
| 2471 | /* Clear the existing signals. Anything but SIGUSR1 is converted | 2424 | /* Clear the existing signals. Anything but SIGUSR1 is converted |
| 2472 | * into a high-priority EXIT exception. */ | 2425 | * into a high-priority EXIT exception. */ |
| 2473 | for (;;) { | 2426 | for (;;) { |
| 2474 | sig = dequeue_signal_lock(current, ¤t->blocked, &info); | 2427 | int sig = |
| 2428 | dequeue_signal_lock(current, ¤t->blocked, &info); | ||
| 2475 | if (!sig) | 2429 | if (!sig) |
| 2476 | break; | 2430 | break; |
| 2477 | if (sig != SIGUSR1) { | 2431 | if (sig != SIGUSR1) { |
| @@ -2482,7 +2436,7 @@ static void handle_exception(struct fsg_common *common) | |||
| 2482 | } | 2436 | } |
| 2483 | 2437 | ||
| 2484 | /* Cancel all the pending transfers */ | 2438 | /* Cancel all the pending transfers */ |
| 2485 | if (fsg_is_set(common)) { | 2439 | if (likely(common->fsg)) { |
| 2486 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { | 2440 | for (i = 0; i < FSG_NUM_BUFFERS; ++i) { |
| 2487 | bh = &common->buffhds[i]; | 2441 | bh = &common->buffhds[i]; |
| 2488 | if (bh->inreq_busy) | 2442 | if (bh->inreq_busy) |
| @@ -2523,7 +2477,6 @@ static void handle_exception(struct fsg_common *common) | |||
| 2523 | common->next_buffhd_to_fill = &common->buffhds[0]; | 2477 | common->next_buffhd_to_fill = &common->buffhds[0]; |
| 2524 | common->next_buffhd_to_drain = &common->buffhds[0]; | 2478 | common->next_buffhd_to_drain = &common->buffhds[0]; |
| 2525 | exception_req_tag = common->exception_req_tag; | 2479 | exception_req_tag = common->exception_req_tag; |
| 2526 | new_config = common->new_config; | ||
| 2527 | old_state = common->state; | 2480 | old_state = common->state; |
| 2528 | 2481 | ||
| 2529 | if (old_state == FSG_STATE_ABORT_BULK_OUT) | 2482 | if (old_state == FSG_STATE_ABORT_BULK_OUT) |
| @@ -2573,12 +2526,12 @@ static void handle_exception(struct fsg_common *common) | |||
| 2573 | break; | 2526 | break; |
| 2574 | 2527 | ||
| 2575 | case FSG_STATE_CONFIG_CHANGE: | 2528 | case FSG_STATE_CONFIG_CHANGE: |
| 2576 | rc = do_set_config(common, new_config); | 2529 | do_set_interface(common, common->new_fsg); |
| 2577 | break; | 2530 | break; |
| 2578 | 2531 | ||
| 2579 | case FSG_STATE_EXIT: | 2532 | case FSG_STATE_EXIT: |
| 2580 | case FSG_STATE_TERMINATED: | 2533 | case FSG_STATE_TERMINATED: |
| 2581 | do_set_config(common, 0); /* Free resources */ | 2534 | do_set_interface(common, NULL); /* Free resources */ |
| 2582 | spin_lock_irq(&common->lock); | 2535 | spin_lock_irq(&common->lock); |
| 2583 | common->state = FSG_STATE_TERMINATED; /* Stop the thread */ | 2536 | common->state = FSG_STATE_TERMINATED; /* Stop the thread */ |
| 2584 | spin_unlock_irq(&common->lock); | 2537 | spin_unlock_irq(&common->lock); |
| @@ -2863,6 +2816,7 @@ buffhds_first_it: | |||
| 2863 | goto error_release; | 2816 | goto error_release; |
| 2864 | } | 2817 | } |
| 2865 | init_completion(&common->thread_notifier); | 2818 | init_completion(&common->thread_notifier); |
| 2819 | init_waitqueue_head(&common->fsg_wait); | ||
| 2866 | #undef OR | 2820 | #undef OR |
| 2867 | 2821 | ||
| 2868 | 2822 | ||
| @@ -2957,9 +2911,17 @@ static void fsg_common_release(struct kref *ref) | |||
| 2957 | static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) | 2911 | static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) |
| 2958 | { | 2912 | { |
| 2959 | struct fsg_dev *fsg = fsg_from_func(f); | 2913 | struct fsg_dev *fsg = fsg_from_func(f); |
| 2914 | struct fsg_common *common = fsg->common; | ||
| 2960 | 2915 | ||
| 2961 | DBG(fsg, "unbind\n"); | 2916 | DBG(fsg, "unbind\n"); |
| 2962 | fsg_common_put(fsg->common); | 2917 | if (fsg->common->fsg == fsg) { |
| 2918 | fsg->common->new_fsg = NULL; | ||
| 2919 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); | ||
| 2920 | /* FIXME: make interruptible or killable somehow? */ | ||
| 2921 | wait_event(common->fsg_wait, common->fsg != fsg); | ||
| 2922 | } | ||
| 2923 | |||
| 2924 | fsg_common_put(common); | ||
| 2963 | usb_free_descriptors(fsg->function.descriptors); | 2925 | usb_free_descriptors(fsg->function.descriptors); |
| 2964 | usb_free_descriptors(fsg->function.hs_descriptors); | 2926 | usb_free_descriptors(fsg->function.hs_descriptors); |
| 2965 | kfree(fsg); | 2927 | kfree(fsg); |
| @@ -2970,7 +2932,6 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 2970 | { | 2932 | { |
| 2971 | struct fsg_dev *fsg = fsg_from_func(f); | 2933 | struct fsg_dev *fsg = fsg_from_func(f); |
| 2972 | struct usb_gadget *gadget = c->cdev->gadget; | 2934 | struct usb_gadget *gadget = c->cdev->gadget; |
| 2973 | int rc; | ||
| 2974 | int i; | 2935 | int i; |
| 2975 | struct usb_ep *ep; | 2936 | struct usb_ep *ep; |
| 2976 | 2937 | ||
| @@ -2996,6 +2957,11 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 2996 | ep->driver_data = fsg->common; /* claim the endpoint */ | 2957 | ep->driver_data = fsg->common; /* claim the endpoint */ |
| 2997 | fsg->bulk_out = ep; | 2958 | fsg->bulk_out = ep; |
| 2998 | 2959 | ||
| 2960 | /* Copy descriptors */ | ||
| 2961 | f->descriptors = usb_copy_descriptors(fsg_fs_function); | ||
| 2962 | if (unlikely(!f->descriptors)) | ||
| 2963 | return -ENOMEM; | ||
| 2964 | |||
| 2999 | if (gadget_is_dualspeed(gadget)) { | 2965 | if (gadget_is_dualspeed(gadget)) { |
| 3000 | /* Assume endpoint addresses are the same for both speeds */ | 2966 | /* Assume endpoint addresses are the same for both speeds */ |
| 3001 | fsg_hs_bulk_in_desc.bEndpointAddress = | 2967 | fsg_hs_bulk_in_desc.bEndpointAddress = |
| @@ -3003,16 +2969,17 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 3003 | fsg_hs_bulk_out_desc.bEndpointAddress = | 2969 | fsg_hs_bulk_out_desc.bEndpointAddress = |
| 3004 | fsg_fs_bulk_out_desc.bEndpointAddress; | 2970 | fsg_fs_bulk_out_desc.bEndpointAddress; |
| 3005 | f->hs_descriptors = usb_copy_descriptors(fsg_hs_function); | 2971 | f->hs_descriptors = usb_copy_descriptors(fsg_hs_function); |
| 3006 | if (unlikely(!f->hs_descriptors)) | 2972 | if (unlikely(!f->hs_descriptors)) { |
| 2973 | usb_free_descriptors(f->descriptors); | ||
| 3007 | return -ENOMEM; | 2974 | return -ENOMEM; |
| 2975 | } | ||
| 3008 | } | 2976 | } |
| 3009 | 2977 | ||
| 3010 | return 0; | 2978 | return 0; |
| 3011 | 2979 | ||
| 3012 | autoconf_fail: | 2980 | autoconf_fail: |
| 3013 | ERROR(fsg, "unable to autoconfigure all endpoints\n"); | 2981 | ERROR(fsg, "unable to autoconfigure all endpoints\n"); |
| 3014 | rc = -ENOTSUPP; | 2982 | return -ENOTSUPP; |
| 3015 | return rc; | ||
| 3016 | } | 2983 | } |
| 3017 | 2984 | ||
| 3018 | 2985 | ||
| @@ -3036,11 +3003,6 @@ static int fsg_add(struct usb_composite_dev *cdev, | |||
| 3036 | 3003 | ||
| 3037 | fsg->function.name = FSG_DRIVER_DESC; | 3004 | fsg->function.name = FSG_DRIVER_DESC; |
| 3038 | fsg->function.strings = fsg_strings_array; | 3005 | fsg->function.strings = fsg_strings_array; |
| 3039 | fsg->function.descriptors = usb_copy_descriptors(fsg_fs_function); | ||
| 3040 | if (unlikely(!fsg->function.descriptors)) { | ||
| 3041 | rc = -ENOMEM; | ||
| 3042 | goto error_free_fsg; | ||
| 3043 | } | ||
| 3044 | fsg->function.bind = fsg_bind; | 3006 | fsg->function.bind = fsg_bind; |
| 3045 | fsg->function.unbind = fsg_unbind; | 3007 | fsg->function.unbind = fsg_unbind; |
| 3046 | fsg->function.setup = fsg_setup; | 3008 | fsg->function.setup = fsg_setup; |
| @@ -3056,19 +3018,9 @@ static int fsg_add(struct usb_composite_dev *cdev, | |||
| 3056 | 3018 | ||
| 3057 | rc = usb_add_function(c, &fsg->function); | 3019 | rc = usb_add_function(c, &fsg->function); |
| 3058 | if (unlikely(rc)) | 3020 | if (unlikely(rc)) |
| 3059 | goto error_free_all; | 3021 | kfree(fsg); |
| 3060 | 3022 | else | |
| 3061 | fsg_common_get(fsg->common); | 3023 | fsg_common_get(fsg->common); |
| 3062 | return 0; | ||
| 3063 | |||
| 3064 | error_free_all: | ||
| 3065 | usb_free_descriptors(fsg->function.descriptors); | ||
| 3066 | /* fsg_bind() might have copied those; or maybe not? who cares | ||
| 3067 | * -- free it just in case. */ | ||
| 3068 | usb_free_descriptors(fsg->function.hs_descriptors); | ||
| 3069 | error_free_fsg: | ||
| 3070 | kfree(fsg); | ||
| 3071 | |||
| 3072 | return rc; | 3024 | return rc; |
| 3073 | } | 3025 | } |
| 3074 | 3026 | ||
diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 4b0e4a040d6f..d1af253a9105 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c | |||
| @@ -392,6 +392,17 @@ static int __gfs_do_config(struct usb_configuration *c, | |||
| 392 | if (unlikely(ret < 0)) | 392 | if (unlikely(ret < 0)) |
| 393 | return ret; | 393 | return ret; |
| 394 | 394 | ||
| 395 | /* After previous do_configs there may be some invalid | ||
| 396 | * pointers in c->interface array. This happens every time | ||
| 397 | * a user space function with fewer interfaces than a user | ||
| 398 | * space function that was run before the new one is run. The | ||
| 399 | * compasit's set_config() assumes that if there is no more | ||
| 400 | * then MAX_CONFIG_INTERFACES interfaces in a configuration | ||
| 401 | * then there is a NULL pointer after the last interface in | ||
| 402 | * c->interface array. We need to make sure this is true. */ | ||
| 403 | if (c->next_interface_id < ARRAY_SIZE(c->interface)) | ||
| 404 | c->interface[c->next_interface_id] = NULL; | ||
| 405 | |||
| 395 | return 0; | 406 | return 0; |
| 396 | } | 407 | } |
| 397 | 408 | ||
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 43abf55d8c60..4c3ac5c42237 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
| @@ -82,7 +82,7 @@ static struct class *usb_gadget_class; | |||
| 82 | struct printer_dev { | 82 | struct printer_dev { |
| 83 | spinlock_t lock; /* lock this structure */ | 83 | spinlock_t lock; /* lock this structure */ |
| 84 | /* lock buffer lists during read/write calls */ | 84 | /* lock buffer lists during read/write calls */ |
| 85 | spinlock_t lock_printer_io; | 85 | struct mutex lock_printer_io; |
| 86 | struct usb_gadget *gadget; | 86 | struct usb_gadget *gadget; |
| 87 | struct usb_request *req; /* for control responses */ | 87 | struct usb_request *req; /* for control responses */ |
| 88 | u8 config; | 88 | u8 config; |
| @@ -567,7 +567,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 567 | 567 | ||
| 568 | DBG(dev, "printer_read trying to read %d bytes\n", (int)len); | 568 | DBG(dev, "printer_read trying to read %d bytes\n", (int)len); |
| 569 | 569 | ||
| 570 | spin_lock(&dev->lock_printer_io); | 570 | mutex_lock(&dev->lock_printer_io); |
| 571 | spin_lock_irqsave(&dev->lock, flags); | 571 | spin_lock_irqsave(&dev->lock, flags); |
| 572 | 572 | ||
| 573 | /* We will use this flag later to check if a printer reset happened | 573 | /* We will use this flag later to check if a printer reset happened |
| @@ -601,7 +601,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 601 | * call or not. | 601 | * call or not. |
| 602 | */ | 602 | */ |
| 603 | if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { | 603 | if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { |
| 604 | spin_unlock(&dev->lock_printer_io); | 604 | mutex_unlock(&dev->lock_printer_io); |
| 605 | return -EAGAIN; | 605 | return -EAGAIN; |
| 606 | } | 606 | } |
| 607 | 607 | ||
| @@ -648,7 +648,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 648 | if (dev->reset_printer) { | 648 | if (dev->reset_printer) { |
| 649 | list_add(¤t_rx_req->list, &dev->rx_reqs); | 649 | list_add(¤t_rx_req->list, &dev->rx_reqs); |
| 650 | spin_unlock_irqrestore(&dev->lock, flags); | 650 | spin_unlock_irqrestore(&dev->lock, flags); |
| 651 | spin_unlock(&dev->lock_printer_io); | 651 | mutex_unlock(&dev->lock_printer_io); |
| 652 | return -EAGAIN; | 652 | return -EAGAIN; |
| 653 | } | 653 | } |
| 654 | 654 | ||
| @@ -673,7 +673,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 673 | dev->current_rx_buf = current_rx_buf; | 673 | dev->current_rx_buf = current_rx_buf; |
| 674 | 674 | ||
| 675 | spin_unlock_irqrestore(&dev->lock, flags); | 675 | spin_unlock_irqrestore(&dev->lock, flags); |
| 676 | spin_unlock(&dev->lock_printer_io); | 676 | mutex_unlock(&dev->lock_printer_io); |
| 677 | 677 | ||
| 678 | DBG(dev, "printer_read returned %d bytes\n", (int)bytes_copied); | 678 | DBG(dev, "printer_read returned %d bytes\n", (int)bytes_copied); |
| 679 | 679 | ||
| @@ -697,7 +697,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 697 | if (len == 0) | 697 | if (len == 0) |
| 698 | return -EINVAL; | 698 | return -EINVAL; |
| 699 | 699 | ||
| 700 | spin_lock(&dev->lock_printer_io); | 700 | mutex_lock(&dev->lock_printer_io); |
| 701 | spin_lock_irqsave(&dev->lock, flags); | 701 | spin_lock_irqsave(&dev->lock, flags); |
| 702 | 702 | ||
| 703 | /* Check if a printer reset happens while we have interrupts on */ | 703 | /* Check if a printer reset happens while we have interrupts on */ |
| @@ -713,7 +713,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 713 | * a NON-Blocking call or not. | 713 | * a NON-Blocking call or not. |
| 714 | */ | 714 | */ |
| 715 | if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { | 715 | if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { |
| 716 | spin_unlock(&dev->lock_printer_io); | 716 | mutex_unlock(&dev->lock_printer_io); |
| 717 | return -EAGAIN; | 717 | return -EAGAIN; |
| 718 | } | 718 | } |
| 719 | 719 | ||
| @@ -752,7 +752,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 752 | 752 | ||
| 753 | if (copy_from_user(req->buf, buf, size)) { | 753 | if (copy_from_user(req->buf, buf, size)) { |
| 754 | list_add(&req->list, &dev->tx_reqs); | 754 | list_add(&req->list, &dev->tx_reqs); |
| 755 | spin_unlock(&dev->lock_printer_io); | 755 | mutex_unlock(&dev->lock_printer_io); |
| 756 | return bytes_copied; | 756 | return bytes_copied; |
| 757 | } | 757 | } |
| 758 | 758 | ||
| @@ -766,14 +766,14 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 766 | if (dev->reset_printer) { | 766 | if (dev->reset_printer) { |
| 767 | list_add(&req->list, &dev->tx_reqs); | 767 | list_add(&req->list, &dev->tx_reqs); |
| 768 | spin_unlock_irqrestore(&dev->lock, flags); | 768 | spin_unlock_irqrestore(&dev->lock, flags); |
| 769 | spin_unlock(&dev->lock_printer_io); | 769 | mutex_unlock(&dev->lock_printer_io); |
| 770 | return -EAGAIN; | 770 | return -EAGAIN; |
| 771 | } | 771 | } |
| 772 | 772 | ||
| 773 | if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) { | 773 | if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) { |
| 774 | list_add(&req->list, &dev->tx_reqs); | 774 | list_add(&req->list, &dev->tx_reqs); |
| 775 | spin_unlock_irqrestore(&dev->lock, flags); | 775 | spin_unlock_irqrestore(&dev->lock, flags); |
| 776 | spin_unlock(&dev->lock_printer_io); | 776 | mutex_unlock(&dev->lock_printer_io); |
| 777 | return -EAGAIN; | 777 | return -EAGAIN; |
| 778 | } | 778 | } |
| 779 | 779 | ||
| @@ -782,7 +782,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 782 | } | 782 | } |
| 783 | 783 | ||
| 784 | spin_unlock_irqrestore(&dev->lock, flags); | 784 | spin_unlock_irqrestore(&dev->lock, flags); |
| 785 | spin_unlock(&dev->lock_printer_io); | 785 | mutex_unlock(&dev->lock_printer_io); |
| 786 | 786 | ||
| 787 | DBG(dev, "printer_write sent %d bytes\n", (int)bytes_copied); | 787 | DBG(dev, "printer_write sent %d bytes\n", (int)bytes_copied); |
| 788 | 788 | ||
| @@ -820,11 +820,11 @@ printer_poll(struct file *fd, poll_table *wait) | |||
| 820 | unsigned long flags; | 820 | unsigned long flags; |
| 821 | int status = 0; | 821 | int status = 0; |
| 822 | 822 | ||
| 823 | spin_lock(&dev->lock_printer_io); | 823 | mutex_lock(&dev->lock_printer_io); |
| 824 | spin_lock_irqsave(&dev->lock, flags); | 824 | spin_lock_irqsave(&dev->lock, flags); |
| 825 | setup_rx_reqs(dev); | 825 | setup_rx_reqs(dev); |
| 826 | spin_unlock_irqrestore(&dev->lock, flags); | 826 | spin_unlock_irqrestore(&dev->lock, flags); |
| 827 | spin_unlock(&dev->lock_printer_io); | 827 | mutex_unlock(&dev->lock_printer_io); |
| 828 | 828 | ||
| 829 | poll_wait(fd, &dev->rx_wait, wait); | 829 | poll_wait(fd, &dev->rx_wait, wait); |
| 830 | poll_wait(fd, &dev->tx_wait, wait); | 830 | poll_wait(fd, &dev->tx_wait, wait); |
| @@ -1461,7 +1461,7 @@ autoconf_fail: | |||
| 1461 | } | 1461 | } |
| 1462 | 1462 | ||
| 1463 | spin_lock_init(&dev->lock); | 1463 | spin_lock_init(&dev->lock); |
| 1464 | spin_lock_init(&dev->lock_printer_io); | 1464 | mutex_init(&dev->lock_printer_io); |
| 1465 | INIT_LIST_HEAD(&dev->tx_reqs); | 1465 | INIT_LIST_HEAD(&dev->tx_reqs); |
| 1466 | INIT_LIST_HEAD(&dev->tx_reqs_active); | 1466 | INIT_LIST_HEAD(&dev->tx_reqs_active); |
| 1467 | INIT_LIST_HEAD(&dev->rx_reqs); | 1467 | INIT_LIST_HEAD(&dev->rx_reqs); |
| @@ -1594,7 +1594,7 @@ cleanup(void) | |||
| 1594 | { | 1594 | { |
| 1595 | int status; | 1595 | int status; |
| 1596 | 1596 | ||
| 1597 | spin_lock(&usb_printer_gadget.lock_printer_io); | 1597 | mutex_lock(&usb_printer_gadget.lock_printer_io); |
| 1598 | class_destroy(usb_gadget_class); | 1598 | class_destroy(usb_gadget_class); |
| 1599 | unregister_chrdev_region(g_printer_devno, 2); | 1599 | unregister_chrdev_region(g_printer_devno, 2); |
| 1600 | 1600 | ||
| @@ -1602,6 +1602,6 @@ cleanup(void) | |||
| 1602 | if (status) | 1602 | if (status) |
| 1603 | ERROR(dev, "usb_gadget_unregister_driver %x\n", status); | 1603 | ERROR(dev, "usb_gadget_unregister_driver %x\n", status); |
| 1604 | 1604 | ||
| 1605 | spin_unlock(&usb_printer_gadget.lock_printer_io); | 1605 | mutex_unlock(&usb_printer_gadget.lock_printer_io); |
| 1606 | } | 1606 | } |
| 1607 | module_exit(cleanup); | 1607 | module_exit(cleanup); |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index d5f4c1d45c97..e724a051bfdd 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
| @@ -1700,9 +1700,13 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
| 1700 | if (!driver || driver != udc->driver || !driver->unbind) | 1700 | if (!driver || driver != udc->driver || !driver->unbind) |
| 1701 | return -EINVAL; | 1701 | return -EINVAL; |
| 1702 | 1702 | ||
| 1703 | dprintk(DEBUG_NORMAL,"usb_gadget_register_driver() '%s'\n", | 1703 | dprintk(DEBUG_NORMAL, "usb_gadget_unregister_driver() '%s'\n", |
| 1704 | driver->driver.name); | 1704 | driver->driver.name); |
| 1705 | 1705 | ||
| 1706 | /* report disconnect */ | ||
| 1707 | if (driver->disconnect) | ||
| 1708 | driver->disconnect(&udc->gadget); | ||
| 1709 | |||
| 1706 | driver->unbind(&udc->gadget); | 1710 | driver->unbind(&udc->gadget); |
| 1707 | 1711 | ||
| 1708 | device_del(&udc->gadget.dev); | 1712 | device_del(&udc->gadget.dev); |
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 16bdf77f582a..3e8dcb5455e3 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c | |||
| @@ -536,17 +536,11 @@ recycle: | |||
| 536 | list_move(&req->list, &port->read_pool); | 536 | list_move(&req->list, &port->read_pool); |
| 537 | } | 537 | } |
| 538 | 538 | ||
| 539 | /* Push from tty to ldisc; this is immediate with low_latency, and | 539 | /* Push from tty to ldisc; without low_latency set this is handled by |
| 540 | * may trigger callbacks to this driver ... so drop the spinlock. | 540 | * a workqueue, so we won't get callbacks and can hold port_lock |
| 541 | */ | 541 | */ |
| 542 | if (tty && do_push) { | 542 | if (tty && do_push) { |
| 543 | spin_unlock_irq(&port->port_lock); | ||
| 544 | tty_flip_buffer_push(tty); | 543 | tty_flip_buffer_push(tty); |
| 545 | wake_up_interruptible(&tty->read_wait); | ||
| 546 | spin_lock_irq(&port->port_lock); | ||
| 547 | |||
| 548 | /* tty may have been closed */ | ||
| 549 | tty = port->port_tty; | ||
| 550 | } | 544 | } |
| 551 | 545 | ||
| 552 | 546 | ||
| @@ -784,11 +778,6 @@ static int gs_open(struct tty_struct *tty, struct file *file) | |||
| 784 | port->open_count = 1; | 778 | port->open_count = 1; |
| 785 | port->openclose = false; | 779 | port->openclose = false; |
| 786 | 780 | ||
| 787 | /* low_latency means ldiscs work in tasklet context, without | ||
| 788 | * needing a workqueue schedule ... easier to keep up. | ||
| 789 | */ | ||
| 790 | tty->low_latency = 1; | ||
| 791 | |||
| 792 | /* if connected, start the I/O stream */ | 781 | /* if connected, start the I/O stream */ |
| 793 | if (port->port_usb) { | 782 | if (port->port_usb) { |
| 794 | struct gserial *gser = port->port_usb; | 783 | struct gserial *gser = port->port_usb; |
| @@ -1195,6 +1184,7 @@ void gserial_cleanup(void) | |||
| 1195 | n_ports = 0; | 1184 | n_ports = 0; |
| 1196 | 1185 | ||
| 1197 | tty_unregister_driver(gs_tty_driver); | 1186 | tty_unregister_driver(gs_tty_driver); |
| 1187 | put_tty_driver(gs_tty_driver); | ||
| 1198 | gs_tty_driver = NULL; | 1188 | gs_tty_driver = NULL; |
| 1199 | 1189 | ||
| 1200 | pr_debug("%s: cleaned up ttyGS* support\n", __func__); | 1190 | pr_debug("%s: cleaned up ttyGS* support\n", __func__); |
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 544ccfd7056e..bd4027745aa7 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
| @@ -207,10 +207,17 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
| 207 | /* Initialize the transceiver */ | 207 | /* Initialize the transceiver */ |
| 208 | if (pdata->otg) { | 208 | if (pdata->otg) { |
| 209 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; | 209 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; |
| 210 | if (otg_init(pdata->otg) != 0) | 210 | ret = otg_init(pdata->otg); |
| 211 | dev_err(dev, "unable to init transceiver\n"); | 211 | if (ret) { |
| 212 | else if (otg_set_vbus(pdata->otg, 1) != 0) | 212 | dev_err(dev, "unable to init transceiver, probably missing\n"); |
| 213 | ret = -ENODEV; | ||
| 214 | goto err_add; | ||
| 215 | } | ||
| 216 | ret = otg_set_vbus(pdata->otg, 1); | ||
| 217 | if (ret) { | ||
| 213 | dev_err(dev, "unable to enable vbus on transceiver\n"); | 218 | dev_err(dev, "unable to enable vbus on transceiver\n"); |
| 219 | goto err_add; | ||
| 220 | } | ||
| 214 | } | 221 | } |
| 215 | 222 | ||
| 216 | priv->hcd = hcd; | 223 | priv->hcd = hcd; |
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index 20a0dfe0fe36..0587ad4ce5c2 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c | |||
| @@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp1362_hcd *isp1362_hcd) | |||
| 2224 | 2224 | ||
| 2225 | /*-------------------------------------------------------------------------*/ | 2225 | /*-------------------------------------------------------------------------*/ |
| 2226 | 2226 | ||
| 2227 | static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) | 2227 | static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) |
| 2228 | { | 2228 | { |
| 2229 | int tmp = 20; | 2229 | int tmp = 20; |
| 2230 | unsigned long flags; | ||
| 2231 | |||
| 2232 | spin_lock_irqsave(&isp1362_hcd->lock, flags); | ||
| 2233 | 2230 | ||
| 2234 | isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC); | 2231 | isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC); |
| 2235 | isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); | 2232 | isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); |
| @@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) | |||
| 2240 | } | 2237 | } |
| 2241 | if (!tmp) | 2238 | if (!tmp) |
| 2242 | pr_err("Software reset timeout\n"); | 2239 | pr_err("Software reset timeout\n"); |
| 2240 | } | ||
| 2241 | |||
| 2242 | static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) | ||
| 2243 | { | ||
| 2244 | unsigned long flags; | ||
| 2245 | |||
| 2246 | spin_lock_irqsave(&isp1362_hcd->lock, flags); | ||
| 2247 | __isp1362_sw_reset(isp1362_hcd); | ||
| 2243 | spin_unlock_irqrestore(&isp1362_hcd->lock, flags); | 2248 | spin_unlock_irqrestore(&isp1362_hcd->lock, flags); |
| 2244 | } | 2249 | } |
| 2245 | 2250 | ||
| @@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_hcd *hcd) | |||
| 2418 | if (isp1362_hcd->board && isp1362_hcd->board->reset) | 2423 | if (isp1362_hcd->board && isp1362_hcd->board->reset) |
| 2419 | isp1362_hcd->board->reset(hcd->self.controller, 1); | 2424 | isp1362_hcd->board->reset(hcd->self.controller, 1); |
| 2420 | else | 2425 | else |
| 2421 | isp1362_sw_reset(isp1362_hcd); | 2426 | __isp1362_sw_reset(isp1362_hcd); |
| 2422 | 2427 | ||
| 2423 | if (isp1362_hcd->board && isp1362_hcd->board->clock) | 2428 | if (isp1362_hcd->board && isp1362_hcd->board->clock) |
| 2424 | isp1362_hcd->board->clock(hcd->self.controller, 0); | 2429 | isp1362_hcd->board->clock(hcd->self.controller, 0); |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 1a2bb4ce638f..77be3c24a427 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
| @@ -1065,7 +1065,7 @@ static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port) | |||
| 1065 | else if (speed == LSMODE) | 1065 | else if (speed == LSMODE) |
| 1066 | rh->port |= USB_PORT_STAT_LOW_SPEED; | 1066 | rh->port |= USB_PORT_STAT_LOW_SPEED; |
| 1067 | 1067 | ||
| 1068 | rh->port &= USB_PORT_STAT_RESET; | 1068 | rh->port &= ~USB_PORT_STAT_RESET; |
| 1069 | rh->port |= USB_PORT_STAT_ENABLE; | 1069 | rh->port |= USB_PORT_STAT_ENABLE; |
| 1070 | } | 1070 | } |
| 1071 | 1071 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 9012098add6b..94e6934edb09 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -182,8 +182,12 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer | |||
| 182 | * set, but other sections talk about dealing with the chain bit set. This was | 182 | * set, but other sections talk about dealing with the chain bit set. This was |
| 183 | * fixed in the 0.96 specification errata, but we have to assume that all 0.95 | 183 | * fixed in the 0.96 specification errata, but we have to assume that all 0.95 |
| 184 | * xHCI hardware can't handle the chain bit being cleared on a link TRB. | 184 | * xHCI hardware can't handle the chain bit being cleared on a link TRB. |
| 185 | * | ||
| 186 | * @more_trbs_coming: Will you enqueue more TRBs before calling | ||
| 187 | * prepare_transfer()? | ||
| 185 | */ | 188 | */ |
| 186 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) | 189 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, |
| 190 | bool consumer, bool more_trbs_coming) | ||
| 187 | { | 191 | { |
| 188 | u32 chain; | 192 | u32 chain; |
| 189 | union xhci_trb *next; | 193 | union xhci_trb *next; |
| @@ -199,15 +203,28 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer | |||
| 199 | while (last_trb(xhci, ring, ring->enq_seg, next)) { | 203 | while (last_trb(xhci, ring, ring->enq_seg, next)) { |
| 200 | if (!consumer) { | 204 | if (!consumer) { |
| 201 | if (ring != xhci->event_ring) { | 205 | if (ring != xhci->event_ring) { |
| 202 | if (chain) { | 206 | /* |
| 203 | next->link.control |= TRB_CHAIN; | 207 | * If the caller doesn't plan on enqueueing more |
| 204 | 208 | * TDs before ringing the doorbell, then we | |
| 205 | /* Give this link TRB to the hardware */ | 209 | * don't want to give the link TRB to the |
| 206 | wmb(); | 210 | * hardware just yet. We'll give the link TRB |
| 207 | next->link.control ^= TRB_CYCLE; | 211 | * back in prepare_ring() just before we enqueue |
| 208 | } else { | 212 | * the TD at the top of the ring. |
| 213 | */ | ||
| 214 | if (!chain && !more_trbs_coming) | ||
| 209 | break; | 215 | break; |
| 216 | |||
| 217 | /* If we're not dealing with 0.95 hardware, | ||
| 218 | * carry over the chain bit of the previous TRB | ||
| 219 | * (which may mean the chain bit is cleared). | ||
| 220 | */ | ||
| 221 | if (!xhci_link_trb_quirk(xhci)) { | ||
| 222 | next->link.control &= ~TRB_CHAIN; | ||
| 223 | next->link.control |= chain; | ||
| 210 | } | 224 | } |
| 225 | /* Give this link TRB to the hardware */ | ||
| 226 | wmb(); | ||
| 227 | next->link.control ^= TRB_CYCLE; | ||
| 211 | } | 228 | } |
| 212 | /* Toggle the cycle bit after the last ring segment. */ | 229 | /* Toggle the cycle bit after the last ring segment. */ |
| 213 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { | 230 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { |
| @@ -1707,9 +1724,12 @@ void xhci_handle_event(struct xhci_hcd *xhci) | |||
| 1707 | /* | 1724 | /* |
| 1708 | * Generic function for queueing a TRB on a ring. | 1725 | * Generic function for queueing a TRB on a ring. |
| 1709 | * The caller must have checked to make sure there's room on the ring. | 1726 | * The caller must have checked to make sure there's room on the ring. |
| 1727 | * | ||
| 1728 | * @more_trbs_coming: Will you enqueue more TRBs before calling | ||
| 1729 | * prepare_transfer()? | ||
| 1710 | */ | 1730 | */ |
| 1711 | static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | 1731 | static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, |
| 1712 | bool consumer, | 1732 | bool consumer, bool more_trbs_coming, |
| 1713 | u32 field1, u32 field2, u32 field3, u32 field4) | 1733 | u32 field1, u32 field2, u32 field3, u32 field4) |
| 1714 | { | 1734 | { |
| 1715 | struct xhci_generic_trb *trb; | 1735 | struct xhci_generic_trb *trb; |
| @@ -1719,7 +1739,7 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 1719 | trb->field[1] = field2; | 1739 | trb->field[1] = field2; |
| 1720 | trb->field[2] = field3; | 1740 | trb->field[2] = field3; |
| 1721 | trb->field[3] = field4; | 1741 | trb->field[3] = field4; |
| 1722 | inc_enq(xhci, ring, consumer); | 1742 | inc_enq(xhci, ring, consumer, more_trbs_coming); |
| 1723 | } | 1743 | } |
| 1724 | 1744 | ||
| 1725 | /* | 1745 | /* |
| @@ -1988,6 +2008,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 1988 | int trb_buff_len, this_sg_len, running_total; | 2008 | int trb_buff_len, this_sg_len, running_total; |
| 1989 | bool first_trb; | 2009 | bool first_trb; |
| 1990 | u64 addr; | 2010 | u64 addr; |
| 2011 | bool more_trbs_coming; | ||
| 1991 | 2012 | ||
| 1992 | struct xhci_generic_trb *start_trb; | 2013 | struct xhci_generic_trb *start_trb; |
| 1993 | int start_cycle; | 2014 | int start_cycle; |
| @@ -2073,7 +2094,11 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2073 | length_field = TRB_LEN(trb_buff_len) | | 2094 | length_field = TRB_LEN(trb_buff_len) | |
| 2074 | remainder | | 2095 | remainder | |
| 2075 | TRB_INTR_TARGET(0); | 2096 | TRB_INTR_TARGET(0); |
| 2076 | queue_trb(xhci, ep_ring, false, | 2097 | if (num_trbs > 1) |
| 2098 | more_trbs_coming = true; | ||
| 2099 | else | ||
| 2100 | more_trbs_coming = false; | ||
| 2101 | queue_trb(xhci, ep_ring, false, more_trbs_coming, | ||
| 2077 | lower_32_bits(addr), | 2102 | lower_32_bits(addr), |
| 2078 | upper_32_bits(addr), | 2103 | upper_32_bits(addr), |
| 2079 | length_field, | 2104 | length_field, |
| @@ -2124,6 +2149,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2124 | int num_trbs; | 2149 | int num_trbs; |
| 2125 | struct xhci_generic_trb *start_trb; | 2150 | struct xhci_generic_trb *start_trb; |
| 2126 | bool first_trb; | 2151 | bool first_trb; |
| 2152 | bool more_trbs_coming; | ||
| 2127 | int start_cycle; | 2153 | int start_cycle; |
| 2128 | u32 field, length_field; | 2154 | u32 field, length_field; |
| 2129 | 2155 | ||
| @@ -2212,7 +2238,11 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2212 | length_field = TRB_LEN(trb_buff_len) | | 2238 | length_field = TRB_LEN(trb_buff_len) | |
| 2213 | remainder | | 2239 | remainder | |
| 2214 | TRB_INTR_TARGET(0); | 2240 | TRB_INTR_TARGET(0); |
| 2215 | queue_trb(xhci, ep_ring, false, | 2241 | if (num_trbs > 1) |
| 2242 | more_trbs_coming = true; | ||
| 2243 | else | ||
| 2244 | more_trbs_coming = false; | ||
| 2245 | queue_trb(xhci, ep_ring, false, more_trbs_coming, | ||
| 2216 | lower_32_bits(addr), | 2246 | lower_32_bits(addr), |
| 2217 | upper_32_bits(addr), | 2247 | upper_32_bits(addr), |
| 2218 | length_field, | 2248 | length_field, |
| @@ -2291,7 +2321,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2291 | /* Queue setup TRB - see section 6.4.1.2.1 */ | 2321 | /* Queue setup TRB - see section 6.4.1.2.1 */ |
| 2292 | /* FIXME better way to translate setup_packet into two u32 fields? */ | 2322 | /* FIXME better way to translate setup_packet into two u32 fields? */ |
| 2293 | setup = (struct usb_ctrlrequest *) urb->setup_packet; | 2323 | setup = (struct usb_ctrlrequest *) urb->setup_packet; |
| 2294 | queue_trb(xhci, ep_ring, false, | 2324 | queue_trb(xhci, ep_ring, false, true, |
| 2295 | /* FIXME endianness is probably going to bite my ass here. */ | 2325 | /* FIXME endianness is probably going to bite my ass here. */ |
| 2296 | setup->bRequestType | setup->bRequest << 8 | setup->wValue << 16, | 2326 | setup->bRequestType | setup->bRequest << 8 | setup->wValue << 16, |
| 2297 | setup->wIndex | setup->wLength << 16, | 2327 | setup->wIndex | setup->wLength << 16, |
| @@ -2307,7 +2337,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2307 | if (urb->transfer_buffer_length > 0) { | 2337 | if (urb->transfer_buffer_length > 0) { |
| 2308 | if (setup->bRequestType & USB_DIR_IN) | 2338 | if (setup->bRequestType & USB_DIR_IN) |
| 2309 | field |= TRB_DIR_IN; | 2339 | field |= TRB_DIR_IN; |
| 2310 | queue_trb(xhci, ep_ring, false, | 2340 | queue_trb(xhci, ep_ring, false, true, |
| 2311 | lower_32_bits(urb->transfer_dma), | 2341 | lower_32_bits(urb->transfer_dma), |
| 2312 | upper_32_bits(urb->transfer_dma), | 2342 | upper_32_bits(urb->transfer_dma), |
| 2313 | length_field, | 2343 | length_field, |
| @@ -2324,7 +2354,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2324 | field = 0; | 2354 | field = 0; |
| 2325 | else | 2355 | else |
| 2326 | field = TRB_DIR_IN; | 2356 | field = TRB_DIR_IN; |
| 2327 | queue_trb(xhci, ep_ring, false, | 2357 | queue_trb(xhci, ep_ring, false, false, |
| 2328 | 0, | 2358 | 0, |
| 2329 | 0, | 2359 | 0, |
| 2330 | TRB_INTR_TARGET(0), | 2360 | TRB_INTR_TARGET(0), |
| @@ -2361,7 +2391,7 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2, | |||
| 2361 | "unfailable commands failed.\n"); | 2391 | "unfailable commands failed.\n"); |
| 2362 | return -ENOMEM; | 2392 | return -ENOMEM; |
| 2363 | } | 2393 | } |
| 2364 | queue_trb(xhci, xhci->cmd_ring, false, field1, field2, field3, | 2394 | queue_trb(xhci, xhci->cmd_ring, false, false, field1, field2, field3, |
| 2365 | field4 | xhci->cmd_ring->cycle_state); | 2395 | field4 | xhci->cmd_ring->cycle_state); |
| 2366 | return 0; | 2396 | return 0; |
| 2367 | } | 2397 | } |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index fad70bc83555..3b795c56221f 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -219,8 +219,8 @@ static int musb_ulpi_write(struct otg_transceiver *otg, | |||
| 219 | return 0; | 219 | return 0; |
| 220 | } | 220 | } |
| 221 | #else | 221 | #else |
| 222 | #define musb_ulpi_read(a, b) NULL | 222 | #define musb_ulpi_read NULL |
| 223 | #define musb_ulpi_write(a, b, c) NULL | 223 | #define musb_ulpi_write NULL |
| 224 | #endif | 224 | #endif |
| 225 | 225 | ||
| 226 | static struct otg_io_access_ops musb_ulpi_access = { | 226 | static struct otg_io_access_ops musb_ulpi_access = { |
| @@ -451,10 +451,6 @@ void musb_hnp_stop(struct musb *musb) | |||
| 451 | * @param power | 451 | * @param power |
| 452 | */ | 452 | */ |
| 453 | 453 | ||
| 454 | #define STAGE0_MASK (MUSB_INTR_RESUME | MUSB_INTR_SESSREQ \ | ||
| 455 | | MUSB_INTR_VBUSERROR | MUSB_INTR_CONNECT \ | ||
| 456 | | MUSB_INTR_RESET) | ||
| 457 | |||
| 458 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | 454 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
| 459 | u8 devctl, u8 power) | 455 | u8 devctl, u8 power) |
| 460 | { | 456 | { |
| @@ -642,7 +638,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 642 | handled = IRQ_HANDLED; | 638 | handled = IRQ_HANDLED; |
| 643 | } | 639 | } |
| 644 | 640 | ||
| 645 | 641 | #endif | |
| 646 | if (int_usb & MUSB_INTR_SUSPEND) { | 642 | if (int_usb & MUSB_INTR_SUSPEND) { |
| 647 | DBG(1, "SUSPEND (%s) devctl %02x power %02x\n", | 643 | DBG(1, "SUSPEND (%s) devctl %02x power %02x\n", |
| 648 | otg_state_string(musb), devctl, power); | 644 | otg_state_string(musb), devctl, power); |
| @@ -705,6 +701,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 705 | } | 701 | } |
| 706 | } | 702 | } |
| 707 | 703 | ||
| 704 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | ||
| 708 | if (int_usb & MUSB_INTR_CONNECT) { | 705 | if (int_usb & MUSB_INTR_CONNECT) { |
| 709 | struct usb_hcd *hcd = musb_to_hcd(musb); | 706 | struct usb_hcd *hcd = musb_to_hcd(musb); |
| 710 | void __iomem *mbase = musb->mregs; | 707 | void __iomem *mbase = musb->mregs; |
| @@ -1597,7 +1594,7 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
| 1597 | /* the core can interrupt us for multiple reasons; docs have | 1594 | /* the core can interrupt us for multiple reasons; docs have |
| 1598 | * a generic interrupt flowchart to follow | 1595 | * a generic interrupt flowchart to follow |
| 1599 | */ | 1596 | */ |
| 1600 | if (musb->int_usb & STAGE0_MASK) | 1597 | if (musb->int_usb) |
| 1601 | retval |= musb_stage0_irq(musb, musb->int_usb, | 1598 | retval |= musb_stage0_irq(musb, musb->int_usb, |
| 1602 | devctl, power); | 1599 | devctl, power); |
| 1603 | 1600 | ||
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index b22d02dea7d3..91d67794e350 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
| @@ -470,7 +470,8 @@ struct musb_csr_regs { | |||
| 470 | 470 | ||
| 471 | struct musb_context_registers { | 471 | struct musb_context_registers { |
| 472 | 472 | ||
| 473 | #ifdef CONFIG_PM | 473 | #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ |
| 474 | defined(CONFIG_ARCH_OMAP4) | ||
| 474 | u32 otg_sysconfig, otg_forcestandby; | 475 | u32 otg_sysconfig, otg_forcestandby; |
| 475 | #endif | 476 | #endif |
| 476 | u8 power; | 477 | u8 power; |
| @@ -484,7 +485,8 @@ struct musb_context_registers { | |||
| 484 | struct musb_csr_regs index_regs[MUSB_C_NUM_EPS]; | 485 | struct musb_csr_regs index_regs[MUSB_C_NUM_EPS]; |
| 485 | }; | 486 | }; |
| 486 | 487 | ||
| 487 | #ifdef CONFIG_PM | 488 | #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ |
| 489 | defined(CONFIG_ARCH_OMAP4) | ||
| 488 | extern void musb_platform_save_context(struct musb *musb, | 490 | extern void musb_platform_save_context(struct musb *musb, |
| 489 | struct musb_context_registers *musb_context); | 491 | struct musb_context_registers *musb_context); |
| 490 | extern void musb_platform_restore_context(struct musb *musb, | 492 | extern void musb_platform_restore_context(struct musb *musb, |
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 1008044a3bbc..dc66e4376d49 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c | |||
| @@ -132,18 +132,9 @@ static void configure_channel(struct dma_channel *channel, | |||
| 132 | if (mode) { | 132 | if (mode) { |
| 133 | csr |= 1 << MUSB_HSDMA_MODE1_SHIFT; | 133 | csr |= 1 << MUSB_HSDMA_MODE1_SHIFT; |
| 134 | BUG_ON(len < packet_sz); | 134 | BUG_ON(len < packet_sz); |
| 135 | |||
| 136 | if (packet_sz >= 64) { | ||
| 137 | csr |= MUSB_HSDMA_BURSTMODE_INCR16 | ||
| 138 | << MUSB_HSDMA_BURSTMODE_SHIFT; | ||
| 139 | } else if (packet_sz >= 32) { | ||
| 140 | csr |= MUSB_HSDMA_BURSTMODE_INCR8 | ||
| 141 | << MUSB_HSDMA_BURSTMODE_SHIFT; | ||
| 142 | } else if (packet_sz >= 16) { | ||
| 143 | csr |= MUSB_HSDMA_BURSTMODE_INCR4 | ||
| 144 | << MUSB_HSDMA_BURSTMODE_SHIFT; | ||
| 145 | } | ||
| 146 | } | 135 | } |
| 136 | csr |= MUSB_HSDMA_BURSTMODE_INCR16 | ||
| 137 | << MUSB_HSDMA_BURSTMODE_SHIFT; | ||
| 147 | 138 | ||
| 148 | csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT) | 139 | csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT) |
| 149 | | (1 << MUSB_HSDMA_ENABLE_SHIFT) | 140 | | (1 << MUSB_HSDMA_ENABLE_SHIFT) |
diff --git a/drivers/usb/otg/ulpi.c b/drivers/usb/otg/ulpi.c index b1b346932946..d331b222ad21 100644 --- a/drivers/usb/otg/ulpi.c +++ b/drivers/usb/otg/ulpi.c | |||
| @@ -59,12 +59,17 @@ static int ulpi_set_flags(struct otg_transceiver *otg) | |||
| 59 | 59 | ||
| 60 | static int ulpi_init(struct otg_transceiver *otg) | 60 | static int ulpi_init(struct otg_transceiver *otg) |
| 61 | { | 61 | { |
| 62 | int i, vid, pid; | 62 | int i, vid, pid, ret; |
| 63 | 63 | u32 ulpi_id = 0; | |
| 64 | vid = (otg_io_read(otg, ULPI_VENDOR_ID_HIGH) << 8) | | 64 | |
| 65 | otg_io_read(otg, ULPI_VENDOR_ID_LOW); | 65 | for (i = 0; i < 4; i++) { |
| 66 | pid = (otg_io_read(otg, ULPI_PRODUCT_ID_HIGH) << 8) | | 66 | ret = otg_io_read(otg, ULPI_PRODUCT_ID_HIGH - i); |
| 67 | otg_io_read(otg, ULPI_PRODUCT_ID_LOW); | 67 | if (ret < 0) |
| 68 | return ret; | ||
| 69 | ulpi_id = (ulpi_id << 8) | ret; | ||
| 70 | } | ||
| 71 | vid = ulpi_id & 0xffff; | ||
| 72 | pid = ulpi_id >> 16; | ||
| 68 | 73 | ||
| 69 | pr_info("ULPI transceiver vendor/product ID 0x%04x/0x%04x\n", vid, pid); | 74 | pr_info("ULPI transceiver vendor/product ID 0x%04x/0x%04x\n", vid, pid); |
| 70 | 75 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 79dd1ae195e5..da7e334b0407 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -653,7 +653,6 @@ static struct usb_device_id id_table_combined [] = { | |||
| 653 | { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, | 653 | { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, |
| 654 | { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, | 654 | { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, |
| 655 | { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, | 655 | { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, |
| 656 | { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, | ||
| 657 | { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, | 656 | { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, |
| 658 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, | 657 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, |
| 659 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, | 658 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 94d86c3febcb..bbc159a1df45 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -501,13 +501,6 @@ | |||
| 501 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ | 501 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ |
| 502 | 502 | ||
| 503 | /* | 503 | /* |
| 504 | * Contec products (http://www.contec.com) | ||
| 505 | * Submitted by Daniel Sangorrin | ||
| 506 | */ | ||
| 507 | #define CONTEC_VID 0x06CE /* Vendor ID */ | ||
| 508 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ | ||
| 509 | |||
| 510 | /* | ||
| 511 | * Definitions for B&B Electronics products. | 504 | * Definitions for B&B Electronics products. |
| 512 | */ | 505 | */ |
| 513 | #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ | 506 | #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 04bb759536bb..93d72eb8cafc 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
| @@ -139,6 +139,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
| 139 | "Could not set interface, error %d\n", | 139 | "Could not set interface, error %d\n", |
| 140 | retval); | 140 | retval); |
| 141 | retval = -ENODEV; | 141 | retval = -ENODEV; |
| 142 | kfree(data); | ||
| 142 | } | 143 | } |
| 143 | return retval; | 144 | return retval; |
| 144 | } | 145 | } |
| @@ -155,6 +156,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
| 155 | "Could not set interface, error %d\n", | 156 | "Could not set interface, error %d\n", |
| 156 | retval); | 157 | retval); |
| 157 | retval = -ENODEV; | 158 | retval = -ENODEV; |
| 159 | kfree(data); | ||
| 158 | } | 160 | } |
| 159 | return retval; | 161 | return retval; |
| 160 | } | 162 | } |
| @@ -163,6 +165,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
| 163 | default: | 165 | default: |
| 164 | dev_err(&serial->dev->dev, | 166 | dev_err(&serial->dev->dev, |
| 165 | "unknown number of interfaces: %d\n", nintf); | 167 | "unknown number of interfaces: %d\n", nintf); |
| 168 | kfree(data); | ||
| 166 | return -ENODEV; | 169 | return -ENODEV; |
| 167 | } | 170 | } |
| 168 | 171 | ||
diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c index 76e7dac6f259..70b1d9d51c96 100644 --- a/drivers/video/geode/gxfb_core.c +++ b/drivers/video/geode/gxfb_core.c | |||
| @@ -40,7 +40,7 @@ static int vram; | |||
| 40 | static int vt_switch; | 40 | static int vt_switch; |
| 41 | 41 | ||
| 42 | /* Modes relevant to the GX (taken from modedb.c) */ | 42 | /* Modes relevant to the GX (taken from modedb.c) */ |
| 43 | static struct fb_videomode gx_modedb[] __initdata = { | 43 | static struct fb_videomode gx_modedb[] __devinitdata = { |
| 44 | /* 640x480-60 VESA */ | 44 | /* 640x480-60 VESA */ |
| 45 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, | 45 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, |
| 46 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, | 46 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, |
| @@ -110,14 +110,15 @@ static struct fb_videomode gx_modedb[] __initdata = { | |||
| 110 | #ifdef CONFIG_OLPC | 110 | #ifdef CONFIG_OLPC |
| 111 | #include <asm/olpc.h> | 111 | #include <asm/olpc.h> |
| 112 | 112 | ||
| 113 | static struct fb_videomode gx_dcon_modedb[] __initdata = { | 113 | static struct fb_videomode gx_dcon_modedb[] __devinitdata = { |
| 114 | /* The only mode the DCON has is 1200x900 */ | 114 | /* The only mode the DCON has is 1200x900 */ |
| 115 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | 115 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, |
| 116 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 116 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| 117 | FB_VMODE_NONINTERLACED, 0 } | 117 | FB_VMODE_NONINTERLACED, 0 } |
| 118 | }; | 118 | }; |
| 119 | 119 | ||
| 120 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 120 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 121 | unsigned int *size) | ||
| 121 | { | 122 | { |
| 122 | if (olpc_has_dcon()) { | 123 | if (olpc_has_dcon()) { |
| 123 | *modedb = (struct fb_videomode *) gx_dcon_modedb; | 124 | *modedb = (struct fb_videomode *) gx_dcon_modedb; |
| @@ -129,7 +130,8 @@ static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | |||
| 129 | } | 130 | } |
| 130 | 131 | ||
| 131 | #else | 132 | #else |
| 132 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 133 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 134 | unsigned int *size) | ||
| 133 | { | 135 | { |
| 134 | *modedb = (struct fb_videomode *) gx_modedb; | 136 | *modedb = (struct fb_videomode *) gx_modedb; |
| 135 | *size = ARRAY_SIZE(gx_modedb); | 137 | *size = ARRAY_SIZE(gx_modedb); |
| @@ -226,7 +228,8 @@ static int gxfb_blank(int blank_mode, struct fb_info *info) | |||
| 226 | return gx_blank_display(info, blank_mode); | 228 | return gx_blank_display(info, blank_mode); |
| 227 | } | 229 | } |
| 228 | 230 | ||
| 229 | static int __init gxfb_map_video_memory(struct fb_info *info, struct pci_dev *dev) | 231 | static int __devinit gxfb_map_video_memory(struct fb_info *info, |
| 232 | struct pci_dev *dev) | ||
| 230 | { | 233 | { |
| 231 | struct gxfb_par *par = info->par; | 234 | struct gxfb_par *par = info->par; |
| 232 | int ret; | 235 | int ret; |
| @@ -290,7 +293,7 @@ static struct fb_ops gxfb_ops = { | |||
| 290 | .fb_imageblit = cfb_imageblit, | 293 | .fb_imageblit = cfb_imageblit, |
| 291 | }; | 294 | }; |
| 292 | 295 | ||
| 293 | static struct fb_info * __init gxfb_init_fbinfo(struct device *dev) | 296 | static struct fb_info *__devinit gxfb_init_fbinfo(struct device *dev) |
| 294 | { | 297 | { |
| 295 | struct gxfb_par *par; | 298 | struct gxfb_par *par; |
| 296 | struct fb_info *info; | 299 | struct fb_info *info; |
| @@ -371,7 +374,8 @@ static int gxfb_resume(struct pci_dev *pdev) | |||
| 371 | } | 374 | } |
| 372 | #endif | 375 | #endif |
| 373 | 376 | ||
| 374 | static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 377 | static int __devinit gxfb_probe(struct pci_dev *pdev, |
| 378 | const struct pci_device_id *id) | ||
| 375 | { | 379 | { |
| 376 | struct gxfb_par *par; | 380 | struct gxfb_par *par; |
| 377 | struct fb_info *info; | 381 | struct fb_info *info; |
| @@ -451,7 +455,7 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i | |||
| 451 | return ret; | 455 | return ret; |
| 452 | } | 456 | } |
| 453 | 457 | ||
| 454 | static void gxfb_remove(struct pci_dev *pdev) | 458 | static void __devexit gxfb_remove(struct pci_dev *pdev) |
| 455 | { | 459 | { |
| 456 | struct fb_info *info = pci_get_drvdata(pdev); | 460 | struct fb_info *info = pci_get_drvdata(pdev); |
| 457 | struct gxfb_par *par = info->par; | 461 | struct gxfb_par *par = info->par; |
diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c index 1a18da86d3fa..39bdbedf43b4 100644 --- a/drivers/video/geode/lxfb_core.c +++ b/drivers/video/geode/lxfb_core.c | |||
| @@ -35,7 +35,7 @@ static int vt_switch; | |||
| 35 | * we try to make it something sane - 640x480-60 is sane | 35 | * we try to make it something sane - 640x480-60 is sane |
| 36 | */ | 36 | */ |
| 37 | 37 | ||
| 38 | static struct fb_videomode geode_modedb[] __initdata = { | 38 | static struct fb_videomode geode_modedb[] __devinitdata = { |
| 39 | /* 640x480-60 */ | 39 | /* 640x480-60 */ |
| 40 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, | 40 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, |
| 41 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 41 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| @@ -219,14 +219,15 @@ static struct fb_videomode geode_modedb[] __initdata = { | |||
| 219 | #ifdef CONFIG_OLPC | 219 | #ifdef CONFIG_OLPC |
| 220 | #include <asm/olpc.h> | 220 | #include <asm/olpc.h> |
| 221 | 221 | ||
| 222 | static struct fb_videomode olpc_dcon_modedb[] __initdata = { | 222 | static struct fb_videomode olpc_dcon_modedb[] __devinitdata = { |
| 223 | /* The only mode the DCON has is 1200x900 */ | 223 | /* The only mode the DCON has is 1200x900 */ |
| 224 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | 224 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, |
| 225 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 225 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| 226 | FB_VMODE_NONINTERLACED, 0 } | 226 | FB_VMODE_NONINTERLACED, 0 } |
| 227 | }; | 227 | }; |
| 228 | 228 | ||
| 229 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 229 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 230 | unsigned int *size) | ||
| 230 | { | 231 | { |
| 231 | if (olpc_has_dcon()) { | 232 | if (olpc_has_dcon()) { |
| 232 | *modedb = (struct fb_videomode *) olpc_dcon_modedb; | 233 | *modedb = (struct fb_videomode *) olpc_dcon_modedb; |
| @@ -238,7 +239,8 @@ static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | |||
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | #else | 241 | #else |
| 241 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 242 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 243 | unsigned int *size) | ||
| 242 | { | 244 | { |
| 243 | *modedb = (struct fb_videomode *) geode_modedb; | 245 | *modedb = (struct fb_videomode *) geode_modedb; |
| 244 | *size = ARRAY_SIZE(geode_modedb); | 246 | *size = ARRAY_SIZE(geode_modedb); |
| @@ -334,7 +336,7 @@ static int lxfb_blank(int blank_mode, struct fb_info *info) | |||
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | 338 | ||
| 337 | static int __init lxfb_map_video_memory(struct fb_info *info, | 339 | static int __devinit lxfb_map_video_memory(struct fb_info *info, |
| 338 | struct pci_dev *dev) | 340 | struct pci_dev *dev) |
| 339 | { | 341 | { |
| 340 | struct lxfb_par *par = info->par; | 342 | struct lxfb_par *par = info->par; |
| @@ -412,7 +414,7 @@ static struct fb_ops lxfb_ops = { | |||
| 412 | .fb_imageblit = cfb_imageblit, | 414 | .fb_imageblit = cfb_imageblit, |
| 413 | }; | 415 | }; |
| 414 | 416 | ||
| 415 | static struct fb_info * __init lxfb_init_fbinfo(struct device *dev) | 417 | static struct fb_info * __devinit lxfb_init_fbinfo(struct device *dev) |
| 416 | { | 418 | { |
| 417 | struct lxfb_par *par; | 419 | struct lxfb_par *par; |
| 418 | struct fb_info *info; | 420 | struct fb_info *info; |
| @@ -496,7 +498,7 @@ static int lxfb_resume(struct pci_dev *pdev) | |||
| 496 | #define lxfb_resume NULL | 498 | #define lxfb_resume NULL |
| 497 | #endif | 499 | #endif |
| 498 | 500 | ||
| 499 | static int __init lxfb_probe(struct pci_dev *pdev, | 501 | static int __devinit lxfb_probe(struct pci_dev *pdev, |
| 500 | const struct pci_device_id *id) | 502 | const struct pci_device_id *id) |
| 501 | { | 503 | { |
| 502 | struct lxfb_par *par; | 504 | struct lxfb_par *par; |
| @@ -588,7 +590,7 @@ err: | |||
| 588 | return ret; | 590 | return ret; |
| 589 | } | 591 | } |
| 590 | 592 | ||
| 591 | static void lxfb_remove(struct pci_dev *pdev) | 593 | static void __devexit lxfb_remove(struct pci_dev *pdev) |
| 592 | { | 594 | { |
| 593 | struct fb_info *info = pci_get_drvdata(pdev); | 595 | struct fb_info *info = pci_get_drvdata(pdev); |
| 594 | struct lxfb_par *par = info->par; | 596 | struct lxfb_par *par = info->par; |
diff --git a/drivers/video/nuc900fb.c b/drivers/video/nuc900fb.c index d4cde79ea15e..81687ed26ba9 100644 --- a/drivers/video/nuc900fb.c +++ b/drivers/video/nuc900fb.c | |||
| @@ -596,8 +596,6 @@ static int __devinit nuc900fb_probe(struct platform_device *pdev) | |||
| 596 | goto release_regs; | 596 | goto release_regs; |
| 597 | } | 597 | } |
| 598 | 598 | ||
| 599 | nuc900_driver_clksrc_div(&pdev->dev, "ext", 0x2); | ||
| 600 | |||
| 601 | fbi->clk = clk_get(&pdev->dev, NULL); | 599 | fbi->clk = clk_get(&pdev->dev, NULL); |
| 602 | if (!fbi->clk || IS_ERR(fbi->clk)) { | 600 | if (!fbi->clk || IS_ERR(fbi->clk)) { |
| 603 | printk(KERN_ERR "nuc900-lcd:failed to get lcd clock source\n"); | 601 | printk(KERN_ERR "nuc900-lcd:failed to get lcd clock source\n"); |
diff --git a/drivers/video/omap/lcdc.c b/drivers/video/omap/lcdc.c index 43ab7d8b66b2..7767338f8b14 100644 --- a/drivers/video/omap/lcdc.c +++ b/drivers/video/omap/lcdc.c | |||
| @@ -572,22 +572,12 @@ static enum omapfb_update_mode omap_lcdc_get_update_mode(void) | |||
| 572 | /* PM code called only in internal controller mode */ | 572 | /* PM code called only in internal controller mode */ |
| 573 | static void omap_lcdc_suspend(void) | 573 | static void omap_lcdc_suspend(void) |
| 574 | { | 574 | { |
| 575 | if (lcdc.update_mode == OMAPFB_AUTO_UPDATE) { | 575 | omap_lcdc_set_update_mode(OMAPFB_UPDATE_DISABLED); |
| 576 | disable_controller(); | ||
| 577 | omap_stop_lcd_dma(); | ||
| 578 | } | ||
| 579 | } | 576 | } |
| 580 | 577 | ||
| 581 | static void omap_lcdc_resume(void) | 578 | static void omap_lcdc_resume(void) |
| 582 | { | 579 | { |
| 583 | if (lcdc.update_mode == OMAPFB_AUTO_UPDATE) { | 580 | omap_lcdc_set_update_mode(OMAPFB_AUTO_UPDATE); |
| 584 | setup_regs(); | ||
| 585 | load_palette(); | ||
| 586 | setup_lcd_dma(); | ||
| 587 | set_load_mode(OMAP_LCDC_LOAD_FRAME); | ||
| 588 | enable_irqs(OMAP_LCDC_IRQ_DONE); | ||
| 589 | enable_controller(); | ||
| 590 | } | ||
| 591 | } | 581 | } |
| 592 | 582 | ||
| 593 | static void omap_lcdc_get_caps(int plane, struct omapfb_caps *caps) | 583 | static void omap_lcdc_get_caps(int plane, struct omapfb_caps *caps) |
diff --git a/drivers/video/omap/rfbi.c b/drivers/video/omap/rfbi.c index 1162603c72e5..eada9f12efc7 100644 --- a/drivers/video/omap/rfbi.c +++ b/drivers/video/omap/rfbi.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
| 28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
| 29 | #include <linux/platform_device.h> | ||
| 29 | 30 | ||
| 30 | #include "omapfb.h" | 31 | #include "omapfb.h" |
| 31 | #include "dispc.h" | 32 | #include "dispc.h" |
| @@ -83,13 +84,13 @@ static inline u32 rfbi_read_reg(int idx) | |||
| 83 | 84 | ||
| 84 | static int rfbi_get_clocks(void) | 85 | static int rfbi_get_clocks(void) |
| 85 | { | 86 | { |
| 86 | rfbi.dss_ick = clk_get(&dispc.fbdev->dssdev->dev, "ick"); | 87 | rfbi.dss_ick = clk_get(&rfbi.fbdev->dssdev->dev, "ick"); |
| 87 | if (IS_ERR(rfbi.dss_ick)) { | 88 | if (IS_ERR(rfbi.dss_ick)) { |
| 88 | dev_err(rfbi.fbdev->dev, "can't get ick\n"); | 89 | dev_err(rfbi.fbdev->dev, "can't get ick\n"); |
| 89 | return PTR_ERR(rfbi.dss_ick); | 90 | return PTR_ERR(rfbi.dss_ick); |
| 90 | } | 91 | } |
| 91 | 92 | ||
| 92 | rfbi.dss1_fck = clk_get(&dispc.fbdev->dssdev->dev, "dss1_fck"); | 93 | rfbi.dss1_fck = clk_get(&rfbi.fbdev->dssdev->dev, "dss1_fck"); |
| 93 | if (IS_ERR(rfbi.dss1_fck)) { | 94 | if (IS_ERR(rfbi.dss1_fck)) { |
| 94 | dev_err(rfbi.fbdev->dev, "can't get dss1_fck\n"); | 95 | dev_err(rfbi.fbdev->dev, "can't get dss1_fck\n"); |
| 95 | clk_put(rfbi.dss_ick); | 96 | clk_put(rfbi.dss_ick); |
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 95896f387927..ef8d9d558fc7 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
| @@ -636,6 +636,9 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev, | |||
| 636 | INIT_LIST_HEAD(&vp_dev->virtqueues); | 636 | INIT_LIST_HEAD(&vp_dev->virtqueues); |
| 637 | spin_lock_init(&vp_dev->lock); | 637 | spin_lock_init(&vp_dev->lock); |
| 638 | 638 | ||
| 639 | /* Disable MSI/MSIX to bring device to a known good state. */ | ||
| 640 | pci_msi_off(pci_dev); | ||
| 641 | |||
| 639 | /* enable the device */ | 642 | /* enable the device */ |
| 640 | err = pci_enable_device(pci_dev); | 643 | err = pci_enable_device(pci_dev); |
| 641 | if (err) | 644 | if (err) |
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 1ca88908723b..afe7e21dd0ae 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
| @@ -119,7 +119,7 @@ static int vring_add_indirect(struct vring_virtqueue *vq, | |||
| 119 | 119 | ||
| 120 | desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp); | 120 | desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp); |
| 121 | if (!desc) | 121 | if (!desc) |
| 122 | return vq->vring.num; | 122 | return -ENOMEM; |
| 123 | 123 | ||
| 124 | /* Transfer entries from the sg list into the indirect page */ | 124 | /* Transfer entries from the sg list into the indirect page */ |
| 125 | for (i = 0; i < out; i++) { | 125 | for (i = 0; i < out; i++) { |
diff --git a/drivers/watchdog/at32ap700x_wdt.c b/drivers/watchdog/at32ap700x_wdt.c index 1cddf92cb9a6..750bc5281d79 100644 --- a/drivers/watchdog/at32ap700x_wdt.c +++ b/drivers/watchdog/at32ap700x_wdt.c | |||
| @@ -346,9 +346,13 @@ static int __init at32_wdt_probe(struct platform_device *pdev) | |||
| 346 | } else { | 346 | } else { |
| 347 | wdt->users = 0; | 347 | wdt->users = 0; |
| 348 | } | 348 | } |
| 349 | wdt->miscdev.minor = WATCHDOG_MINOR; | 349 | |
| 350 | wdt->miscdev.name = "watchdog"; | 350 | wdt->miscdev.minor = WATCHDOG_MINOR; |
| 351 | wdt->miscdev.fops = &at32_wdt_fops; | 351 | wdt->miscdev.name = "watchdog"; |
| 352 | wdt->miscdev.fops = &at32_wdt_fops; | ||
| 353 | wdt->miscdev.parent = &pdev->dev; | ||
| 354 | |||
| 355 | platform_set_drvdata(pdev, wdt); | ||
| 352 | 356 | ||
| 353 | if (at32_wdt_settimeout(timeout)) { | 357 | if (at32_wdt_settimeout(timeout)) { |
| 354 | at32_wdt_settimeout(TIMEOUT_DEFAULT); | 358 | at32_wdt_settimeout(TIMEOUT_DEFAULT); |
| @@ -360,17 +364,17 @@ static int __init at32_wdt_probe(struct platform_device *pdev) | |||
| 360 | ret = misc_register(&wdt->miscdev); | 364 | ret = misc_register(&wdt->miscdev); |
| 361 | if (ret) { | 365 | if (ret) { |
| 362 | dev_dbg(&pdev->dev, "failed to register wdt miscdev\n"); | 366 | dev_dbg(&pdev->dev, "failed to register wdt miscdev\n"); |
| 363 | goto err_iounmap; | 367 | goto err_register; |
| 364 | } | 368 | } |
| 365 | 369 | ||
| 366 | platform_set_drvdata(pdev, wdt); | ||
| 367 | wdt->miscdev.parent = &pdev->dev; | ||
| 368 | dev_info(&pdev->dev, | 370 | dev_info(&pdev->dev, |
| 369 | "AT32AP700X WDT at 0x%p, timeout %d sec (nowayout=%d)\n", | 371 | "AT32AP700X WDT at 0x%p, timeout %d sec (nowayout=%d)\n", |
| 370 | wdt->regs, wdt->timeout, nowayout); | 372 | wdt->regs, wdt->timeout, nowayout); |
| 371 | 373 | ||
| 372 | return 0; | 374 | return 0; |
| 373 | 375 | ||
| 376 | err_register: | ||
| 377 | platform_set_drvdata(pdev, NULL); | ||
| 374 | err_iounmap: | 378 | err_iounmap: |
| 375 | iounmap(wdt->regs); | 379 | iounmap(wdt->regs); |
| 376 | err_free: | 380 | err_free: |
diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c index ea25885781bb..2ee7dac55a3c 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c | |||
| @@ -330,7 +330,6 @@ static void imx2_wdt_shutdown(struct platform_device *pdev) | |||
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | static struct platform_driver imx2_wdt_driver = { | 332 | static struct platform_driver imx2_wdt_driver = { |
| 333 | .probe = imx2_wdt_probe, | ||
| 334 | .remove = __exit_p(imx2_wdt_remove), | 333 | .remove = __exit_p(imx2_wdt_remove), |
| 335 | .shutdown = imx2_wdt_shutdown, | 334 | .shutdown = imx2_wdt_shutdown, |
| 336 | .driver = { | 335 | .driver = { |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index b6ab27ccf214..811384bec8de 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -68,11 +68,7 @@ | |||
| 68 | * Here we can be a bit looser than the data sections since this | 68 | * Here we can be a bit looser than the data sections since this |
| 69 | * needs to only meet arch ABI requirements. | 69 | * needs to only meet arch ABI requirements. |
| 70 | */ | 70 | */ |
| 71 | #ifdef ARCH_SLAB_MINALIGN | 71 | #define FLAT_STACK_ALIGN max_t(unsigned long, sizeof(void *), ARCH_SLAB_MINALIGN) |
| 72 | #define FLAT_STACK_ALIGN (ARCH_SLAB_MINALIGN) | ||
| 73 | #else | ||
| 74 | #define FLAT_STACK_ALIGN (sizeof(void *)) | ||
| 75 | #endif | ||
| 76 | 72 | ||
| 77 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ | 73 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ |
| 78 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ | 74 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 78c02eb4cb1f..484e52bb40bb 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -473,14 +473,24 @@ static int cifs_remount(struct super_block *sb, int *flags, char *data) | |||
| 473 | return 0; | 473 | return 0; |
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | void cifs_drop_inode(struct inode *inode) | ||
| 477 | { | ||
| 478 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | ||
| 479 | |||
| 480 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) | ||
| 481 | return generic_drop_inode(inode); | ||
| 482 | |||
| 483 | return generic_delete_inode(inode); | ||
| 484 | } | ||
| 485 | |||
| 476 | static const struct super_operations cifs_super_ops = { | 486 | static const struct super_operations cifs_super_ops = { |
| 477 | .put_super = cifs_put_super, | 487 | .put_super = cifs_put_super, |
| 478 | .statfs = cifs_statfs, | 488 | .statfs = cifs_statfs, |
| 479 | .alloc_inode = cifs_alloc_inode, | 489 | .alloc_inode = cifs_alloc_inode, |
| 480 | .destroy_inode = cifs_destroy_inode, | 490 | .destroy_inode = cifs_destroy_inode, |
| 481 | /* .drop_inode = generic_delete_inode, | 491 | .drop_inode = cifs_drop_inode, |
| 482 | .delete_inode = cifs_delete_inode, */ /* Do not need above two | 492 | /* .delete_inode = cifs_delete_inode, */ /* Do not need above |
| 483 | functions unless later we add lazy close of inodes or unless the | 493 | function unless later we add lazy close of inodes or unless the |
| 484 | kernel forgets to call us with the same number of releases (closes) | 494 | kernel forgets to call us with the same number of releases (closes) |
| 485 | as opens */ | 495 | as opens */ |
| 486 | .show_options = cifs_show_options, | 496 | .show_options = cifs_show_options, |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index fb1657e0fdb8..fb6318b81509 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -106,7 +106,6 @@ extern struct cifsFileInfo *cifs_new_fileinfo(struct inode *newinode, | |||
| 106 | __u16 fileHandle, struct file *file, | 106 | __u16 fileHandle, struct file *file, |
| 107 | struct vfsmount *mnt, unsigned int oflags); | 107 | struct vfsmount *mnt, unsigned int oflags); |
| 108 | extern int cifs_posix_open(char *full_path, struct inode **pinode, | 108 | extern int cifs_posix_open(char *full_path, struct inode **pinode, |
| 109 | struct vfsmount *mnt, | ||
| 110 | struct super_block *sb, | 109 | struct super_block *sb, |
| 111 | int mode, int oflags, | 110 | int mode, int oflags, |
| 112 | __u32 *poplock, __u16 *pnetfid, int xid); | 111 | __u32 *poplock, __u16 *pnetfid, int xid); |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 391816b461ca..e7ae78b66fa1 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
| 26 | #include <linux/namei.h> | 26 | #include <linux/namei.h> |
| 27 | #include <linux/mount.h> | 27 | #include <linux/mount.h> |
| 28 | #include <linux/file.h> | ||
| 28 | #include "cifsfs.h" | 29 | #include "cifsfs.h" |
| 29 | #include "cifspdu.h" | 30 | #include "cifspdu.h" |
| 30 | #include "cifsglob.h" | 31 | #include "cifsglob.h" |
| @@ -184,12 +185,13 @@ cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, | |||
| 184 | } | 185 | } |
| 185 | write_unlock(&GlobalSMBSeslock); | 186 | write_unlock(&GlobalSMBSeslock); |
| 186 | 187 | ||
| 188 | file->private_data = pCifsFile; | ||
| 189 | |||
| 187 | return pCifsFile; | 190 | return pCifsFile; |
| 188 | } | 191 | } |
| 189 | 192 | ||
| 190 | int cifs_posix_open(char *full_path, struct inode **pinode, | 193 | int cifs_posix_open(char *full_path, struct inode **pinode, |
| 191 | struct vfsmount *mnt, struct super_block *sb, | 194 | struct super_block *sb, int mode, int oflags, |
| 192 | int mode, int oflags, | ||
| 193 | __u32 *poplock, __u16 *pnetfid, int xid) | 195 | __u32 *poplock, __u16 *pnetfid, int xid) |
| 194 | { | 196 | { |
| 195 | int rc; | 197 | int rc; |
| @@ -258,19 +260,6 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | |||
| 258 | cifs_fattr_to_inode(*pinode, &fattr); | 260 | cifs_fattr_to_inode(*pinode, &fattr); |
| 259 | } | 261 | } |
| 260 | 262 | ||
| 261 | /* | ||
| 262 | * cifs_fill_filedata() takes care of setting cifsFileInfo pointer to | ||
| 263 | * file->private_data. | ||
| 264 | */ | ||
| 265 | if (mnt) { | ||
| 266 | struct cifsFileInfo *pfile_info; | ||
| 267 | |||
| 268 | pfile_info = cifs_new_fileinfo(*pinode, *pnetfid, NULL, mnt, | ||
| 269 | oflags); | ||
| 270 | if (pfile_info == NULL) | ||
| 271 | rc = -ENOMEM; | ||
| 272 | } | ||
| 273 | |||
| 274 | posix_open_ret: | 263 | posix_open_ret: |
| 275 | kfree(presp_data); | 264 | kfree(presp_data); |
| 276 | return rc; | 265 | return rc; |
| @@ -298,7 +287,6 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 298 | int create_options = CREATE_NOT_DIR; | 287 | int create_options = CREATE_NOT_DIR; |
| 299 | __u32 oplock = 0; | 288 | __u32 oplock = 0; |
| 300 | int oflags; | 289 | int oflags; |
| 301 | bool posix_create = false; | ||
| 302 | /* | 290 | /* |
| 303 | * BB below access is probably too much for mknod to request | 291 | * BB below access is probably too much for mknod to request |
| 304 | * but we have to do query and setpathinfo so requesting | 292 | * but we have to do query and setpathinfo so requesting |
| @@ -339,7 +327,6 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 339 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & | 327 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & |
| 340 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { | 328 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { |
| 341 | rc = cifs_posix_open(full_path, &newinode, | 329 | rc = cifs_posix_open(full_path, &newinode, |
| 342 | nd ? nd->path.mnt : NULL, | ||
| 343 | inode->i_sb, mode, oflags, &oplock, &fileHandle, xid); | 330 | inode->i_sb, mode, oflags, &oplock, &fileHandle, xid); |
| 344 | /* EIO could indicate that (posix open) operation is not | 331 | /* EIO could indicate that (posix open) operation is not |
| 345 | supported, despite what server claimed in capability | 332 | supported, despite what server claimed in capability |
| @@ -347,7 +334,6 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 347 | handled in posix open */ | 334 | handled in posix open */ |
| 348 | 335 | ||
| 349 | if (rc == 0) { | 336 | if (rc == 0) { |
| 350 | posix_create = true; | ||
| 351 | if (newinode == NULL) /* query inode info */ | 337 | if (newinode == NULL) /* query inode info */ |
| 352 | goto cifs_create_get_file_info; | 338 | goto cifs_create_get_file_info; |
| 353 | else /* success, no need to query */ | 339 | else /* success, no need to query */ |
| @@ -478,21 +464,28 @@ cifs_create_set_dentry: | |||
| 478 | else | 464 | else |
| 479 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); | 465 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); |
| 480 | 466 | ||
| 481 | /* nfsd case - nfs srv does not set nd */ | 467 | if (newinode && nd && (nd->flags & LOOKUP_OPEN)) { |
| 482 | if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) { | ||
| 483 | /* mknod case - do not leave file open */ | ||
| 484 | CIFSSMBClose(xid, tcon, fileHandle); | ||
| 485 | } else if (!(posix_create) && (newinode)) { | ||
| 486 | struct cifsFileInfo *pfile_info; | 468 | struct cifsFileInfo *pfile_info; |
| 487 | /* | 469 | struct file *filp; |
| 488 | * cifs_fill_filedata() takes care of setting cifsFileInfo | 470 | |
| 489 | * pointer to file->private_data. | 471 | filp = lookup_instantiate_filp(nd, direntry, generic_file_open); |
| 490 | */ | 472 | if (IS_ERR(filp)) { |
| 491 | pfile_info = cifs_new_fileinfo(newinode, fileHandle, NULL, | 473 | rc = PTR_ERR(filp); |
| 474 | CIFSSMBClose(xid, tcon, fileHandle); | ||
| 475 | goto cifs_create_out; | ||
| 476 | } | ||
| 477 | |||
| 478 | pfile_info = cifs_new_fileinfo(newinode, fileHandle, filp, | ||
| 492 | nd->path.mnt, oflags); | 479 | nd->path.mnt, oflags); |
| 493 | if (pfile_info == NULL) | 480 | if (pfile_info == NULL) { |
| 481 | fput(filp); | ||
| 482 | CIFSSMBClose(xid, tcon, fileHandle); | ||
| 494 | rc = -ENOMEM; | 483 | rc = -ENOMEM; |
| 484 | } | ||
| 485 | } else { | ||
| 486 | CIFSSMBClose(xid, tcon, fileHandle); | ||
| 495 | } | 487 | } |
| 488 | |||
| 496 | cifs_create_out: | 489 | cifs_create_out: |
| 497 | kfree(buf); | 490 | kfree(buf); |
| 498 | kfree(full_path); | 491 | kfree(full_path); |
| @@ -636,6 +629,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 636 | bool posix_open = false; | 629 | bool posix_open = false; |
| 637 | struct cifs_sb_info *cifs_sb; | 630 | struct cifs_sb_info *cifs_sb; |
| 638 | struct cifsTconInfo *pTcon; | 631 | struct cifsTconInfo *pTcon; |
| 632 | struct cifsFileInfo *cfile; | ||
| 639 | struct inode *newInode = NULL; | 633 | struct inode *newInode = NULL; |
| 640 | char *full_path = NULL; | 634 | char *full_path = NULL; |
| 641 | struct file *filp; | 635 | struct file *filp; |
| @@ -703,7 +697,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 703 | if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && | 697 | if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && |
| 704 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && | 698 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && |
| 705 | (nd->intent.open.flags & O_CREAT)) { | 699 | (nd->intent.open.flags & O_CREAT)) { |
| 706 | rc = cifs_posix_open(full_path, &newInode, nd->path.mnt, | 700 | rc = cifs_posix_open(full_path, &newInode, |
| 707 | parent_dir_inode->i_sb, | 701 | parent_dir_inode->i_sb, |
| 708 | nd->intent.open.create_mode, | 702 | nd->intent.open.create_mode, |
| 709 | nd->intent.open.flags, &oplock, | 703 | nd->intent.open.flags, &oplock, |
| @@ -733,8 +727,25 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 733 | else | 727 | else |
| 734 | direntry->d_op = &cifs_dentry_ops; | 728 | direntry->d_op = &cifs_dentry_ops; |
| 735 | d_add(direntry, newInode); | 729 | d_add(direntry, newInode); |
| 736 | if (posix_open) | 730 | if (posix_open) { |
| 737 | filp = lookup_instantiate_filp(nd, direntry, NULL); | 731 | filp = lookup_instantiate_filp(nd, direntry, |
| 732 | generic_file_open); | ||
| 733 | if (IS_ERR(filp)) { | ||
| 734 | rc = PTR_ERR(filp); | ||
| 735 | CIFSSMBClose(xid, pTcon, fileHandle); | ||
| 736 | goto lookup_out; | ||
| 737 | } | ||
| 738 | |||
| 739 | cfile = cifs_new_fileinfo(newInode, fileHandle, filp, | ||
| 740 | nd->path.mnt, | ||
| 741 | nd->intent.open.flags); | ||
| 742 | if (cfile == NULL) { | ||
| 743 | fput(filp); | ||
| 744 | CIFSSMBClose(xid, pTcon, fileHandle); | ||
| 745 | rc = -ENOMEM; | ||
| 746 | goto lookup_out; | ||
| 747 | } | ||
| 748 | } | ||
| 738 | /* since paths are not looked up by component - the parent | 749 | /* since paths are not looked up by component - the parent |
| 739 | directories are presumed to be good here */ | 750 | directories are presumed to be good here */ |
| 740 | renew_parental_timestamps(direntry); | 751 | renew_parental_timestamps(direntry); |
| @@ -755,6 +766,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 755 | is a common return code */ | 766 | is a common return code */ |
| 756 | } | 767 | } |
| 757 | 768 | ||
| 769 | lookup_out: | ||
| 758 | kfree(full_path); | 770 | kfree(full_path); |
| 759 | FreeXid(xid); | 771 | FreeXid(xid); |
| 760 | return ERR_PTR(rc); | 772 | return ERR_PTR(rc); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 75541af4b3db..409e4f523e61 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -162,44 +162,12 @@ psx_client_can_cache: | |||
| 162 | return 0; | 162 | return 0; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | static struct cifsFileInfo * | ||
| 166 | cifs_fill_filedata(struct file *file) | ||
| 167 | { | ||
| 168 | struct list_head *tmp; | ||
| 169 | struct cifsFileInfo *pCifsFile = NULL; | ||
| 170 | struct cifsInodeInfo *pCifsInode = NULL; | ||
| 171 | |||
| 172 | /* search inode for this file and fill in file->private_data */ | ||
| 173 | pCifsInode = CIFS_I(file->f_path.dentry->d_inode); | ||
| 174 | read_lock(&GlobalSMBSeslock); | ||
| 175 | list_for_each(tmp, &pCifsInode->openFileList) { | ||
| 176 | pCifsFile = list_entry(tmp, struct cifsFileInfo, flist); | ||
| 177 | if ((pCifsFile->pfile == NULL) && | ||
| 178 | (pCifsFile->pid == current->tgid)) { | ||
| 179 | /* mode set in cifs_create */ | ||
| 180 | |||
| 181 | /* needed for writepage */ | ||
| 182 | pCifsFile->pfile = file; | ||
| 183 | file->private_data = pCifsFile; | ||
| 184 | break; | ||
| 185 | } | ||
| 186 | } | ||
| 187 | read_unlock(&GlobalSMBSeslock); | ||
| 188 | |||
| 189 | if (file->private_data != NULL) { | ||
| 190 | return pCifsFile; | ||
| 191 | } else if ((file->f_flags & O_CREAT) && (file->f_flags & O_EXCL)) | ||
| 192 | cERROR(1, "could not find file instance for " | ||
| 193 | "new file %p", file); | ||
| 194 | return NULL; | ||
| 195 | } | ||
| 196 | |||
| 197 | /* all arguments to this function must be checked for validity in caller */ | 165 | /* all arguments to this function must be checked for validity in caller */ |
| 198 | static inline int cifs_open_inode_helper(struct inode *inode, struct file *file, | 166 | static inline int cifs_open_inode_helper(struct inode *inode, |
| 199 | struct cifsInodeInfo *pCifsInode, struct cifsFileInfo *pCifsFile, | ||
| 200 | struct cifsTconInfo *pTcon, int *oplock, FILE_ALL_INFO *buf, | 167 | struct cifsTconInfo *pTcon, int *oplock, FILE_ALL_INFO *buf, |
| 201 | char *full_path, int xid) | 168 | char *full_path, int xid) |
| 202 | { | 169 | { |
| 170 | struct cifsInodeInfo *pCifsInode = CIFS_I(inode); | ||
| 203 | struct timespec temp; | 171 | struct timespec temp; |
| 204 | int rc; | 172 | int rc; |
| 205 | 173 | ||
| @@ -213,36 +181,35 @@ static inline int cifs_open_inode_helper(struct inode *inode, struct file *file, | |||
| 213 | /* if not oplocked, invalidate inode pages if mtime or file | 181 | /* if not oplocked, invalidate inode pages if mtime or file |
| 214 | size changed */ | 182 | size changed */ |
| 215 | temp = cifs_NTtimeToUnix(buf->LastWriteTime); | 183 | temp = cifs_NTtimeToUnix(buf->LastWriteTime); |
| 216 | if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) && | 184 | if (timespec_equal(&inode->i_mtime, &temp) && |
| 217 | (file->f_path.dentry->d_inode->i_size == | 185 | (inode->i_size == |
| 218 | (loff_t)le64_to_cpu(buf->EndOfFile))) { | 186 | (loff_t)le64_to_cpu(buf->EndOfFile))) { |
| 219 | cFYI(1, "inode unchanged on server"); | 187 | cFYI(1, "inode unchanged on server"); |
| 220 | } else { | 188 | } else { |
| 221 | if (file->f_path.dentry->d_inode->i_mapping) { | 189 | if (inode->i_mapping) { |
| 222 | /* BB no need to lock inode until after invalidate | 190 | /* BB no need to lock inode until after invalidate |
| 223 | since namei code should already have it locked? */ | 191 | since namei code should already have it locked? */ |
| 224 | rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping); | 192 | rc = filemap_write_and_wait(inode->i_mapping); |
| 225 | if (rc != 0) | 193 | if (rc != 0) |
| 226 | CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc; | 194 | pCifsInode->write_behind_rc = rc; |
| 227 | } | 195 | } |
| 228 | cFYI(1, "invalidating remote inode since open detected it " | 196 | cFYI(1, "invalidating remote inode since open detected it " |
| 229 | "changed"); | 197 | "changed"); |
| 230 | invalidate_remote_inode(file->f_path.dentry->d_inode); | 198 | invalidate_remote_inode(inode); |
| 231 | } | 199 | } |
| 232 | 200 | ||
| 233 | client_can_cache: | 201 | client_can_cache: |
| 234 | if (pTcon->unix_ext) | 202 | if (pTcon->unix_ext) |
| 235 | rc = cifs_get_inode_info_unix(&file->f_path.dentry->d_inode, | 203 | rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb, |
| 236 | full_path, inode->i_sb, xid); | 204 | xid); |
| 237 | else | 205 | else |
| 238 | rc = cifs_get_inode_info(&file->f_path.dentry->d_inode, | 206 | rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb, |
| 239 | full_path, buf, inode->i_sb, xid, NULL); | 207 | xid, NULL); |
| 240 | 208 | ||
| 241 | if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) { | 209 | if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
| 242 | pCifsInode->clientCanCacheAll = true; | 210 | pCifsInode->clientCanCacheAll = true; |
| 243 | pCifsInode->clientCanCacheRead = true; | 211 | pCifsInode->clientCanCacheRead = true; |
| 244 | cFYI(1, "Exclusive Oplock granted on inode %p", | 212 | cFYI(1, "Exclusive Oplock granted on inode %p", inode); |
| 245 | file->f_path.dentry->d_inode); | ||
| 246 | } else if ((*oplock & 0xF) == OPLOCK_READ) | 213 | } else if ((*oplock & 0xF) == OPLOCK_READ) |
| 247 | pCifsInode->clientCanCacheRead = true; | 214 | pCifsInode->clientCanCacheRead = true; |
| 248 | 215 | ||
| @@ -256,7 +223,7 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 256 | __u32 oplock; | 223 | __u32 oplock; |
| 257 | struct cifs_sb_info *cifs_sb; | 224 | struct cifs_sb_info *cifs_sb; |
| 258 | struct cifsTconInfo *tcon; | 225 | struct cifsTconInfo *tcon; |
| 259 | struct cifsFileInfo *pCifsFile; | 226 | struct cifsFileInfo *pCifsFile = NULL; |
| 260 | struct cifsInodeInfo *pCifsInode; | 227 | struct cifsInodeInfo *pCifsInode; |
| 261 | char *full_path = NULL; | 228 | char *full_path = NULL; |
| 262 | int desiredAccess; | 229 | int desiredAccess; |
| @@ -270,12 +237,6 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 270 | tcon = cifs_sb->tcon; | 237 | tcon = cifs_sb->tcon; |
| 271 | 238 | ||
| 272 | pCifsInode = CIFS_I(file->f_path.dentry->d_inode); | 239 | pCifsInode = CIFS_I(file->f_path.dentry->d_inode); |
| 273 | pCifsFile = cifs_fill_filedata(file); | ||
| 274 | if (pCifsFile) { | ||
| 275 | rc = 0; | ||
| 276 | FreeXid(xid); | ||
| 277 | return rc; | ||
| 278 | } | ||
| 279 | 240 | ||
| 280 | full_path = build_path_from_dentry(file->f_path.dentry); | 241 | full_path = build_path_from_dentry(file->f_path.dentry); |
| 281 | if (full_path == NULL) { | 242 | if (full_path == NULL) { |
| @@ -299,8 +260,7 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 299 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); | 260 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); |
| 300 | oflags |= SMB_O_CREAT; | 261 | oflags |= SMB_O_CREAT; |
| 301 | /* can not refresh inode info since size could be stale */ | 262 | /* can not refresh inode info since size could be stale */ |
| 302 | rc = cifs_posix_open(full_path, &inode, file->f_path.mnt, | 263 | rc = cifs_posix_open(full_path, &inode, inode->i_sb, |
| 303 | inode->i_sb, | ||
| 304 | cifs_sb->mnt_file_mode /* ignored */, | 264 | cifs_sb->mnt_file_mode /* ignored */, |
| 305 | oflags, &oplock, &netfid, xid); | 265 | oflags, &oplock, &netfid, xid); |
| 306 | if (rc == 0) { | 266 | if (rc == 0) { |
| @@ -308,9 +268,20 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 308 | /* no need for special case handling of setting mode | 268 | /* no need for special case handling of setting mode |
| 309 | on read only files needed here */ | 269 | on read only files needed here */ |
| 310 | 270 | ||
| 311 | pCifsFile = cifs_fill_filedata(file); | 271 | rc = cifs_posix_open_inode_helper(inode, file, |
| 312 | cifs_posix_open_inode_helper(inode, file, pCifsInode, | 272 | pCifsInode, oplock, netfid); |
| 313 | oplock, netfid); | 273 | if (rc != 0) { |
| 274 | CIFSSMBClose(xid, tcon, netfid); | ||
| 275 | goto out; | ||
| 276 | } | ||
| 277 | |||
| 278 | pCifsFile = cifs_new_fileinfo(inode, netfid, file, | ||
| 279 | file->f_path.mnt, | ||
| 280 | oflags); | ||
| 281 | if (pCifsFile == NULL) { | ||
| 282 | CIFSSMBClose(xid, tcon, netfid); | ||
| 283 | rc = -ENOMEM; | ||
| 284 | } | ||
| 314 | goto out; | 285 | goto out; |
| 315 | } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 286 | } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 316 | if (tcon->ses->serverNOS) | 287 | if (tcon->ses->serverNOS) |
| @@ -391,17 +362,17 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 391 | goto out; | 362 | goto out; |
| 392 | } | 363 | } |
| 393 | 364 | ||
| 365 | rc = cifs_open_inode_helper(inode, tcon, &oplock, buf, full_path, xid); | ||
| 366 | if (rc != 0) | ||
| 367 | goto out; | ||
| 368 | |||
| 394 | pCifsFile = cifs_new_fileinfo(inode, netfid, file, file->f_path.mnt, | 369 | pCifsFile = cifs_new_fileinfo(inode, netfid, file, file->f_path.mnt, |
| 395 | file->f_flags); | 370 | file->f_flags); |
| 396 | file->private_data = pCifsFile; | 371 | if (pCifsFile == NULL) { |
| 397 | if (file->private_data == NULL) { | ||
| 398 | rc = -ENOMEM; | 372 | rc = -ENOMEM; |
| 399 | goto out; | 373 | goto out; |
| 400 | } | 374 | } |
| 401 | 375 | ||
| 402 | rc = cifs_open_inode_helper(inode, file, pCifsInode, pCifsFile, tcon, | ||
| 403 | &oplock, buf, full_path, xid); | ||
| 404 | |||
| 405 | if (oplock & CIFS_CREATE_ACTION) { | 376 | if (oplock & CIFS_CREATE_ACTION) { |
| 406 | /* time to set mode which we can not set earlier due to | 377 | /* time to set mode which we can not set earlier due to |
| 407 | problems creating new read-only files */ | 378 | problems creating new read-only files */ |
| @@ -513,8 +484,7 @@ reopen_error_exit: | |||
| 513 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { | 484 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { |
| 514 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); | 485 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); |
| 515 | /* can not refresh inode info since size could be stale */ | 486 | /* can not refresh inode info since size could be stale */ |
| 516 | rc = cifs_posix_open(full_path, NULL, file->f_path.mnt, | 487 | rc = cifs_posix_open(full_path, NULL, inode->i_sb, |
| 517 | inode->i_sb, | ||
| 518 | cifs_sb->mnt_file_mode /* ignored */, | 488 | cifs_sb->mnt_file_mode /* ignored */, |
| 519 | oflags, &oplock, &netfid, xid); | 489 | oflags, &oplock, &netfid, xid); |
| 520 | if (rc == 0) { | 490 | if (rc == 0) { |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 62b324f26a56..6f0683c68952 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -1401,6 +1401,10 @@ cifs_do_rename(int xid, struct dentry *from_dentry, const char *fromPath, | |||
| 1401 | if (rc == 0 || rc != -ETXTBSY) | 1401 | if (rc == 0 || rc != -ETXTBSY) |
| 1402 | return rc; | 1402 | return rc; |
| 1403 | 1403 | ||
| 1404 | /* open-file renames don't work across directories */ | ||
| 1405 | if (to_dentry->d_parent != from_dentry->d_parent) | ||
| 1406 | return rc; | ||
| 1407 | |||
| 1404 | /* open the file to be renamed -- we need DELETE perms */ | 1408 | /* open the file to be renamed -- we need DELETE perms */ |
| 1405 | rc = CIFSSMBOpen(xid, pTcon, fromPath, FILE_OPEN, DELETE, | 1409 | rc = CIFSSMBOpen(xid, pTcon, fromPath, FILE_OPEN, DELETE, |
| 1406 | CREATE_NOT_DIR, &srcfid, &oplock, NULL, | 1410 | CREATE_NOT_DIR, &srcfid, &oplock, NULL, |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 7707389bdf2c..0a57cb7db5dd 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
| @@ -730,15 +730,7 @@ ssetup_ntlmssp_authenticate: | |||
| 730 | 730 | ||
| 731 | /* calculate session key */ | 731 | /* calculate session key */ |
| 732 | setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp); | 732 | setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp); |
| 733 | if (first_time) /* should this be moved into common code | 733 | /* FIXME: calculate MAC key */ |
| 734 | with similar ntlmv2 path? */ | ||
| 735 | /* cifs_calculate_ntlmv2_mac_key(ses->server->mac_signing_key, | ||
| 736 | response BB FIXME, v2_sess_key); */ | ||
| 737 | |||
| 738 | /* copy session key */ | ||
| 739 | |||
| 740 | /* memcpy(bcc_ptr, (char *)ntlm_session_key,LM2_SESS_KEY_SIZE); | ||
| 741 | bcc_ptr += LM2_SESS_KEY_SIZE; */ | ||
| 742 | memcpy(bcc_ptr, (char *)v2_sess_key, | 734 | memcpy(bcc_ptr, (char *)v2_sess_key, |
| 743 | sizeof(struct ntlmv2_resp)); | 735 | sizeof(struct ntlmv2_resp)); |
| 744 | bcc_ptr += sizeof(struct ntlmv2_resp); | 736 | bcc_ptr += sizeof(struct ntlmv2_resp); |
diff --git a/fs/dcache.c b/fs/dcache.c index d96047b4a633..c8c78ba07827 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -590,6 +590,8 @@ static void prune_dcache(int count) | |||
| 590 | up_read(&sb->s_umount); | 590 | up_read(&sb->s_umount); |
| 591 | } | 591 | } |
| 592 | spin_lock(&sb_lock); | 592 | spin_lock(&sb_lock); |
| 593 | /* lock was dropped, must reset next */ | ||
| 594 | list_safe_reset_next(sb, n, s_list); | ||
| 593 | count -= pruned; | 595 | count -= pruned; |
| 594 | __put_super(sb); | 596 | __put_super(sb); |
| 595 | /* more work left to do? */ | 597 | /* more work left to do? */ |
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index ca7e2a0ed98a..2bcc0431bada 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c | |||
| @@ -200,6 +200,7 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 200 | return error; | 200 | return error; |
| 201 | else { | 201 | else { |
| 202 | inode->i_mode = mode; | 202 | inode->i_mode = mode; |
| 203 | inode->i_ctime = CURRENT_TIME_SEC; | ||
| 203 | mark_inode_dirty(inode); | 204 | mark_inode_dirty(inode); |
| 204 | if (error == 0) | 205 | if (error == 0) |
| 205 | acl = NULL; | 206 | acl = NULL; |
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c index 01552abbca3c..8a11fe212183 100644 --- a/fs/ext3/acl.c +++ b/fs/ext3/acl.c | |||
| @@ -205,6 +205,7 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type, | |||
| 205 | return error; | 205 | return error; |
| 206 | else { | 206 | else { |
| 207 | inode->i_mode = mode; | 207 | inode->i_mode = mode; |
| 208 | inode->i_ctime = CURRENT_TIME_SEC; | ||
| 208 | ext3_mark_inode_dirty(handle, inode); | 209 | ext3_mark_inode_dirty(handle, inode); |
| 209 | if (error == 0) | 210 | if (error == 0) |
| 210 | acl = NULL; | 211 | acl = NULL; |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 51e11bf5708f..9d175d623aab 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -733,12 +733,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band) | |||
| 733 | { | 733 | { |
| 734 | while (fa) { | 734 | while (fa) { |
| 735 | struct fown_struct *fown; | 735 | struct fown_struct *fown; |
| 736 | unsigned long flags; | ||
| 737 | |||
| 736 | if (fa->magic != FASYNC_MAGIC) { | 738 | if (fa->magic != FASYNC_MAGIC) { |
| 737 | printk(KERN_ERR "kill_fasync: bad magic number in " | 739 | printk(KERN_ERR "kill_fasync: bad magic number in " |
| 738 | "fasync_struct!\n"); | 740 | "fasync_struct!\n"); |
| 739 | return; | 741 | return; |
| 740 | } | 742 | } |
| 741 | spin_lock(&fa->fa_lock); | 743 | spin_lock_irqsave(&fa->fa_lock, flags); |
| 742 | if (fa->fa_file) { | 744 | if (fa->fa_file) { |
| 743 | fown = &fa->fa_file->f_owner; | 745 | fown = &fa->fa_file->f_owner; |
| 744 | /* Don't send SIGURG to processes which have not set a | 746 | /* Don't send SIGURG to processes which have not set a |
| @@ -747,7 +749,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band) | |||
| 747 | if (!(sig == SIGURG && fown->signum == 0)) | 749 | if (!(sig == SIGURG && fown->signum == 0)) |
| 748 | send_sigio(fown, fa->fa_fd, band); | 750 | send_sigio(fown, fa->fa_fd, band); |
| 749 | } | 751 | } |
| 750 | spin_unlock(&fa->fa_lock); | 752 | spin_unlock_irqrestore(&fa->fa_lock, flags); |
| 751 | fa = rcu_dereference(fa->fa_next); | 753 | fa = rcu_dereference(fa->fa_next); |
| 752 | } | 754 | } |
| 753 | } | 755 | } |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 1d1088f48bc2..0609607d3955 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -63,24 +63,16 @@ struct bdi_work { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | enum { | 65 | enum { |
| 66 | WS_USED_B = 0, | 66 | WS_INPROGRESS = 0, |
| 67 | WS_ONSTACK_B, | 67 | WS_ONSTACK, |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | #define WS_USED (1 << WS_USED_B) | ||
| 71 | #define WS_ONSTACK (1 << WS_ONSTACK_B) | ||
| 72 | |||
| 73 | static inline bool bdi_work_on_stack(struct bdi_work *work) | ||
| 74 | { | ||
| 75 | return test_bit(WS_ONSTACK_B, &work->state); | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline void bdi_work_init(struct bdi_work *work, | 70 | static inline void bdi_work_init(struct bdi_work *work, |
| 79 | struct wb_writeback_args *args) | 71 | struct wb_writeback_args *args) |
| 80 | { | 72 | { |
| 81 | INIT_RCU_HEAD(&work->rcu_head); | 73 | INIT_RCU_HEAD(&work->rcu_head); |
| 82 | work->args = *args; | 74 | work->args = *args; |
| 83 | work->state = WS_USED; | 75 | __set_bit(WS_INPROGRESS, &work->state); |
| 84 | } | 76 | } |
| 85 | 77 | ||
| 86 | /** | 78 | /** |
| @@ -95,43 +87,16 @@ int writeback_in_progress(struct backing_dev_info *bdi) | |||
| 95 | return !list_empty(&bdi->work_list); | 87 | return !list_empty(&bdi->work_list); |
| 96 | } | 88 | } |
| 97 | 89 | ||
| 98 | static void bdi_work_clear(struct bdi_work *work) | ||
| 99 | { | ||
| 100 | clear_bit(WS_USED_B, &work->state); | ||
| 101 | smp_mb__after_clear_bit(); | ||
| 102 | /* | ||
| 103 | * work can have disappeared at this point. bit waitq functions | ||
| 104 | * should be able to tolerate this, provided bdi_sched_wait does | ||
| 105 | * not dereference it's pointer argument. | ||
| 106 | */ | ||
| 107 | wake_up_bit(&work->state, WS_USED_B); | ||
| 108 | } | ||
| 109 | |||
| 110 | static void bdi_work_free(struct rcu_head *head) | 90 | static void bdi_work_free(struct rcu_head *head) |
| 111 | { | 91 | { |
| 112 | struct bdi_work *work = container_of(head, struct bdi_work, rcu_head); | 92 | struct bdi_work *work = container_of(head, struct bdi_work, rcu_head); |
| 113 | 93 | ||
| 114 | if (!bdi_work_on_stack(work)) | 94 | clear_bit(WS_INPROGRESS, &work->state); |
| 115 | kfree(work); | 95 | smp_mb__after_clear_bit(); |
| 116 | else | 96 | wake_up_bit(&work->state, WS_INPROGRESS); |
| 117 | bdi_work_clear(work); | ||
| 118 | } | ||
| 119 | |||
| 120 | static void wb_work_complete(struct bdi_work *work) | ||
| 121 | { | ||
| 122 | const enum writeback_sync_modes sync_mode = work->args.sync_mode; | ||
| 123 | int onstack = bdi_work_on_stack(work); | ||
| 124 | 97 | ||
| 125 | /* | 98 | if (!test_bit(WS_ONSTACK, &work->state)) |
| 126 | * For allocated work, we can clear the done/seen bit right here. | 99 | kfree(work); |
| 127 | * For on-stack work, we need to postpone both the clear and free | ||
| 128 | * to after the RCU grace period, since the stack could be invalidated | ||
| 129 | * as soon as bdi_work_clear() has done the wakeup. | ||
| 130 | */ | ||
| 131 | if (!onstack) | ||
| 132 | bdi_work_clear(work); | ||
| 133 | if (sync_mode == WB_SYNC_NONE || onstack) | ||
| 134 | call_rcu(&work->rcu_head, bdi_work_free); | ||
| 135 | } | 100 | } |
| 136 | 101 | ||
| 137 | static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) | 102 | static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) |
| @@ -147,7 +112,7 @@ static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) | |||
| 147 | list_del_rcu(&work->list); | 112 | list_del_rcu(&work->list); |
| 148 | spin_unlock(&bdi->wb_lock); | 113 | spin_unlock(&bdi->wb_lock); |
| 149 | 114 | ||
| 150 | wb_work_complete(work); | 115 | call_rcu(&work->rcu_head, bdi_work_free); |
| 151 | } | 116 | } |
| 152 | } | 117 | } |
| 153 | 118 | ||
| @@ -185,9 +150,9 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) | |||
| 185 | * Used for on-stack allocated work items. The caller needs to wait until | 150 | * Used for on-stack allocated work items. The caller needs to wait until |
| 186 | * the wb threads have acked the work before it's safe to continue. | 151 | * the wb threads have acked the work before it's safe to continue. |
| 187 | */ | 152 | */ |
| 188 | static void bdi_wait_on_work_clear(struct bdi_work *work) | 153 | static void bdi_wait_on_work_done(struct bdi_work *work) |
| 189 | { | 154 | { |
| 190 | wait_on_bit(&work->state, WS_USED_B, bdi_sched_wait, | 155 | wait_on_bit(&work->state, WS_INPROGRESS, bdi_sched_wait, |
| 191 | TASK_UNINTERRUPTIBLE); | 156 | TASK_UNINTERRUPTIBLE); |
| 192 | } | 157 | } |
| 193 | 158 | ||
| @@ -213,37 +178,28 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, | |||
| 213 | } | 178 | } |
| 214 | 179 | ||
| 215 | /** | 180 | /** |
| 216 | * bdi_sync_writeback - start and wait for writeback | 181 | * bdi_queue_work_onstack - start and wait for writeback |
| 217 | * @bdi: the backing device to write from | ||
| 218 | * @sb: write inodes from this super_block | 182 | * @sb: write inodes from this super_block |
| 219 | * | 183 | * |
| 220 | * Description: | 184 | * Description: |
| 221 | * This does WB_SYNC_ALL data integrity writeback and waits for the | 185 | * This function initiates writeback and waits for the operation to |
| 222 | * IO to complete. Callers must hold the sb s_umount semaphore for | 186 | * complete. Callers must hold the sb s_umount semaphore for |
| 223 | * reading, to avoid having the super disappear before we are done. | 187 | * reading, to avoid having the super disappear before we are done. |
| 224 | */ | 188 | */ |
| 225 | static void bdi_sync_writeback(struct backing_dev_info *bdi, | 189 | static void bdi_queue_work_onstack(struct wb_writeback_args *args) |
| 226 | struct super_block *sb) | ||
| 227 | { | 190 | { |
| 228 | struct wb_writeback_args args = { | ||
| 229 | .sb = sb, | ||
| 230 | .sync_mode = WB_SYNC_ALL, | ||
| 231 | .nr_pages = LONG_MAX, | ||
| 232 | .range_cyclic = 0, | ||
| 233 | }; | ||
| 234 | struct bdi_work work; | 191 | struct bdi_work work; |
| 235 | 192 | ||
| 236 | bdi_work_init(&work, &args); | 193 | bdi_work_init(&work, args); |
| 237 | work.state |= WS_ONSTACK; | 194 | __set_bit(WS_ONSTACK, &work.state); |
| 238 | 195 | ||
| 239 | bdi_queue_work(bdi, &work); | 196 | bdi_queue_work(args->sb->s_bdi, &work); |
| 240 | bdi_wait_on_work_clear(&work); | 197 | bdi_wait_on_work_done(&work); |
| 241 | } | 198 | } |
| 242 | 199 | ||
| 243 | /** | 200 | /** |
| 244 | * bdi_start_writeback - start writeback | 201 | * bdi_start_writeback - start writeback |
| 245 | * @bdi: the backing device to write from | 202 | * @bdi: the backing device to write from |
| 246 | * @sb: write inodes from this super_block | ||
| 247 | * @nr_pages: the number of pages to write | 203 | * @nr_pages: the number of pages to write |
| 248 | * | 204 | * |
| 249 | * Description: | 205 | * Description: |
| @@ -252,25 +208,34 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, | |||
| 252 | * completion. Caller need not hold sb s_umount semaphore. | 208 | * completion. Caller need not hold sb s_umount semaphore. |
| 253 | * | 209 | * |
| 254 | */ | 210 | */ |
| 255 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | 211 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages) |
| 256 | long nr_pages) | ||
| 257 | { | 212 | { |
| 258 | struct wb_writeback_args args = { | 213 | struct wb_writeback_args args = { |
| 259 | .sb = sb, | ||
| 260 | .sync_mode = WB_SYNC_NONE, | 214 | .sync_mode = WB_SYNC_NONE, |
| 261 | .nr_pages = nr_pages, | 215 | .nr_pages = nr_pages, |
| 262 | .range_cyclic = 1, | 216 | .range_cyclic = 1, |
| 263 | }; | 217 | }; |
| 264 | 218 | ||
| 265 | /* | 219 | bdi_alloc_queue_work(bdi, &args); |
| 266 | * We treat @nr_pages=0 as the special case to do background writeback, | 220 | } |
| 267 | * ie. to sync pages until the background dirty threshold is reached. | ||
| 268 | */ | ||
| 269 | if (!nr_pages) { | ||
| 270 | args.nr_pages = LONG_MAX; | ||
| 271 | args.for_background = 1; | ||
| 272 | } | ||
| 273 | 221 | ||
| 222 | /** | ||
| 223 | * bdi_start_background_writeback - start background writeback | ||
| 224 | * @bdi: the backing device to write from | ||
| 225 | * | ||
| 226 | * Description: | ||
| 227 | * This does WB_SYNC_NONE background writeback. The IO is only | ||
| 228 | * started when this function returns, we make no guarentees on | ||
| 229 | * completion. Caller need not hold sb s_umount semaphore. | ||
| 230 | */ | ||
| 231 | void bdi_start_background_writeback(struct backing_dev_info *bdi) | ||
| 232 | { | ||
| 233 | struct wb_writeback_args args = { | ||
| 234 | .sync_mode = WB_SYNC_NONE, | ||
| 235 | .nr_pages = LONG_MAX, | ||
| 236 | .for_background = 1, | ||
| 237 | .range_cyclic = 1, | ||
| 238 | }; | ||
| 274 | bdi_alloc_queue_work(bdi, &args); | 239 | bdi_alloc_queue_work(bdi, &args); |
| 275 | } | 240 | } |
| 276 | 241 | ||
| @@ -561,48 +526,30 @@ select_queue: | |||
| 561 | return ret; | 526 | return ret; |
| 562 | } | 527 | } |
| 563 | 528 | ||
| 564 | static void unpin_sb_for_writeback(struct super_block *sb) | ||
| 565 | { | ||
| 566 | up_read(&sb->s_umount); | ||
| 567 | put_super(sb); | ||
| 568 | } | ||
| 569 | |||
| 570 | enum sb_pin_state { | ||
| 571 | SB_PINNED, | ||
| 572 | SB_NOT_PINNED, | ||
| 573 | SB_PIN_FAILED | ||
| 574 | }; | ||
| 575 | |||
| 576 | /* | 529 | /* |
| 577 | * For WB_SYNC_NONE writeback, the caller does not have the sb pinned | 530 | * For background writeback the caller does not have the sb pinned |
| 578 | * before calling writeback. So make sure that we do pin it, so it doesn't | 531 | * before calling writeback. So make sure that we do pin it, so it doesn't |
| 579 | * go away while we are writing inodes from it. | 532 | * go away while we are writing inodes from it. |
| 580 | */ | 533 | */ |
| 581 | static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc, | 534 | static bool pin_sb_for_writeback(struct super_block *sb) |
| 582 | struct super_block *sb) | ||
| 583 | { | 535 | { |
| 584 | /* | ||
| 585 | * Caller must already hold the ref for this | ||
| 586 | */ | ||
| 587 | if (wbc->sync_mode == WB_SYNC_ALL) { | ||
| 588 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 589 | return SB_NOT_PINNED; | ||
| 590 | } | ||
| 591 | spin_lock(&sb_lock); | 536 | spin_lock(&sb_lock); |
| 537 | if (list_empty(&sb->s_instances)) { | ||
| 538 | spin_unlock(&sb_lock); | ||
| 539 | return false; | ||
| 540 | } | ||
| 541 | |||
| 592 | sb->s_count++; | 542 | sb->s_count++; |
| 543 | spin_unlock(&sb_lock); | ||
| 544 | |||
| 593 | if (down_read_trylock(&sb->s_umount)) { | 545 | if (down_read_trylock(&sb->s_umount)) { |
| 594 | if (sb->s_root) { | 546 | if (sb->s_root) |
| 595 | spin_unlock(&sb_lock); | 547 | return true; |
| 596 | return SB_PINNED; | ||
| 597 | } | ||
| 598 | /* | ||
| 599 | * umounted, drop rwsem again and fall through to failure | ||
| 600 | */ | ||
| 601 | up_read(&sb->s_umount); | 548 | up_read(&sb->s_umount); |
| 602 | } | 549 | } |
| 603 | sb->s_count--; | 550 | |
| 604 | spin_unlock(&sb_lock); | 551 | put_super(sb); |
| 605 | return SB_PIN_FAILED; | 552 | return false; |
| 606 | } | 553 | } |
| 607 | 554 | ||
| 608 | /* | 555 | /* |
| @@ -681,24 +628,31 @@ static void writeback_inodes_wb(struct bdi_writeback *wb, | |||
| 681 | struct inode *inode = list_entry(wb->b_io.prev, | 628 | struct inode *inode = list_entry(wb->b_io.prev, |
| 682 | struct inode, i_list); | 629 | struct inode, i_list); |
| 683 | struct super_block *sb = inode->i_sb; | 630 | struct super_block *sb = inode->i_sb; |
| 684 | enum sb_pin_state state; | ||
| 685 | 631 | ||
| 686 | if (wbc->sb && sb != wbc->sb) { | 632 | if (wbc->sb) { |
| 687 | /* super block given and doesn't | 633 | /* |
| 688 | match, skip this inode */ | 634 | * We are requested to write out inodes for a specific |
| 689 | redirty_tail(inode); | 635 | * superblock. This means we already have s_umount |
| 690 | continue; | 636 | * taken by the caller which also waits for us to |
| 691 | } | 637 | * complete the writeout. |
| 692 | state = pin_sb_for_writeback(wbc, sb); | 638 | */ |
| 639 | if (sb != wbc->sb) { | ||
| 640 | redirty_tail(inode); | ||
| 641 | continue; | ||
| 642 | } | ||
| 693 | 643 | ||
| 694 | if (state == SB_PIN_FAILED) { | 644 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); |
| 695 | requeue_io(inode); | 645 | |
| 696 | continue; | 646 | ret = writeback_sb_inodes(sb, wb, wbc); |
| 647 | } else { | ||
| 648 | if (!pin_sb_for_writeback(sb)) { | ||
| 649 | requeue_io(inode); | ||
| 650 | continue; | ||
| 651 | } | ||
| 652 | ret = writeback_sb_inodes(sb, wb, wbc); | ||
| 653 | drop_super(sb); | ||
| 697 | } | 654 | } |
| 698 | ret = writeback_sb_inodes(sb, wb, wbc); | ||
| 699 | 655 | ||
| 700 | if (state == SB_PINNED) | ||
| 701 | unpin_sb_for_writeback(sb); | ||
| 702 | if (ret) | 656 | if (ret) |
| 703 | break; | 657 | break; |
| 704 | } | 658 | } |
| @@ -911,7 +865,7 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 911 | * If this isn't a data integrity operation, just notify | 865 | * If this isn't a data integrity operation, just notify |
| 912 | * that we have seen this work and we are now starting it. | 866 | * that we have seen this work and we are now starting it. |
| 913 | */ | 867 | */ |
| 914 | if (args.sync_mode == WB_SYNC_NONE) | 868 | if (!test_bit(WS_ONSTACK, &work->state)) |
| 915 | wb_clear_pending(wb, work); | 869 | wb_clear_pending(wb, work); |
| 916 | 870 | ||
| 917 | wrote += wb_writeback(wb, &args); | 871 | wrote += wb_writeback(wb, &args); |
| @@ -920,7 +874,7 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 920 | * This is a data integrity writeback, so only do the | 874 | * This is a data integrity writeback, so only do the |
| 921 | * notification when we have completed the work. | 875 | * notification when we have completed the work. |
| 922 | */ | 876 | */ |
| 923 | if (args.sync_mode == WB_SYNC_ALL) | 877 | if (test_bit(WS_ONSTACK, &work->state)) |
| 924 | wb_clear_pending(wb, work); | 878 | wb_clear_pending(wb, work); |
| 925 | } | 879 | } |
| 926 | 880 | ||
| @@ -978,42 +932,32 @@ int bdi_writeback_task(struct bdi_writeback *wb) | |||
| 978 | } | 932 | } |
| 979 | 933 | ||
| 980 | /* | 934 | /* |
| 981 | * Schedule writeback for all backing devices. This does WB_SYNC_NONE | 935 | * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back |
| 982 | * writeback, for integrity writeback see bdi_sync_writeback(). | 936 | * the whole world. |
| 983 | */ | 937 | */ |
| 984 | static void bdi_writeback_all(struct super_block *sb, long nr_pages) | 938 | void wakeup_flusher_threads(long nr_pages) |
| 985 | { | 939 | { |
| 940 | struct backing_dev_info *bdi; | ||
| 986 | struct wb_writeback_args args = { | 941 | struct wb_writeback_args args = { |
| 987 | .sb = sb, | ||
| 988 | .nr_pages = nr_pages, | ||
| 989 | .sync_mode = WB_SYNC_NONE, | 942 | .sync_mode = WB_SYNC_NONE, |
| 990 | }; | 943 | }; |
| 991 | struct backing_dev_info *bdi; | ||
| 992 | 944 | ||
| 993 | rcu_read_lock(); | 945 | if (nr_pages) { |
| 946 | args.nr_pages = nr_pages; | ||
| 947 | } else { | ||
| 948 | args.nr_pages = global_page_state(NR_FILE_DIRTY) + | ||
| 949 | global_page_state(NR_UNSTABLE_NFS); | ||
| 950 | } | ||
| 994 | 951 | ||
| 952 | rcu_read_lock(); | ||
| 995 | list_for_each_entry_rcu(bdi, &bdi_list, bdi_list) { | 953 | list_for_each_entry_rcu(bdi, &bdi_list, bdi_list) { |
| 996 | if (!bdi_has_dirty_io(bdi)) | 954 | if (!bdi_has_dirty_io(bdi)) |
| 997 | continue; | 955 | continue; |
| 998 | |||
| 999 | bdi_alloc_queue_work(bdi, &args); | 956 | bdi_alloc_queue_work(bdi, &args); |
| 1000 | } | 957 | } |
| 1001 | |||
| 1002 | rcu_read_unlock(); | 958 | rcu_read_unlock(); |
| 1003 | } | 959 | } |
| 1004 | 960 | ||
| 1005 | /* | ||
| 1006 | * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back | ||
| 1007 | * the whole world. | ||
| 1008 | */ | ||
| 1009 | void wakeup_flusher_threads(long nr_pages) | ||
| 1010 | { | ||
| 1011 | if (nr_pages == 0) | ||
| 1012 | nr_pages = global_page_state(NR_FILE_DIRTY) + | ||
| 1013 | global_page_state(NR_UNSTABLE_NFS); | ||
| 1014 | bdi_writeback_all(NULL, nr_pages); | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | static noinline void block_dump___mark_inode_dirty(struct inode *inode) | 961 | static noinline void block_dump___mark_inode_dirty(struct inode *inode) |
| 1018 | { | 962 | { |
| 1019 | if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) { | 963 | if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) { |
| @@ -1218,12 +1162,17 @@ void writeback_inodes_sb(struct super_block *sb) | |||
| 1218 | { | 1162 | { |
| 1219 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); | 1163 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); |
| 1220 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); | 1164 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); |
| 1221 | long nr_to_write; | 1165 | struct wb_writeback_args args = { |
| 1166 | .sb = sb, | ||
| 1167 | .sync_mode = WB_SYNC_NONE, | ||
| 1168 | }; | ||
| 1169 | |||
| 1170 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 1222 | 1171 | ||
| 1223 | nr_to_write = nr_dirty + nr_unstable + | 1172 | args.nr_pages = nr_dirty + nr_unstable + |
| 1224 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); | 1173 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); |
| 1225 | 1174 | ||
| 1226 | bdi_start_writeback(sb->s_bdi, sb, nr_to_write); | 1175 | bdi_queue_work_onstack(&args); |
| 1227 | } | 1176 | } |
| 1228 | EXPORT_SYMBOL(writeback_inodes_sb); | 1177 | EXPORT_SYMBOL(writeback_inodes_sb); |
| 1229 | 1178 | ||
| @@ -1237,7 +1186,9 @@ EXPORT_SYMBOL(writeback_inodes_sb); | |||
| 1237 | int writeback_inodes_sb_if_idle(struct super_block *sb) | 1186 | int writeback_inodes_sb_if_idle(struct super_block *sb) |
| 1238 | { | 1187 | { |
| 1239 | if (!writeback_in_progress(sb->s_bdi)) { | 1188 | if (!writeback_in_progress(sb->s_bdi)) { |
| 1189 | down_read(&sb->s_umount); | ||
| 1240 | writeback_inodes_sb(sb); | 1190 | writeback_inodes_sb(sb); |
| 1191 | up_read(&sb->s_umount); | ||
| 1241 | return 1; | 1192 | return 1; |
| 1242 | } else | 1193 | } else |
| 1243 | return 0; | 1194 | return 0; |
| @@ -1253,7 +1204,16 @@ EXPORT_SYMBOL(writeback_inodes_sb_if_idle); | |||
| 1253 | */ | 1204 | */ |
| 1254 | void sync_inodes_sb(struct super_block *sb) | 1205 | void sync_inodes_sb(struct super_block *sb) |
| 1255 | { | 1206 | { |
| 1256 | bdi_sync_writeback(sb->s_bdi, sb); | 1207 | struct wb_writeback_args args = { |
| 1208 | .sb = sb, | ||
| 1209 | .sync_mode = WB_SYNC_ALL, | ||
| 1210 | .nr_pages = LONG_MAX, | ||
| 1211 | .range_cyclic = 0, | ||
| 1212 | }; | ||
| 1213 | |||
| 1214 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 1215 | |||
| 1216 | bdi_queue_work_onstack(&args); | ||
| 1257 | wait_sb_inodes(sb); | 1217 | wait_sb_inodes(sb); |
| 1258 | } | 1218 | } |
| 1259 | EXPORT_SYMBOL(sync_inodes_sb); | 1219 | EXPORT_SYMBOL(sync_inodes_sb); |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 7ec9b34a59f8..d25b5257b7a1 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
| @@ -1286,6 +1286,55 @@ static void nfs4_session_set_rwsize(struct nfs_server *server) | |||
| 1286 | #endif /* CONFIG_NFS_V4_1 */ | 1286 | #endif /* CONFIG_NFS_V4_1 */ |
| 1287 | } | 1287 | } |
| 1288 | 1288 | ||
| 1289 | static int nfs4_server_common_setup(struct nfs_server *server, | ||
| 1290 | struct nfs_fh *mntfh) | ||
| 1291 | { | ||
| 1292 | struct nfs_fattr *fattr; | ||
| 1293 | int error; | ||
| 1294 | |||
| 1295 | BUG_ON(!server->nfs_client); | ||
| 1296 | BUG_ON(!server->nfs_client->rpc_ops); | ||
| 1297 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | ||
| 1298 | |||
| 1299 | fattr = nfs_alloc_fattr(); | ||
| 1300 | if (fattr == NULL) | ||
| 1301 | return -ENOMEM; | ||
| 1302 | |||
| 1303 | /* We must ensure the session is initialised first */ | ||
| 1304 | error = nfs4_init_session(server); | ||
| 1305 | if (error < 0) | ||
| 1306 | goto out; | ||
| 1307 | |||
| 1308 | /* Probe the root fh to retrieve its FSID and filehandle */ | ||
| 1309 | error = nfs4_get_rootfh(server, mntfh); | ||
| 1310 | if (error < 0) | ||
| 1311 | goto out; | ||
| 1312 | |||
| 1313 | dprintk("Server FSID: %llx:%llx\n", | ||
| 1314 | (unsigned long long) server->fsid.major, | ||
| 1315 | (unsigned long long) server->fsid.minor); | ||
| 1316 | dprintk("Mount FH: %d\n", mntfh->size); | ||
| 1317 | |||
| 1318 | nfs4_session_set_rwsize(server); | ||
| 1319 | |||
| 1320 | error = nfs_probe_fsinfo(server, mntfh, fattr); | ||
| 1321 | if (error < 0) | ||
| 1322 | goto out; | ||
| 1323 | |||
| 1324 | if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) | ||
| 1325 | server->namelen = NFS4_MAXNAMLEN; | ||
| 1326 | |||
| 1327 | spin_lock(&nfs_client_lock); | ||
| 1328 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); | ||
| 1329 | list_add_tail(&server->master_link, &nfs_volume_list); | ||
| 1330 | spin_unlock(&nfs_client_lock); | ||
| 1331 | |||
| 1332 | server->mount_time = jiffies; | ||
| 1333 | out: | ||
| 1334 | nfs_free_fattr(fattr); | ||
| 1335 | return error; | ||
| 1336 | } | ||
| 1337 | |||
| 1289 | /* | 1338 | /* |
| 1290 | * Create a version 4 volume record | 1339 | * Create a version 4 volume record |
| 1291 | */ | 1340 | */ |
| @@ -1346,7 +1395,6 @@ error: | |||
| 1346 | struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, | 1395 | struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, |
| 1347 | struct nfs_fh *mntfh) | 1396 | struct nfs_fh *mntfh) |
| 1348 | { | 1397 | { |
| 1349 | struct nfs_fattr *fattr; | ||
| 1350 | struct nfs_server *server; | 1398 | struct nfs_server *server; |
| 1351 | int error; | 1399 | int error; |
| 1352 | 1400 | ||
| @@ -1356,55 +1404,19 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, | |||
| 1356 | if (!server) | 1404 | if (!server) |
| 1357 | return ERR_PTR(-ENOMEM); | 1405 | return ERR_PTR(-ENOMEM); |
| 1358 | 1406 | ||
| 1359 | error = -ENOMEM; | ||
| 1360 | fattr = nfs_alloc_fattr(); | ||
| 1361 | if (fattr == NULL) | ||
| 1362 | goto error; | ||
| 1363 | |||
| 1364 | /* set up the general RPC client */ | 1407 | /* set up the general RPC client */ |
| 1365 | error = nfs4_init_server(server, data); | 1408 | error = nfs4_init_server(server, data); |
| 1366 | if (error < 0) | 1409 | if (error < 0) |
| 1367 | goto error; | 1410 | goto error; |
| 1368 | 1411 | ||
| 1369 | BUG_ON(!server->nfs_client); | 1412 | error = nfs4_server_common_setup(server, mntfh); |
| 1370 | BUG_ON(!server->nfs_client->rpc_ops); | ||
| 1371 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | ||
| 1372 | |||
| 1373 | error = nfs4_init_session(server); | ||
| 1374 | if (error < 0) | ||
| 1375 | goto error; | ||
| 1376 | |||
| 1377 | /* Probe the root fh to retrieve its FSID */ | ||
| 1378 | error = nfs4_get_rootfh(server, mntfh); | ||
| 1379 | if (error < 0) | 1413 | if (error < 0) |
| 1380 | goto error; | 1414 | goto error; |
| 1381 | 1415 | ||
| 1382 | dprintk("Server FSID: %llx:%llx\n", | ||
| 1383 | (unsigned long long) server->fsid.major, | ||
| 1384 | (unsigned long long) server->fsid.minor); | ||
| 1385 | dprintk("Mount FH: %d\n", mntfh->size); | ||
| 1386 | |||
| 1387 | nfs4_session_set_rwsize(server); | ||
| 1388 | |||
| 1389 | error = nfs_probe_fsinfo(server, mntfh, fattr); | ||
| 1390 | if (error < 0) | ||
| 1391 | goto error; | ||
| 1392 | |||
| 1393 | if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) | ||
| 1394 | server->namelen = NFS4_MAXNAMLEN; | ||
| 1395 | |||
| 1396 | spin_lock(&nfs_client_lock); | ||
| 1397 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); | ||
| 1398 | list_add_tail(&server->master_link, &nfs_volume_list); | ||
| 1399 | spin_unlock(&nfs_client_lock); | ||
| 1400 | |||
| 1401 | server->mount_time = jiffies; | ||
| 1402 | dprintk("<-- nfs4_create_server() = %p\n", server); | 1416 | dprintk("<-- nfs4_create_server() = %p\n", server); |
| 1403 | nfs_free_fattr(fattr); | ||
| 1404 | return server; | 1417 | return server; |
| 1405 | 1418 | ||
| 1406 | error: | 1419 | error: |
| 1407 | nfs_free_fattr(fattr); | ||
| 1408 | nfs_free_server(server); | 1420 | nfs_free_server(server); |
| 1409 | dprintk("<-- nfs4_create_server() = error %d\n", error); | 1421 | dprintk("<-- nfs4_create_server() = error %d\n", error); |
| 1410 | return ERR_PTR(error); | 1422 | return ERR_PTR(error); |
| @@ -1418,7 +1430,6 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
| 1418 | { | 1430 | { |
| 1419 | struct nfs_client *parent_client; | 1431 | struct nfs_client *parent_client; |
| 1420 | struct nfs_server *server, *parent_server; | 1432 | struct nfs_server *server, *parent_server; |
| 1421 | struct nfs_fattr *fattr; | ||
| 1422 | int error; | 1433 | int error; |
| 1423 | 1434 | ||
| 1424 | dprintk("--> nfs4_create_referral_server()\n"); | 1435 | dprintk("--> nfs4_create_referral_server()\n"); |
| @@ -1427,11 +1438,6 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
| 1427 | if (!server) | 1438 | if (!server) |
| 1428 | return ERR_PTR(-ENOMEM); | 1439 | return ERR_PTR(-ENOMEM); |
| 1429 | 1440 | ||
| 1430 | error = -ENOMEM; | ||
| 1431 | fattr = nfs_alloc_fattr(); | ||
| 1432 | if (fattr == NULL) | ||
| 1433 | goto error; | ||
| 1434 | |||
| 1435 | parent_server = NFS_SB(data->sb); | 1441 | parent_server = NFS_SB(data->sb); |
| 1436 | parent_client = parent_server->nfs_client; | 1442 | parent_client = parent_server->nfs_client; |
| 1437 | 1443 | ||
| @@ -1456,40 +1462,14 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
| 1456 | if (error < 0) | 1462 | if (error < 0) |
| 1457 | goto error; | 1463 | goto error; |
| 1458 | 1464 | ||
| 1459 | BUG_ON(!server->nfs_client); | 1465 | error = nfs4_server_common_setup(server, mntfh); |
| 1460 | BUG_ON(!server->nfs_client->rpc_ops); | ||
| 1461 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | ||
| 1462 | |||
| 1463 | /* Probe the root fh to retrieve its FSID and filehandle */ | ||
| 1464 | error = nfs4_get_rootfh(server, mntfh); | ||
| 1465 | if (error < 0) | ||
| 1466 | goto error; | ||
| 1467 | |||
| 1468 | /* probe the filesystem info for this server filesystem */ | ||
| 1469 | error = nfs_probe_fsinfo(server, mntfh, fattr); | ||
| 1470 | if (error < 0) | 1466 | if (error < 0) |
| 1471 | goto error; | 1467 | goto error; |
| 1472 | 1468 | ||
| 1473 | if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) | ||
| 1474 | server->namelen = NFS4_MAXNAMLEN; | ||
| 1475 | |||
| 1476 | dprintk("Referral FSID: %llx:%llx\n", | ||
| 1477 | (unsigned long long) server->fsid.major, | ||
| 1478 | (unsigned long long) server->fsid.minor); | ||
| 1479 | |||
| 1480 | spin_lock(&nfs_client_lock); | ||
| 1481 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); | ||
| 1482 | list_add_tail(&server->master_link, &nfs_volume_list); | ||
| 1483 | spin_unlock(&nfs_client_lock); | ||
| 1484 | |||
| 1485 | server->mount_time = jiffies; | ||
| 1486 | |||
| 1487 | nfs_free_fattr(fattr); | ||
| 1488 | dprintk("<-- nfs_create_referral_server() = %p\n", server); | 1469 | dprintk("<-- nfs_create_referral_server() = %p\n", server); |
| 1489 | return server; | 1470 | return server; |
| 1490 | 1471 | ||
| 1491 | error: | 1472 | error: |
| 1492 | nfs_free_fattr(fattr); | ||
| 1493 | nfs_free_server(server); | 1473 | nfs_free_server(server); |
| 1494 | dprintk("<-- nfs4_create_referral_server() = error %d\n", error); | 1474 | dprintk("<-- nfs4_create_referral_server() = error %d\n", error); |
| 1495 | return ERR_PTR(error); | 1475 | return ERR_PTR(error); |
diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c index 7428f7d6273b..a70e446e1605 100644 --- a/fs/nfs/getroot.c +++ b/fs/nfs/getroot.c | |||
| @@ -146,7 +146,7 @@ int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh) | |||
| 146 | goto out; | 146 | goto out; |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_MODE) | 149 | if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_TYPE) |
| 150 | || !S_ISDIR(fsinfo.fattr->mode)) { | 150 | || !S_ISDIR(fsinfo.fattr->mode)) { |
| 151 | printk(KERN_ERR "nfs4_get_rootfh:" | 151 | printk(KERN_ERR "nfs4_get_rootfh:" |
| 152 | " getroot encountered non-directory\n"); | 152 | " getroot encountered non-directory\n"); |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 6bdef28efa33..65c8dae4b267 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -862,8 +862,8 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const | |||
| 862 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; | 862 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; |
| 863 | *p++ = cpu_to_be32(NFS4_SET_TO_CLIENT_TIME); | 863 | *p++ = cpu_to_be32(NFS4_SET_TO_CLIENT_TIME); |
| 864 | *p++ = cpu_to_be32(0); | 864 | *p++ = cpu_to_be32(0); |
| 865 | *p++ = cpu_to_be32(iap->ia_mtime.tv_sec); | 865 | *p++ = cpu_to_be32(iap->ia_atime.tv_sec); |
| 866 | *p++ = cpu_to_be32(iap->ia_mtime.tv_nsec); | 866 | *p++ = cpu_to_be32(iap->ia_atime.tv_nsec); |
| 867 | } | 867 | } |
| 868 | else if (iap->ia_valid & ATTR_ATIME) { | 868 | else if (iap->ia_valid & ATTR_ATIME) { |
| 869 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; | 869 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 04214fc5c304..f9df16de4a56 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -570,6 +570,22 @@ static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss, | |||
| 570 | nfs_show_mountd_netid(m, nfss, showdefaults); | 570 | nfs_show_mountd_netid(m, nfss, showdefaults); |
| 571 | } | 571 | } |
| 572 | 572 | ||
| 573 | #ifdef CONFIG_NFS_V4 | ||
| 574 | static void nfs_show_nfsv4_options(struct seq_file *m, struct nfs_server *nfss, | ||
| 575 | int showdefaults) | ||
| 576 | { | ||
| 577 | struct nfs_client *clp = nfss->nfs_client; | ||
| 578 | |||
| 579 | seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr); | ||
| 580 | seq_printf(m, ",minorversion=%u", clp->cl_minorversion); | ||
| 581 | } | ||
| 582 | #else | ||
| 583 | static void nfs_show_nfsv4_options(struct seq_file *m, struct nfs_server *nfss, | ||
| 584 | int showdefaults) | ||
| 585 | { | ||
| 586 | } | ||
| 587 | #endif | ||
| 588 | |||
| 573 | /* | 589 | /* |
| 574 | * Describe the mount options in force on this server representation | 590 | * Describe the mount options in force on this server representation |
| 575 | */ | 591 | */ |
| @@ -631,11 +647,9 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, | |||
| 631 | 647 | ||
| 632 | if (version != 4) | 648 | if (version != 4) |
| 633 | nfs_show_mountd_options(m, nfss, showdefaults); | 649 | nfs_show_mountd_options(m, nfss, showdefaults); |
| 650 | else | ||
| 651 | nfs_show_nfsv4_options(m, nfss, showdefaults); | ||
| 634 | 652 | ||
| 635 | #ifdef CONFIG_NFS_V4 | ||
| 636 | if (clp->rpc_ops->version == 4) | ||
| 637 | seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr); | ||
| 638 | #endif | ||
| 639 | if (nfss->options & NFS_OPTION_FSCACHE) | 653 | if (nfss->options & NFS_OPTION_FSCACHE) |
| 640 | seq_printf(m, ",fsc"); | 654 | seq_printf(m, ",fsc"); |
| 641 | } | 655 | } |
diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c index 40650021fc24..d8b6e4259b80 100644 --- a/fs/ocfs2/reservations.c +++ b/fs/ocfs2/reservations.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/slab.h> | ||
| 30 | #include <linux/highmem.h> | 29 | #include <linux/highmem.h> |
| 31 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
| 32 | #include <linux/list.h> | 31 | #include <linux/list.h> |
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index ce94801f48ca..d9396a4fc7ff 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c | |||
| @@ -209,6 +209,9 @@ void proc_device_tree_add_node(struct device_node *np, | |||
| 209 | for (pp = np->properties; pp != NULL; pp = pp->next) { | 209 | for (pp = np->properties; pp != NULL; pp = pp->next) { |
| 210 | p = pp->name; | 210 | p = pp->name; |
| 211 | 211 | ||
| 212 | if (strchr(p, '/')) | ||
| 213 | continue; | ||
| 214 | |||
| 212 | if (duplicate_name(de, p)) | 215 | if (duplicate_name(de, p)) |
| 213 | p = fixup_name(np, de, p); | 216 | p = fixup_name(np, de, p); |
| 214 | 217 | ||
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 46d4b5d72bd3..cb6306e63843 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
| @@ -122,11 +122,20 @@ int task_statm(struct mm_struct *mm, int *shared, int *text, | |||
| 122 | return size; | 122 | return size; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | static void pad_len_spaces(struct seq_file *m, int len) | ||
| 126 | { | ||
| 127 | len = 25 + sizeof(void*) * 6 - len; | ||
| 128 | if (len < 1) | ||
| 129 | len = 1; | ||
| 130 | seq_printf(m, "%*c", len, ' '); | ||
| 131 | } | ||
| 132 | |||
| 125 | /* | 133 | /* |
| 126 | * display a single VMA to a sequenced file | 134 | * display a single VMA to a sequenced file |
| 127 | */ | 135 | */ |
| 128 | static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | 136 | static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) |
| 129 | { | 137 | { |
| 138 | struct mm_struct *mm = vma->vm_mm; | ||
| 130 | unsigned long ino = 0; | 139 | unsigned long ino = 0; |
| 131 | struct file *file; | 140 | struct file *file; |
| 132 | dev_t dev = 0; | 141 | dev_t dev = 0; |
| @@ -155,11 +164,14 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | |||
| 155 | MAJOR(dev), MINOR(dev), ino, &len); | 164 | MAJOR(dev), MINOR(dev), ino, &len); |
| 156 | 165 | ||
| 157 | if (file) { | 166 | if (file) { |
| 158 | len = 25 + sizeof(void *) * 6 - len; | 167 | pad_len_spaces(m, len); |
| 159 | if (len < 1) | ||
| 160 | len = 1; | ||
| 161 | seq_printf(m, "%*c", len, ' '); | ||
| 162 | seq_path(m, &file->f_path, ""); | 168 | seq_path(m, &file->f_path, ""); |
| 169 | } else if (mm) { | ||
| 170 | if (vma->vm_start <= mm->start_stack && | ||
| 171 | vma->vm_end >= mm->start_stack) { | ||
| 172 | pad_len_spaces(m, len); | ||
| 173 | seq_puts(m, "[stack]"); | ||
| 174 | } | ||
| 163 | } | 175 | } |
| 164 | 176 | ||
| 165 | seq_putc(m, '\n'); | 177 | seq_putc(m, '\n'); |
diff --git a/fs/super.c b/fs/super.c index 5c35bc7a499e..938119ab8dcb 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -374,6 +374,8 @@ void sync_supers(void) | |||
| 374 | up_read(&sb->s_umount); | 374 | up_read(&sb->s_umount); |
| 375 | 375 | ||
| 376 | spin_lock(&sb_lock); | 376 | spin_lock(&sb_lock); |
| 377 | /* lock was dropped, must reset next */ | ||
| 378 | list_safe_reset_next(sb, n, s_list); | ||
| 377 | __put_super(sb); | 379 | __put_super(sb); |
| 378 | } | 380 | } |
| 379 | } | 381 | } |
| @@ -405,6 +407,8 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg) | |||
| 405 | up_read(&sb->s_umount); | 407 | up_read(&sb->s_umount); |
| 406 | 408 | ||
| 407 | spin_lock(&sb_lock); | 409 | spin_lock(&sb_lock); |
| 410 | /* lock was dropped, must reset next */ | ||
| 411 | list_safe_reset_next(sb, n, s_list); | ||
| 408 | __put_super(sb); | 412 | __put_super(sb); |
| 409 | } | 413 | } |
| 410 | spin_unlock(&sb_lock); | 414 | spin_unlock(&sb_lock); |
| @@ -585,6 +589,8 @@ static void do_emergency_remount(struct work_struct *work) | |||
| 585 | } | 589 | } |
| 586 | up_write(&sb->s_umount); | 590 | up_write(&sb->s_umount); |
| 587 | spin_lock(&sb_lock); | 591 | spin_lock(&sb_lock); |
| 592 | /* lock was dropped, must reset next */ | ||
| 593 | list_safe_reset_next(sb, n, s_list); | ||
| 588 | __put_super(sb); | 594 | __put_super(sb); |
| 589 | } | 595 | } |
| 590 | spin_unlock(&sb_lock); | 596 | spin_unlock(&sb_lock); |
diff --git a/fs/sysv/ialloc.c b/fs/sysv/ialloc.c index bbd69bdb0fa8..fcc498ec9b33 100644 --- a/fs/sysv/ialloc.c +++ b/fs/sysv/ialloc.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/stat.h> | 25 | #include <linux/stat.h> |
| 26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
| 27 | #include <linux/buffer_head.h> | 27 | #include <linux/buffer_head.h> |
| 28 | #include <linux/writeback.h> | ||
| 28 | #include "sysv.h" | 29 | #include "sysv.h" |
| 29 | 30 | ||
| 30 | /* We don't trust the value of | 31 | /* We don't trust the value of |
| @@ -139,6 +140,9 @@ struct inode * sysv_new_inode(const struct inode * dir, mode_t mode) | |||
| 139 | struct inode *inode; | 140 | struct inode *inode; |
| 140 | sysv_ino_t ino; | 141 | sysv_ino_t ino; |
| 141 | unsigned count; | 142 | unsigned count; |
| 143 | struct writeback_control wbc = { | ||
| 144 | .sync_mode = WB_SYNC_NONE | ||
| 145 | }; | ||
| 142 | 146 | ||
| 143 | inode = new_inode(sb); | 147 | inode = new_inode(sb); |
| 144 | if (!inode) | 148 | if (!inode) |
| @@ -168,7 +172,7 @@ struct inode * sysv_new_inode(const struct inode * dir, mode_t mode) | |||
| 168 | insert_inode_hash(inode); | 172 | insert_inode_hash(inode); |
| 169 | mark_inode_dirty(inode); | 173 | mark_inode_dirty(inode); |
| 170 | 174 | ||
| 171 | sysv_write_inode(inode, 0); /* ensure inode not allocated again */ | 175 | sysv_write_inode(inode, &wbc); /* ensure inode not allocated again */ |
| 172 | mark_inode_dirty(inode); /* cleared by sysv_write_inode() */ | 176 | mark_inode_dirty(inode); /* cleared by sysv_write_inode() */ |
| 173 | /* That's it. */ | 177 | /* That's it. */ |
| 174 | unlock_super(sb); | 178 | unlock_super(sb); |
diff --git a/fs/ubifs/budget.c b/fs/ubifs/budget.c index 076ca50e9933..c8ff0d1ae5d3 100644 --- a/fs/ubifs/budget.c +++ b/fs/ubifs/budget.c | |||
| @@ -62,7 +62,9 @@ | |||
| 62 | */ | 62 | */ |
| 63 | static void shrink_liability(struct ubifs_info *c, int nr_to_write) | 63 | static void shrink_liability(struct ubifs_info *c, int nr_to_write) |
| 64 | { | 64 | { |
| 65 | down_read(&c->vfs_sb->s_umount); | ||
| 65 | writeback_inodes_sb(c->vfs_sb); | 66 | writeback_inodes_sb(c->vfs_sb); |
| 67 | up_read(&c->vfs_sb->s_umount); | ||
| 66 | } | 68 | } |
| 67 | 69 | ||
| 68 | /** | 70 | /** |
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 846b75aeb2ab..e7839ee49e43 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
| @@ -128,13 +128,12 @@ xfs_nfs_get_inode( | |||
| 128 | return ERR_PTR(-ESTALE); | 128 | return ERR_PTR(-ESTALE); |
| 129 | 129 | ||
| 130 | /* | 130 | /* |
| 131 | * The XFS_IGET_BULKSTAT means that an invalid inode number is just | 131 | * The XFS_IGET_UNTRUSTED means that an invalid inode number is just |
| 132 | * fine and not an indication of a corrupted filesystem. Because | 132 | * fine and not an indication of a corrupted filesystem as clients can |
| 133 | * clients can send any kind of invalid file handle, e.g. after | 133 | * send invalid file handles and we have to handle it gracefully.. |
| 134 | * a restore on the server we have to deal with this case gracefully. | ||
| 135 | */ | 134 | */ |
| 136 | error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, | 135 | error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, |
| 137 | XFS_ILOCK_SHARED, &ip, 0); | 136 | XFS_ILOCK_SHARED, &ip); |
| 138 | if (error) { | 137 | if (error) { |
| 139 | /* | 138 | /* |
| 140 | * EINVAL means the inode cluster doesn't exist anymore. | 139 | * EINVAL means the inode cluster doesn't exist anymore. |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 699b60cbab9c..e59a81062830 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -679,10 +679,9 @@ xfs_ioc_bulkstat( | |||
| 679 | error = xfs_bulkstat_single(mp, &inlast, | 679 | error = xfs_bulkstat_single(mp, &inlast, |
| 680 | bulkreq.ubuffer, &done); | 680 | bulkreq.ubuffer, &done); |
| 681 | else /* XFS_IOC_FSBULKSTAT */ | 681 | else /* XFS_IOC_FSBULKSTAT */ |
| 682 | error = xfs_bulkstat(mp, &inlast, &count, | 682 | error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, |
| 683 | (bulkstat_one_pf)xfs_bulkstat_one, NULL, | 683 | sizeof(xfs_bstat_t), bulkreq.ubuffer, |
| 684 | sizeof(xfs_bstat_t), bulkreq.ubuffer, | 684 | &done); |
| 685 | BULKSTAT_FG_QUICK, &done); | ||
| 686 | 685 | ||
| 687 | if (error) | 686 | if (error) |
| 688 | return -error; | 687 | return -error; |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 9287135e9bfc..52ed49e6465c 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
| @@ -237,15 +237,12 @@ xfs_bulkstat_one_compat( | |||
| 237 | xfs_ino_t ino, /* inode number to get data for */ | 237 | xfs_ino_t ino, /* inode number to get data for */ |
| 238 | void __user *buffer, /* buffer to place output in */ | 238 | void __user *buffer, /* buffer to place output in */ |
| 239 | int ubsize, /* size of buffer */ | 239 | int ubsize, /* size of buffer */ |
| 240 | void *private_data, /* my private data */ | ||
| 241 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 242 | int *ubused, /* bytes used by me */ | 240 | int *ubused, /* bytes used by me */ |
| 243 | void *dibuff, /* on-disk inode buffer */ | ||
| 244 | int *stat) /* BULKSTAT_RV_... */ | 241 | int *stat) /* BULKSTAT_RV_... */ |
| 245 | { | 242 | { |
| 246 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, | 243 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, |
| 247 | xfs_bulkstat_one_fmt_compat, bno, | 244 | xfs_bulkstat_one_fmt_compat, |
| 248 | ubused, dibuff, stat); | 245 | ubused, stat); |
| 249 | } | 246 | } |
| 250 | 247 | ||
| 251 | /* copied from xfs_ioctl.c */ | 248 | /* copied from xfs_ioctl.c */ |
| @@ -298,13 +295,11 @@ xfs_compat_ioc_bulkstat( | |||
| 298 | int res; | 295 | int res; |
| 299 | 296 | ||
| 300 | error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, | 297 | error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, |
| 301 | sizeof(compat_xfs_bstat_t), | 298 | sizeof(compat_xfs_bstat_t), 0, &res); |
| 302 | NULL, 0, NULL, NULL, &res); | ||
| 303 | } else if (cmd == XFS_IOC_FSBULKSTAT_32) { | 299 | } else if (cmd == XFS_IOC_FSBULKSTAT_32) { |
| 304 | error = xfs_bulkstat(mp, &inlast, &count, | 300 | error = xfs_bulkstat(mp, &inlast, &count, |
| 305 | xfs_bulkstat_one_compat, NULL, | 301 | xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), |
| 306 | sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, | 302 | bulkreq.ubuffer, &done); |
| 307 | BULKSTAT_FG_QUICK, &done); | ||
| 308 | } else | 303 | } else |
| 309 | error = XFS_ERROR(EINVAL); | 304 | error = XFS_ERROR(EINVAL); |
| 310 | if (error) | 305 | if (error) |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 2d8b7bc792c9..8c117ff2e3ab 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
| @@ -1632,10 +1632,7 @@ xfs_qm_dqusage_adjust( | |||
| 1632 | xfs_ino_t ino, /* inode number to get data for */ | 1632 | xfs_ino_t ino, /* inode number to get data for */ |
| 1633 | void __user *buffer, /* not used */ | 1633 | void __user *buffer, /* not used */ |
| 1634 | int ubsize, /* not used */ | 1634 | int ubsize, /* not used */ |
| 1635 | void *private_data, /* not used */ | ||
| 1636 | xfs_daddr_t bno, /* starting block of inode cluster */ | ||
| 1637 | int *ubused, /* not used */ | 1635 | int *ubused, /* not used */ |
| 1638 | void *dip, /* on-disk inode pointer (not used) */ | ||
| 1639 | int *res) /* result code value */ | 1636 | int *res) /* result code value */ |
| 1640 | { | 1637 | { |
| 1641 | xfs_inode_t *ip; | 1638 | xfs_inode_t *ip; |
| @@ -1660,7 +1657,7 @@ xfs_qm_dqusage_adjust( | |||
| 1660 | * the case in all other instances. It's OK that we do this because | 1657 | * the case in all other instances. It's OK that we do this because |
| 1661 | * quotacheck is done only at mount time. | 1658 | * quotacheck is done only at mount time. |
| 1662 | */ | 1659 | */ |
| 1663 | if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) { | 1660 | if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip))) { |
| 1664 | *res = BULKSTAT_RV_NOTHING; | 1661 | *res = BULKSTAT_RV_NOTHING; |
| 1665 | return error; | 1662 | return error; |
| 1666 | } | 1663 | } |
| @@ -1796,12 +1793,13 @@ xfs_qm_quotacheck( | |||
| 1796 | * Iterate thru all the inodes in the file system, | 1793 | * Iterate thru all the inodes in the file system, |
| 1797 | * adjusting the corresponding dquot counters in core. | 1794 | * adjusting the corresponding dquot counters in core. |
| 1798 | */ | 1795 | */ |
| 1799 | if ((error = xfs_bulkstat(mp, &lastino, &count, | 1796 | error = xfs_bulkstat(mp, &lastino, &count, |
| 1800 | xfs_qm_dqusage_adjust, NULL, | 1797 | xfs_qm_dqusage_adjust, |
| 1801 | structsz, NULL, BULKSTAT_FG_IGET, &done))) | 1798 | structsz, NULL, &done); |
| 1799 | if (error) | ||
| 1802 | break; | 1800 | break; |
| 1803 | 1801 | ||
| 1804 | } while (! done); | 1802 | } while (!done); |
| 1805 | 1803 | ||
| 1806 | /* | 1804 | /* |
| 1807 | * We've made all the changes that we need to make incore. | 1805 | * We've made all the changes that we need to make incore. |
| @@ -1889,14 +1887,14 @@ xfs_qm_init_quotainos( | |||
| 1889 | mp->m_sb.sb_uquotino != NULLFSINO) { | 1887 | mp->m_sb.sb_uquotino != NULLFSINO) { |
| 1890 | ASSERT(mp->m_sb.sb_uquotino > 0); | 1888 | ASSERT(mp->m_sb.sb_uquotino > 0); |
| 1891 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 1889 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 1892 | 0, 0, &uip, 0))) | 1890 | 0, 0, &uip))) |
| 1893 | return XFS_ERROR(error); | 1891 | return XFS_ERROR(error); |
| 1894 | } | 1892 | } |
| 1895 | if (XFS_IS_OQUOTA_ON(mp) && | 1893 | if (XFS_IS_OQUOTA_ON(mp) && |
| 1896 | mp->m_sb.sb_gquotino != NULLFSINO) { | 1894 | mp->m_sb.sb_gquotino != NULLFSINO) { |
| 1897 | ASSERT(mp->m_sb.sb_gquotino > 0); | 1895 | ASSERT(mp->m_sb.sb_gquotino > 0); |
| 1898 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, | 1896 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, |
| 1899 | 0, 0, &gip, 0))) { | 1897 | 0, 0, &gip))) { |
| 1900 | if (uip) | 1898 | if (uip) |
| 1901 | IRELE(uip); | 1899 | IRELE(uip); |
| 1902 | return XFS_ERROR(error); | 1900 | return XFS_ERROR(error); |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 92b002f1805f..b4487764e923 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
| @@ -262,7 +262,7 @@ xfs_qm_scall_trunc_qfiles( | |||
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { | 264 | if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 265 | error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip, 0); | 265 | error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip); |
| 266 | if (!error) { | 266 | if (!error) { |
| 267 | error = xfs_truncate_file(mp, qip); | 267 | error = xfs_truncate_file(mp, qip); |
| 268 | IRELE(qip); | 268 | IRELE(qip); |
| @@ -271,7 +271,7 @@ xfs_qm_scall_trunc_qfiles( | |||
| 271 | 271 | ||
| 272 | if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && | 272 | if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && |
| 273 | mp->m_sb.sb_gquotino != NULLFSINO) { | 273 | mp->m_sb.sb_gquotino != NULLFSINO) { |
| 274 | error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0); | 274 | error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip); |
| 275 | if (!error2) { | 275 | if (!error2) { |
| 276 | error2 = xfs_truncate_file(mp, qip); | 276 | error2 = xfs_truncate_file(mp, qip); |
| 277 | IRELE(qip); | 277 | IRELE(qip); |
| @@ -417,12 +417,12 @@ xfs_qm_scall_getqstat( | |||
| 417 | } | 417 | } |
| 418 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { | 418 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 419 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 419 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 420 | 0, 0, &uip, 0) == 0) | 420 | 0, 0, &uip) == 0) |
| 421 | tempuqip = B_TRUE; | 421 | tempuqip = B_TRUE; |
| 422 | } | 422 | } |
| 423 | if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { | 423 | if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { |
| 424 | if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, | 424 | if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, |
| 425 | 0, 0, &gip, 0) == 0) | 425 | 0, 0, &gip) == 0) |
| 426 | tempgqip = B_TRUE; | 426 | tempgqip = B_TRUE; |
| 427 | } | 427 | } |
| 428 | if (uip) { | 428 | if (uip) { |
| @@ -1109,10 +1109,7 @@ xfs_qm_internalqcheck_adjust( | |||
| 1109 | xfs_ino_t ino, /* inode number to get data for */ | 1109 | xfs_ino_t ino, /* inode number to get data for */ |
| 1110 | void __user *buffer, /* not used */ | 1110 | void __user *buffer, /* not used */ |
| 1111 | int ubsize, /* not used */ | 1111 | int ubsize, /* not used */ |
| 1112 | void *private_data, /* not used */ | ||
| 1113 | xfs_daddr_t bno, /* starting block of inode cluster */ | ||
| 1114 | int *ubused, /* not used */ | 1112 | int *ubused, /* not used */ |
| 1115 | void *dip, /* not used */ | ||
| 1116 | int *res) /* bulkstat result code */ | 1113 | int *res) /* bulkstat result code */ |
| 1117 | { | 1114 | { |
| 1118 | xfs_inode_t *ip; | 1115 | xfs_inode_t *ip; |
| @@ -1134,7 +1131,7 @@ xfs_qm_internalqcheck_adjust( | |||
| 1134 | ipreleased = B_FALSE; | 1131 | ipreleased = B_FALSE; |
| 1135 | again: | 1132 | again: |
| 1136 | lock_flags = XFS_ILOCK_SHARED; | 1133 | lock_flags = XFS_ILOCK_SHARED; |
| 1137 | if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip, bno))) { | 1134 | if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip))) { |
| 1138 | *res = BULKSTAT_RV_NOTHING; | 1135 | *res = BULKSTAT_RV_NOTHING; |
| 1139 | return (error); | 1136 | return (error); |
| 1140 | } | 1137 | } |
| @@ -1205,15 +1202,15 @@ xfs_qm_internalqcheck( | |||
| 1205 | * Iterate thru all the inodes in the file system, | 1202 | * Iterate thru all the inodes in the file system, |
| 1206 | * adjusting the corresponding dquot counters | 1203 | * adjusting the corresponding dquot counters |
| 1207 | */ | 1204 | */ |
| 1208 | if ((error = xfs_bulkstat(mp, &lastino, &count, | 1205 | error = xfs_bulkstat(mp, &lastino, &count, |
| 1209 | xfs_qm_internalqcheck_adjust, NULL, | 1206 | xfs_qm_internalqcheck_adjust, |
| 1210 | 0, NULL, BULKSTAT_FG_IGET, &done))) { | 1207 | 0, NULL, &done); |
| 1208 | if (error) { | ||
| 1209 | cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); | ||
| 1211 | break; | 1210 | break; |
| 1212 | } | 1211 | } |
| 1213 | } while (! done); | 1212 | } while (!done); |
| 1214 | if (error) { | 1213 | |
| 1215 | cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); | ||
| 1216 | } | ||
| 1217 | cmn_err(CE_DEBUG, "Checking results against system dquots"); | 1214 | cmn_err(CE_DEBUG, "Checking results against system dquots"); |
| 1218 | for (i = 0; i < qmtest_hashmask; i++) { | 1215 | for (i = 0; i < qmtest_hashmask; i++) { |
| 1219 | xfs_dqtest_t *d, *n; | 1216 | xfs_dqtest_t *d, *n; |
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 5bba29a07812..7f159d2a429a 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -69,7 +69,9 @@ xfs_swapext( | |||
| 69 | goto out; | 69 | goto out; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) { | 72 | if (!(file->f_mode & FMODE_WRITE) || |
| 73 | !(file->f_mode & FMODE_READ) || | ||
| 74 | (file->f_flags & O_APPEND)) { | ||
| 73 | error = XFS_ERROR(EBADF); | 75 | error = XFS_ERROR(EBADF); |
| 74 | goto out_put_file; | 76 | goto out_put_file; |
| 75 | } | 77 | } |
| @@ -81,6 +83,7 @@ xfs_swapext( | |||
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | if (!(tmp_file->f_mode & FMODE_WRITE) || | 85 | if (!(tmp_file->f_mode & FMODE_WRITE) || |
| 86 | !(tmp_file->f_mode & FMODE_READ) || | ||
| 84 | (tmp_file->f_flags & O_APPEND)) { | 87 | (tmp_file->f_flags & O_APPEND)) { |
| 85 | error = XFS_ERROR(EBADF); | 88 | error = XFS_ERROR(EBADF); |
| 86 | goto out_put_tmp_file; | 89 | goto out_put_tmp_file; |
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 9d884c127bb9..c7142a064c48 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
| @@ -1203,6 +1203,63 @@ error0: | |||
| 1203 | return error; | 1203 | return error; |
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | STATIC int | ||
| 1207 | xfs_imap_lookup( | ||
| 1208 | struct xfs_mount *mp, | ||
| 1209 | struct xfs_trans *tp, | ||
| 1210 | xfs_agnumber_t agno, | ||
| 1211 | xfs_agino_t agino, | ||
| 1212 | xfs_agblock_t agbno, | ||
| 1213 | xfs_agblock_t *chunk_agbno, | ||
| 1214 | xfs_agblock_t *offset_agbno, | ||
| 1215 | int flags) | ||
| 1216 | { | ||
| 1217 | struct xfs_inobt_rec_incore rec; | ||
| 1218 | struct xfs_btree_cur *cur; | ||
| 1219 | struct xfs_buf *agbp; | ||
| 1220 | xfs_agino_t startino; | ||
| 1221 | int error; | ||
| 1222 | int i; | ||
| 1223 | |||
| 1224 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | ||
| 1225 | if (error) { | ||
| 1226 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1227 | "xfs_ialloc_read_agi() returned " | ||
| 1228 | "error %d, agno %d", | ||
| 1229 | error, agno); | ||
| 1230 | return error; | ||
| 1231 | } | ||
| 1232 | |||
| 1233 | /* | ||
| 1234 | * derive and lookup the exact inode record for the given agino. If the | ||
| 1235 | * record cannot be found, then it's an invalid inode number and we | ||
| 1236 | * should abort. | ||
| 1237 | */ | ||
| 1238 | cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); | ||
| 1239 | startino = agino & ~(XFS_IALLOC_INODES(mp) - 1); | ||
| 1240 | error = xfs_inobt_lookup(cur, startino, XFS_LOOKUP_EQ, &i); | ||
| 1241 | if (!error) { | ||
| 1242 | if (i) | ||
| 1243 | error = xfs_inobt_get_rec(cur, &rec, &i); | ||
| 1244 | if (!error && i == 0) | ||
| 1245 | error = EINVAL; | ||
| 1246 | } | ||
| 1247 | |||
| 1248 | xfs_trans_brelse(tp, agbp); | ||
| 1249 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); | ||
| 1250 | if (error) | ||
| 1251 | return error; | ||
| 1252 | |||
| 1253 | /* for untrusted inodes check it is allocated first */ | ||
| 1254 | if ((flags & XFS_IGET_UNTRUSTED) && | ||
| 1255 | (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) | ||
| 1256 | return EINVAL; | ||
| 1257 | |||
| 1258 | *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); | ||
| 1259 | *offset_agbno = agbno - *chunk_agbno; | ||
| 1260 | return 0; | ||
| 1261 | } | ||
| 1262 | |||
| 1206 | /* | 1263 | /* |
| 1207 | * Return the location of the inode in imap, for mapping it into a buffer. | 1264 | * Return the location of the inode in imap, for mapping it into a buffer. |
| 1208 | */ | 1265 | */ |
| @@ -1235,8 +1292,11 @@ xfs_imap( | |||
| 1235 | if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || | 1292 | if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || |
| 1236 | ino != XFS_AGINO_TO_INO(mp, agno, agino)) { | 1293 | ino != XFS_AGINO_TO_INO(mp, agno, agino)) { |
| 1237 | #ifdef DEBUG | 1294 | #ifdef DEBUG |
| 1238 | /* no diagnostics for bulkstat, ino comes from userspace */ | 1295 | /* |
| 1239 | if (flags & XFS_IGET_BULKSTAT) | 1296 | * Don't output diagnostic information for untrusted inodes |
| 1297 | * as they can be invalid without implying corruption. | ||
| 1298 | */ | ||
| 1299 | if (flags & XFS_IGET_UNTRUSTED) | ||
| 1240 | return XFS_ERROR(EINVAL); | 1300 | return XFS_ERROR(EINVAL); |
| 1241 | if (agno >= mp->m_sb.sb_agcount) { | 1301 | if (agno >= mp->m_sb.sb_agcount) { |
| 1242 | xfs_fs_cmn_err(CE_ALERT, mp, | 1302 | xfs_fs_cmn_err(CE_ALERT, mp, |
| @@ -1263,6 +1323,23 @@ xfs_imap( | |||
| 1263 | return XFS_ERROR(EINVAL); | 1323 | return XFS_ERROR(EINVAL); |
| 1264 | } | 1324 | } |
| 1265 | 1325 | ||
| 1326 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; | ||
| 1327 | |||
| 1328 | /* | ||
| 1329 | * For bulkstat and handle lookups, we have an untrusted inode number | ||
| 1330 | * that we have to verify is valid. We cannot do this just by reading | ||
| 1331 | * the inode buffer as it may have been unlinked and removed leaving | ||
| 1332 | * inodes in stale state on disk. Hence we have to do a btree lookup | ||
| 1333 | * in all cases where an untrusted inode number is passed. | ||
| 1334 | */ | ||
| 1335 | if (flags & XFS_IGET_UNTRUSTED) { | ||
| 1336 | error = xfs_imap_lookup(mp, tp, agno, agino, agbno, | ||
| 1337 | &chunk_agbno, &offset_agbno, flags); | ||
| 1338 | if (error) | ||
| 1339 | return error; | ||
| 1340 | goto out_map; | ||
| 1341 | } | ||
| 1342 | |||
| 1266 | /* | 1343 | /* |
| 1267 | * If the inode cluster size is the same as the blocksize or | 1344 | * If the inode cluster size is the same as the blocksize or |
| 1268 | * smaller we get to the buffer by simple arithmetics. | 1345 | * smaller we get to the buffer by simple arithmetics. |
| @@ -1277,24 +1354,6 @@ xfs_imap( | |||
| 1277 | return 0; | 1354 | return 0; |
| 1278 | } | 1355 | } |
| 1279 | 1356 | ||
| 1280 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; | ||
| 1281 | |||
| 1282 | /* | ||
| 1283 | * If we get a block number passed from bulkstat we can use it to | ||
| 1284 | * find the buffer easily. | ||
| 1285 | */ | ||
| 1286 | if (imap->im_blkno) { | ||
| 1287 | offset = XFS_INO_TO_OFFSET(mp, ino); | ||
| 1288 | ASSERT(offset < mp->m_sb.sb_inopblock); | ||
| 1289 | |||
| 1290 | cluster_agbno = xfs_daddr_to_agbno(mp, imap->im_blkno); | ||
| 1291 | offset += (agbno - cluster_agbno) * mp->m_sb.sb_inopblock; | ||
| 1292 | |||
| 1293 | imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); | ||
| 1294 | imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); | ||
| 1295 | return 0; | ||
| 1296 | } | ||
| 1297 | |||
| 1298 | /* | 1357 | /* |
| 1299 | * If the inode chunks are aligned then use simple maths to | 1358 | * If the inode chunks are aligned then use simple maths to |
| 1300 | * find the location. Otherwise we have to do a btree | 1359 | * find the location. Otherwise we have to do a btree |
| @@ -1304,50 +1363,13 @@ xfs_imap( | |||
| 1304 | offset_agbno = agbno & mp->m_inoalign_mask; | 1363 | offset_agbno = agbno & mp->m_inoalign_mask; |
| 1305 | chunk_agbno = agbno - offset_agbno; | 1364 | chunk_agbno = agbno - offset_agbno; |
| 1306 | } else { | 1365 | } else { |
| 1307 | xfs_btree_cur_t *cur; /* inode btree cursor */ | 1366 | error = xfs_imap_lookup(mp, tp, agno, agino, agbno, |
| 1308 | xfs_inobt_rec_incore_t chunk_rec; | 1367 | &chunk_agbno, &offset_agbno, flags); |
| 1309 | xfs_buf_t *agbp; /* agi buffer */ | ||
| 1310 | int i; /* temp state */ | ||
| 1311 | |||
| 1312 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | ||
| 1313 | if (error) { | ||
| 1314 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1315 | "xfs_ialloc_read_agi() returned " | ||
| 1316 | "error %d, agno %d", | ||
| 1317 | error, agno); | ||
| 1318 | return error; | ||
| 1319 | } | ||
| 1320 | |||
| 1321 | cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); | ||
| 1322 | error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); | ||
| 1323 | if (error) { | ||
| 1324 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1325 | "xfs_inobt_lookup() failed"); | ||
| 1326 | goto error0; | ||
| 1327 | } | ||
| 1328 | |||
| 1329 | error = xfs_inobt_get_rec(cur, &chunk_rec, &i); | ||
| 1330 | if (error) { | ||
| 1331 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1332 | "xfs_inobt_get_rec() failed"); | ||
| 1333 | goto error0; | ||
| 1334 | } | ||
| 1335 | if (i == 0) { | ||
| 1336 | #ifdef DEBUG | ||
| 1337 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1338 | "xfs_inobt_get_rec() failed"); | ||
| 1339 | #endif /* DEBUG */ | ||
| 1340 | error = XFS_ERROR(EINVAL); | ||
| 1341 | } | ||
| 1342 | error0: | ||
| 1343 | xfs_trans_brelse(tp, agbp); | ||
| 1344 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); | ||
| 1345 | if (error) | 1368 | if (error) |
| 1346 | return error; | 1369 | return error; |
| 1347 | chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_rec.ir_startino); | ||
| 1348 | offset_agbno = agbno - chunk_agbno; | ||
| 1349 | } | 1370 | } |
| 1350 | 1371 | ||
| 1372 | out_map: | ||
| 1351 | ASSERT(agbno >= chunk_agbno); | 1373 | ASSERT(agbno >= chunk_agbno); |
| 1352 | cluster_agbno = chunk_agbno + | 1374 | cluster_agbno = chunk_agbno + |
| 1353 | ((offset_agbno / blks_per_cluster) * blks_per_cluster); | 1375 | ((offset_agbno / blks_per_cluster) * blks_per_cluster); |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 75df75f43d48..8f8b91be2c99 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -259,7 +259,6 @@ xfs_iget_cache_miss( | |||
| 259 | xfs_trans_t *tp, | 259 | xfs_trans_t *tp, |
| 260 | xfs_ino_t ino, | 260 | xfs_ino_t ino, |
| 261 | struct xfs_inode **ipp, | 261 | struct xfs_inode **ipp, |
| 262 | xfs_daddr_t bno, | ||
| 263 | int flags, | 262 | int flags, |
| 264 | int lock_flags) | 263 | int lock_flags) |
| 265 | { | 264 | { |
| @@ -272,7 +271,7 @@ xfs_iget_cache_miss( | |||
| 272 | if (!ip) | 271 | if (!ip) |
| 273 | return ENOMEM; | 272 | return ENOMEM; |
| 274 | 273 | ||
| 275 | error = xfs_iread(mp, tp, ip, bno, flags); | 274 | error = xfs_iread(mp, tp, ip, flags); |
| 276 | if (error) | 275 | if (error) |
| 277 | goto out_destroy; | 276 | goto out_destroy; |
| 278 | 277 | ||
| @@ -358,8 +357,6 @@ out_destroy: | |||
| 358 | * within the file system for the inode being requested. | 357 | * within the file system for the inode being requested. |
| 359 | * lock_flags -- flags indicating how to lock the inode. See the comment | 358 | * lock_flags -- flags indicating how to lock the inode. See the comment |
| 360 | * for xfs_ilock() for a list of valid values. | 359 | * for xfs_ilock() for a list of valid values. |
| 361 | * bno -- the block number starting the buffer containing the inode, | ||
| 362 | * if known (as by bulkstat), else 0. | ||
| 363 | */ | 360 | */ |
| 364 | int | 361 | int |
| 365 | xfs_iget( | 362 | xfs_iget( |
| @@ -368,8 +365,7 @@ xfs_iget( | |||
| 368 | xfs_ino_t ino, | 365 | xfs_ino_t ino, |
| 369 | uint flags, | 366 | uint flags, |
| 370 | uint lock_flags, | 367 | uint lock_flags, |
| 371 | xfs_inode_t **ipp, | 368 | xfs_inode_t **ipp) |
| 372 | xfs_daddr_t bno) | ||
| 373 | { | 369 | { |
| 374 | xfs_inode_t *ip; | 370 | xfs_inode_t *ip; |
| 375 | int error; | 371 | int error; |
| @@ -397,7 +393,7 @@ again: | |||
| 397 | read_unlock(&pag->pag_ici_lock); | 393 | read_unlock(&pag->pag_ici_lock); |
| 398 | XFS_STATS_INC(xs_ig_missed); | 394 | XFS_STATS_INC(xs_ig_missed); |
| 399 | 395 | ||
| 400 | error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, bno, | 396 | error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, |
| 401 | flags, lock_flags); | 397 | flags, lock_flags); |
| 402 | if (error) | 398 | if (error) |
| 403 | goto out_error_or_again; | 399 | goto out_error_or_again; |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d53c39de7d05..b76a829d7e20 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -177,7 +177,7 @@ xfs_imap_to_bp( | |||
| 177 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, | 177 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, |
| 178 | XFS_ERRTAG_ITOBP_INOTOBP, | 178 | XFS_ERRTAG_ITOBP_INOTOBP, |
| 179 | XFS_RANDOM_ITOBP_INOTOBP))) { | 179 | XFS_RANDOM_ITOBP_INOTOBP))) { |
| 180 | if (iget_flags & XFS_IGET_BULKSTAT) { | 180 | if (iget_flags & XFS_IGET_UNTRUSTED) { |
| 181 | xfs_trans_brelse(tp, bp); | 181 | xfs_trans_brelse(tp, bp); |
| 182 | return XFS_ERROR(EINVAL); | 182 | return XFS_ERROR(EINVAL); |
| 183 | } | 183 | } |
| @@ -787,7 +787,6 @@ xfs_iread( | |||
| 787 | xfs_mount_t *mp, | 787 | xfs_mount_t *mp, |
| 788 | xfs_trans_t *tp, | 788 | xfs_trans_t *tp, |
| 789 | xfs_inode_t *ip, | 789 | xfs_inode_t *ip, |
| 790 | xfs_daddr_t bno, | ||
| 791 | uint iget_flags) | 790 | uint iget_flags) |
| 792 | { | 791 | { |
| 793 | xfs_buf_t *bp; | 792 | xfs_buf_t *bp; |
| @@ -797,11 +796,9 @@ xfs_iread( | |||
| 797 | /* | 796 | /* |
| 798 | * Fill in the location information in the in-core inode. | 797 | * Fill in the location information in the in-core inode. |
| 799 | */ | 798 | */ |
| 800 | ip->i_imap.im_blkno = bno; | ||
| 801 | error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); | 799 | error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); |
| 802 | if (error) | 800 | if (error) |
| 803 | return error; | 801 | return error; |
| 804 | ASSERT(bno == 0 || bno == ip->i_imap.im_blkno); | ||
| 805 | 802 | ||
| 806 | /* | 803 | /* |
| 807 | * Get pointers to the on-disk inode and the buffer containing it. | 804 | * Get pointers to the on-disk inode and the buffer containing it. |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9965e40a4615..78550df13cd6 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -442,7 +442,7 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) | |||
| 442 | * xfs_iget.c prototypes. | 442 | * xfs_iget.c prototypes. |
| 443 | */ | 443 | */ |
| 444 | int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, | 444 | int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, |
| 445 | uint, uint, xfs_inode_t **, xfs_daddr_t); | 445 | uint, uint, xfs_inode_t **); |
| 446 | void xfs_iput(xfs_inode_t *, uint); | 446 | void xfs_iput(xfs_inode_t *, uint); |
| 447 | void xfs_iput_new(xfs_inode_t *, uint); | 447 | void xfs_iput_new(xfs_inode_t *, uint); |
| 448 | void xfs_ilock(xfs_inode_t *, uint); | 448 | void xfs_ilock(xfs_inode_t *, uint); |
| @@ -500,7 +500,7 @@ do { \ | |||
| 500 | * Flags for xfs_iget() | 500 | * Flags for xfs_iget() |
| 501 | */ | 501 | */ |
| 502 | #define XFS_IGET_CREATE 0x1 | 502 | #define XFS_IGET_CREATE 0x1 |
| 503 | #define XFS_IGET_BULKSTAT 0x2 | 503 | #define XFS_IGET_UNTRUSTED 0x2 |
| 504 | 504 | ||
| 505 | int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, | 505 | int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, |
| 506 | xfs_ino_t, struct xfs_dinode **, | 506 | xfs_ino_t, struct xfs_dinode **, |
| @@ -509,7 +509,7 @@ int xfs_itobp(struct xfs_mount *, struct xfs_trans *, | |||
| 509 | struct xfs_inode *, struct xfs_dinode **, | 509 | struct xfs_inode *, struct xfs_dinode **, |
| 510 | struct xfs_buf **, uint); | 510 | struct xfs_buf **, uint); |
| 511 | int xfs_iread(struct xfs_mount *, struct xfs_trans *, | 511 | int xfs_iread(struct xfs_mount *, struct xfs_trans *, |
| 512 | struct xfs_inode *, xfs_daddr_t, uint); | 512 | struct xfs_inode *, uint); |
| 513 | void xfs_dinode_to_disk(struct xfs_dinode *, | 513 | void xfs_dinode_to_disk(struct xfs_dinode *, |
| 514 | struct xfs_icdinode *); | 514 | struct xfs_icdinode *); |
| 515 | void xfs_idestroy_fork(struct xfs_inode *, int); | 515 | void xfs_idestroy_fork(struct xfs_inode *, int); |
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b1b801e4a28e..2b86f8610512 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
| @@ -49,24 +49,40 @@ xfs_internal_inum( | |||
| 49 | (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); | 49 | (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | STATIC int | 52 | /* |
| 53 | xfs_bulkstat_one_iget( | 53 | * Return stat information for one inode. |
| 54 | xfs_mount_t *mp, /* mount point for filesystem */ | 54 | * Return 0 if ok, else errno. |
| 55 | xfs_ino_t ino, /* inode number to get data for */ | 55 | */ |
| 56 | xfs_daddr_t bno, /* starting bno of inode cluster */ | 56 | int |
| 57 | xfs_bstat_t *buf, /* return buffer */ | 57 | xfs_bulkstat_one_int( |
| 58 | int *stat) /* BULKSTAT_RV_... */ | 58 | struct xfs_mount *mp, /* mount point for filesystem */ |
| 59 | xfs_ino_t ino, /* inode to get data for */ | ||
| 60 | void __user *buffer, /* buffer to place output in */ | ||
| 61 | int ubsize, /* size of buffer */ | ||
| 62 | bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ | ||
| 63 | int *ubused, /* bytes used by me */ | ||
| 64 | int *stat) /* BULKSTAT_RV_... */ | ||
| 59 | { | 65 | { |
| 60 | xfs_icdinode_t *dic; /* dinode core info pointer */ | 66 | struct xfs_icdinode *dic; /* dinode core info pointer */ |
| 61 | xfs_inode_t *ip; /* incore inode pointer */ | 67 | struct xfs_inode *ip; /* incore inode pointer */ |
| 62 | struct inode *inode; | 68 | struct inode *inode; |
| 63 | int error; | 69 | struct xfs_bstat *buf; /* return buffer */ |
| 70 | int error = 0; /* error value */ | ||
| 71 | |||
| 72 | *stat = BULKSTAT_RV_NOTHING; | ||
| 73 | |||
| 74 | if (!buffer || xfs_internal_inum(mp, ino)) | ||
| 75 | return XFS_ERROR(EINVAL); | ||
| 76 | |||
| 77 | buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); | ||
| 78 | if (!buf) | ||
| 79 | return XFS_ERROR(ENOMEM); | ||
| 64 | 80 | ||
| 65 | error = xfs_iget(mp, NULL, ino, | 81 | error = xfs_iget(mp, NULL, ino, |
| 66 | XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); | 82 | XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip); |
| 67 | if (error) { | 83 | if (error) { |
| 68 | *stat = BULKSTAT_RV_NOTHING; | 84 | *stat = BULKSTAT_RV_NOTHING; |
| 69 | return error; | 85 | goto out_free; |
| 70 | } | 86 | } |
| 71 | 87 | ||
| 72 | ASSERT(ip != NULL); | 88 | ASSERT(ip != NULL); |
| @@ -127,77 +143,16 @@ xfs_bulkstat_one_iget( | |||
| 127 | buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; | 143 | buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; |
| 128 | break; | 144 | break; |
| 129 | } | 145 | } |
| 130 | |||
| 131 | xfs_iput(ip, XFS_ILOCK_SHARED); | 146 | xfs_iput(ip, XFS_ILOCK_SHARED); |
| 132 | return error; | ||
| 133 | } | ||
| 134 | 147 | ||
| 135 | STATIC void | 148 | error = formatter(buffer, ubsize, ubused, buf); |
| 136 | xfs_bulkstat_one_dinode( | ||
| 137 | xfs_mount_t *mp, /* mount point for filesystem */ | ||
| 138 | xfs_ino_t ino, /* inode number to get data for */ | ||
| 139 | xfs_dinode_t *dic, /* dinode inode pointer */ | ||
| 140 | xfs_bstat_t *buf) /* return buffer */ | ||
| 141 | { | ||
| 142 | /* | ||
| 143 | * The inode format changed when we moved the link count and | ||
| 144 | * made it 32 bits long. If this is an old format inode, | ||
| 145 | * convert it in memory to look like a new one. If it gets | ||
| 146 | * flushed to disk we will convert back before flushing or | ||
| 147 | * logging it. We zero out the new projid field and the old link | ||
| 148 | * count field. We'll handle clearing the pad field (the remains | ||
| 149 | * of the old uuid field) when we actually convert the inode to | ||
| 150 | * the new format. We don't change the version number so that we | ||
| 151 | * can distinguish this from a real new format inode. | ||
| 152 | */ | ||
| 153 | if (dic->di_version == 1) { | ||
| 154 | buf->bs_nlink = be16_to_cpu(dic->di_onlink); | ||
| 155 | buf->bs_projid = 0; | ||
| 156 | } else { | ||
| 157 | buf->bs_nlink = be32_to_cpu(dic->di_nlink); | ||
| 158 | buf->bs_projid = be16_to_cpu(dic->di_projid); | ||
| 159 | } | ||
| 160 | 149 | ||
| 161 | buf->bs_ino = ino; | 150 | if (!error) |
| 162 | buf->bs_mode = be16_to_cpu(dic->di_mode); | 151 | *stat = BULKSTAT_RV_DIDONE; |
| 163 | buf->bs_uid = be32_to_cpu(dic->di_uid); | ||
| 164 | buf->bs_gid = be32_to_cpu(dic->di_gid); | ||
| 165 | buf->bs_size = be64_to_cpu(dic->di_size); | ||
| 166 | buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); | ||
| 167 | buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); | ||
| 168 | buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); | ||
| 169 | buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); | ||
| 170 | buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); | ||
| 171 | buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); | ||
| 172 | buf->bs_xflags = xfs_dic2xflags(dic); | ||
| 173 | buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; | ||
| 174 | buf->bs_extents = be32_to_cpu(dic->di_nextents); | ||
| 175 | buf->bs_gen = be32_to_cpu(dic->di_gen); | ||
| 176 | memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); | ||
| 177 | buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); | ||
| 178 | buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); | ||
| 179 | buf->bs_aextents = be16_to_cpu(dic->di_anextents); | ||
| 180 | buf->bs_forkoff = XFS_DFORK_BOFF(dic); | ||
| 181 | 152 | ||
| 182 | switch (dic->di_format) { | 153 | out_free: |
| 183 | case XFS_DINODE_FMT_DEV: | 154 | kmem_free(buf); |
| 184 | buf->bs_rdev = xfs_dinode_get_rdev(dic); | 155 | return error; |
| 185 | buf->bs_blksize = BLKDEV_IOSIZE; | ||
| 186 | buf->bs_blocks = 0; | ||
| 187 | break; | ||
| 188 | case XFS_DINODE_FMT_LOCAL: | ||
| 189 | case XFS_DINODE_FMT_UUID: | ||
| 190 | buf->bs_rdev = 0; | ||
| 191 | buf->bs_blksize = mp->m_sb.sb_blocksize; | ||
| 192 | buf->bs_blocks = 0; | ||
| 193 | break; | ||
| 194 | case XFS_DINODE_FMT_EXTENTS: | ||
| 195 | case XFS_DINODE_FMT_BTREE: | ||
| 196 | buf->bs_rdev = 0; | ||
| 197 | buf->bs_blksize = mp->m_sb.sb_blocksize; | ||
| 198 | buf->bs_blocks = be64_to_cpu(dic->di_nblocks); | ||
| 199 | break; | ||
| 200 | } | ||
| 201 | } | 156 | } |
| 202 | 157 | ||
| 203 | /* Return 0 on success or positive error */ | 158 | /* Return 0 on success or positive error */ |
| @@ -217,118 +172,17 @@ xfs_bulkstat_one_fmt( | |||
| 217 | return 0; | 172 | return 0; |
| 218 | } | 173 | } |
| 219 | 174 | ||
| 220 | /* | ||
| 221 | * Return stat information for one inode. | ||
| 222 | * Return 0 if ok, else errno. | ||
| 223 | */ | ||
| 224 | int /* error status */ | ||
| 225 | xfs_bulkstat_one_int( | ||
| 226 | xfs_mount_t *mp, /* mount point for filesystem */ | ||
| 227 | xfs_ino_t ino, /* inode number to get data for */ | ||
| 228 | void __user *buffer, /* buffer to place output in */ | ||
| 229 | int ubsize, /* size of buffer */ | ||
| 230 | bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ | ||
| 231 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 232 | int *ubused, /* bytes used by me */ | ||
| 233 | void *dibuff, /* on-disk inode buffer */ | ||
| 234 | int *stat) /* BULKSTAT_RV_... */ | ||
| 235 | { | ||
| 236 | xfs_bstat_t *buf; /* return buffer */ | ||
| 237 | int error = 0; /* error value */ | ||
| 238 | xfs_dinode_t *dip; /* dinode inode pointer */ | ||
| 239 | |||
| 240 | dip = (xfs_dinode_t *)dibuff; | ||
| 241 | *stat = BULKSTAT_RV_NOTHING; | ||
| 242 | |||
| 243 | if (!buffer || xfs_internal_inum(mp, ino)) | ||
| 244 | return XFS_ERROR(EINVAL); | ||
| 245 | |||
| 246 | buf = kmem_alloc(sizeof(*buf), KM_SLEEP); | ||
| 247 | |||
| 248 | if (dip == NULL) { | ||
| 249 | /* We're not being passed a pointer to a dinode. This happens | ||
| 250 | * if BULKSTAT_FG_IGET is selected. Do the iget. | ||
| 251 | */ | ||
| 252 | error = xfs_bulkstat_one_iget(mp, ino, bno, buf, stat); | ||
| 253 | if (error) | ||
| 254 | goto out_free; | ||
| 255 | } else { | ||
| 256 | xfs_bulkstat_one_dinode(mp, ino, dip, buf); | ||
| 257 | } | ||
| 258 | |||
| 259 | error = formatter(buffer, ubsize, ubused, buf); | ||
| 260 | if (error) | ||
| 261 | goto out_free; | ||
| 262 | |||
| 263 | *stat = BULKSTAT_RV_DIDONE; | ||
| 264 | |||
| 265 | out_free: | ||
| 266 | kmem_free(buf); | ||
| 267 | return error; | ||
| 268 | } | ||
| 269 | |||
| 270 | int | 175 | int |
| 271 | xfs_bulkstat_one( | 176 | xfs_bulkstat_one( |
| 272 | xfs_mount_t *mp, /* mount point for filesystem */ | 177 | xfs_mount_t *mp, /* mount point for filesystem */ |
| 273 | xfs_ino_t ino, /* inode number to get data for */ | 178 | xfs_ino_t ino, /* inode number to get data for */ |
| 274 | void __user *buffer, /* buffer to place output in */ | 179 | void __user *buffer, /* buffer to place output in */ |
| 275 | int ubsize, /* size of buffer */ | 180 | int ubsize, /* size of buffer */ |
| 276 | void *private_data, /* my private data */ | ||
| 277 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 278 | int *ubused, /* bytes used by me */ | 181 | int *ubused, /* bytes used by me */ |
| 279 | void *dibuff, /* on-disk inode buffer */ | ||
| 280 | int *stat) /* BULKSTAT_RV_... */ | 182 | int *stat) /* BULKSTAT_RV_... */ |
| 281 | { | 183 | { |
| 282 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, | 184 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, |
| 283 | xfs_bulkstat_one_fmt, bno, | 185 | xfs_bulkstat_one_fmt, ubused, stat); |
| 284 | ubused, dibuff, stat); | ||
| 285 | } | ||
| 286 | |||
| 287 | /* | ||
| 288 | * Test to see whether we can use the ondisk inode directly, based | ||
| 289 | * on the given bulkstat flags, filling in dipp accordingly. | ||
| 290 | * Returns zero if the inode is dodgey. | ||
| 291 | */ | ||
| 292 | STATIC int | ||
| 293 | xfs_bulkstat_use_dinode( | ||
| 294 | xfs_mount_t *mp, | ||
| 295 | int flags, | ||
| 296 | xfs_buf_t *bp, | ||
| 297 | int clustidx, | ||
| 298 | xfs_dinode_t **dipp) | ||
| 299 | { | ||
| 300 | xfs_dinode_t *dip; | ||
| 301 | unsigned int aformat; | ||
| 302 | |||
| 303 | *dipp = NULL; | ||
| 304 | if (!bp || (flags & BULKSTAT_FG_IGET)) | ||
| 305 | return 1; | ||
| 306 | dip = (xfs_dinode_t *) | ||
| 307 | xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); | ||
| 308 | /* | ||
| 309 | * Check the buffer containing the on-disk inode for di_mode == 0. | ||
| 310 | * This is to prevent xfs_bulkstat from picking up just reclaimed | ||
| 311 | * inodes that have their in-core state initialized but not flushed | ||
| 312 | * to disk yet. This is a temporary hack that would require a proper | ||
| 313 | * fix in the future. | ||
| 314 | */ | ||
| 315 | if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC || | ||
| 316 | !XFS_DINODE_GOOD_VERSION(dip->di_version) || | ||
| 317 | !dip->di_mode) | ||
| 318 | return 0; | ||
| 319 | if (flags & BULKSTAT_FG_QUICK) { | ||
| 320 | *dipp = dip; | ||
| 321 | return 1; | ||
| 322 | } | ||
| 323 | /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ | ||
| 324 | aformat = dip->di_aformat; | ||
| 325 | if ((XFS_DFORK_Q(dip) == 0) || | ||
| 326 | (aformat == XFS_DINODE_FMT_LOCAL) || | ||
| 327 | (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_anextents)) { | ||
| 328 | *dipp = dip; | ||
| 329 | return 1; | ||
| 330 | } | ||
| 331 | return 1; | ||
| 332 | } | 186 | } |
| 333 | 187 | ||
| 334 | #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) | 188 | #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) |
| @@ -342,10 +196,8 @@ xfs_bulkstat( | |||
| 342 | xfs_ino_t *lastinop, /* last inode returned */ | 196 | xfs_ino_t *lastinop, /* last inode returned */ |
| 343 | int *ubcountp, /* size of buffer/count returned */ | 197 | int *ubcountp, /* size of buffer/count returned */ |
| 344 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ | 198 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ |
| 345 | void *private_data,/* private data for formatter */ | ||
| 346 | size_t statstruct_size, /* sizeof struct filling */ | 199 | size_t statstruct_size, /* sizeof struct filling */ |
| 347 | char __user *ubuffer, /* buffer with inode stats */ | 200 | char __user *ubuffer, /* buffer with inode stats */ |
| 348 | int flags, /* defined in xfs_itable.h */ | ||
| 349 | int *done) /* 1 if there are more stats to get */ | 201 | int *done) /* 1 if there are more stats to get */ |
| 350 | { | 202 | { |
| 351 | xfs_agblock_t agbno=0;/* allocation group block number */ | 203 | xfs_agblock_t agbno=0;/* allocation group block number */ |
| @@ -380,14 +232,12 @@ xfs_bulkstat( | |||
| 380 | int ubelem; /* spaces used in user's buffer */ | 232 | int ubelem; /* spaces used in user's buffer */ |
| 381 | int ubused; /* bytes used by formatter */ | 233 | int ubused; /* bytes used by formatter */ |
| 382 | xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ | 234 | xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ |
| 383 | xfs_dinode_t *dip; /* ptr into bp for specific inode */ | ||
| 384 | 235 | ||
| 385 | /* | 236 | /* |
| 386 | * Get the last inode value, see if there's nothing to do. | 237 | * Get the last inode value, see if there's nothing to do. |
| 387 | */ | 238 | */ |
| 388 | ino = (xfs_ino_t)*lastinop; | 239 | ino = (xfs_ino_t)*lastinop; |
| 389 | lastino = ino; | 240 | lastino = ino; |
| 390 | dip = NULL; | ||
| 391 | agno = XFS_INO_TO_AGNO(mp, ino); | 241 | agno = XFS_INO_TO_AGNO(mp, ino); |
| 392 | agino = XFS_INO_TO_AGINO(mp, ino); | 242 | agino = XFS_INO_TO_AGINO(mp, ino); |
| 393 | if (agno >= mp->m_sb.sb_agcount || | 243 | if (agno >= mp->m_sb.sb_agcount || |
| @@ -612,37 +462,6 @@ xfs_bulkstat( | |||
| 612 | irbp->ir_startino) + | 462 | irbp->ir_startino) + |
| 613 | ((chunkidx & nimask) >> | 463 | ((chunkidx & nimask) >> |
| 614 | mp->m_sb.sb_inopblog); | 464 | mp->m_sb.sb_inopblog); |
| 615 | |||
| 616 | if (flags & (BULKSTAT_FG_QUICK | | ||
| 617 | BULKSTAT_FG_INLINE)) { | ||
| 618 | int offset; | ||
| 619 | |||
| 620 | ino = XFS_AGINO_TO_INO(mp, agno, | ||
| 621 | agino); | ||
| 622 | bno = XFS_AGB_TO_DADDR(mp, agno, | ||
| 623 | agbno); | ||
| 624 | |||
| 625 | /* | ||
| 626 | * Get the inode cluster buffer | ||
| 627 | */ | ||
| 628 | if (bp) | ||
| 629 | xfs_buf_relse(bp); | ||
| 630 | |||
| 631 | error = xfs_inotobp(mp, NULL, ino, &dip, | ||
| 632 | &bp, &offset, | ||
| 633 | XFS_IGET_BULKSTAT); | ||
| 634 | |||
| 635 | if (!error) | ||
| 636 | clustidx = offset / mp->m_sb.sb_inodesize; | ||
| 637 | if (XFS_TEST_ERROR(error != 0, | ||
| 638 | mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK, | ||
| 639 | XFS_RANDOM_BULKSTAT_READ_CHUNK)) { | ||
| 640 | bp = NULL; | ||
| 641 | ubleft = 0; | ||
| 642 | rval = error; | ||
| 643 | break; | ||
| 644 | } | ||
| 645 | } | ||
| 646 | } | 465 | } |
| 647 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | 466 | ino = XFS_AGINO_TO_INO(mp, agno, agino); |
| 648 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); | 467 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); |
| @@ -658,35 +477,13 @@ xfs_bulkstat( | |||
| 658 | * when the chunk is used up. | 477 | * when the chunk is used up. |
| 659 | */ | 478 | */ |
| 660 | irbp->ir_freecount++; | 479 | irbp->ir_freecount++; |
| 661 | if (!xfs_bulkstat_use_dinode(mp, flags, bp, | ||
| 662 | clustidx, &dip)) { | ||
| 663 | lastino = ino; | ||
| 664 | continue; | ||
| 665 | } | ||
| 666 | /* | ||
| 667 | * If we need to do an iget, cannot hold bp. | ||
| 668 | * Drop it, until starting the next cluster. | ||
| 669 | */ | ||
| 670 | if ((flags & BULKSTAT_FG_INLINE) && !dip) { | ||
| 671 | if (bp) | ||
| 672 | xfs_buf_relse(bp); | ||
| 673 | bp = NULL; | ||
| 674 | } | ||
| 675 | 480 | ||
| 676 | /* | 481 | /* |
| 677 | * Get the inode and fill in a single buffer. | 482 | * Get the inode and fill in a single buffer. |
| 678 | * BULKSTAT_FG_QUICK uses dip to fill it in. | ||
| 679 | * BULKSTAT_FG_IGET uses igets. | ||
| 680 | * BULKSTAT_FG_INLINE uses dip if we have an | ||
| 681 | * inline attr fork, else igets. | ||
| 682 | * See: xfs_bulkstat_one & xfs_dm_bulkstat_one. | ||
| 683 | * This is also used to count inodes/blks, etc | ||
| 684 | * in xfs_qm_quotacheck. | ||
| 685 | */ | 483 | */ |
| 686 | ubused = statstruct_size; | 484 | ubused = statstruct_size; |
| 687 | error = formatter(mp, ino, ubufp, | 485 | error = formatter(mp, ino, ubufp, ubleft, |
| 688 | ubleft, private_data, | 486 | &ubused, &fmterror); |
| 689 | bno, &ubused, dip, &fmterror); | ||
| 690 | if (fmterror == BULKSTAT_RV_NOTHING) { | 487 | if (fmterror == BULKSTAT_RV_NOTHING) { |
| 691 | if (error && error != ENOENT && | 488 | if (error && error != ENOENT && |
| 692 | error != EINVAL) { | 489 | error != EINVAL) { |
| @@ -778,8 +575,7 @@ xfs_bulkstat_single( | |||
| 778 | */ | 575 | */ |
| 779 | 576 | ||
| 780 | ino = (xfs_ino_t)*lastinop; | 577 | ino = (xfs_ino_t)*lastinop; |
| 781 | error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), | 578 | error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); |
| 782 | NULL, 0, NULL, NULL, &res); | ||
| 783 | if (error) { | 579 | if (error) { |
| 784 | /* | 580 | /* |
| 785 | * Special case way failed, do it the "long" way | 581 | * Special case way failed, do it the "long" way |
| @@ -788,8 +584,7 @@ xfs_bulkstat_single( | |||
| 788 | (*lastinop)--; | 584 | (*lastinop)--; |
| 789 | count = 1; | 585 | count = 1; |
| 790 | if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, | 586 | if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, |
| 791 | NULL, sizeof(xfs_bstat_t), buffer, | 587 | sizeof(xfs_bstat_t), buffer, done)) |
| 792 | BULKSTAT_FG_IGET, done)) | ||
| 793 | return error; | 588 | return error; |
| 794 | if (count == 0 || (xfs_ino_t)*lastinop != ino) | 589 | if (count == 0 || (xfs_ino_t)*lastinop != ino) |
| 795 | return error == EFSCORRUPTED ? | 590 | return error == EFSCORRUPTED ? |
diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 20792bf45946..97295d91d170 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h | |||
| @@ -27,10 +27,7 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, | |||
| 27 | xfs_ino_t ino, | 27 | xfs_ino_t ino, |
| 28 | void __user *buffer, | 28 | void __user *buffer, |
| 29 | int ubsize, | 29 | int ubsize, |
| 30 | void *private_data, | ||
| 31 | xfs_daddr_t bno, | ||
| 32 | int *ubused, | 30 | int *ubused, |
| 33 | void *dip, | ||
| 34 | int *stat); | 31 | int *stat); |
| 35 | 32 | ||
| 36 | /* | 33 | /* |
| @@ -41,13 +38,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, | |||
| 41 | #define BULKSTAT_RV_GIVEUP 2 | 38 | #define BULKSTAT_RV_GIVEUP 2 |
| 42 | 39 | ||
| 43 | /* | 40 | /* |
| 44 | * Values for bulkstat flag argument. | ||
| 45 | */ | ||
| 46 | #define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ | ||
| 47 | #define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ | ||
| 48 | #define BULKSTAT_FG_INLINE 0x4 /* No iget if inline attrs */ | ||
| 49 | |||
| 50 | /* | ||
| 51 | * Return stat information in bulk (by-inode) for the filesystem. | 41 | * Return stat information in bulk (by-inode) for the filesystem. |
| 52 | */ | 42 | */ |
| 53 | int /* error status */ | 43 | int /* error status */ |
| @@ -56,10 +46,8 @@ xfs_bulkstat( | |||
| 56 | xfs_ino_t *lastino, /* last inode returned */ | 46 | xfs_ino_t *lastino, /* last inode returned */ |
| 57 | int *count, /* size of buffer/count returned */ | 47 | int *count, /* size of buffer/count returned */ |
| 58 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ | 48 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ |
| 59 | void *private_data, /* private data for formatter */ | ||
| 60 | size_t statstruct_size,/* sizeof struct that we're filling */ | 49 | size_t statstruct_size,/* sizeof struct that we're filling */ |
| 61 | char __user *ubuffer,/* buffer with inode stats */ | 50 | char __user *ubuffer,/* buffer with inode stats */ |
| 62 | int flags, /* flag to control access method */ | ||
| 63 | int *done); /* 1 if there are more stats to get */ | 51 | int *done); /* 1 if there are more stats to get */ |
| 64 | 52 | ||
| 65 | int | 53 | int |
| @@ -82,9 +70,7 @@ xfs_bulkstat_one_int( | |||
| 82 | void __user *buffer, | 70 | void __user *buffer, |
| 83 | int ubsize, | 71 | int ubsize, |
| 84 | bulkstat_one_fmt_pf formatter, | 72 | bulkstat_one_fmt_pf formatter, |
| 85 | xfs_daddr_t bno, | ||
| 86 | int *ubused, | 73 | int *ubused, |
| 87 | void *dibuff, | ||
| 88 | int *stat); | 74 | int *stat); |
| 89 | 75 | ||
| 90 | int | 76 | int |
| @@ -93,10 +79,7 @@ xfs_bulkstat_one( | |||
| 93 | xfs_ino_t ino, | 79 | xfs_ino_t ino, |
| 94 | void __user *buffer, | 80 | void __user *buffer, |
| 95 | int ubsize, | 81 | int ubsize, |
| 96 | void *private_data, | ||
| 97 | xfs_daddr_t bno, | ||
| 98 | int *ubused, | 82 | int *ubused, |
| 99 | void *dibuff, | ||
| 100 | int *stat); | 83 | int *stat); |
| 101 | 84 | ||
| 102 | typedef int (*inumbers_fmt_pf)( | 85 | typedef int (*inumbers_fmt_pf)( |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ed0684cc50ee..9ac5cfab27b9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -3198,7 +3198,7 @@ xlog_recover_process_one_iunlink( | |||
| 3198 | int error; | 3198 | int error; |
| 3199 | 3199 | ||
| 3200 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | 3200 | ino = XFS_AGINO_TO_INO(mp, agno, agino); |
| 3201 | error = xfs_iget(mp, NULL, ino, 0, 0, &ip, 0); | 3201 | error = xfs_iget(mp, NULL, ino, 0, 0, &ip); |
| 3202 | if (error) | 3202 | if (error) |
| 3203 | goto fail; | 3203 | goto fail; |
| 3204 | 3204 | ||
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d59f4e8bedcf..69f62d8b2816 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -1300,7 +1300,7 @@ xfs_mountfs( | |||
| 1300 | * Get and sanity-check the root inode. | 1300 | * Get and sanity-check the root inode. |
| 1301 | * Save the pointer to it in the mount structure. | 1301 | * Save the pointer to it in the mount structure. |
| 1302 | */ | 1302 | */ |
| 1303 | error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0); | 1303 | error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip); |
| 1304 | if (error) { | 1304 | if (error) { |
| 1305 | cmn_err(CE_WARN, "XFS: failed to read root inode"); | 1305 | cmn_err(CE_WARN, "XFS: failed to read root inode"); |
| 1306 | goto out_log_dealloc; | 1306 | goto out_log_dealloc; |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 16445518506d..a2d32ce335aa 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
| @@ -2277,12 +2277,12 @@ xfs_rtmount_inodes( | |||
| 2277 | sbp = &mp->m_sb; | 2277 | sbp = &mp->m_sb; |
| 2278 | if (sbp->sb_rbmino == NULLFSINO) | 2278 | if (sbp->sb_rbmino == NULLFSINO) |
| 2279 | return 0; | 2279 | return 0; |
| 2280 | error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip, 0); | 2280 | error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); |
| 2281 | if (error) | 2281 | if (error) |
| 2282 | return error; | 2282 | return error; |
| 2283 | ASSERT(mp->m_rbmip != NULL); | 2283 | ASSERT(mp->m_rbmip != NULL); |
| 2284 | ASSERT(sbp->sb_rsumino != NULLFSINO); | 2284 | ASSERT(sbp->sb_rsumino != NULLFSINO); |
| 2285 | error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip, 0); | 2285 | error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); |
| 2286 | if (error) { | 2286 | if (error) { |
| 2287 | IRELE(mp->m_rbmip); | 2287 | IRELE(mp->m_rbmip); |
| 2288 | return error; | 2288 | return error; |
diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 785ff101da0a..2559dfec946b 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c | |||
| @@ -62,7 +62,7 @@ xfs_trans_iget( | |||
| 62 | { | 62 | { |
| 63 | int error; | 63 | int error; |
| 64 | 64 | ||
| 65 | error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp, 0); | 65 | error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp); |
| 66 | if (!error && tp) | 66 | if (!error && tp) |
| 67 | xfs_trans_ijoin(tp, *ipp, lock_flags); | 67 | xfs_trans_ijoin(tp, *ipp, lock_flags); |
| 68 | return error; | 68 | return error; |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index a06bd62504fc..c1646838898f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -1269,7 +1269,7 @@ xfs_lookup( | |||
| 1269 | if (error) | 1269 | if (error) |
| 1270 | goto out; | 1270 | goto out; |
| 1271 | 1271 | ||
| 1272 | error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); | 1272 | error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); |
| 1273 | if (error) | 1273 | if (error) |
| 1274 | goto out_free_name; | 1274 | goto out_free_name; |
| 1275 | 1275 | ||
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 5958d7845bd5..17714beb868e 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h | |||
| @@ -212,7 +212,7 @@ char const *acpi_gbl_exception_names_env[] = { | |||
| 212 | "AE_NO_GLOBAL_LOCK", | 212 | "AE_NO_GLOBAL_LOCK", |
| 213 | "AE_ABORT_METHOD", | 213 | "AE_ABORT_METHOD", |
| 214 | "AE_SAME_HANDLER", | 214 | "AE_SAME_HANDLER", |
| 215 | "AE_WAKE_ONLY_GPE", | 215 | "AE_NO_HANDLER", |
| 216 | "AE_OWNER_ID_LIMIT" | 216 | "AE_OWNER_ID_LIMIT" |
| 217 | }; | 217 | }; |
| 218 | 218 | ||
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 0e4ab1fe5966..1371cc997393 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
| @@ -69,6 +69,7 @@ extern acpi_name acpi_gbl_trace_method_name; | |||
| 69 | extern u32 acpi_gbl_trace_flags; | 69 | extern u32 acpi_gbl_trace_flags; |
| 70 | extern u8 acpi_gbl_enable_aml_debug_object; | 70 | extern u8 acpi_gbl_enable_aml_debug_object; |
| 71 | extern u8 acpi_gbl_copy_dsdt_locally; | 71 | extern u8 acpi_gbl_copy_dsdt_locally; |
| 72 | extern u8 acpi_gbl_truncate_io_addresses; | ||
| 72 | 73 | ||
| 73 | extern u32 acpi_current_gpe_count; | 74 | extern u32 acpi_current_gpe_count; |
| 74 | extern struct acpi_table_fadt acpi_gbl_FADT; | 75 | extern struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index bade172cad47..d55f4a7b824d 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
| @@ -663,10 +663,11 @@ typedef u32 acpi_event_status; | |||
| 663 | #define ACPI_GPE_MAX 0xFF | 663 | #define ACPI_GPE_MAX 0xFF |
| 664 | #define ACPI_NUM_GPE 256 | 664 | #define ACPI_NUM_GPE 256 |
| 665 | 665 | ||
| 666 | /* Actions for acpi_set_gpe */ | 666 | /* Actions for acpi_set_gpe and acpi_hw_low_set_gpe */ |
| 667 | 667 | ||
| 668 | #define ACPI_GPE_ENABLE 0 | 668 | #define ACPI_GPE_ENABLE 0 |
| 669 | #define ACPI_GPE_DISABLE 1 | 669 | #define ACPI_GPE_DISABLE 1 |
| 670 | #define ACPI_GPE_COND_ENABLE 2 | ||
| 670 | 671 | ||
| 671 | /* gpe_types for acpi_enable_gpe and acpi_disable_gpe */ | 672 | /* gpe_types for acpi_enable_gpe and acpi_disable_gpe */ |
| 672 | 673 | ||
diff --git a/include/linux/agp_backend.h b/include/linux/agp_backend.h index 9101ed64f803..09ea4a1e9505 100644 --- a/include/linux/agp_backend.h +++ b/include/linux/agp_backend.h | |||
| @@ -79,7 +79,6 @@ struct agp_memory { | |||
| 79 | u32 physical; | 79 | u32 physical; |
| 80 | bool is_bound; | 80 | bool is_bound; |
| 81 | bool is_flushed; | 81 | bool is_flushed; |
| 82 | bool vmalloc_flag; | ||
| 83 | /* list of agp_memory mapped to the aperture */ | 82 | /* list of agp_memory mapped to the aperture */ |
| 84 | struct list_head mapped_list; | 83 | struct list_head mapped_list; |
| 85 | /* DMA-mapped addresses */ | 84 | /* DMA-mapped addresses */ |
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index aee5f6ce166e..9ae2889096b6 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -105,8 +105,8 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, | |||
| 105 | int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); | 105 | int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); |
| 106 | void bdi_unregister(struct backing_dev_info *bdi); | 106 | void bdi_unregister(struct backing_dev_info *bdi); |
| 107 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); | 107 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); |
| 108 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | 108 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); |
| 109 | long nr_pages); | 109 | void bdi_start_background_writeback(struct backing_dev_info *bdi); |
| 110 | int bdi_writeback_task(struct bdi_writeback *wb); | 110 | int bdi_writeback_task(struct bdi_writeback *wb); |
| 111 | int bdi_has_dirty_io(struct backing_dev_info *bdi); | 111 | int bdi_has_dirty_io(struct backing_dev_info *bdi); |
| 112 | void bdi_arm_supers_timer(void); | 112 | void bdi_arm_supers_timer(void); |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 0c621604baa1..e3d00fdb858d 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -525,13 +525,21 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state( | |||
| 525 | return cgrp->subsys[subsys_id]; | 525 | return cgrp->subsys[subsys_id]; |
| 526 | } | 526 | } |
| 527 | 527 | ||
| 528 | static inline struct cgroup_subsys_state *task_subsys_state( | 528 | /* |
| 529 | struct task_struct *task, int subsys_id) | 529 | * function to get the cgroup_subsys_state which allows for extra |
| 530 | * rcu_dereference_check() conditions, such as locks used during the | ||
| 531 | * cgroup_subsys::attach() methods. | ||
| 532 | */ | ||
| 533 | #define task_subsys_state_check(task, subsys_id, __c) \ | ||
| 534 | rcu_dereference_check(task->cgroups->subsys[subsys_id], \ | ||
| 535 | rcu_read_lock_held() || \ | ||
| 536 | lockdep_is_held(&task->alloc_lock) || \ | ||
| 537 | cgroup_lock_is_held() || (__c)) | ||
| 538 | |||
| 539 | static inline struct cgroup_subsys_state * | ||
| 540 | task_subsys_state(struct task_struct *task, int subsys_id) | ||
| 530 | { | 541 | { |
| 531 | return rcu_dereference_check(task->cgroups->subsys[subsys_id], | 542 | return task_subsys_state_check(task, subsys_id, false); |
| 532 | rcu_read_lock_held() || | ||
| 533 | lockdep_is_held(&task->alloc_lock) || | ||
| 534 | cgroup_lock_is_held()); | ||
| 535 | } | 543 | } |
| 536 | 544 | ||
| 537 | static inline struct cgroup* task_cgroup(struct task_struct *task, | 545 | static inline struct cgroup* task_cgroup(struct task_struct *task, |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 73dcf804bc94..0da5b187f124 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
| @@ -58,8 +58,12 @@ | |||
| 58 | * naked functions because then mcount is called without stack and frame pointer | 58 | * naked functions because then mcount is called without stack and frame pointer |
| 59 | * being set up and there is no chance to restore the lr register to the value | 59 | * being set up and there is no chance to restore the lr register to the value |
| 60 | * before mcount was called. | 60 | * before mcount was called. |
| 61 | * | ||
| 62 | * The asm() bodies of naked functions often depend on standard calling conventions, | ||
| 63 | * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce | ||
| 64 | * this, so we must do so ourselves. See GCC PR44290. | ||
| 61 | */ | 65 | */ |
| 62 | #define __naked __attribute__((naked)) notrace | 66 | #define __naked __attribute__((naked)) noinline __noclone notrace |
| 63 | 67 | ||
| 64 | #define __noreturn __attribute__((noreturn)) | 68 | #define __noreturn __attribute__((noreturn)) |
| 65 | 69 | ||
| @@ -85,3 +89,7 @@ | |||
| 85 | #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) | 89 | #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) |
| 86 | #define gcc_header(x) _gcc_header(x) | 90 | #define gcc_header(x) _gcc_header(x) |
| 87 | #include gcc_header(__GNUC__) | 91 | #include gcc_header(__GNUC__) |
| 92 | |||
| 93 | #if !defined(__noclone) | ||
| 94 | #define __noclone /* not needed */ | ||
| 95 | #endif | ||
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 94dea3ffbfa1..fcfa5b9a4317 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h | |||
| @@ -48,6 +48,10 @@ | |||
| 48 | * unreleased. Really, we need to have autoconf for the kernel. | 48 | * unreleased. Really, we need to have autoconf for the kernel. |
| 49 | */ | 49 | */ |
| 50 | #define unreachable() __builtin_unreachable() | 50 | #define unreachable() __builtin_unreachable() |
| 51 | |||
| 52 | /* Mark a function definition as prohibited from being cloned. */ | ||
| 53 | #define __noclone __attribute__((__noclone__)) | ||
| 54 | |||
| 51 | #endif | 55 | #endif |
| 52 | 56 | ||
| 53 | #endif | 57 | #endif |
diff --git a/include/linux/drbd.h b/include/linux/drbd.h index 30da4ae48972..b8d2516668aa 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h | |||
| @@ -53,7 +53,7 @@ | |||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | extern const char *drbd_buildtag(void); | 55 | extern const char *drbd_buildtag(void); |
| 56 | #define REL_VERSION "8.3.8rc2" | 56 | #define REL_VERSION "8.3.8" |
| 57 | #define API_VERSION 88 | 57 | #define API_VERSION 88 |
| 58 | #define PRO_VERSION_MIN 86 | 58 | #define PRO_VERSION_MIN 86 |
| 59 | #define PRO_VERSION_MAX 94 | 59 | #define PRO_VERSION_MAX 94 |
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index b3cd4de9432b..52c0da4bdd18 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h | |||
| @@ -40,7 +40,7 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
| 40 | const char *modname); | 40 | const char *modname); |
| 41 | 41 | ||
| 42 | #if defined(CONFIG_DYNAMIC_DEBUG) | 42 | #if defined(CONFIG_DYNAMIC_DEBUG) |
| 43 | extern int ddebug_remove_module(char *mod_name); | 43 | extern int ddebug_remove_module(const char *mod_name); |
| 44 | 44 | ||
| 45 | #define __dynamic_dbg_enabled(dd) ({ \ | 45 | #define __dynamic_dbg_enabled(dd) ({ \ |
| 46 | int __ret = 0; \ | 46 | int __ret = 0; \ |
| @@ -73,7 +73,7 @@ extern int ddebug_remove_module(char *mod_name); | |||
| 73 | 73 | ||
| 74 | #else | 74 | #else |
| 75 | 75 | ||
| 76 | static inline int ddebug_remove_module(char *mod) | 76 | static inline int ddebug_remove_module(const char *mod) |
| 77 | { | 77 | { |
| 78 | return 0; | 78 | return 0; |
| 79 | } | 79 | } |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 907ace3a64c8..8e5a9dfb76bf 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
| @@ -786,8 +786,6 @@ struct fb_tile_ops { | |||
| 786 | #define FBINFO_MISC_USEREVENT 0x10000 /* event request | 786 | #define FBINFO_MISC_USEREVENT 0x10000 /* event request |
| 787 | from userspace */ | 787 | from userspace */ |
| 788 | #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ | 788 | #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ |
| 789 | #define FBINFO_MISC_FIRMWARE 0x40000 /* a replaceable firmware | ||
| 790 | inited framebuffer */ | ||
| 791 | 789 | ||
| 792 | /* A driver may set this flag to indicate that it does want a set_par to be | 790 | /* A driver may set this flag to indicate that it does want a set_par to be |
| 793 | * called every time when fbcon_switch is executed. The advantage is that with | 791 | * called every time when fbcon_switch is executed. The advantage is that with |
| @@ -801,6 +799,8 @@ struct fb_tile_ops { | |||
| 801 | */ | 799 | */ |
| 802 | #define FBINFO_MISC_ALWAYS_SETPAR 0x40000 | 800 | #define FBINFO_MISC_ALWAYS_SETPAR 0x40000 |
| 803 | 801 | ||
| 802 | /* where the fb is a firmware driver, and can be replaced with a proper one */ | ||
| 803 | #define FBINFO_MISC_FIRMWARE 0x80000 | ||
| 804 | /* | 804 | /* |
| 805 | * Host and GPU endianness differ. | 805 | * Host and GPU endianness differ. |
| 806 | */ | 806 | */ |
diff --git a/include/linux/list.h b/include/linux/list.h index bc43e8a0d7f6..d167b5d7c0ac 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
| @@ -541,6 +541,21 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
| 541 | &pos->member != (head); \ | 541 | &pos->member != (head); \ |
| 542 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) | 542 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) |
| 543 | 543 | ||
| 544 | /** | ||
| 545 | * list_safe_reset_next - reset a stale list_for_each_entry_safe loop | ||
| 546 | * @pos: the loop cursor used in the list_for_each_entry_safe loop | ||
| 547 | * @n: temporary storage used in list_for_each_entry_safe | ||
| 548 | * @member: the name of the list_struct within the struct. | ||
| 549 | * | ||
| 550 | * list_safe_reset_next is not safe to use in general if the list may be | ||
| 551 | * modified concurrently (eg. the lock is dropped in the loop body). An | ||
| 552 | * exception to this is if the cursor element (pos) is pinned in the list, | ||
| 553 | * and list_safe_reset_next is called after re-taking the lock and before | ||
| 554 | * completing the current iteration of the loop body. | ||
| 555 | */ | ||
| 556 | #define list_safe_reset_next(pos, n, member) \ | ||
| 557 | n = list_entry(pos->member.next, typeof(*pos), member) | ||
| 558 | |||
| 544 | /* | 559 | /* |
| 545 | * Double linked lists with a single pointer list head. | 560 | * Double linked lists with a single pointer list head. |
| 546 | * Mostly useful for hash tables where the two pointer list head is | 561 | * Mostly useful for hash tables where the two pointer list head is |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 4eb467910a45..3bedcc149c84 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -1261,6 +1261,7 @@ | |||
| 1261 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 | 1261 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 |
| 1262 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 | 1262 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 |
| 1263 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 | 1263 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 |
| 1264 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85 | ||
| 1264 | 1265 | ||
| 1265 | #define PCI_VENDOR_ID_IMS 0x10e0 | 1266 | #define PCI_VENDOR_ID_IMS 0x10e0 |
| 1266 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 | 1267 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 |
diff --git a/include/linux/sched.h b/include/linux/sched.h index f118809c953f..747fcaedddb7 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -139,7 +139,7 @@ extern int nr_processes(void); | |||
| 139 | extern unsigned long nr_running(void); | 139 | extern unsigned long nr_running(void); |
| 140 | extern unsigned long nr_uninterruptible(void); | 140 | extern unsigned long nr_uninterruptible(void); |
| 141 | extern unsigned long nr_iowait(void); | 141 | extern unsigned long nr_iowait(void); |
| 142 | extern unsigned long nr_iowait_cpu(void); | 142 | extern unsigned long nr_iowait_cpu(int cpu); |
| 143 | extern unsigned long this_cpu_load(void); | 143 | extern unsigned long this_cpu_load(void); |
| 144 | 144 | ||
| 145 | 145 | ||
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 5e781d824e6d..bc7d6bb4cd8e 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -256,22 +256,22 @@ static inline int hibernate(void) { return -ENOSYS; } | |||
| 256 | static inline bool system_entering_hibernation(void) { return false; } | 256 | static inline bool system_entering_hibernation(void) { return false; } |
| 257 | #endif /* CONFIG_HIBERNATION */ | 257 | #endif /* CONFIG_HIBERNATION */ |
| 258 | 258 | ||
| 259 | #ifdef CONFIG_HIBERNATION_NVS | 259 | #ifdef CONFIG_SUSPEND_NVS |
| 260 | extern int hibernate_nvs_register(unsigned long start, unsigned long size); | 260 | extern int suspend_nvs_register(unsigned long start, unsigned long size); |
| 261 | extern int hibernate_nvs_alloc(void); | 261 | extern int suspend_nvs_alloc(void); |
| 262 | extern void hibernate_nvs_free(void); | 262 | extern void suspend_nvs_free(void); |
| 263 | extern void hibernate_nvs_save(void); | 263 | extern void suspend_nvs_save(void); |
| 264 | extern void hibernate_nvs_restore(void); | 264 | extern void suspend_nvs_restore(void); |
| 265 | #else /* CONFIG_HIBERNATION_NVS */ | 265 | #else /* CONFIG_SUSPEND_NVS */ |
| 266 | static inline int hibernate_nvs_register(unsigned long a, unsigned long b) | 266 | static inline int suspend_nvs_register(unsigned long a, unsigned long b) |
| 267 | { | 267 | { |
| 268 | return 0; | 268 | return 0; |
| 269 | } | 269 | } |
| 270 | static inline int hibernate_nvs_alloc(void) { return 0; } | 270 | static inline int suspend_nvs_alloc(void) { return 0; } |
| 271 | static inline void hibernate_nvs_free(void) {} | 271 | static inline void suspend_nvs_free(void) {} |
| 272 | static inline void hibernate_nvs_save(void) {} | 272 | static inline void suspend_nvs_save(void) {} |
| 273 | static inline void hibernate_nvs_restore(void) {} | 273 | static inline void suspend_nvs_restore(void) {} |
| 274 | #endif /* CONFIG_HIBERNATION_NVS */ | 274 | #endif /* CONFIG_SUSPEND_NVS */ |
| 275 | 275 | ||
| 276 | #ifdef CONFIG_PM_SLEEP | 276 | #ifdef CONFIG_PM_SLEEP |
| 277 | void save_processor_state(void); | 277 | void save_processor_state(void); |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 9a59d1f98cd4..103d1b61aacb 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | * See the file COPYING for more details. | 14 | * See the file COPYING for more details. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/errno.h> | ||
| 17 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 18 | #include <linux/rcupdate.h> | 19 | #include <linux/rcupdate.h> |
| 19 | 20 | ||
diff --git a/include/net/snmp.h b/include/net/snmp.h index 92456f1035f5..899003d18db9 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h | |||
| @@ -134,7 +134,7 @@ struct linux_xfrm_mib { | |||
| 134 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ | 134 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ |
| 135 | this_cpu_add(mib[1]->mibs[field], addend) | 135 | this_cpu_add(mib[1]->mibs[field], addend) |
| 136 | #define SNMP_ADD_STATS(mib, field, addend) \ | 136 | #define SNMP_ADD_STATS(mib, field, addend) \ |
| 137 | this_cpu_add(mib[0]->mibs[field], addend) | 137 | this_cpu_add(mib[!in_softirq()]->mibs[field], addend) |
| 138 | /* | 138 | /* |
| 139 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" | 139 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" |
| 140 | * to make @ptr a non-percpu pointer. | 140 | * to make @ptr a non-percpu pointer. |
diff --git a/init/main.c b/init/main.c index 3bdb152f412f..a42fdf4aeba9 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -125,7 +125,9 @@ static char *ramdisk_execute_command; | |||
| 125 | 125 | ||
| 126 | #ifdef CONFIG_SMP | 126 | #ifdef CONFIG_SMP |
| 127 | /* Setup configured maximum number of CPUs to activate */ | 127 | /* Setup configured maximum number of CPUs to activate */ |
| 128 | unsigned int __initdata setup_max_cpus = NR_CPUS; | 128 | unsigned int setup_max_cpus = NR_CPUS; |
| 129 | EXPORT_SYMBOL(setup_max_cpus); | ||
| 130 | |||
| 129 | 131 | ||
| 130 | /* | 132 | /* |
| 131 | * Setup routine for controlling SMP activation | 133 | * Setup routine for controlling SMP activation |
| @@ -422,18 +424,26 @@ static void __init setup_command_line(char *command_line) | |||
| 422 | * gcc-3.4 accidentally inlines this function, so use noinline. | 424 | * gcc-3.4 accidentally inlines this function, so use noinline. |
| 423 | */ | 425 | */ |
| 424 | 426 | ||
| 427 | static __initdata DECLARE_COMPLETION(kthreadd_done); | ||
| 428 | |||
| 425 | static noinline void __init_refok rest_init(void) | 429 | static noinline void __init_refok rest_init(void) |
| 426 | __releases(kernel_lock) | 430 | __releases(kernel_lock) |
| 427 | { | 431 | { |
| 428 | int pid; | 432 | int pid; |
| 429 | 433 | ||
| 430 | rcu_scheduler_starting(); | 434 | rcu_scheduler_starting(); |
| 435 | /* | ||
| 436 | * We need to spawn init first so that it obtains pid 1, however | ||
| 437 | * the init task will end up wanting to create kthreads, which, if | ||
| 438 | * we schedule it before we create kthreadd, will OOPS. | ||
| 439 | */ | ||
| 431 | kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); | 440 | kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); |
| 432 | numa_default_policy(); | 441 | numa_default_policy(); |
| 433 | pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); | 442 | pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); |
| 434 | rcu_read_lock(); | 443 | rcu_read_lock(); |
| 435 | kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); | 444 | kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); |
| 436 | rcu_read_unlock(); | 445 | rcu_read_unlock(); |
| 446 | complete(&kthreadd_done); | ||
| 437 | unlock_kernel(); | 447 | unlock_kernel(); |
| 438 | 448 | ||
| 439 | /* | 449 | /* |
| @@ -855,6 +865,10 @@ static noinline int init_post(void) | |||
| 855 | 865 | ||
| 856 | static int __init kernel_init(void * unused) | 866 | static int __init kernel_init(void * unused) |
| 857 | { | 867 | { |
| 868 | /* | ||
| 869 | * Wait until kthreadd is all set-up. | ||
| 870 | */ | ||
| 871 | wait_for_completion(&kthreadd_done); | ||
| 858 | lock_kernel(); | 872 | lock_kernel(); |
| 859 | 873 | ||
| 860 | /* | 874 | /* |
diff --git a/kernel/futex.c b/kernel/futex.c index e7a35f1039e7..6a3a5fa1526d 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -429,20 +429,11 @@ static void free_pi_state(struct futex_pi_state *pi_state) | |||
| 429 | static struct task_struct * futex_find_get_task(pid_t pid) | 429 | static struct task_struct * futex_find_get_task(pid_t pid) |
| 430 | { | 430 | { |
| 431 | struct task_struct *p; | 431 | struct task_struct *p; |
| 432 | const struct cred *cred = current_cred(), *pcred; | ||
| 433 | 432 | ||
| 434 | rcu_read_lock(); | 433 | rcu_read_lock(); |
| 435 | p = find_task_by_vpid(pid); | 434 | p = find_task_by_vpid(pid); |
| 436 | if (!p) { | 435 | if (p) |
| 437 | p = ERR_PTR(-ESRCH); | 436 | get_task_struct(p); |
| 438 | } else { | ||
| 439 | pcred = __task_cred(p); | ||
| 440 | if (cred->euid != pcred->euid && | ||
| 441 | cred->euid != pcred->uid) | ||
| 442 | p = ERR_PTR(-ESRCH); | ||
| 443 | else | ||
| 444 | get_task_struct(p); | ||
| 445 | } | ||
| 446 | 437 | ||
| 447 | rcu_read_unlock(); | 438 | rcu_read_unlock(); |
| 448 | 439 | ||
| @@ -564,8 +555,8 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, | |||
| 564 | if (!pid) | 555 | if (!pid) |
| 565 | return -ESRCH; | 556 | return -ESRCH; |
| 566 | p = futex_find_get_task(pid); | 557 | p = futex_find_get_task(pid); |
| 567 | if (IS_ERR(p)) | 558 | if (!p) |
| 568 | return PTR_ERR(p); | 559 | return -ESRCH; |
| 569 | 560 | ||
| 570 | /* | 561 | /* |
| 571 | * We need to look at the task state flags to figure out, | 562 | * We need to look at the task state flags to figure out, |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 3164ba7ce151..e1497481fe8a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -456,6 +456,9 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 456 | /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ | 456 | /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ |
| 457 | desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); | 457 | desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); |
| 458 | desc->status |= flags; | 458 | desc->status |= flags; |
| 459 | |||
| 460 | if (chip != desc->chip) | ||
| 461 | irq_chip_set_defaults(desc->chip); | ||
| 459 | } | 462 | } |
| 460 | 463 | ||
| 461 | return ret; | 464 | return ret; |
diff --git a/kernel/kexec.c b/kernel/kexec.c index 474a84715eac..131b1703936f 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -1089,9 +1089,10 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1089 | 1089 | ||
| 1090 | size_t crash_get_memory_size(void) | 1090 | size_t crash_get_memory_size(void) |
| 1091 | { | 1091 | { |
| 1092 | size_t size; | 1092 | size_t size = 0; |
| 1093 | mutex_lock(&kexec_mutex); | 1093 | mutex_lock(&kexec_mutex); |
| 1094 | size = crashk_res.end - crashk_res.start + 1; | 1094 | if (crashk_res.end != crashk_res.start) |
| 1095 | size = crashk_res.end - crashk_res.start + 1; | ||
| 1095 | mutex_unlock(&kexec_mutex); | 1096 | mutex_unlock(&kexec_mutex); |
| 1096 | return size; | 1097 | return size; |
| 1097 | } | 1098 | } |
| @@ -1134,7 +1135,7 @@ int crash_shrink_memory(unsigned long new_size) | |||
| 1134 | 1135 | ||
| 1135 | free_reserved_phys_range(end, crashk_res.end); | 1136 | free_reserved_phys_range(end, crashk_res.end); |
| 1136 | 1137 | ||
| 1137 | if (start == end) | 1138 | if ((start == end) && (crashk_res.parent != NULL)) |
| 1138 | release_resource(&crashk_res); | 1139 | release_resource(&crashk_res); |
| 1139 | crashk_res.end = end - 1; | 1140 | crashk_res.end = end - 1; |
| 1140 | 1141 | ||
diff --git a/kernel/module.c b/kernel/module.c index 8c6b42840dd1..5d2d28197c82 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -2062,6 +2062,12 @@ static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num) | |||
| 2062 | #endif | 2062 | #endif |
| 2063 | } | 2063 | } |
| 2064 | 2064 | ||
| 2065 | static void dynamic_debug_remove(struct _ddebug *debug) | ||
| 2066 | { | ||
| 2067 | if (debug) | ||
| 2068 | ddebug_remove_module(debug->modname); | ||
| 2069 | } | ||
| 2070 | |||
| 2065 | static void *module_alloc_update_bounds(unsigned long size) | 2071 | static void *module_alloc_update_bounds(unsigned long size) |
| 2066 | { | 2072 | { |
| 2067 | void *ret = module_alloc(size); | 2073 | void *ret = module_alloc(size); |
| @@ -2124,6 +2130,8 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2124 | void *ptr = NULL; /* Stops spurious gcc warning */ | 2130 | void *ptr = NULL; /* Stops spurious gcc warning */ |
| 2125 | unsigned long symoffs, stroffs, *strmap; | 2131 | unsigned long symoffs, stroffs, *strmap; |
| 2126 | void __percpu *percpu; | 2132 | void __percpu *percpu; |
| 2133 | struct _ddebug *debug = NULL; | ||
| 2134 | unsigned int num_debug = 0; | ||
| 2127 | 2135 | ||
| 2128 | mm_segment_t old_fs; | 2136 | mm_segment_t old_fs; |
| 2129 | 2137 | ||
| @@ -2476,15 +2484,9 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2476 | kfree(strmap); | 2484 | kfree(strmap); |
| 2477 | strmap = NULL; | 2485 | strmap = NULL; |
| 2478 | 2486 | ||
| 2479 | if (!mod->taints) { | 2487 | if (!mod->taints) |
| 2480 | struct _ddebug *debug; | ||
| 2481 | unsigned int num_debug; | ||
| 2482 | |||
| 2483 | debug = section_objs(hdr, sechdrs, secstrings, "__verbose", | 2488 | debug = section_objs(hdr, sechdrs, secstrings, "__verbose", |
| 2484 | sizeof(*debug), &num_debug); | 2489 | sizeof(*debug), &num_debug); |
| 2485 | if (debug) | ||
| 2486 | dynamic_debug_setup(debug, num_debug); | ||
| 2487 | } | ||
| 2488 | 2490 | ||
| 2489 | err = module_finalize(hdr, sechdrs, mod); | 2491 | err = module_finalize(hdr, sechdrs, mod); |
| 2490 | if (err < 0) | 2492 | if (err < 0) |
| @@ -2526,10 +2528,13 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2526 | goto unlock; | 2528 | goto unlock; |
| 2527 | } | 2529 | } |
| 2528 | 2530 | ||
| 2531 | if (debug) | ||
| 2532 | dynamic_debug_setup(debug, num_debug); | ||
| 2533 | |||
| 2529 | /* Find duplicate symbols */ | 2534 | /* Find duplicate symbols */ |
| 2530 | err = verify_export_symbols(mod); | 2535 | err = verify_export_symbols(mod); |
| 2531 | if (err < 0) | 2536 | if (err < 0) |
| 2532 | goto unlock; | 2537 | goto ddebug; |
| 2533 | 2538 | ||
| 2534 | list_add_rcu(&mod->list, &modules); | 2539 | list_add_rcu(&mod->list, &modules); |
| 2535 | mutex_unlock(&module_mutex); | 2540 | mutex_unlock(&module_mutex); |
| @@ -2557,6 +2562,8 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2557 | mutex_lock(&module_mutex); | 2562 | mutex_lock(&module_mutex); |
| 2558 | /* Unlink carefully: kallsyms could be walking list. */ | 2563 | /* Unlink carefully: kallsyms could be walking list. */ |
| 2559 | list_del_rcu(&mod->list); | 2564 | list_del_rcu(&mod->list); |
| 2565 | ddebug: | ||
| 2566 | dynamic_debug_remove(debug); | ||
| 2560 | unlock: | 2567 | unlock: |
| 2561 | mutex_unlock(&module_mutex); | 2568 | mutex_unlock(&module_mutex); |
| 2562 | synchronize_sched(); | 2569 | synchronize_sched(); |
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 5c36ea9d55d2..ca6066a6952e 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
| @@ -99,9 +99,13 @@ config PM_SLEEP_ADVANCED_DEBUG | |||
| 99 | depends on PM_ADVANCED_DEBUG | 99 | depends on PM_ADVANCED_DEBUG |
| 100 | default n | 100 | default n |
| 101 | 101 | ||
| 102 | config SUSPEND_NVS | ||
| 103 | bool | ||
| 104 | |||
| 102 | config SUSPEND | 105 | config SUSPEND |
| 103 | bool "Suspend to RAM and standby" | 106 | bool "Suspend to RAM and standby" |
| 104 | depends on PM && ARCH_SUSPEND_POSSIBLE | 107 | depends on PM && ARCH_SUSPEND_POSSIBLE |
| 108 | select SUSPEND_NVS if HAS_IOMEM | ||
| 105 | default y | 109 | default y |
| 106 | ---help--- | 110 | ---help--- |
| 107 | Allow the system to enter sleep states in which main memory is | 111 | Allow the system to enter sleep states in which main memory is |
| @@ -130,13 +134,10 @@ config SUSPEND_FREEZER | |||
| 130 | 134 | ||
| 131 | Turning OFF this setting is NOT recommended! If in doubt, say Y. | 135 | Turning OFF this setting is NOT recommended! If in doubt, say Y. |
| 132 | 136 | ||
| 133 | config HIBERNATION_NVS | ||
| 134 | bool | ||
| 135 | |||
| 136 | config HIBERNATION | 137 | config HIBERNATION |
| 137 | bool "Hibernation (aka 'suspend to disk')" | 138 | bool "Hibernation (aka 'suspend to disk')" |
| 138 | depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE | 139 | depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE |
| 139 | select HIBERNATION_NVS if HAS_IOMEM | 140 | select SUSPEND_NVS if HAS_IOMEM |
| 140 | ---help--- | 141 | ---help--- |
| 141 | Enable the suspend to disk (STD) functionality, which is usually | 142 | Enable the suspend to disk (STD) functionality, which is usually |
| 142 | called "hibernation" in user interfaces. STD checkpoints the | 143 | called "hibernation" in user interfaces. STD checkpoints the |
diff --git a/kernel/power/Makefile b/kernel/power/Makefile index 524e058dcf06..f9063c6b185d 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile | |||
| @@ -10,6 +10,6 @@ obj-$(CONFIG_SUSPEND) += suspend.o | |||
| 10 | obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o | 10 | obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o |
| 11 | obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o \ | 11 | obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o \ |
| 12 | block_io.o | 12 | block_io.o |
| 13 | obj-$(CONFIG_HIBERNATION_NVS) += hibernate_nvs.o | 13 | obj-$(CONFIG_SUSPEND_NVS) += nvs.o |
| 14 | 14 | ||
| 15 | obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o | 15 | obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o |
diff --git a/kernel/power/hibernate_nvs.c b/kernel/power/nvs.c index fdcad9ed5a7b..1836db60bbb6 100644 --- a/kernel/power/hibernate_nvs.c +++ b/kernel/power/nvs.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | /* | 16 | /* |
| 17 | * Platforms, like ACPI, may want us to save some memory used by them during | 17 | * Platforms, like ACPI, may want us to save some memory used by them during |
| 18 | * hibernation and to restore the contents of this memory during the subsequent | 18 | * suspend and to restore the contents of this memory during the subsequent |
| 19 | * resume. The code below implements a mechanism allowing us to do that. | 19 | * resume. The code below implements a mechanism allowing us to do that. |
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| @@ -30,7 +30,7 @@ struct nvs_page { | |||
| 30 | static LIST_HEAD(nvs_list); | 30 | static LIST_HEAD(nvs_list); |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | * hibernate_nvs_register - register platform NVS memory region to save | 33 | * suspend_nvs_register - register platform NVS memory region to save |
| 34 | * @start - physical address of the region | 34 | * @start - physical address of the region |
| 35 | * @size - size of the region | 35 | * @size - size of the region |
| 36 | * | 36 | * |
| @@ -38,7 +38,7 @@ static LIST_HEAD(nvs_list); | |||
| 38 | * things so that the data from page-aligned addresses in this region will | 38 | * things so that the data from page-aligned addresses in this region will |
| 39 | * be copied into separate RAM pages. | 39 | * be copied into separate RAM pages. |
| 40 | */ | 40 | */ |
| 41 | int hibernate_nvs_register(unsigned long start, unsigned long size) | 41 | int suspend_nvs_register(unsigned long start, unsigned long size) |
| 42 | { | 42 | { |
| 43 | struct nvs_page *entry, *next; | 43 | struct nvs_page *entry, *next; |
| 44 | 44 | ||
| @@ -68,9 +68,9 @@ int hibernate_nvs_register(unsigned long start, unsigned long size) | |||
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | /** | 70 | /** |
| 71 | * hibernate_nvs_free - free data pages allocated for saving NVS regions | 71 | * suspend_nvs_free - free data pages allocated for saving NVS regions |
| 72 | */ | 72 | */ |
| 73 | void hibernate_nvs_free(void) | 73 | void suspend_nvs_free(void) |
| 74 | { | 74 | { |
| 75 | struct nvs_page *entry; | 75 | struct nvs_page *entry; |
| 76 | 76 | ||
| @@ -86,16 +86,16 @@ void hibernate_nvs_free(void) | |||
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | /** | 88 | /** |
| 89 | * hibernate_nvs_alloc - allocate memory necessary for saving NVS regions | 89 | * suspend_nvs_alloc - allocate memory necessary for saving NVS regions |
| 90 | */ | 90 | */ |
| 91 | int hibernate_nvs_alloc(void) | 91 | int suspend_nvs_alloc(void) |
| 92 | { | 92 | { |
| 93 | struct nvs_page *entry; | 93 | struct nvs_page *entry; |
| 94 | 94 | ||
| 95 | list_for_each_entry(entry, &nvs_list, node) { | 95 | list_for_each_entry(entry, &nvs_list, node) { |
| 96 | entry->data = (void *)__get_free_page(GFP_KERNEL); | 96 | entry->data = (void *)__get_free_page(GFP_KERNEL); |
| 97 | if (!entry->data) { | 97 | if (!entry->data) { |
| 98 | hibernate_nvs_free(); | 98 | suspend_nvs_free(); |
| 99 | return -ENOMEM; | 99 | return -ENOMEM; |
| 100 | } | 100 | } |
| 101 | } | 101 | } |
| @@ -103,9 +103,9 @@ int hibernate_nvs_alloc(void) | |||
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | /** | 105 | /** |
| 106 | * hibernate_nvs_save - save NVS memory regions | 106 | * suspend_nvs_save - save NVS memory regions |
| 107 | */ | 107 | */ |
| 108 | void hibernate_nvs_save(void) | 108 | void suspend_nvs_save(void) |
| 109 | { | 109 | { |
| 110 | struct nvs_page *entry; | 110 | struct nvs_page *entry; |
| 111 | 111 | ||
| @@ -119,12 +119,12 @@ void hibernate_nvs_save(void) | |||
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | /** | 121 | /** |
| 122 | * hibernate_nvs_restore - restore NVS memory regions | 122 | * suspend_nvs_restore - restore NVS memory regions |
| 123 | * | 123 | * |
| 124 | * This function is going to be called with interrupts disabled, so it | 124 | * This function is going to be called with interrupts disabled, so it |
| 125 | * cannot iounmap the virtual addresses used to access the NVS region. | 125 | * cannot iounmap the virtual addresses used to access the NVS region. |
| 126 | */ | 126 | */ |
| 127 | void hibernate_nvs_restore(void) | 127 | void suspend_nvs_restore(void) |
| 128 | { | 128 | { |
| 129 | struct nvs_page *entry; | 129 | struct nvs_page *entry; |
| 130 | 130 | ||
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 56e7dbb8b996..f37cb7dd4402 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
| @@ -16,6 +16,12 @@ | |||
| 16 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
| 17 | #include <linux/syscalls.h> | 17 | #include <linux/syscalls.h> |
| 18 | #include <linux/gfp.h> | 18 | #include <linux/gfp.h> |
| 19 | #include <linux/io.h> | ||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <linux/list.h> | ||
| 22 | #include <linux/mm.h> | ||
| 23 | #include <linux/slab.h> | ||
| 24 | #include <linux/suspend.h> | ||
| 19 | 25 | ||
| 20 | #include "power.h" | 26 | #include "power.h" |
| 21 | 27 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index f8b8996228dd..f52a8801b7a2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -306,52 +306,6 @@ static int init_task_group_load = INIT_TASK_GROUP_LOAD; | |||
| 306 | */ | 306 | */ |
| 307 | struct task_group init_task_group; | 307 | struct task_group init_task_group; |
| 308 | 308 | ||
| 309 | /* return group to which a task belongs */ | ||
| 310 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 311 | { | ||
| 312 | struct task_group *tg; | ||
| 313 | |||
| 314 | #ifdef CONFIG_CGROUP_SCHED | ||
| 315 | tg = container_of(task_subsys_state(p, cpu_cgroup_subsys_id), | ||
| 316 | struct task_group, css); | ||
| 317 | #else | ||
| 318 | tg = &init_task_group; | ||
| 319 | #endif | ||
| 320 | return tg; | ||
| 321 | } | ||
| 322 | |||
| 323 | /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */ | ||
| 324 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) | ||
| 325 | { | ||
| 326 | /* | ||
| 327 | * Strictly speaking this rcu_read_lock() is not needed since the | ||
| 328 | * task_group is tied to the cgroup, which in turn can never go away | ||
| 329 | * as long as there are tasks attached to it. | ||
| 330 | * | ||
| 331 | * However since task_group() uses task_subsys_state() which is an | ||
| 332 | * rcu_dereference() user, this quiets CONFIG_PROVE_RCU. | ||
| 333 | */ | ||
| 334 | rcu_read_lock(); | ||
| 335 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 336 | p->se.cfs_rq = task_group(p)->cfs_rq[cpu]; | ||
| 337 | p->se.parent = task_group(p)->se[cpu]; | ||
| 338 | #endif | ||
| 339 | |||
| 340 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 341 | p->rt.rt_rq = task_group(p)->rt_rq[cpu]; | ||
| 342 | p->rt.parent = task_group(p)->rt_se[cpu]; | ||
| 343 | #endif | ||
| 344 | rcu_read_unlock(); | ||
| 345 | } | ||
| 346 | |||
| 347 | #else | ||
| 348 | |||
| 349 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } | ||
| 350 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 351 | { | ||
| 352 | return NULL; | ||
| 353 | } | ||
| 354 | |||
| 355 | #endif /* CONFIG_CGROUP_SCHED */ | 309 | #endif /* CONFIG_CGROUP_SCHED */ |
| 356 | 310 | ||
| 357 | /* CFS-related fields in a runqueue */ | 311 | /* CFS-related fields in a runqueue */ |
| @@ -644,6 +598,49 @@ static inline int cpu_of(struct rq *rq) | |||
| 644 | #define cpu_curr(cpu) (cpu_rq(cpu)->curr) | 598 | #define cpu_curr(cpu) (cpu_rq(cpu)->curr) |
| 645 | #define raw_rq() (&__raw_get_cpu_var(runqueues)) | 599 | #define raw_rq() (&__raw_get_cpu_var(runqueues)) |
| 646 | 600 | ||
| 601 | #ifdef CONFIG_CGROUP_SCHED | ||
| 602 | |||
| 603 | /* | ||
| 604 | * Return the group to which this tasks belongs. | ||
| 605 | * | ||
| 606 | * We use task_subsys_state_check() and extend the RCU verification | ||
| 607 | * with lockdep_is_held(&task_rq(p)->lock) because cpu_cgroup_attach() | ||
| 608 | * holds that lock for each task it moves into the cgroup. Therefore | ||
| 609 | * by holding that lock, we pin the task to the current cgroup. | ||
| 610 | */ | ||
| 611 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 612 | { | ||
| 613 | struct cgroup_subsys_state *css; | ||
| 614 | |||
| 615 | css = task_subsys_state_check(p, cpu_cgroup_subsys_id, | ||
| 616 | lockdep_is_held(&task_rq(p)->lock)); | ||
| 617 | return container_of(css, struct task_group, css); | ||
| 618 | } | ||
| 619 | |||
| 620 | /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */ | ||
| 621 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) | ||
| 622 | { | ||
| 623 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 624 | p->se.cfs_rq = task_group(p)->cfs_rq[cpu]; | ||
| 625 | p->se.parent = task_group(p)->se[cpu]; | ||
| 626 | #endif | ||
| 627 | |||
| 628 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 629 | p->rt.rt_rq = task_group(p)->rt_rq[cpu]; | ||
| 630 | p->rt.parent = task_group(p)->rt_se[cpu]; | ||
| 631 | #endif | ||
| 632 | } | ||
| 633 | |||
| 634 | #else /* CONFIG_CGROUP_SCHED */ | ||
| 635 | |||
| 636 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } | ||
| 637 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 638 | { | ||
| 639 | return NULL; | ||
| 640 | } | ||
| 641 | |||
| 642 | #endif /* CONFIG_CGROUP_SCHED */ | ||
| 643 | |||
| 647 | inline void update_rq_clock(struct rq *rq) | 644 | inline void update_rq_clock(struct rq *rq) |
| 648 | { | 645 | { |
| 649 | if (!rq->skip_clock_update) | 646 | if (!rq->skip_clock_update) |
| @@ -1257,6 +1254,12 @@ static void sched_avg_update(struct rq *rq) | |||
| 1257 | s64 period = sched_avg_period(); | 1254 | s64 period = sched_avg_period(); |
| 1258 | 1255 | ||
| 1259 | while ((s64)(rq->clock - rq->age_stamp) > period) { | 1256 | while ((s64)(rq->clock - rq->age_stamp) > period) { |
| 1257 | /* | ||
| 1258 | * Inline assembly required to prevent the compiler | ||
| 1259 | * optimising this loop into a divmod call. | ||
| 1260 | * See __iter_div_u64_rem() for another example of this. | ||
| 1261 | */ | ||
| 1262 | asm("" : "+rm" (rq->age_stamp)); | ||
| 1260 | rq->age_stamp += period; | 1263 | rq->age_stamp += period; |
| 1261 | rq->rt_avg /= 2; | 1264 | rq->rt_avg /= 2; |
| 1262 | } | 1265 | } |
| @@ -1660,9 +1663,6 @@ static void update_shares(struct sched_domain *sd) | |||
| 1660 | 1663 | ||
| 1661 | static void update_h_load(long cpu) | 1664 | static void update_h_load(long cpu) |
| 1662 | { | 1665 | { |
| 1663 | if (root_task_group_empty()) | ||
| 1664 | return; | ||
| 1665 | |||
| 1666 | walk_tg_tree(tg_load_down, tg_nop, (void *)cpu); | 1666 | walk_tg_tree(tg_load_down, tg_nop, (void *)cpu); |
| 1667 | } | 1667 | } |
| 1668 | 1668 | ||
| @@ -2494,7 +2494,16 @@ void sched_fork(struct task_struct *p, int clone_flags) | |||
| 2494 | if (p->sched_class->task_fork) | 2494 | if (p->sched_class->task_fork) |
| 2495 | p->sched_class->task_fork(p); | 2495 | p->sched_class->task_fork(p); |
| 2496 | 2496 | ||
| 2497 | /* | ||
| 2498 | * The child is not yet in the pid-hash so no cgroup attach races, | ||
| 2499 | * and the cgroup is pinned to this child due to cgroup_fork() | ||
| 2500 | * is ran before sched_fork(). | ||
| 2501 | * | ||
| 2502 | * Silence PROVE_RCU. | ||
| 2503 | */ | ||
| 2504 | rcu_read_lock(); | ||
| 2497 | set_task_cpu(p, cpu); | 2505 | set_task_cpu(p, cpu); |
| 2506 | rcu_read_unlock(); | ||
| 2498 | 2507 | ||
| 2499 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) | 2508 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) |
| 2500 | if (likely(sched_info_on())) | 2509 | if (likely(sched_info_on())) |
| @@ -2864,9 +2873,9 @@ unsigned long nr_iowait(void) | |||
| 2864 | return sum; | 2873 | return sum; |
| 2865 | } | 2874 | } |
| 2866 | 2875 | ||
| 2867 | unsigned long nr_iowait_cpu(void) | 2876 | unsigned long nr_iowait_cpu(int cpu) |
| 2868 | { | 2877 | { |
| 2869 | struct rq *this = this_rq(); | 2878 | struct rq *this = cpu_rq(cpu); |
| 2870 | return atomic_read(&this->nr_iowait); | 2879 | return atomic_read(&this->nr_iowait); |
| 2871 | } | 2880 | } |
| 2872 | 2881 | ||
| @@ -4465,16 +4474,6 @@ recheck: | |||
| 4465 | } | 4474 | } |
| 4466 | 4475 | ||
| 4467 | if (user) { | 4476 | if (user) { |
| 4468 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 4469 | /* | ||
| 4470 | * Do not allow realtime tasks into groups that have no runtime | ||
| 4471 | * assigned. | ||
| 4472 | */ | ||
| 4473 | if (rt_bandwidth_enabled() && rt_policy(policy) && | ||
| 4474 | task_group(p)->rt_bandwidth.rt_runtime == 0) | ||
| 4475 | return -EPERM; | ||
| 4476 | #endif | ||
| 4477 | |||
| 4478 | retval = security_task_setscheduler(p, policy, param); | 4477 | retval = security_task_setscheduler(p, policy, param); |
| 4479 | if (retval) | 4478 | if (retval) |
| 4480 | return retval; | 4479 | return retval; |
| @@ -4490,6 +4489,22 @@ recheck: | |||
| 4490 | * runqueue lock must be held. | 4489 | * runqueue lock must be held. |
| 4491 | */ | 4490 | */ |
| 4492 | rq = __task_rq_lock(p); | 4491 | rq = __task_rq_lock(p); |
| 4492 | |||
| 4493 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 4494 | if (user) { | ||
| 4495 | /* | ||
| 4496 | * Do not allow realtime tasks into groups that have no runtime | ||
| 4497 | * assigned. | ||
| 4498 | */ | ||
| 4499 | if (rt_bandwidth_enabled() && rt_policy(policy) && | ||
| 4500 | task_group(p)->rt_bandwidth.rt_runtime == 0) { | ||
| 4501 | __task_rq_unlock(rq); | ||
| 4502 | raw_spin_unlock_irqrestore(&p->pi_lock, flags); | ||
| 4503 | return -EPERM; | ||
| 4504 | } | ||
| 4505 | } | ||
| 4506 | #endif | ||
| 4507 | |||
| 4493 | /* recheck policy now with rq lock held */ | 4508 | /* recheck policy now with rq lock held */ |
| 4494 | if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { | 4509 | if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { |
| 4495 | policy = oldpolicy = -1; | 4510 | policy = oldpolicy = -1; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index eed35eded602..a878b5332daa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -1240,6 +1240,7 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | |||
| 1240 | * effect of the currently running task from the load | 1240 | * effect of the currently running task from the load |
| 1241 | * of the current CPU: | 1241 | * of the current CPU: |
| 1242 | */ | 1242 | */ |
| 1243 | rcu_read_lock(); | ||
| 1243 | if (sync) { | 1244 | if (sync) { |
| 1244 | tg = task_group(current); | 1245 | tg = task_group(current); |
| 1245 | weight = current->se.load.weight; | 1246 | weight = current->se.load.weight; |
| @@ -1275,6 +1276,7 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | |||
| 1275 | balanced = this_eff_load <= prev_eff_load; | 1276 | balanced = this_eff_load <= prev_eff_load; |
| 1276 | } else | 1277 | } else |
| 1277 | balanced = true; | 1278 | balanced = true; |
| 1279 | rcu_read_unlock(); | ||
| 1278 | 1280 | ||
| 1279 | /* | 1281 | /* |
| 1280 | * If the currently running task will sleep within | 1282 | * If the currently running task will sleep within |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 1d7b9bc1c034..813993b5fb61 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -154,14 +154,14 @@ static void tick_nohz_update_jiffies(ktime_t now) | |||
| 154 | * Updates the per cpu time idle statistics counters | 154 | * Updates the per cpu time idle statistics counters |
| 155 | */ | 155 | */ |
| 156 | static void | 156 | static void |
| 157 | update_ts_time_stats(struct tick_sched *ts, ktime_t now, u64 *last_update_time) | 157 | update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_update_time) |
| 158 | { | 158 | { |
| 159 | ktime_t delta; | 159 | ktime_t delta; |
| 160 | 160 | ||
| 161 | if (ts->idle_active) { | 161 | if (ts->idle_active) { |
| 162 | delta = ktime_sub(now, ts->idle_entrytime); | 162 | delta = ktime_sub(now, ts->idle_entrytime); |
| 163 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | 163 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); |
| 164 | if (nr_iowait_cpu() > 0) | 164 | if (nr_iowait_cpu(cpu) > 0) |
| 165 | ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta); | 165 | ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta); |
| 166 | ts->idle_entrytime = now; | 166 | ts->idle_entrytime = now; |
| 167 | } | 167 | } |
| @@ -175,19 +175,19 @@ static void tick_nohz_stop_idle(int cpu, ktime_t now) | |||
| 175 | { | 175 | { |
| 176 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); | 176 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); |
| 177 | 177 | ||
| 178 | update_ts_time_stats(ts, now, NULL); | 178 | update_ts_time_stats(cpu, ts, now, NULL); |
| 179 | ts->idle_active = 0; | 179 | ts->idle_active = 0; |
| 180 | 180 | ||
| 181 | sched_clock_idle_wakeup_event(0); | 181 | sched_clock_idle_wakeup_event(0); |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | static ktime_t tick_nohz_start_idle(struct tick_sched *ts) | 184 | static ktime_t tick_nohz_start_idle(int cpu, struct tick_sched *ts) |
| 185 | { | 185 | { |
| 186 | ktime_t now; | 186 | ktime_t now; |
| 187 | 187 | ||
| 188 | now = ktime_get(); | 188 | now = ktime_get(); |
| 189 | 189 | ||
| 190 | update_ts_time_stats(ts, now, NULL); | 190 | update_ts_time_stats(cpu, ts, now, NULL); |
| 191 | 191 | ||
| 192 | ts->idle_entrytime = now; | 192 | ts->idle_entrytime = now; |
| 193 | ts->idle_active = 1; | 193 | ts->idle_active = 1; |
| @@ -216,7 +216,7 @@ u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time) | |||
| 216 | if (!tick_nohz_enabled) | 216 | if (!tick_nohz_enabled) |
| 217 | return -1; | 217 | return -1; |
| 218 | 218 | ||
| 219 | update_ts_time_stats(ts, ktime_get(), last_update_time); | 219 | update_ts_time_stats(cpu, ts, ktime_get(), last_update_time); |
| 220 | 220 | ||
| 221 | return ktime_to_us(ts->idle_sleeptime); | 221 | return ktime_to_us(ts->idle_sleeptime); |
| 222 | } | 222 | } |
| @@ -242,7 +242,7 @@ u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time) | |||
| 242 | if (!tick_nohz_enabled) | 242 | if (!tick_nohz_enabled) |
| 243 | return -1; | 243 | return -1; |
| 244 | 244 | ||
| 245 | update_ts_time_stats(ts, ktime_get(), last_update_time); | 245 | update_ts_time_stats(cpu, ts, ktime_get(), last_update_time); |
| 246 | 246 | ||
| 247 | return ktime_to_us(ts->iowait_sleeptime); | 247 | return ktime_to_us(ts->iowait_sleeptime); |
| 248 | } | 248 | } |
| @@ -284,7 +284,7 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 284 | */ | 284 | */ |
| 285 | ts->inidle = 1; | 285 | ts->inidle = 1; |
| 286 | 286 | ||
| 287 | now = tick_nohz_start_idle(ts); | 287 | now = tick_nohz_start_idle(cpu, ts); |
| 288 | 288 | ||
| 289 | /* | 289 | /* |
| 290 | * If this cpu is offline and it is the one which updates | 290 | * If this cpu is offline and it is the one which updates |
| @@ -315,9 +315,6 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 315 | goto end; | 315 | goto end; |
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | if (nohz_ratelimit(cpu)) | ||
| 319 | goto end; | ||
| 320 | |||
| 321 | ts->idle_calls++; | 318 | ts->idle_calls++; |
| 322 | /* Read jiffies and the time when jiffies were updated last */ | 319 | /* Read jiffies and the time when jiffies were updated last */ |
| 323 | do { | 320 | do { |
| @@ -328,7 +325,7 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 328 | } while (read_seqretry(&xtime_lock, seq)); | 325 | } while (read_seqretry(&xtime_lock, seq)); |
| 329 | 326 | ||
| 330 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || | 327 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || |
| 331 | arch_needs_cpu(cpu)) { | 328 | arch_needs_cpu(cpu) || nohz_ratelimit(cpu)) { |
| 332 | next_jiffies = last_jiffies + 1; | 329 | next_jiffies = last_jiffies + 1; |
| 333 | delta_jiffies = 1; | 330 | delta_jiffies = 1; |
| 334 | } else { | 331 | } else { |
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index e6f65887842c..8a2b73f7c068 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c | |||
| @@ -96,7 +96,9 @@ int perf_trace_init(struct perf_event *p_event) | |||
| 96 | mutex_lock(&event_mutex); | 96 | mutex_lock(&event_mutex); |
| 97 | list_for_each_entry(tp_event, &ftrace_events, list) { | 97 | list_for_each_entry(tp_event, &ftrace_events, list) { |
| 98 | if (tp_event->event.type == event_id && | 98 | if (tp_event->event.type == event_id && |
| 99 | tp_event->class && tp_event->class->perf_probe && | 99 | tp_event->class && |
| 100 | (tp_event->class->perf_probe || | ||
| 101 | tp_event->class->reg) && | ||
| 100 | try_module_get(tp_event->mod)) { | 102 | try_module_get(tp_event->mod)) { |
| 101 | ret = perf_trace_event_init(tp_event, p_event); | 103 | ret = perf_trace_event_init(tp_event, p_event); |
| 102 | break; | 104 | break; |
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 3df8eb17a607..02afc2533728 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
| @@ -692,7 +692,7 @@ static void ddebug_table_free(struct ddebug_table *dt) | |||
| 692 | * Called in response to a module being unloaded. Removes | 692 | * Called in response to a module being unloaded. Removes |
| 693 | * any ddebug_table's which point at the module. | 693 | * any ddebug_table's which point at the module. |
| 694 | */ | 694 | */ |
| 695 | int ddebug_remove_module(char *mod_name) | 695 | int ddebug_remove_module(const char *mod_name) |
| 696 | { | 696 | { |
| 697 | struct ddebug_table *dt, *nextdt; | 697 | struct ddebug_table *dt, *nextdt; |
| 698 | int ret = -ENOENT; | 698 | int ret = -ENOENT; |
diff --git a/lib/genalloc.c b/lib/genalloc.c index 736c3b06398e..1923f1490e72 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c | |||
| @@ -128,7 +128,6 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) | |||
| 128 | chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); | 128 | chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); |
| 129 | 129 | ||
| 130 | end_bit = (chunk->end_addr - chunk->start_addr) >> order; | 130 | end_bit = (chunk->end_addr - chunk->start_addr) >> order; |
| 131 | end_bit -= nbits + 1; | ||
| 132 | 131 | ||
| 133 | spin_lock_irqsave(&chunk->lock, flags); | 132 | spin_lock_irqsave(&chunk->lock, flags); |
| 134 | start_bit = bitmap_find_next_zero_area(chunk->bits, end_bit, 0, | 133 | start_bit = bitmap_find_next_zero_area(chunk->bits, end_bit, 0, |
| @@ -602,7 +602,7 @@ void *idr_get_next(struct idr *idp, int *nextidp) | |||
| 602 | /* find first ent */ | 602 | /* find first ent */ |
| 603 | n = idp->layers * IDR_BITS; | 603 | n = idp->layers * IDR_BITS; |
| 604 | max = 1 << n; | 604 | max = 1 << n; |
| 605 | p = rcu_dereference(idp->top); | 605 | p = rcu_dereference_raw(idp->top); |
| 606 | if (!p) | 606 | if (!p) |
| 607 | return NULL; | 607 | return NULL; |
| 608 | 608 | ||
| @@ -610,7 +610,7 @@ void *idr_get_next(struct idr *idp, int *nextidp) | |||
| 610 | while (n > 0 && p) { | 610 | while (n > 0 && p) { |
| 611 | n -= IDR_BITS; | 611 | n -= IDR_BITS; |
| 612 | *paa++ = p; | 612 | *paa++ = p; |
| 613 | p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]); | 613 | p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]); |
| 614 | } | 614 | } |
| 615 | 615 | ||
| 616 | if (p) { | 616 | if (p) { |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c6ece0a57595..20a8193a7af8 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1370,7 +1370,7 @@ static void memcg_wakeup_oom(struct mem_cgroup *mem) | |||
| 1370 | 1370 | ||
| 1371 | static void memcg_oom_recover(struct mem_cgroup *mem) | 1371 | static void memcg_oom_recover(struct mem_cgroup *mem) |
| 1372 | { | 1372 | { |
| 1373 | if (mem->oom_kill_disable && atomic_read(&mem->oom_lock)) | 1373 | if (atomic_read(&mem->oom_lock)) |
| 1374 | memcg_wakeup_oom(mem); | 1374 | memcg_wakeup_oom(mem); |
| 1375 | } | 1375 | } |
| 1376 | 1376 | ||
| @@ -3781,6 +3781,8 @@ static int mem_cgroup_oom_control_write(struct cgroup *cgrp, | |||
| 3781 | return -EINVAL; | 3781 | return -EINVAL; |
| 3782 | } | 3782 | } |
| 3783 | mem->oom_kill_disable = val; | 3783 | mem->oom_kill_disable = val; |
| 3784 | if (!val) | ||
| 3785 | memcg_oom_recover(mem); | ||
| 3784 | cgroup_unlock(); | 3786 | cgroup_unlock(); |
| 3785 | return 0; | 3787 | return 0; |
| 3786 | } | 3788 | } |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 5d6fb339de03..5bc0a96beb51 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -2094,7 +2094,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 2094 | NODEMASK_SCRATCH(scratch); | 2094 | NODEMASK_SCRATCH(scratch); |
| 2095 | 2095 | ||
| 2096 | if (!scratch) | 2096 | if (!scratch) |
| 2097 | return; | 2097 | goto put_mpol; |
| 2098 | /* contextualize the tmpfs mount point mempolicy */ | 2098 | /* contextualize the tmpfs mount point mempolicy */ |
| 2099 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); | 2099 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); |
| 2100 | if (IS_ERR(new)) | 2100 | if (IS_ERR(new)) |
| @@ -2103,19 +2103,20 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 2103 | task_lock(current); | 2103 | task_lock(current); |
| 2104 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); | 2104 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); |
| 2105 | task_unlock(current); | 2105 | task_unlock(current); |
| 2106 | mpol_put(mpol); /* drop our ref on sb mpol */ | ||
| 2107 | if (ret) | 2106 | if (ret) |
| 2108 | goto put_free; | 2107 | goto put_new; |
| 2109 | 2108 | ||
| 2110 | /* Create pseudo-vma that contains just the policy */ | 2109 | /* Create pseudo-vma that contains just the policy */ |
| 2111 | memset(&pvma, 0, sizeof(struct vm_area_struct)); | 2110 | memset(&pvma, 0, sizeof(struct vm_area_struct)); |
| 2112 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ | 2111 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ |
| 2113 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ | 2112 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ |
| 2114 | 2113 | ||
| 2115 | put_free: | 2114 | put_new: |
| 2116 | mpol_put(new); /* drop initial ref */ | 2115 | mpol_put(new); /* drop initial ref */ |
| 2117 | free_scratch: | 2116 | free_scratch: |
| 2118 | NODEMASK_SCRATCH_FREE(scratch); | 2117 | NODEMASK_SCRATCH_FREE(scratch); |
| 2118 | put_mpol: | ||
| 2119 | mpol_put(mpol); /* drop our incoming ref on sb mpol */ | ||
| 2119 | } | 2120 | } |
| 2120 | } | 2121 | } |
| 2121 | 2122 | ||
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index bbd396ac9546..54f28bd493d3 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
| @@ -597,7 +597,7 @@ static void balance_dirty_pages(struct address_space *mapping, | |||
| 597 | (!laptop_mode && ((global_page_state(NR_FILE_DIRTY) | 597 | (!laptop_mode && ((global_page_state(NR_FILE_DIRTY) |
| 598 | + global_page_state(NR_UNSTABLE_NFS)) | 598 | + global_page_state(NR_UNSTABLE_NFS)) |
| 599 | > background_thresh))) | 599 | > background_thresh))) |
| 600 | bdi_start_writeback(bdi, NULL, 0); | 600 | bdi_start_background_writeback(bdi); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | void set_page_dirty_balance(struct page *page, int page_mkwrite) | 603 | void set_page_dirty_balance(struct page *page, int page_mkwrite) |
| @@ -705,9 +705,8 @@ void laptop_mode_timer_fn(unsigned long data) | |||
| 705 | * We want to write everything out, not just down to the dirty | 705 | * We want to write everything out, not just down to the dirty |
| 706 | * threshold | 706 | * threshold |
| 707 | */ | 707 | */ |
| 708 | |||
| 709 | if (bdi_has_dirty_io(&q->backing_dev_info)) | 708 | if (bdi_has_dirty_io(&q->backing_dev_info)) |
| 710 | bdi_start_writeback(&q->backing_dev_info, NULL, nr_pages); | 709 | bdi_start_writeback(&q->backing_dev_info, nr_pages); |
| 711 | } | 710 | } |
| 712 | 711 | ||
| 713 | /* | 712 | /* |
diff --git a/mm/percpu.c b/mm/percpu.c index 39f7dfd59585..6470e7710231 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
| @@ -229,8 +229,8 @@ static int __maybe_unused pcpu_page_idx(unsigned int cpu, int page_idx) | |||
| 229 | return pcpu_unit_map[cpu] * pcpu_unit_pages + page_idx; | 229 | return pcpu_unit_map[cpu] * pcpu_unit_pages + page_idx; |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | static unsigned long __maybe_unused pcpu_chunk_addr(struct pcpu_chunk *chunk, | 232 | static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk, |
| 233 | unsigned int cpu, int page_idx) | 233 | unsigned int cpu, int page_idx) |
| 234 | { | 234 | { |
| 235 | return (unsigned long)chunk->base_addr + pcpu_unit_offsets[cpu] + | 235 | return (unsigned long)chunk->base_addr + pcpu_unit_offsets[cpu] + |
| 236 | (page_idx << PAGE_SHIFT); | 236 | (page_idx << PAGE_SHIFT); |
| @@ -978,7 +978,32 @@ bool is_kernel_percpu_address(unsigned long addr) | |||
| 978 | */ | 978 | */ |
| 979 | phys_addr_t per_cpu_ptr_to_phys(void *addr) | 979 | phys_addr_t per_cpu_ptr_to_phys(void *addr) |
| 980 | { | 980 | { |
| 981 | if (pcpu_addr_in_first_chunk(addr)) { | 981 | void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr); |
| 982 | bool in_first_chunk = false; | ||
| 983 | unsigned long first_start, first_end; | ||
| 984 | unsigned int cpu; | ||
| 985 | |||
| 986 | /* | ||
| 987 | * The following test on first_start/end isn't strictly | ||
| 988 | * necessary but will speed up lookups of addresses which | ||
| 989 | * aren't in the first chunk. | ||
| 990 | */ | ||
| 991 | first_start = pcpu_chunk_addr(pcpu_first_chunk, pcpu_first_unit_cpu, 0); | ||
| 992 | first_end = pcpu_chunk_addr(pcpu_first_chunk, pcpu_last_unit_cpu, | ||
| 993 | pcpu_unit_pages); | ||
| 994 | if ((unsigned long)addr >= first_start && | ||
| 995 | (unsigned long)addr < first_end) { | ||
| 996 | for_each_possible_cpu(cpu) { | ||
| 997 | void *start = per_cpu_ptr(base, cpu); | ||
| 998 | |||
| 999 | if (addr >= start && addr < start + pcpu_unit_size) { | ||
| 1000 | in_first_chunk = true; | ||
| 1001 | break; | ||
| 1002 | } | ||
| 1003 | } | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | if (in_first_chunk) { | ||
| 982 | if ((unsigned long)addr < VMALLOC_START || | 1007 | if ((unsigned long)addr < VMALLOC_START || |
| 983 | (unsigned long)addr >= VMALLOC_END) | 1008 | (unsigned long)addr >= VMALLOC_END) |
| 984 | return __pa(addr); | 1009 | return __pa(addr); |
| @@ -1086,7 +1111,7 @@ struct pcpu_alloc_info * __init pcpu_build_alloc_info( | |||
| 1086 | static int group_map[NR_CPUS] __initdata; | 1111 | static int group_map[NR_CPUS] __initdata; |
| 1087 | static int group_cnt[NR_CPUS] __initdata; | 1112 | static int group_cnt[NR_CPUS] __initdata; |
| 1088 | const size_t static_size = __per_cpu_end - __per_cpu_start; | 1113 | const size_t static_size = __per_cpu_end - __per_cpu_start; |
| 1089 | int group_cnt_max = 0, nr_groups = 1, nr_units = 0; | 1114 | int nr_groups = 1, nr_units = 0; |
| 1090 | size_t size_sum, min_unit_size, alloc_size; | 1115 | size_t size_sum, min_unit_size, alloc_size; |
| 1091 | int upa, max_upa, uninitialized_var(best_upa); /* units_per_alloc */ | 1116 | int upa, max_upa, uninitialized_var(best_upa); /* units_per_alloc */ |
| 1092 | int last_allocs, group, unit; | 1117 | int last_allocs, group, unit; |
| @@ -1096,7 +1121,7 @@ struct pcpu_alloc_info * __init pcpu_build_alloc_info( | |||
| 1096 | 1121 | ||
| 1097 | /* this function may be called multiple times */ | 1122 | /* this function may be called multiple times */ |
| 1098 | memset(group_map, 0, sizeof(group_map)); | 1123 | memset(group_map, 0, sizeof(group_map)); |
| 1099 | memset(group_cnt, 0, sizeof(group_map)); | 1124 | memset(group_cnt, 0, sizeof(group_cnt)); |
| 1100 | 1125 | ||
| 1101 | /* | 1126 | /* |
| 1102 | * Determine min_unit_size, alloc_size and max_upa such that | 1127 | * Determine min_unit_size, alloc_size and max_upa such that |
| @@ -1130,7 +1155,6 @@ struct pcpu_alloc_info * __init pcpu_build_alloc_info( | |||
| 1130 | } | 1155 | } |
| 1131 | group_map[cpu] = group; | 1156 | group_map[cpu] = group; |
| 1132 | group_cnt[group]++; | 1157 | group_cnt[group]++; |
| 1133 | group_cnt_max = max(group_cnt_max, group_cnt[group]); | ||
| 1134 | } | 1158 | } |
| 1135 | 1159 | ||
| 1136 | /* | 1160 | /* |
diff --git a/net/bluetooth/bnep/netdev.c b/net/bluetooth/bnep/netdev.c index 0faad5ce6dc4..8c100c9dae28 100644 --- a/net/bluetooth/bnep/netdev.c +++ b/net/bluetooth/bnep/netdev.c | |||
| @@ -104,6 +104,8 @@ static void bnep_net_set_mc_list(struct net_device *dev) | |||
| 104 | break; | 104 | break; |
| 105 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); | 105 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); |
| 106 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); | 106 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); |
| 107 | |||
| 108 | i++; | ||
| 107 | } | 109 | } |
| 108 | r->len = htons(skb->len - len); | 110 | r->len = htons(skb->len - len); |
| 109 | } | 111 | } |
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 26637439965b..b01dde35a69e 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
| @@ -128,7 +128,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
| 128 | { | 128 | { |
| 129 | struct net_bridge *br = (struct net_bridge *)_data; | 129 | struct net_bridge *br = (struct net_bridge *)_data; |
| 130 | unsigned long delay = hold_time(br); | 130 | unsigned long delay = hold_time(br); |
| 131 | unsigned long next_timer = jiffies + br->forward_delay; | 131 | unsigned long next_timer = jiffies + br->ageing_time; |
| 132 | int i; | 132 | int i; |
| 133 | 133 | ||
| 134 | spin_lock_bh(&br->hash_lock); | 134 | spin_lock_bh(&br->hash_lock); |
| @@ -149,9 +149,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
| 149 | } | 149 | } |
| 150 | spin_unlock_bh(&br->hash_lock); | 150 | spin_unlock_bh(&br->hash_lock); |
| 151 | 151 | ||
| 152 | /* Add HZ/4 to ensure we round the jiffies upwards to be after the next | 152 | mod_timer(&br->gc_timer, round_jiffies_up(next_timer)); |
| 153 | * timer, otherwise we might round down and will have no-op run. */ | ||
| 154 | mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4)); | ||
| 155 | } | 153 | } |
| 156 | 154 | ||
| 157 | /* Completely flush all dynamic entries in forwarding database.*/ | 155 | /* Completely flush all dynamic entries in forwarding database.*/ |
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index a98ef1393097..a4e72a89e4ff 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
| @@ -140,10 +140,10 @@ static int deliver_clone(const struct net_bridge_port *prev, | |||
| 140 | void (*__packet_hook)(const struct net_bridge_port *p, | 140 | void (*__packet_hook)(const struct net_bridge_port *p, |
| 141 | struct sk_buff *skb)) | 141 | struct sk_buff *skb)) |
| 142 | { | 142 | { |
| 143 | struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; | ||
| 144 | |||
| 143 | skb = skb_clone(skb, GFP_ATOMIC); | 145 | skb = skb_clone(skb, GFP_ATOMIC); |
| 144 | if (!skb) { | 146 | if (!skb) { |
| 145 | struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; | ||
| 146 | |||
| 147 | dev->stats.tx_dropped++; | 147 | dev->stats.tx_dropped++; |
| 148 | return -ENOMEM; | 148 | return -ENOMEM; |
| 149 | } | 149 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 9f07e749d7b1..34432b4e96bb 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -532,6 +532,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
| 532 | new->ip_summed = old->ip_summed; | 532 | new->ip_summed = old->ip_summed; |
| 533 | skb_copy_queue_mapping(new, old); | 533 | skb_copy_queue_mapping(new, old); |
| 534 | new->priority = old->priority; | 534 | new->priority = old->priority; |
| 535 | new->deliver_no_wcard = old->deliver_no_wcard; | ||
| 535 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) | 536 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) |
| 536 | new->ipvs_property = old->ipvs_property; | 537 | new->ipvs_property = old->ipvs_property; |
| 537 | #endif | 538 | #endif |
| @@ -569,7 +570,6 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb) | |||
| 569 | C(len); | 570 | C(len); |
| 570 | C(data_len); | 571 | C(data_len); |
| 571 | C(mac_len); | 572 | C(mac_len); |
| 572 | C(rxhash); | ||
| 573 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; | 573 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; |
| 574 | n->cloned = 1; | 574 | n->cloned = 1; |
| 575 | n->nohdr = 0; | 575 | n->nohdr = 0; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 9a4a6c96cb0d..041d41df1224 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -873,8 +873,10 @@ int ip_append_data(struct sock *sk, | |||
| 873 | !exthdrlen) | 873 | !exthdrlen) |
| 874 | csummode = CHECKSUM_PARTIAL; | 874 | csummode = CHECKSUM_PARTIAL; |
| 875 | 875 | ||
| 876 | skb = skb_peek_tail(&sk->sk_write_queue); | ||
| 877 | |||
| 876 | inet->cork.length += length; | 878 | inet->cork.length += length; |
| 877 | if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) && | 879 | if (((length > mtu) || (skb && skb_is_gso(skb))) && |
| 878 | (sk->sk_protocol == IPPROTO_UDP) && | 880 | (sk->sk_protocol == IPPROTO_UDP) && |
| 879 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 881 | (rt->u.dst.dev->features & NETIF_F_UFO)) { |
| 880 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, | 882 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, |
| @@ -892,7 +894,7 @@ int ip_append_data(struct sock *sk, | |||
| 892 | * adding appropriate IP header. | 894 | * adding appropriate IP header. |
| 893 | */ | 895 | */ |
| 894 | 896 | ||
| 895 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) | 897 | if (!skb) |
| 896 | goto alloc_new_skb; | 898 | goto alloc_new_skb; |
| 897 | 899 | ||
| 898 | while (length > 0) { | 900 | while (length > 0) { |
| @@ -1121,7 +1123,8 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, | |||
| 1121 | return -EINVAL; | 1123 | return -EINVAL; |
| 1122 | 1124 | ||
| 1123 | inet->cork.length += size; | 1125 | inet->cork.length += size; |
| 1124 | if ((sk->sk_protocol == IPPROTO_UDP) && | 1126 | if ((size + skb->len > mtu) && |
| 1127 | (sk->sk_protocol == IPPROTO_UDP) && | ||
| 1125 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 1128 | (rt->u.dst.dev->features & NETIF_F_UFO)) { |
| 1126 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; | 1129 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; |
| 1127 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1130 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 0abdc242ddb7..2efef52fb461 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -586,6 +586,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
| 586 | src_addr = solicited_addr; | 586 | src_addr = solicited_addr; |
| 587 | if (ifp->flags & IFA_F_OPTIMISTIC) | 587 | if (ifp->flags & IFA_F_OPTIMISTIC) |
| 588 | override = 0; | 588 | override = 0; |
| 589 | inc_opt |= ifp->idev->cnf.force_tllao; | ||
| 589 | in6_ifa_put(ifp); | 590 | in6_ifa_put(ifp); |
| 590 | } else { | 591 | } else { |
| 591 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, | 592 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, |
| @@ -599,7 +600,6 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
| 599 | icmp6h.icmp6_solicited = solicited; | 600 | icmp6h.icmp6_solicited = solicited; |
| 600 | icmp6h.icmp6_override = override; | 601 | icmp6h.icmp6_override = override; |
| 601 | 602 | ||
| 602 | inc_opt |= ifp->idev->cnf.force_tllao; | ||
| 603 | __ndisc_send(dev, neigh, daddr, src_addr, | 603 | __ndisc_send(dev, neigh, daddr, src_addr, |
| 604 | &icmp6h, solicited_addr, | 604 | &icmp6h, solicited_addr, |
| 605 | inc_opt ? ND_OPT_TARGET_LL_ADDR : 0); | 605 | inc_opt ? ND_OPT_TARGET_LL_ADDR : 0); |
diff --git a/net/mac80211/work.c b/net/mac80211/work.c index be3d4a698692..b025dc7bb0fd 100644 --- a/net/mac80211/work.c +++ b/net/mac80211/work.c | |||
| @@ -715,7 +715,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local, | |||
| 715 | struct ieee80211_rx_status *rx_status; | 715 | struct ieee80211_rx_status *rx_status; |
| 716 | struct ieee80211_mgmt *mgmt; | 716 | struct ieee80211_mgmt *mgmt; |
| 717 | struct ieee80211_work *wk; | 717 | struct ieee80211_work *wk; |
| 718 | enum work_action rma; | 718 | enum work_action rma = WORK_ACT_NONE; |
| 719 | u16 fc; | 719 | u16 fc; |
| 720 | 720 | ||
| 721 | rx_status = (struct ieee80211_rx_status *) skb->cb; | 721 | rx_status = (struct ieee80211_rx_status *) skb->cb; |
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index d8f7e8ef67b4..ff04e9edbed6 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
| @@ -162,6 +162,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
| 162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
| 163 | 163 | ||
| 164 | ct_write_lock(hash); | 164 | ct_write_lock(hash); |
| 165 | spin_lock(&cp->lock); | ||
| 165 | 166 | ||
| 166 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { | 167 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { |
| 167 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); | 168 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); |
| @@ -174,6 +175,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
| 174 | ret = 0; | 175 | ret = 0; |
| 175 | } | 176 | } |
| 176 | 177 | ||
| 178 | spin_unlock(&cp->lock); | ||
| 177 | ct_write_unlock(hash); | 179 | ct_write_unlock(hash); |
| 178 | 180 | ||
| 179 | return ret; | 181 | return ret; |
| @@ -193,6 +195,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
| 193 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 195 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
| 194 | 196 | ||
| 195 | ct_write_lock(hash); | 197 | ct_write_lock(hash); |
| 198 | spin_lock(&cp->lock); | ||
| 196 | 199 | ||
| 197 | if (cp->flags & IP_VS_CONN_F_HASHED) { | 200 | if (cp->flags & IP_VS_CONN_F_HASHED) { |
| 198 | list_del(&cp->c_list); | 201 | list_del(&cp->c_list); |
| @@ -202,6 +205,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
| 202 | } else | 205 | } else |
| 203 | ret = 0; | 206 | ret = 0; |
| 204 | 207 | ||
| 208 | spin_unlock(&cp->lock); | ||
| 205 | ct_write_unlock(hash); | 209 | ct_write_unlock(hash); |
| 206 | 210 | ||
| 207 | return ret; | 211 | return ret; |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 3415b6ce1c0a..807643bdcbac 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -449,6 +449,7 @@ static __init void teql_master_setup(struct net_device *dev) | |||
| 449 | dev->tx_queue_len = 100; | 449 | dev->tx_queue_len = 100; |
| 450 | dev->flags = IFF_NOARP; | 450 | dev->flags = IFF_NOARP; |
| 451 | dev->hard_header_len = LL_MAX_HEADER; | 451 | dev->hard_header_len = LL_MAX_HEADER; |
| 452 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | ||
| 452 | } | 453 | } |
| 453 | 454 | ||
| 454 | static LIST_HEAD(master_dev_list); | 455 | static LIST_HEAD(master_dev_list); |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 2a9675136c68..7ca65c7005ea 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -210,7 +210,8 @@ struct sock_xprt { | |||
| 210 | * State of TCP reply receive | 210 | * State of TCP reply receive |
| 211 | */ | 211 | */ |
| 212 | __be32 tcp_fraghdr, | 212 | __be32 tcp_fraghdr, |
| 213 | tcp_xid; | 213 | tcp_xid, |
| 214 | tcp_calldir; | ||
| 214 | 215 | ||
| 215 | u32 tcp_offset, | 216 | u32 tcp_offset, |
| 216 | tcp_reclen; | 217 | tcp_reclen; |
| @@ -927,7 +928,7 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, | |||
| 927 | { | 928 | { |
| 928 | size_t len, used; | 929 | size_t len, used; |
| 929 | u32 offset; | 930 | u32 offset; |
| 930 | __be32 calldir; | 931 | char *p; |
| 931 | 932 | ||
| 932 | /* | 933 | /* |
| 933 | * We want transport->tcp_offset to be 8 at the end of this routine | 934 | * We want transport->tcp_offset to be 8 at the end of this routine |
| @@ -936,26 +937,33 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, | |||
| 936 | * transport->tcp_offset is 4 (after having already read the xid). | 937 | * transport->tcp_offset is 4 (after having already read the xid). |
| 937 | */ | 938 | */ |
| 938 | offset = transport->tcp_offset - sizeof(transport->tcp_xid); | 939 | offset = transport->tcp_offset - sizeof(transport->tcp_xid); |
| 939 | len = sizeof(calldir) - offset; | 940 | len = sizeof(transport->tcp_calldir) - offset; |
| 940 | dprintk("RPC: reading CALL/REPLY flag (%Zu bytes)\n", len); | 941 | dprintk("RPC: reading CALL/REPLY flag (%Zu bytes)\n", len); |
| 941 | used = xdr_skb_read_bits(desc, &calldir, len); | 942 | p = ((char *) &transport->tcp_calldir) + offset; |
| 943 | used = xdr_skb_read_bits(desc, p, len); | ||
| 942 | transport->tcp_offset += used; | 944 | transport->tcp_offset += used; |
| 943 | if (used != len) | 945 | if (used != len) |
| 944 | return; | 946 | return; |
| 945 | transport->tcp_flags &= ~TCP_RCV_READ_CALLDIR; | 947 | transport->tcp_flags &= ~TCP_RCV_READ_CALLDIR; |
| 946 | transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
| 947 | transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
| 948 | /* | 948 | /* |
| 949 | * We don't yet have the XDR buffer, so we will write the calldir | 949 | * We don't yet have the XDR buffer, so we will write the calldir |
| 950 | * out after we get the buffer from the 'struct rpc_rqst' | 950 | * out after we get the buffer from the 'struct rpc_rqst' |
| 951 | */ | 951 | */ |
| 952 | if (ntohl(calldir) == RPC_REPLY) | 952 | switch (ntohl(transport->tcp_calldir)) { |
| 953 | case RPC_REPLY: | ||
| 954 | transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
| 955 | transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
| 953 | transport->tcp_flags |= TCP_RPC_REPLY; | 956 | transport->tcp_flags |= TCP_RPC_REPLY; |
| 954 | else | 957 | break; |
| 958 | case RPC_CALL: | ||
| 959 | transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
| 960 | transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
| 955 | transport->tcp_flags &= ~TCP_RPC_REPLY; | 961 | transport->tcp_flags &= ~TCP_RPC_REPLY; |
| 956 | dprintk("RPC: reading %s CALL/REPLY flag %08x\n", | 962 | break; |
| 957 | (transport->tcp_flags & TCP_RPC_REPLY) ? | 963 | default: |
| 958 | "reply for" : "request with", calldir); | 964 | dprintk("RPC: invalid request message type\n"); |
| 965 | xprt_force_disconnect(&transport->xprt); | ||
| 966 | } | ||
| 959 | xs_tcp_check_fraghdr(transport); | 967 | xs_tcp_check_fraghdr(transport); |
| 960 | } | 968 | } |
| 961 | 969 | ||
| @@ -975,12 +983,10 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt, | |||
| 975 | /* | 983 | /* |
| 976 | * Save the RPC direction in the XDR buffer | 984 | * Save the RPC direction in the XDR buffer |
| 977 | */ | 985 | */ |
| 978 | __be32 calldir = transport->tcp_flags & TCP_RPC_REPLY ? | ||
| 979 | htonl(RPC_REPLY) : 0; | ||
| 980 | |||
| 981 | memcpy(rcvbuf->head[0].iov_base + transport->tcp_copied, | 986 | memcpy(rcvbuf->head[0].iov_base + transport->tcp_copied, |
| 982 | &calldir, sizeof(calldir)); | 987 | &transport->tcp_calldir, |
| 983 | transport->tcp_copied += sizeof(calldir); | 988 | sizeof(transport->tcp_calldir)); |
| 989 | transport->tcp_copied += sizeof(transport->tcp_calldir); | ||
| 984 | transport->tcp_flags &= ~TCP_RCV_COPY_CALLDIR; | 990 | transport->tcp_flags &= ~TCP_RCV_COPY_CALLDIR; |
| 985 | } | 991 | } |
| 986 | 992 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4bf27d901333..af1c173be4ad 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2300,7 +2300,8 @@ int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first, | |||
| 2300 | return 0; | 2300 | return 0; |
| 2301 | if (xdst->xfrm_genid != dst->xfrm->genid) | 2301 | if (xdst->xfrm_genid != dst->xfrm->genid) |
| 2302 | return 0; | 2302 | return 0; |
| 2303 | if (xdst->policy_genid != atomic_read(&xdst->pols[0]->genid)) | 2303 | if (xdst->num_pols > 0 && |
| 2304 | xdst->policy_genid != atomic_read(&xdst->pols[0]->genid)) | ||
| 2304 | return 0; | 2305 | return 0; |
| 2305 | 2306 | ||
| 2306 | if (strict && fl && | 2307 | if (strict && fl && |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 3318692e4e76..f8779006986d 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -1342,7 +1342,7 @@ static unsigned int *reloc_location(struct elf_info *elf, | |||
| 1342 | int section = sechdr->sh_info; | 1342 | int section = sechdr->sh_info; |
| 1343 | 1343 | ||
| 1344 | return (void *)elf->hdr + sechdrs[section].sh_offset + | 1344 | return (void *)elf->hdr + sechdrs[section].sh_offset + |
| 1345 | (r->r_offset - sechdrs[section].sh_addr); | 1345 | r->r_offset - sechdrs[section].sh_addr; |
| 1346 | } | 1346 | } |
| 1347 | 1347 | ||
| 1348 | static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | 1348 | static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) |
diff --git a/scripts/package/Makefile b/scripts/package/Makefile index 62fcc3a7f4d3..3a681ef25306 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile | |||
| @@ -44,7 +44,7 @@ rpm-pkg rpm: $(objtree)/kernel.spec FORCE | |||
| 44 | fi | 44 | fi |
| 45 | $(MAKE) clean | 45 | $(MAKE) clean |
| 46 | $(PREV) ln -sf $(srctree) $(KERNELPATH) | 46 | $(PREV) ln -sf $(srctree) $(KERNELPATH) |
| 47 | $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion > $(objtree)/.scmversion | 47 | $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion --scm-only > $(objtree)/.scmversion |
| 48 | $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. | 48 | $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. |
| 49 | $(PREV) rm $(KERNELPATH) | 49 | $(PREV) rm $(KERNELPATH) |
| 50 | rm -f $(objtree)/.scmversion | 50 | rm -f $(objtree)/.scmversion |
diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 46989b88d734..d6a866ed1835 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion | |||
| @@ -10,73 +10,158 @@ | |||
| 10 | # | 10 | # |
| 11 | 11 | ||
| 12 | usage() { | 12 | usage() { |
| 13 | echo "Usage: $0 [srctree]" >&2 | 13 | echo "Usage: $0 [--scm-only] [srctree]" >&2 |
| 14 | exit 1 | 14 | exit 1 |
| 15 | } | 15 | } |
| 16 | 16 | ||
| 17 | cd "${1:-.}" || usage | 17 | scm_only=false |
| 18 | srctree=. | ||
| 19 | if test "$1" = "--scm-only"; then | ||
| 20 | scm_only=true | ||
| 21 | shift | ||
| 22 | fi | ||
| 23 | if test $# -gt 0; then | ||
| 24 | srctree=$1 | ||
| 25 | shift | ||
| 26 | fi | ||
| 27 | if test $# -gt 0 -o ! -d "$srctree"; then | ||
| 28 | usage | ||
| 29 | fi | ||
| 18 | 30 | ||
| 19 | # Check for git and a git repo. | 31 | scm_version() |
| 20 | if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then | 32 | { |
| 33 | local short=false | ||
| 21 | 34 | ||
| 22 | # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore it, | 35 | cd "$srctree" |
| 23 | # because this version is defined in the top level Makefile. | 36 | if test -e .scmversion; then |
| 24 | if [ -z "`git describe --exact-match 2>/dev/null`" ]; then | 37 | cat "$_" |
| 38 | return | ||
| 39 | fi | ||
| 40 | if test "$1" = "--short"; then | ||
| 41 | short=true | ||
| 42 | fi | ||
| 25 | 43 | ||
| 26 | # If we are past a tagged commit (like "v2.6.30-rc5-302-g72357d5"), | 44 | # Check for git and a git repo. |
| 27 | # we pretty print it. | 45 | if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then |
| 28 | if atag="`git describe 2>/dev/null`"; then | 46 | |
| 29 | echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' | 47 | # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore |
| 48 | # it, because this version is defined in the top level Makefile. | ||
| 49 | if [ -z "`git describe --exact-match 2>/dev/null`" ]; then | ||
| 50 | |||
| 51 | # If only the short version is requested, don't bother | ||
| 52 | # running further git commands | ||
| 53 | if $short; then | ||
| 54 | echo "+" | ||
| 55 | return | ||
| 56 | fi | ||
| 57 | # If we are past a tagged commit (like | ||
| 58 | # "v2.6.30-rc5-302-g72357d5"), we pretty print it. | ||
| 59 | if atag="`git describe 2>/dev/null`"; then | ||
| 60 | echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' | ||
| 61 | |||
| 62 | # If we don't have a tag at all we print -g{commitish}. | ||
| 63 | else | ||
| 64 | printf '%s%s' -g $head | ||
| 65 | fi | ||
| 66 | fi | ||
| 30 | 67 | ||
| 31 | # If we don't have a tag at all we print -g{commitish}. | 68 | # Is this git on svn? |
| 32 | else | 69 | if git config --get svn-remote.svn.url >/dev/null; then |
| 33 | printf '%s%s' -g $head | 70 | printf -- '-svn%s' "`git svn find-rev $head`" |
| 34 | fi | 71 | fi |
| 35 | fi | ||
| 36 | 72 | ||
| 37 | # Is this git on svn? | 73 | # Update index only on r/w media |
| 38 | if git config --get svn-remote.svn.url >/dev/null; then | 74 | [ -w . ] && git update-index --refresh --unmerged > /dev/null |
| 39 | printf -- '-svn%s' "`git svn find-rev $head`" | ||
| 40 | fi | ||
| 41 | 75 | ||
| 42 | # Update index only on r/w media | 76 | # Check for uncommitted changes |
| 43 | [ -w . ] && git update-index --refresh --unmerged > /dev/null | 77 | if git diff-index --name-only HEAD | grep -v "^scripts/package" \ |
| 78 | | read dummy; then | ||
| 79 | printf '%s' -dirty | ||
| 80 | fi | ||
| 44 | 81 | ||
| 45 | # Check for uncommitted changes | 82 | # All done with git |
| 46 | if git diff-index --name-only HEAD | grep -v "^scripts/package" \ | 83 | return |
| 47 | | read dummy; then | ||
| 48 | printf '%s' -dirty | ||
| 49 | fi | 84 | fi |
| 50 | 85 | ||
| 51 | # All done with git | 86 | # Check for mercurial and a mercurial repo. |
| 52 | exit | 87 | if hgid=`hg id 2>/dev/null`; then |
| 53 | fi | 88 | tag=`printf '%s' "$hgid" | cut -d' ' -f2` |
| 89 | |||
| 90 | # Do we have an untagged version? | ||
| 91 | if [ -z "$tag" -o "$tag" = tip ]; then | ||
| 92 | id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` | ||
| 93 | printf '%s%s' -hg "$id" | ||
| 94 | fi | ||
| 54 | 95 | ||
| 55 | # Check for mercurial and a mercurial repo. | 96 | # Are there uncommitted changes? |
| 56 | if hgid=`hg id 2>/dev/null`; then | 97 | # These are represented by + after the changeset id. |
| 57 | tag=`printf '%s' "$hgid" | cut -d' ' -f2` | 98 | case "$hgid" in |
| 99 | *+|*+\ *) printf '%s' -dirty ;; | ||
| 100 | esac | ||
| 58 | 101 | ||
| 59 | # Do we have an untagged version? | 102 | # All done with mercurial |
| 60 | if [ -z "$tag" -o "$tag" = tip ]; then | 103 | return |
| 61 | id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` | ||
| 62 | printf '%s%s' -hg "$id" | ||
| 63 | fi | 104 | fi |
| 64 | 105 | ||
| 65 | # Are there uncommitted changes? | 106 | # Check for svn and a svn repo. |
| 66 | # These are represented by + after the changeset id. | 107 | if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then |
| 67 | case "$hgid" in | 108 | rev=`echo $rev | awk '{print $NF}'` |
| 68 | *+|*+\ *) printf '%s' -dirty ;; | 109 | printf -- '-svn%s' "$rev" |
| 69 | esac | ||
| 70 | 110 | ||
| 71 | # All done with mercurial | 111 | # All done with svn |
| 112 | return | ||
| 113 | fi | ||
| 114 | } | ||
| 115 | |||
| 116 | collect_files() | ||
| 117 | { | ||
| 118 | local file res | ||
| 119 | |||
| 120 | for file; do | ||
| 121 | case "$file" in | ||
| 122 | *\~*) | ||
| 123 | continue | ||
| 124 | ;; | ||
| 125 | esac | ||
| 126 | if test -e "$file"; then | ||
| 127 | res="$res$(cat "$file")" | ||
| 128 | fi | ||
| 129 | done | ||
| 130 | echo "$res" | ||
| 131 | } | ||
| 132 | |||
| 133 | if $scm_only; then | ||
| 134 | scm_version | ||
| 72 | exit | 135 | exit |
| 73 | fi | 136 | fi |
| 74 | 137 | ||
| 75 | # Check for svn and a svn repo. | 138 | if test -e include/config/auto.conf; then |
| 76 | if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then | 139 | source "$_" |
| 77 | rev=`echo $rev | awk '{print $NF}'` | 140 | else |
| 78 | printf -- '-svn%s' "$rev" | 141 | echo "Error: kernelrelease not valid - run 'make prepare' to update it" |
| 142 | exit 1 | ||
| 143 | fi | ||
| 79 | 144 | ||
| 80 | # All done with svn | 145 | # localversion* files in the build and source directory |
| 81 | exit | 146 | res="$(collect_files localversion*)" |
| 147 | if test ! "$srctree" -ef .; then | ||
| 148 | res="$res$(collect_files "$srctree"/localversion*)" | ||
| 149 | fi | ||
| 150 | |||
| 151 | # CONFIG_LOCALVERSION and LOCALVERSION (if set) | ||
| 152 | res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}" | ||
| 153 | |||
| 154 | # scm version string if not at a tagged commit | ||
| 155 | if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then | ||
| 156 | # full scm version string | ||
| 157 | res="$res$(scm_version)" | ||
| 158 | else | ||
| 159 | # apped a plus sign if the repository is not in a clean tagged | ||
| 160 | # state and LOCALVERSION= is not specified | ||
| 161 | if test "${LOCALVERSION+set}" != "set"; then | ||
| 162 | scm=$(scm_version --short) | ||
| 163 | res="$res${scm:++}" | ||
| 164 | fi | ||
| 82 | fi | 165 | fi |
| 166 | |||
| 167 | echo "$res" | ||
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 13074b454743..6261745e4459 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
| @@ -33,7 +33,7 @@ static int key_get_type_from_user(char *type, | |||
| 33 | ret = strncpy_from_user(type, _type, len); | 33 | ret = strncpy_from_user(type, _type, len); |
| 34 | 34 | ||
| 35 | if (ret < 0) | 35 | if (ret < 0) |
| 36 | return -EFAULT; | 36 | return ret; |
| 37 | 37 | ||
| 38 | if (ret == 0 || ret >= len) | 38 | if (ret == 0 || ret >= len) |
| 39 | return -EINVAL; | 39 | return -EINVAL; |
| @@ -1080,7 +1080,7 @@ set: | |||
| 1080 | return old_setting; | 1080 | return old_setting; |
| 1081 | error: | 1081 | error: |
| 1082 | abort_creds(new); | 1082 | abort_creds(new); |
| 1083 | return -EINVAL; | 1083 | return ret; |
| 1084 | 1084 | ||
| 1085 | } /* end keyctl_set_reqkey_keyring() */ | 1085 | } /* end keyctl_set_reqkey_keyring() */ |
| 1086 | 1086 | ||
diff --git a/sound/pci/asihpi/hpi6205.c b/sound/pci/asihpi/hpi6205.c index e89991ea3543..3b4413448226 100644 --- a/sound/pci/asihpi/hpi6205.c +++ b/sound/pci/asihpi/hpi6205.c | |||
| @@ -941,11 +941,11 @@ static void outstream_host_buffer_free(struct hpi_adapter_obj *pao, | |||
| 941 | 941 | ||
| 942 | } | 942 | } |
| 943 | 943 | ||
| 944 | static long outstream_get_space_available(struct hpi_hostbuffer_status | 944 | static u32 outstream_get_space_available(struct hpi_hostbuffer_status |
| 945 | *status) | 945 | *status) |
| 946 | { | 946 | { |
| 947 | return status->size_in_bytes - ((long)(status->host_index) - | 947 | return status->size_in_bytes - (status->host_index - |
| 948 | (long)(status->dSP_index)); | 948 | status->dSP_index); |
| 949 | } | 949 | } |
| 950 | 950 | ||
| 951 | static void outstream_write(struct hpi_adapter_obj *pao, | 951 | static void outstream_write(struct hpi_adapter_obj *pao, |
| @@ -954,7 +954,7 @@ static void outstream_write(struct hpi_adapter_obj *pao, | |||
| 954 | struct hpi_hw_obj *phw = pao->priv; | 954 | struct hpi_hw_obj *phw = pao->priv; |
| 955 | struct bus_master_interface *interface = phw->p_interface_buffer; | 955 | struct bus_master_interface *interface = phw->p_interface_buffer; |
| 956 | struct hpi_hostbuffer_status *status; | 956 | struct hpi_hostbuffer_status *status; |
| 957 | long space_available; | 957 | u32 space_available; |
| 958 | 958 | ||
| 959 | if (!phw->outstream_host_buffer_size[phm->obj_index]) { | 959 | if (!phw->outstream_host_buffer_size[phm->obj_index]) { |
| 960 | /* there is no BBM buffer, write via message */ | 960 | /* there is no BBM buffer, write via message */ |
| @@ -1007,7 +1007,7 @@ static void outstream_write(struct hpi_adapter_obj *pao, | |||
| 1007 | } | 1007 | } |
| 1008 | 1008 | ||
| 1009 | space_available = outstream_get_space_available(status); | 1009 | space_available = outstream_get_space_available(status); |
| 1010 | if (space_available < (long)phm->u.d.u.data.data_size) { | 1010 | if (space_available < phm->u.d.u.data.data_size) { |
| 1011 | phr->error = HPI_ERROR_INVALID_DATASIZE; | 1011 | phr->error = HPI_ERROR_INVALID_DATASIZE; |
| 1012 | return; | 1012 | return; |
| 1013 | } | 1013 | } |
| @@ -1018,7 +1018,7 @@ static void outstream_write(struct hpi_adapter_obj *pao, | |||
| 1018 | && hpios_locked_mem_valid(&phw->outstream_host_buffers[phm-> | 1018 | && hpios_locked_mem_valid(&phw->outstream_host_buffers[phm-> |
| 1019 | obj_index])) { | 1019 | obj_index])) { |
| 1020 | u8 *p_bbm_data; | 1020 | u8 *p_bbm_data; |
| 1021 | long l_first_write; | 1021 | u32 l_first_write; |
| 1022 | u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; | 1022 | u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; |
| 1023 | 1023 | ||
| 1024 | if (hpios_locked_mem_get_virt_addr(&phw-> | 1024 | if (hpios_locked_mem_get_virt_addr(&phw-> |
| @@ -1248,9 +1248,9 @@ static void instream_start(struct hpi_adapter_obj *pao, | |||
| 1248 | hw_message(pao, phm, phr); | 1248 | hw_message(pao, phm, phr); |
| 1249 | } | 1249 | } |
| 1250 | 1250 | ||
| 1251 | static long instream_get_bytes_available(struct hpi_hostbuffer_status *status) | 1251 | static u32 instream_get_bytes_available(struct hpi_hostbuffer_status *status) |
| 1252 | { | 1252 | { |
| 1253 | return (long)(status->dSP_index) - (long)(status->host_index); | 1253 | return status->dSP_index - status->host_index; |
| 1254 | } | 1254 | } |
| 1255 | 1255 | ||
| 1256 | static void instream_read(struct hpi_adapter_obj *pao, | 1256 | static void instream_read(struct hpi_adapter_obj *pao, |
| @@ -1259,9 +1259,9 @@ static void instream_read(struct hpi_adapter_obj *pao, | |||
| 1259 | struct hpi_hw_obj *phw = pao->priv; | 1259 | struct hpi_hw_obj *phw = pao->priv; |
| 1260 | struct bus_master_interface *interface = phw->p_interface_buffer; | 1260 | struct bus_master_interface *interface = phw->p_interface_buffer; |
| 1261 | struct hpi_hostbuffer_status *status; | 1261 | struct hpi_hostbuffer_status *status; |
| 1262 | long data_available; | 1262 | u32 data_available; |
| 1263 | u8 *p_bbm_data; | 1263 | u8 *p_bbm_data; |
| 1264 | long l_first_read; | 1264 | u32 l_first_read; |
| 1265 | u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; | 1265 | u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data; |
| 1266 | 1266 | ||
| 1267 | if (!phw->instream_host_buffer_size[phm->obj_index]) { | 1267 | if (!phw->instream_host_buffer_size[phm->obj_index]) { |
| @@ -1272,7 +1272,7 @@ static void instream_read(struct hpi_adapter_obj *pao, | |||
| 1272 | 1272 | ||
| 1273 | status = &interface->instream_host_buffer_status[phm->obj_index]; | 1273 | status = &interface->instream_host_buffer_status[phm->obj_index]; |
| 1274 | data_available = instream_get_bytes_available(status); | 1274 | data_available = instream_get_bytes_available(status); |
| 1275 | if (data_available < (long)phm->u.d.u.data.data_size) { | 1275 | if (data_available < phm->u.d.u.data.data_size) { |
| 1276 | phr->error = HPI_ERROR_INVALID_DATASIZE; | 1276 | phr->error = HPI_ERROR_INVALID_DATASIZE; |
| 1277 | return; | 1277 | return; |
| 1278 | } | 1278 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index fc767b6b4785..f1ce7d7f5aa3 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -2619,16 +2619,18 @@ static int alc_build_controls(struct hda_codec *codec) | |||
| 2619 | } | 2619 | } |
| 2620 | 2620 | ||
| 2621 | /* assign Capture Source enums to NID */ | 2621 | /* assign Capture Source enums to NID */ |
| 2622 | kctl = snd_hda_find_mixer_ctl(codec, "Capture Source"); | 2622 | if (spec->capsrc_nids || spec->adc_nids) { |
| 2623 | if (!kctl) | 2623 | kctl = snd_hda_find_mixer_ctl(codec, "Capture Source"); |
| 2624 | kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); | 2624 | if (!kctl) |
| 2625 | for (i = 0; kctl && i < kctl->count; i++) { | 2625 | kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); |
| 2626 | hda_nid_t *nids = spec->capsrc_nids; | 2626 | for (i = 0; kctl && i < kctl->count; i++) { |
| 2627 | if (!nids) | 2627 | hda_nid_t *nids = spec->capsrc_nids; |
| 2628 | nids = spec->adc_nids; | 2628 | if (!nids) |
| 2629 | err = snd_hda_add_nid(codec, kctl, i, nids[i]); | 2629 | nids = spec->adc_nids; |
| 2630 | if (err < 0) | 2630 | err = snd_hda_add_nid(codec, kctl, i, nids[i]); |
| 2631 | return err; | 2631 | if (err < 0) |
| 2632 | return err; | ||
| 2633 | } | ||
| 2632 | } | 2634 | } |
| 2633 | if (spec->cap_mixer) { | 2635 | if (spec->cap_mixer) { |
| 2634 | const char *kname = kctl ? kctl->id.name : NULL; | 2636 | const char *kname = kctl ? kctl->id.name : NULL; |
| @@ -6948,7 +6950,7 @@ static struct hda_input_mux mb5_capture_source = { | |||
| 6948 | .num_items = 3, | 6950 | .num_items = 3, |
| 6949 | .items = { | 6951 | .items = { |
| 6950 | { "Mic", 0x1 }, | 6952 | { "Mic", 0x1 }, |
| 6951 | { "Line", 0x2 }, | 6953 | { "Line", 0x7 }, |
| 6952 | { "CD", 0x4 }, | 6954 | { "CD", 0x4 }, |
| 6953 | }, | 6955 | }, |
| 6954 | }; | 6956 | }; |
| @@ -7469,8 +7471,8 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = { | |||
| 7469 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | 7471 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), |
| 7470 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | 7472 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), |
| 7471 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), | 7473 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), |
| 7472 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 7474 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT), |
| 7473 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 7475 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT), |
| 7474 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 7476 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
| 7475 | HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 7477 | HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
| 7476 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), | 7478 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), |
| @@ -7853,10 +7855,9 @@ static struct hda_verb alc885_mb5_init_verbs[] = { | |||
| 7853 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 7855 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| 7854 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 7856 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 7855 | 7857 | ||
| 7856 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 7858 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)}, |
| 7857 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | 7859 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)}, |
| 7858 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | 7860 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)}, |
| 7859 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 7860 | { } | 7861 | { } |
| 7861 | }; | 7862 | }; |
| 7862 | 7863 | ||
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 79f0f4ad242c..d3955096d872 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -612,7 +612,6 @@ static void davinci_hw_common_param(struct davinci_audio_dev *dev, int stream) | |||
| 612 | NUMDMA_MASK); | 612 | NUMDMA_MASK); |
| 613 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | 613 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, |
| 614 | ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK); | 614 | ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK); |
| 615 | mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
| 616 | } | 615 | } |
| 617 | 616 | ||
| 618 | if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { | 617 | if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { |
| @@ -623,7 +622,6 @@ static void davinci_hw_common_param(struct davinci_audio_dev *dev, int stream) | |||
| 623 | NUMDMA_MASK); | 622 | NUMDMA_MASK); |
| 624 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | 623 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, |
| 625 | ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK); | 624 | ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK); |
| 626 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
| 627 | } | 625 | } |
| 628 | } | 626 | } |
| 629 | 627 | ||
diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index 22208b373fb9..e1ec6d91ea38 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h | |||
| @@ -73,7 +73,7 @@ struct psc_dma { | |||
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | /* Utility for retrieving psc_dma_stream structure from a substream */ | 75 | /* Utility for retrieving psc_dma_stream structure from a substream */ |
| 76 | inline struct psc_dma_stream * | 76 | static inline struct psc_dma_stream * |
| 77 | to_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) | 77 | to_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) |
| 78 | { | 78 | { |
| 79 | if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) | 79 | if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) |
diff --git a/sound/usb/clock.c b/sound/usb/clock.c index b7aadd614c70..b5855114667e 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c | |||
| @@ -103,7 +103,8 @@ static int uac_clock_selector_get_val(struct snd_usb_audio *chip, int selector_i | |||
| 103 | ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), | 103 | ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), |
| 104 | UAC2_CS_CUR, | 104 | UAC2_CS_CUR, |
| 105 | USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, | 105 | USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, |
| 106 | UAC2_CX_CLOCK_SELECTOR << 8, selector_id << 8, | 106 | UAC2_CX_CLOCK_SELECTOR << 8, |
| 107 | snd_usb_ctrl_intf(chip) | (selector_id << 8), | ||
| 107 | &buf, sizeof(buf), 1000); | 108 | &buf, sizeof(buf), 1000); |
| 108 | 109 | ||
| 109 | if (ret < 0) | 110 | if (ret < 0) |
| @@ -120,7 +121,8 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id) | |||
| 120 | 121 | ||
| 121 | err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, | 122 | err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, |
| 122 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | 123 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| 123 | UAC2_CS_CONTROL_CLOCK_VALID << 8, source_id << 8, | 124 | UAC2_CS_CONTROL_CLOCK_VALID << 8, |
| 125 | snd_usb_ctrl_intf(chip) | (source_id << 8), | ||
| 124 | &data, sizeof(data), 1000); | 126 | &data, sizeof(data), 1000); |
| 125 | 127 | ||
| 126 | if (err < 0) { | 128 | if (err < 0) { |
| @@ -269,7 +271,8 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, | |||
| 269 | data[3] = rate >> 24; | 271 | data[3] = rate >> 24; |
| 270 | if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR, | 272 | if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR, |
| 271 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, | 273 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, |
| 272 | UAC2_CS_CONTROL_SAM_FREQ << 8, clock << 8, | 274 | UAC2_CS_CONTROL_SAM_FREQ << 8, |
| 275 | snd_usb_ctrl_intf(chip) | (clock << 8), | ||
| 273 | data, sizeof(data), 1000)) < 0) { | 276 | data, sizeof(data), 1000)) < 0) { |
| 274 | snd_printk(KERN_ERR "%d:%d:%d: cannot set freq %d (v2)\n", | 277 | snd_printk(KERN_ERR "%d:%d:%d: cannot set freq %d (v2)\n", |
| 275 | dev->devnum, iface, fmt->altsetting, rate); | 278 | dev->devnum, iface, fmt->altsetting, rate); |
| @@ -278,7 +281,8 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, | |||
| 278 | 281 | ||
| 279 | if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, | 282 | if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, |
| 280 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | 283 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| 281 | UAC2_CS_CONTROL_SAM_FREQ << 8, clock << 8, | 284 | UAC2_CS_CONTROL_SAM_FREQ << 8, |
| 285 | snd_usb_ctrl_intf(chip) | (clock << 8), | ||
| 282 | data, sizeof(data), 1000)) < 0) { | 286 | data, sizeof(data), 1000)) < 0) { |
| 283 | snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n", | 287 | snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n", |
| 284 | dev->devnum, iface, fmt->altsetting); | 288 | dev->devnum, iface, fmt->altsetting); |
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 9593b91452b9..6f6596cf2b19 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c | |||
| @@ -427,6 +427,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) | |||
| 427 | if (snd_usb_parse_audio_format(chip, fp, format, fmt, stream, alts) < 0) { | 427 | if (snd_usb_parse_audio_format(chip, fp, format, fmt, stream, alts) < 0) { |
| 428 | kfree(fp->rate_table); | 428 | kfree(fp->rate_table); |
| 429 | kfree(fp); | 429 | kfree(fp); |
| 430 | fp = NULL; | ||
| 430 | continue; | 431 | continue; |
| 431 | } | 432 | } |
| 432 | 433 | ||
diff --git a/sound/usb/format.c b/sound/usb/format.c index 5367cd1e52d9..30364aba79cc 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c | |||
| @@ -206,6 +206,60 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof | |||
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | /* | 208 | /* |
| 209 | * Helper function to walk the array of sample rate triplets reported by | ||
| 210 | * the device. The problem is that we need to parse whole array first to | ||
| 211 | * get to know how many sample rates we have to expect. | ||
| 212 | * Then fp->rate_table can be allocated and filled. | ||
| 213 | */ | ||
| 214 | static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets, | ||
| 215 | const unsigned char *data) | ||
| 216 | { | ||
| 217 | int i, nr_rates = 0; | ||
| 218 | |||
| 219 | fp->rates = fp->rate_min = fp->rate_max = 0; | ||
| 220 | |||
| 221 | for (i = 0; i < nr_triplets; i++) { | ||
| 222 | int min = combine_quad(&data[2 + 12 * i]); | ||
| 223 | int max = combine_quad(&data[6 + 12 * i]); | ||
| 224 | int res = combine_quad(&data[10 + 12 * i]); | ||
| 225 | int rate; | ||
| 226 | |||
| 227 | if ((max < 0) || (min < 0) || (res < 0) || (max < min)) | ||
| 228 | continue; | ||
| 229 | |||
| 230 | /* | ||
| 231 | * for ranges with res == 1, we announce a continuous sample | ||
| 232 | * rate range, and this function should return 0 for no further | ||
| 233 | * parsing. | ||
| 234 | */ | ||
| 235 | if (res == 1) { | ||
| 236 | fp->rate_min = min; | ||
| 237 | fp->rate_max = max; | ||
| 238 | fp->rates = SNDRV_PCM_RATE_CONTINUOUS; | ||
| 239 | return 0; | ||
| 240 | } | ||
| 241 | |||
| 242 | for (rate = min; rate <= max; rate += res) { | ||
| 243 | if (fp->rate_table) | ||
| 244 | fp->rate_table[nr_rates] = rate; | ||
| 245 | if (!fp->rate_min || rate < fp->rate_min) | ||
| 246 | fp->rate_min = rate; | ||
| 247 | if (!fp->rate_max || rate > fp->rate_max) | ||
| 248 | fp->rate_max = rate; | ||
| 249 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); | ||
| 250 | |||
| 251 | nr_rates++; | ||
| 252 | |||
| 253 | /* avoid endless loop */ | ||
| 254 | if (res == 0) | ||
| 255 | break; | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | return nr_rates; | ||
| 260 | } | ||
| 261 | |||
| 262 | /* | ||
| 209 | * parse the format descriptor and stores the possible sample rates | 263 | * parse the format descriptor and stores the possible sample rates |
| 210 | * on the audioformat table (audio class v2). | 264 | * on the audioformat table (audio class v2). |
| 211 | */ | 265 | */ |
| @@ -215,13 +269,20 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, | |||
| 215 | { | 269 | { |
| 216 | struct usb_device *dev = chip->dev; | 270 | struct usb_device *dev = chip->dev; |
| 217 | unsigned char tmp[2], *data; | 271 | unsigned char tmp[2], *data; |
| 218 | int i, nr_rates, data_size, ret = 0; | 272 | int nr_triplets, data_size, ret = 0; |
| 219 | int clock = snd_usb_clock_find_source(chip, chip->ctrl_intf, fp->clock); | 273 | int clock = snd_usb_clock_find_source(chip, chip->ctrl_intf, fp->clock); |
| 220 | 274 | ||
| 275 | if (clock < 0) { | ||
| 276 | snd_printk(KERN_ERR "%s(): unable to find clock source (clock %d)\n", | ||
| 277 | __func__, clock); | ||
| 278 | goto err; | ||
| 279 | } | ||
| 280 | |||
| 221 | /* get the number of sample rates first by only fetching 2 bytes */ | 281 | /* get the number of sample rates first by only fetching 2 bytes */ |
| 222 | ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, | 282 | ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, |
| 223 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | 283 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| 224 | UAC2_CS_CONTROL_SAM_FREQ << 8, clock << 8, | 284 | UAC2_CS_CONTROL_SAM_FREQ << 8, |
| 285 | snd_usb_ctrl_intf(chip) | (clock << 8), | ||
| 225 | tmp, sizeof(tmp), 1000); | 286 | tmp, sizeof(tmp), 1000); |
| 226 | 287 | ||
| 227 | if (ret < 0) { | 288 | if (ret < 0) { |
| @@ -230,8 +291,8 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, | |||
| 230 | goto err; | 291 | goto err; |
| 231 | } | 292 | } |
| 232 | 293 | ||
| 233 | nr_rates = (tmp[1] << 8) | tmp[0]; | 294 | nr_triplets = (tmp[1] << 8) | tmp[0]; |
| 234 | data_size = 2 + 12 * nr_rates; | 295 | data_size = 2 + 12 * nr_triplets; |
| 235 | data = kzalloc(data_size, GFP_KERNEL); | 296 | data = kzalloc(data_size, GFP_KERNEL); |
| 236 | if (!data) { | 297 | if (!data) { |
| 237 | ret = -ENOMEM; | 298 | ret = -ENOMEM; |
| @@ -241,7 +302,8 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, | |||
| 241 | /* now get the full information */ | 302 | /* now get the full information */ |
| 242 | ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, | 303 | ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, |
| 243 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | 304 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| 244 | UAC2_CS_CONTROL_SAM_FREQ << 8, clock << 8, | 305 | UAC2_CS_CONTROL_SAM_FREQ << 8, |
| 306 | snd_usb_ctrl_intf(chip) | (clock << 8), | ||
| 245 | data, data_size, 1000); | 307 | data, data_size, 1000); |
| 246 | 308 | ||
| 247 | if (ret < 0) { | 309 | if (ret < 0) { |
| @@ -251,26 +313,28 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, | |||
| 251 | goto err_free; | 313 | goto err_free; |
| 252 | } | 314 | } |
| 253 | 315 | ||
| 254 | fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL); | 316 | /* Call the triplet parser, and make sure fp->rate_table is NULL. |
| 317 | * We just use the return value to know how many sample rates we | ||
| 318 | * will have to deal with. */ | ||
| 319 | kfree(fp->rate_table); | ||
| 320 | fp->rate_table = NULL; | ||
| 321 | fp->nr_rates = parse_uac2_sample_rate_range(fp, nr_triplets, data); | ||
| 322 | |||
| 323 | if (fp->nr_rates == 0) { | ||
| 324 | /* SNDRV_PCM_RATE_CONTINUOUS */ | ||
| 325 | ret = 0; | ||
| 326 | goto err_free; | ||
| 327 | } | ||
| 328 | |||
| 329 | fp->rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL); | ||
| 255 | if (!fp->rate_table) { | 330 | if (!fp->rate_table) { |
| 256 | ret = -ENOMEM; | 331 | ret = -ENOMEM; |
| 257 | goto err_free; | 332 | goto err_free; |
| 258 | } | 333 | } |
| 259 | 334 | ||
| 260 | fp->nr_rates = 0; | 335 | /* Call the triplet parser again, but this time, fp->rate_table is |
| 261 | fp->rate_min = fp->rate_max = 0; | 336 | * allocated, so the rates will be stored */ |
| 262 | 337 | parse_uac2_sample_rate_range(fp, nr_triplets, data); | |
| 263 | for (i = 0; i < nr_rates; i++) { | ||
| 264 | int rate = combine_quad(&data[2 + 12 * i]); | ||
| 265 | |||
| 266 | fp->rate_table[fp->nr_rates] = rate; | ||
| 267 | if (!fp->rate_min || rate < fp->rate_min) | ||
| 268 | fp->rate_min = rate; | ||
| 269 | if (!fp->rate_max || rate > fp->rate_max) | ||
| 270 | fp->rate_max = rate; | ||
| 271 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); | ||
| 272 | fp->nr_rates++; | ||
| 273 | } | ||
| 274 | 338 | ||
| 275 | err_free: | 339 | err_free: |
| 276 | kfree(data); | 340 | kfree(data); |
diff --git a/sound/usb/helper.h b/sound/usb/helper.h index a6b0e51b3a9a..09bd943c43bf 100644 --- a/sound/usb/helper.h +++ b/sound/usb/helper.h | |||
| @@ -28,5 +28,9 @@ unsigned char snd_usb_parse_datainterval(struct snd_usb_audio *chip, | |||
| 28 | #define snd_usb_get_speed(dev) ((dev)->speed) | 28 | #define snd_usb_get_speed(dev) ((dev)->speed) |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | static inline int snd_usb_ctrl_intf(struct snd_usb_audio *chip) | ||
| 32 | { | ||
| 33 | return get_iface_desc(chip->ctrl_intf)->bInterfaceNumber; | ||
| 34 | } | ||
| 31 | 35 | ||
| 32 | #endif /* __USBAUDIO_HELPER_H */ | 36 | #endif /* __USBAUDIO_HELPER_H */ |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index a060d005e209..6939d0f517d9 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -297,20 +297,27 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v | |||
| 297 | 297 | ||
| 298 | static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) | 298 | static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) |
| 299 | { | 299 | { |
| 300 | unsigned char buf[14]; /* enough space for one range of 4 bytes */ | 300 | unsigned char buf[2 + 3*sizeof(__u16)]; /* enough space for one range */ |
| 301 | unsigned char *val; | 301 | unsigned char *val; |
| 302 | int ret; | 302 | int ret, size; |
| 303 | __u8 bRequest; | 303 | __u8 bRequest; |
| 304 | 304 | ||
| 305 | bRequest = (request == UAC_GET_CUR) ? | 305 | if (request == UAC_GET_CUR) { |
| 306 | UAC2_CS_CUR : UAC2_CS_RANGE; | 306 | bRequest = UAC2_CS_CUR; |
| 307 | size = sizeof(__u16); | ||
| 308 | } else { | ||
| 309 | bRequest = UAC2_CS_RANGE; | ||
| 310 | size = sizeof(buf); | ||
| 311 | } | ||
| 312 | |||
| 313 | memset(buf, 0, sizeof(buf)); | ||
| 307 | 314 | ||
| 308 | ret = snd_usb_ctl_msg(cval->mixer->chip->dev, | 315 | ret = snd_usb_ctl_msg(cval->mixer->chip->dev, |
| 309 | usb_rcvctrlpipe(cval->mixer->chip->dev, 0), | 316 | usb_rcvctrlpipe(cval->mixer->chip->dev, 0), |
| 310 | bRequest, | 317 | bRequest, |
| 311 | USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, | 318 | USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, |
| 312 | validx, cval->mixer->ctrlif | (cval->id << 8), | 319 | validx, cval->mixer->ctrlif | (cval->id << 8), |
| 313 | buf, sizeof(buf), 1000); | 320 | buf, size, 1000); |
| 314 | 321 | ||
| 315 | if (ret < 0) { | 322 | if (ret < 0) { |
| 316 | snd_printk(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", | 323 | snd_printk(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", |
| @@ -318,6 +325,8 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int v | |||
| 318 | return ret; | 325 | return ret; |
| 319 | } | 326 | } |
| 320 | 327 | ||
| 328 | /* FIXME: how should we handle multiple triplets here? */ | ||
| 329 | |||
| 321 | switch (request) { | 330 | switch (request) { |
| 322 | case UAC_GET_CUR: | 331 | case UAC_GET_CUR: |
| 323 | val = buf; | 332 | val = buf; |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index dc3435e18bde..711745f56bba 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -193,7 +193,7 @@ static void sig_handler(int sig) | |||
| 193 | 193 | ||
| 194 | static void sig_atexit(void) | 194 | static void sig_atexit(void) |
| 195 | { | 195 | { |
| 196 | if (child_pid != -1) | 196 | if (child_pid > 0) |
| 197 | kill(child_pid, SIGTERM); | 197 | kill(child_pid, SIGTERM); |
| 198 | 198 | ||
| 199 | if (signr == -1) | 199 | if (signr == -1) |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1f08f008d289..2fbf6a463c81 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -538,8 +538,10 @@ int event__process_task(event_t *self, struct perf_session *session) | |||
| 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, | 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, |
| 539 | self->fork.ppid, self->fork.ptid); | 539 | self->fork.ppid, self->fork.ptid); |
| 540 | 540 | ||
| 541 | if (self->header.type == PERF_RECORD_EXIT) | 541 | if (self->header.type == PERF_RECORD_EXIT) { |
| 542 | perf_session__remove_thread(session, thread); | ||
| 542 | return 0; | 543 | return 0; |
| 544 | } | ||
| 543 | 545 | ||
| 544 | if (thread == NULL || parent == NULL || | 546 | if (thread == NULL || parent == NULL || |
| 545 | thread__fork(thread, parent) < 0) { | 547 | thread__fork(thread, parent) < 0) { |
diff --git a/tools/perf/util/newt.c b/tools/perf/util/newt.c index cf182ca132fe..7537ca15900b 100644 --- a/tools/perf/util/newt.c +++ b/tools/perf/util/newt.c | |||
| @@ -43,6 +43,9 @@ struct ui_progress *ui_progress__new(const char *title, u64 total) | |||
| 43 | 43 | ||
| 44 | if (self != NULL) { | 44 | if (self != NULL) { |
| 45 | int cols; | 45 | int cols; |
| 46 | |||
| 47 | if (use_browser <= 0) | ||
| 48 | return self; | ||
| 46 | newtGetScreenSize(&cols, NULL); | 49 | newtGetScreenSize(&cols, NULL); |
| 47 | cols -= 4; | 50 | cols -= 4; |
| 48 | newtCenteredWindow(cols, 1, title); | 51 | newtCenteredWindow(cols, 1, title); |
| @@ -67,14 +70,22 @@ out_free_self: | |||
| 67 | 70 | ||
| 68 | void ui_progress__update(struct ui_progress *self, u64 curr) | 71 | void ui_progress__update(struct ui_progress *self, u64 curr) |
| 69 | { | 72 | { |
| 73 | /* | ||
| 74 | * FIXME: We should have a per UI backend way of showing progress, | ||
| 75 | * stdio will just show a percentage as NN%, etc. | ||
| 76 | */ | ||
| 77 | if (use_browser <= 0) | ||
| 78 | return; | ||
| 70 | newtScaleSet(self->scale, curr); | 79 | newtScaleSet(self->scale, curr); |
| 71 | newtRefresh(); | 80 | newtRefresh(); |
| 72 | } | 81 | } |
| 73 | 82 | ||
| 74 | void ui_progress__delete(struct ui_progress *self) | 83 | void ui_progress__delete(struct ui_progress *self) |
| 75 | { | 84 | { |
| 76 | newtFormDestroy(self->form); | 85 | if (use_browser > 0) { |
| 77 | newtPopWindow(); | 86 | newtFormDestroy(self->form); |
| 87 | newtPopWindow(); | ||
| 88 | } | ||
| 78 | free(self); | 89 | free(self); |
| 79 | } | 90 | } |
| 80 | 91 | ||
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 8f83a1835766..c422cd676313 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -90,6 +90,7 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc | |||
| 90 | 90 | ||
| 91 | memcpy(self->filename, filename, len); | 91 | memcpy(self->filename, filename, len); |
| 92 | self->threads = RB_ROOT; | 92 | self->threads = RB_ROOT; |
| 93 | INIT_LIST_HEAD(&self->dead_threads); | ||
| 93 | self->hists_tree = RB_ROOT; | 94 | self->hists_tree = RB_ROOT; |
| 94 | self->last_match = NULL; | 95 | self->last_match = NULL; |
| 95 | self->mmap_window = 32; | 96 | self->mmap_window = 32; |
| @@ -131,6 +132,16 @@ void perf_session__delete(struct perf_session *self) | |||
| 131 | free(self); | 132 | free(self); |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 135 | void perf_session__remove_thread(struct perf_session *self, struct thread *th) | ||
| 136 | { | ||
| 137 | rb_erase(&th->rb_node, &self->threads); | ||
| 138 | /* | ||
| 139 | * We may have references to this thread, for instance in some hist_entry | ||
| 140 | * instances, so just move them to a separate list. | ||
| 141 | */ | ||
| 142 | list_add_tail(&th->node, &self->dead_threads); | ||
| 143 | } | ||
| 144 | |||
| 134 | static bool symbol__match_parent_regex(struct symbol *sym) | 145 | static bool symbol__match_parent_regex(struct symbol *sym) |
| 135 | { | 146 | { |
| 136 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) | 147 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 55c6881b218d..9fa0fc2a863f 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
| @@ -26,6 +26,7 @@ struct perf_session { | |||
| 26 | unsigned long size; | 26 | unsigned long size; |
| 27 | unsigned long mmap_window; | 27 | unsigned long mmap_window; |
| 28 | struct rb_root threads; | 28 | struct rb_root threads; |
| 29 | struct list_head dead_threads; | ||
| 29 | struct thread *last_match; | 30 | struct thread *last_match; |
| 30 | struct machine host_machine; | 31 | struct machine host_machine; |
| 31 | struct rb_root machines; | 32 | struct rb_root machines; |
| @@ -99,6 +100,7 @@ int perf_session__create_kernel_maps(struct perf_session *self); | |||
| 99 | 100 | ||
| 100 | int do_read(int fd, void *buf, size_t size); | 101 | int do_read(int fd, void *buf, size_t size); |
| 101 | void perf_session__update_sample_type(struct perf_session *self); | 102 | void perf_session__update_sample_type(struct perf_session *self); |
| 103 | void perf_session__remove_thread(struct perf_session *self, struct thread *th); | ||
| 102 | 104 | ||
| 103 | static inline | 105 | static inline |
| 104 | struct machine *perf_session__find_host_machine(struct perf_session *self) | 106 | struct machine *perf_session__find_host_machine(struct perf_session *self) |
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 1f7ecd47f499..9a448b47400c 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c | |||
| @@ -7,6 +7,15 @@ | |||
| 7 | #include "util.h" | 7 | #include "util.h" |
| 8 | #include "debug.h" | 8 | #include "debug.h" |
| 9 | 9 | ||
| 10 | /* Skip "." and ".." directories */ | ||
| 11 | static int filter(const struct dirent *dir) | ||
| 12 | { | ||
| 13 | if (dir->d_name[0] == '.') | ||
| 14 | return 0; | ||
| 15 | else | ||
| 16 | return 1; | ||
| 17 | } | ||
| 18 | |||
| 10 | int find_all_tid(int pid, pid_t ** all_tid) | 19 | int find_all_tid(int pid, pid_t ** all_tid) |
| 11 | { | 20 | { |
| 12 | char name[256]; | 21 | char name[256]; |
| @@ -16,7 +25,7 @@ int find_all_tid(int pid, pid_t ** all_tid) | |||
| 16 | int i; | 25 | int i; |
| 17 | 26 | ||
| 18 | sprintf(name, "/proc/%d/task", pid); | 27 | sprintf(name, "/proc/%d/task", pid); |
| 19 | items = scandir(name, &namelist, NULL, NULL); | 28 | items = scandir(name, &namelist, filter, NULL); |
| 20 | if (items <= 0) | 29 | if (items <= 0) |
| 21 | return -ENOENT; | 30 | return -ENOENT; |
| 22 | *all_tid = malloc(sizeof(pid_t) * items); | 31 | *all_tid = malloc(sizeof(pid_t) * items); |
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 1dfd9ff8bdcd..ee6bbcf277ca 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h | |||
| @@ -6,7 +6,10 @@ | |||
| 6 | #include "symbol.h" | 6 | #include "symbol.h" |
| 7 | 7 | ||
| 8 | struct thread { | 8 | struct thread { |
| 9 | struct rb_node rb_node; | 9 | union { |
| 10 | struct rb_node rb_node; | ||
| 11 | struct list_head node; | ||
| 12 | }; | ||
| 10 | struct map_groups mg; | 13 | struct map_groups mg; |
| 11 | pid_t pid; | 14 | pid_t pid; |
| 12 | char shortname[3]; | 15 | char shortname[3]; |
