aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MAINTAINERS2
-rw-r--r--Makefile4
-rw-r--r--arch/arm/Kconfig14
-rw-r--r--arch/arm/kernel/kprobes-decode.c7
-rw-r--r--arch/arm/mach-at91/include/mach/system.h7
-rw-r--r--arch/arm/mach-ep93xx/dma-m2p.c2
-rw-r--r--arch/arm/mach-imx/Kconfig1
-rw-r--r--arch/arm/mach-imx/mach-cpuimx27.c2
-rw-r--r--arch/arm/mach-vexpress/ct-ca9x4.c4
-rw-r--r--arch/arm/mach-vexpress/v2m.c2
-rw-r--r--arch/arm/mm/ioremap.c8
-rw-r--r--arch/arm/mm/mmu.c4
-rw-r--r--arch/arm/mm/proc-v7.S10
-rw-r--r--arch/arm/plat-omap/iommu.c1
-rw-r--r--arch/m32r/include/asm/elf.h4
-rw-r--r--arch/m32r/kernel/.gitignore1
-rw-r--r--arch/m32r/kernel/signal.c4
-rw-r--r--arch/mips/Kbuild4
-rw-r--r--arch/mips/Kconfig4
-rw-r--r--arch/mips/boot/compressed/Makefile2
-rw-r--r--arch/mips/dec/Platform2
-rw-r--r--arch/mips/include/asm/fcntl.h1
-rw-r--r--arch/mips/jz4740/Platform2
-rw-r--r--arch/mips/kernel/branch.c1
-rw-r--r--arch/mips/kernel/ptrace.c4
-rw-r--r--arch/mips/kernel/scall32-o32.S11
-rw-r--r--arch/mips/kernel/scall64-64.S7
-rw-r--r--arch/mips/kernel/scall64-n32.S12
-rw-r--r--arch/mips/kernel/scall64-o32.S15
-rw-r--r--arch/mips/kernel/signal.c45
-rw-r--r--arch/mips/kernel/signal_n32.c5
-rw-r--r--arch/mips/kernel/unaligned.c2
-rw-r--r--arch/um/drivers/hostaudio_kern.c14
-rw-r--r--arch/um/drivers/ubd_kern.c9
-rw-r--r--arch/x86/ia32/ia32_aout.c22
-rw-r--r--arch/x86/include/asm/kvm_host.h24
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce_amd.c9
-rw-r--r--arch/x86/kernel/cpu/mcheck/therm_throt.c3
-rw-r--r--arch/x86/kvm/svm.c17
-rw-r--r--arch/x86/kvm/vmx.c24
-rw-r--r--arch/x86/mm/srat_64.c8
-rw-r--r--block/bsg.c2
-rw-r--r--drivers/acpi/Kconfig11
-rw-r--r--drivers/acpi/ac.c14
-rw-r--r--drivers/acpi/acpica/Makefile5
-rw-r--r--drivers/acpi/acpica/acdebug.h2
-rw-r--r--drivers/acpi/acpica/acglobal.h8
-rw-r--r--drivers/acpi/acpica/achware.h7
-rw-r--r--drivers/acpi/acpica/aclocal.h12
-rw-r--r--drivers/acpi/acpica/acmacros.h4
-rw-r--r--drivers/acpi/acpica/acnamesp.h12
-rw-r--r--drivers/acpi/acpica/acobject.h2
-rw-r--r--drivers/acpi/acpica/acutils.h56
-rw-r--r--drivers/acpi/acpica/dsmethod.c2
-rw-r--r--drivers/acpi/acpica/dswexec.c19
-rw-r--r--drivers/acpi/acpica/evmisc.c2
-rw-r--r--drivers/acpi/acpica/evrgnini.c14
-rw-r--r--drivers/acpi/acpica/evxfregn.c6
-rw-r--r--drivers/acpi/acpica/exfldio.c75
-rw-r--r--drivers/acpi/acpica/exmutex.c10
-rw-r--r--drivers/acpi/acpica/exprep.c45
-rw-r--r--drivers/acpi/acpica/exregion.c4
-rw-r--r--drivers/acpi/acpica/hwpci.c412
-rw-r--r--drivers/acpi/acpica/nsrepair2.c163
-rw-r--r--drivers/acpi/acpica/nsutils.c98
-rw-r--r--drivers/acpi/acpica/tbfadt.c4
-rw-r--r--drivers/acpi/acpica/utdebug.c7
-rw-r--r--drivers/acpi/acpica/uteval.c147
-rw-r--r--drivers/acpi/acpica/utglobal.c8
-rw-r--r--drivers/acpi/acpica/utids.c45
-rw-r--r--drivers/acpi/acpica/utinit.c4
-rw-r--r--drivers/acpi/acpica/utmath.c23
-rw-r--r--drivers/acpi/acpica/utmisc.c162
-rw-r--r--drivers/acpi/acpica/utmutex.c37
-rw-r--r--drivers/acpi/acpica/utosi.c380
-rw-r--r--drivers/acpi/acpica/utxface.c125
-rw-r--r--drivers/acpi/acpica/utxferror.c415
-rw-r--r--drivers/acpi/battery.c59
-rw-r--r--drivers/acpi/button.c4
-rw-r--r--drivers/acpi/fan.c139
-rw-r--r--drivers/acpi/osl.c162
-rw-r--r--drivers/acpi/pci_irq.c1
-rw-r--r--drivers/acpi/pci_link.c1
-rw-r--r--drivers/acpi/pci_root.c1
-rw-r--r--drivers/acpi/processor_driver.c20
-rw-r--r--drivers/acpi/processor_throttling.c4
-rw-r--r--drivers/acpi/sbs.c25
-rw-r--r--drivers/acpi/scan.c37
-rw-r--r--drivers/acpi/thermal.c436
-rw-r--r--drivers/acpi/video.c771
-rw-r--r--drivers/atm/iphase.c6
-rw-r--r--drivers/atm/iphase.h2
-rw-r--r--drivers/atm/solos-pci.c8
-rw-r--r--drivers/block/ps3disk.c2
-rw-r--r--drivers/char/virtio_console.c17
-rw-r--r--drivers/dma/ioat/dma_v2.c2
-rw-r--r--drivers/firewire/ohci.c19
-rw-r--r--drivers/firewire/ohci.h8
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c5
-rw-r--r--drivers/gpu/drm/radeon/r100.c3
-rw-r--r--drivers/gpu/drm/radeon/r600.c4
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_kms.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c18
-rw-r--r--drivers/gpu/drm/radeon/radeon_combios.c26
-rw-r--r--drivers/gpu/drm/radeon/radeon_cursor.c28
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.h5
-rw-r--r--drivers/gpu/drm/radeon/rs600.c1
-rw-r--r--drivers/gpu/drm/radeon/rs690.c1
-rw-r--r--drivers/gpu/drm/radeon/rv770.c2
-rw-r--r--drivers/hid/hid-cando.c2
-rw-r--r--drivers/hid/hid-core.c1
-rw-r--r--drivers/hid/hid-ids.h2
-rw-r--r--drivers/hid/hidraw.c11
-rw-r--r--drivers/hid/usbhid/hid-quirks.c1
-rw-r--r--drivers/i2c/busses/i2c-davinci.c24
-rw-r--r--drivers/i2c/busses/i2c-imx.c12
-rw-r--r--drivers/input/evdev.c8
-rw-r--r--drivers/media/video/v4l2-compat-ioctl32.c32
-rw-r--r--drivers/mmc/core/core.c13
-rw-r--r--drivers/mtd/nand/mxc_nand.c92
-rw-r--r--drivers/net/b44.c4
-rw-r--r--drivers/net/ehea/ehea_main.c9
-rw-r--r--drivers/net/ehea/ehea_qmr.h1
-rw-r--r--drivers/net/fec.c44
-rw-r--r--drivers/net/r8169.c65
-rw-r--r--drivers/net/tg3.c6
-rw-r--r--drivers/net/tg3.h2
-rw-r--r--drivers/net/wimax/i2400m/rx.c26
-rw-r--r--drivers/pnp/base.h5
-rw-r--r--drivers/pnp/core.c3
-rw-r--r--drivers/pnp/driver.c2
-rw-r--r--drivers/pnp/pnpacpi/core.c2
-rw-r--r--drivers/scsi/scsi.c4
-rw-r--r--drivers/serial/ioc3_serial.c1
-rw-r--r--fs/binfmt_aout.c4
-rw-r--r--fs/exec.c40
-rw-r--r--fs/nfsd/nfsfh.h2
-rw-r--r--fs/notify/Kconfig2
-rw-r--r--include/acpi/acpi_bus.h2
-rw-r--r--include/acpi/acpiosxf.h12
-rw-r--r--include/acpi/acpixf.h9
-rw-r--r--include/acpi/actypes.h30
-rw-r--r--include/acpi/platform/acenv.h6
-rw-r--r--include/acpi/platform/acgcc.h2
-rw-r--r--include/acpi/platform/aclinux.h7
-rw-r--r--include/linux/Kbuild1
-rw-r--r--include/linux/coredump.h34
-rw-r--r--include/linux/types.h15
-rw-r--r--kernel/hrtimer.c13
-rw-r--r--kernel/perf_event.c4
-rw-r--r--kernel/sysctl_check.c9
-rw-r--r--kernel/trace/ring_buffer.c2
-rw-r--r--net/atm/mpc.c2
-rw-r--r--net/core/ethtool.c6
-rw-r--r--net/rds/page.c27
-rw-r--r--sound/core/rawmidi.c4
-rw-r--r--tools/perf/perf.h12
159 files changed, 2514 insertions, 2591 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 7679bf32f7bb..f2a2b8e647c5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3162,7 +3162,7 @@ F: drivers/net/ioc3-eth.c
3162 3162
3163IOC3 SERIAL DRIVER 3163IOC3 SERIAL DRIVER
3164M: Pat Gefre <pfg@sgi.com> 3164M: Pat Gefre <pfg@sgi.com>
3165L: linux-mips@linux-mips.org 3165L: linux-serial@vger.kernel.org
3166S: Maintained 3166S: Maintained
3167F: drivers/serial/ioc3_serial.c 3167F: drivers/serial/ioc3_serial.c
3168 3168
diff --git a/Makefile b/Makefile
index 77b5c6ed0ce5..860c26af52c3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
1VERSION = 2 1VERSION = 2
2PATCHLEVEL = 6 2PATCHLEVEL = 6
3SUBLEVEL = 36 3SUBLEVEL = 36
4EXTRAVERSION = -rc7 4EXTRAVERSION =
5NAME = Sheep on Meth 5NAME = Flesh-Eating Bats with Fangs
6 6
7# *DOCUMENTATION* 7# *DOCUMENTATION*
8# To see a list of typical targets execute "make help" 8# To see a list of typical targets execute "make help"
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 88c97bc7a6f5..9c26ba7244fb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1101,6 +1101,20 @@ config ARM_ERRATA_720789
1101 invalidated are not, resulting in an incoherency in the system page 1101 invalidated are not, resulting in an incoherency in the system page
1102 tables. The workaround changes the TLB flushing routines to invalidate 1102 tables. The workaround changes the TLB flushing routines to invalidate
1103 entries regardless of the ASID. 1103 entries regardless of the ASID.
1104
1105config ARM_ERRATA_743622
1106 bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption"
1107 depends on CPU_V7
1108 help
1109 This option enables the workaround for the 743622 Cortex-A9
1110 (r2p0..r2p2) erratum. Under very rare conditions, a faulty
1111 optimisation in the Cortex-A9 Store Buffer may lead to data
1112 corruption. This workaround sets a specific bit in the diagnostic
1113 register of the Cortex-A9 which disables the Store Buffer
1114 optimisation, preventing the defect from occurring. This has no
1115 visible impact on the overall performance or power consumption of the
1116 processor.
1117
1104endmenu 1118endmenu
1105 1119
1106source "arch/arm/common/Kconfig" 1120source "arch/arm/common/Kconfig"
diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c
index 8bccbfa693ff..2c1f0050c9c4 100644
--- a/arch/arm/kernel/kprobes-decode.c
+++ b/arch/arm/kernel/kprobes-decode.c
@@ -1162,11 +1162,12 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1162{ 1162{
1163 /* 1163 /*
1164 * MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx 1164 * MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx
1165 * Undef : cccc 0011 0x00 xxxx xxxx xxxx xxxx xxxx 1165 * Undef : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx
1166 * ALU op with S bit and Rd == 15 : 1166 * ALU op with S bit and Rd == 15 :
1167 * cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx 1167 * cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx
1168 */ 1168 */
1169 if ((insn & 0x0f900000) == 0x03200000 || /* MSR & Undef */ 1169 if ((insn & 0x0fb00000) == 0x03200000 || /* MSR */
1170 (insn & 0x0ff00000) == 0x03400000 || /* Undef */
1170 (insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */ 1171 (insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */
1171 return INSN_REJECTED; 1172 return INSN_REJECTED;
1172 1173
@@ -1177,7 +1178,7 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1177 * *S (bit 20) updates condition codes 1178 * *S (bit 20) updates condition codes
1178 * ADC/SBC/RSC reads the C flag 1179 * ADC/SBC/RSC reads the C flag
1179 */ 1180 */
1180 insn &= 0xfff00fff; /* Rn = r0, Rd = r0 */ 1181 insn &= 0xffff0fff; /* Rd = r0 */
1181 asi->insn[0] = insn; 1182 asi->insn[0] = insn;
1182 asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ 1183 asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */
1183 emulate_alu_imm_rwflags : emulate_alu_imm_rflags; 1184 emulate_alu_imm_rwflags : emulate_alu_imm_rflags;
diff --git a/arch/arm/mach-at91/include/mach/system.h b/arch/arm/mach-at91/include/mach/system.h
index c80e090b3670..ee8db152592e 100644
--- a/arch/arm/mach-at91/include/mach/system.h
+++ b/arch/arm/mach-at91/include/mach/system.h
@@ -28,17 +28,16 @@
28 28
29static inline void arch_idle(void) 29static inline void arch_idle(void)
30{ 30{
31#ifndef CONFIG_DEBUG_KERNEL
32 /* 31 /*
33 * Disable the processor clock. The processor will be automatically 32 * Disable the processor clock. The processor will be automatically
34 * re-enabled by an interrupt or by a reset. 33 * re-enabled by an interrupt or by a reset.
35 */ 34 */
36 at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); 35 at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK);
37#else 36#ifndef CONFIG_CPU_ARM920T
38 /* 37 /*
39 * Set the processor (CP15) into 'Wait for Interrupt' mode. 38 * Set the processor (CP15) into 'Wait for Interrupt' mode.
40 * Unlike disabling the processor clock via the PMC (above) 39 * Post-RM9200 processors need this in conjunction with the above
41 * this allows the processor to be woken via JTAG. 40 * to save power when idle.
42 */ 41 */
43 cpu_do_idle(); 42 cpu_do_idle();
44#endif 43#endif
diff --git a/arch/arm/mach-ep93xx/dma-m2p.c b/arch/arm/mach-ep93xx/dma-m2p.c
index 8904ca4e2e24..a696d354b1f8 100644
--- a/arch/arm/mach-ep93xx/dma-m2p.c
+++ b/arch/arm/mach-ep93xx/dma-m2p.c
@@ -276,7 +276,7 @@ static void channel_disable(struct m2p_channel *ch)
276 v &= ~(M2P_CONTROL_STALL_IRQ_EN | M2P_CONTROL_NFB_IRQ_EN); 276 v &= ~(M2P_CONTROL_STALL_IRQ_EN | M2P_CONTROL_NFB_IRQ_EN);
277 m2p_set_control(ch, v); 277 m2p_set_control(ch, v);
278 278
279 while (m2p_channel_state(ch) == STATE_ON) 279 while (m2p_channel_state(ch) >= STATE_ON)
280 cpu_relax(); 280 cpu_relax();
281 281
282 m2p_set_control(ch, 0x0); 282 m2p_set_control(ch, 0x0);
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index c5c0369bb481..2f7e2728970d 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -122,6 +122,7 @@ config MACH_CPUIMX27
122 select IMX_HAVE_PLATFORM_IMX_I2C 122 select IMX_HAVE_PLATFORM_IMX_I2C
123 select IMX_HAVE_PLATFORM_IMX_UART 123 select IMX_HAVE_PLATFORM_IMX_UART
124 select IMX_HAVE_PLATFORM_MXC_NAND 124 select IMX_HAVE_PLATFORM_MXC_NAND
125 select MXC_ULPI if USB_ULPI
125 help 126 help
126 Include support for Eukrea CPUIMX27 platform. This includes 127 Include support for Eukrea CPUIMX27 platform. This includes
127 specific configurations for the module and its peripherals. 128 specific configurations for the module and its peripherals.
diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c
index 339150ab0ea5..6830afd1d2ba 100644
--- a/arch/arm/mach-imx/mach-cpuimx27.c
+++ b/arch/arm/mach-imx/mach-cpuimx27.c
@@ -259,7 +259,7 @@ static void __init eukrea_cpuimx27_init(void)
259 i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices, 259 i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices,
260 ARRAY_SIZE(eukrea_cpuimx27_i2c_devices)); 260 ARRAY_SIZE(eukrea_cpuimx27_i2c_devices));
261 261
262 imx27_add_i2c_imx1(&cpuimx27_i2c1_data); 262 imx27_add_i2c_imx0(&cpuimx27_i2c1_data);
263 263
264 platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); 264 platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
265 265
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c
index efb127022d42..71fb17349520 100644
--- a/arch/arm/mach-vexpress/ct-ca9x4.c
+++ b/arch/arm/mach-vexpress/ct-ca9x4.c
@@ -68,7 +68,7 @@ static void __init ct_ca9x4_init_irq(void)
68} 68}
69 69
70#if 0 70#if 0
71static void ct_ca9x4_timer_init(void) 71static void __init ct_ca9x4_timer_init(void)
72{ 72{
73 writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL); 73 writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
74 writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL); 74 writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
@@ -222,7 +222,7 @@ static struct platform_device pmu_device = {
222 .resource = pmu_resources, 222 .resource = pmu_resources,
223}; 223};
224 224
225static void ct_ca9x4_init(void) 225static void __init ct_ca9x4_init(void)
226{ 226{
227 int i; 227 int i;
228 228
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c
index 817f0ad38a0b..7eaa232180a5 100644
--- a/arch/arm/mach-vexpress/v2m.c
+++ b/arch/arm/mach-vexpress/v2m.c
@@ -48,7 +48,7 @@ void __init v2m_map_io(struct map_desc *tile, size_t num)
48} 48}
49 49
50 50
51static void v2m_timer_init(void) 51static void __init v2m_timer_init(void)
52{ 52{
53 writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL); 53 writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL);
54 writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL); 54 writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL);
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index ab506272b2d3..17e7b0b57e49 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -204,8 +204,12 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
204 /* 204 /*
205 * Don't allow RAM to be mapped - this causes problems with ARMv6+ 205 * Don't allow RAM to be mapped - this causes problems with ARMv6+
206 */ 206 */
207 if (WARN_ON(pfn_valid(pfn))) 207 if (pfn_valid(pfn)) {
208 return NULL; 208 printk(KERN_WARNING "BUG: Your driver calls ioremap() on system memory. This leads\n"
209 KERN_WARNING "to architecturally unpredictable behaviour on ARMv6+, and ioremap()\n"
210 KERN_WARNING "will fail in the next kernel release. Please fix your driver.\n");
211 WARN_ON(1);
212 }
209 213
210 type = get_mem_type(mtype); 214 type = get_mem_type(mtype);
211 if (!type) 215 if (!type)
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 6a3a2d0cd6db..e8ed9dc461fe 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -248,7 +248,7 @@ static struct mem_type mem_types[] = {
248 }, 248 },
249 [MT_MEMORY] = { 249 [MT_MEMORY] = {
250 .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | 250 .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
251 L_PTE_USER | L_PTE_EXEC, 251 L_PTE_WRITE | L_PTE_EXEC,
252 .prot_l1 = PMD_TYPE_TABLE, 252 .prot_l1 = PMD_TYPE_TABLE,
253 .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, 253 .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
254 .domain = DOMAIN_KERNEL, 254 .domain = DOMAIN_KERNEL,
@@ -259,7 +259,7 @@ static struct mem_type mem_types[] = {
259 }, 259 },
260 [MT_MEMORY_NONCACHED] = { 260 [MT_MEMORY_NONCACHED] = {
261 .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | 261 .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
262 L_PTE_USER | L_PTE_EXEC | L_PTE_MT_BUFFERABLE, 262 L_PTE_WRITE | L_PTE_EXEC | L_PTE_MT_BUFFERABLE,
263 .prot_l1 = PMD_TYPE_TABLE, 263 .prot_l1 = PMD_TYPE_TABLE,
264 .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, 264 .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
265 .domain = DOMAIN_KERNEL, 265 .domain = DOMAIN_KERNEL,
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 7563ff0141bd..197f21bed5e9 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -253,6 +253,14 @@ __v7_setup:
253 orreq r10, r10, #1 << 22 @ set bit #22 253 orreq r10, r10, #1 << 22 @ set bit #22
254 mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register 254 mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
255#endif 255#endif
256#ifdef CONFIG_ARM_ERRATA_743622
257 teq r6, #0x20 @ present in r2p0
258 teqne r6, #0x21 @ present in r2p1
259 teqne r6, #0x22 @ present in r2p2
260 mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
261 orreq r10, r10, #1 << 6 @ set bit #6
262 mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
263#endif
256 264
2573: mov r10, #0 2653: mov r10, #0
258#ifdef HARVARD_CACHE 266#ifdef HARVARD_CACHE
@@ -365,7 +373,7 @@ __v7_ca9mp_proc_info:
365 b __v7_ca9mp_setup 373 b __v7_ca9mp_setup
366 .long cpu_arch_name 374 .long cpu_arch_name
367 .long cpu_elf_name 375 .long cpu_elf_name
368 .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP 376 .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
369 .long cpu_v7_name 377 .long cpu_v7_name
370 .long v7_processor_functions 378 .long v7_processor_functions
371 .long v7wbi_tlb_fns 379 .long v7wbi_tlb_fns
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
index a202a2ce6e3d..6cd151b31bc5 100644
--- a/arch/arm/plat-omap/iommu.c
+++ b/arch/arm/plat-omap/iommu.c
@@ -320,6 +320,7 @@ void flush_iotlb_page(struct iommu *obj, u32 da)
320 if ((start <= da) && (da < start + bytes)) { 320 if ((start <= da) && (da < start + bytes)) {
321 dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n", 321 dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
322 __func__, start, da, bytes); 322 __func__, start, da, bytes);
323 iotlb_load_cr(obj, &cr);
323 iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); 324 iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
324 } 325 }
325 } 326 }
diff --git a/arch/m32r/include/asm/elf.h b/arch/m32r/include/asm/elf.h
index 2f85412ef730..b8da7d0574d2 100644
--- a/arch/m32r/include/asm/elf.h
+++ b/arch/m32r/include/asm/elf.h
@@ -82,9 +82,9 @@ typedef elf_fpreg_t elf_fpregset_t;
82 * These are used to set parameters in the core dumps. 82 * These are used to set parameters in the core dumps.
83 */ 83 */
84#define ELF_CLASS ELFCLASS32 84#define ELF_CLASS ELFCLASS32
85#if defined(__LITTLE_ENDIAN) 85#if defined(__LITTLE_ENDIAN__)
86#define ELF_DATA ELFDATA2LSB 86#define ELF_DATA ELFDATA2LSB
87#elif defined(__BIG_ENDIAN) 87#elif defined(__BIG_ENDIAN__)
88#define ELF_DATA ELFDATA2MSB 88#define ELF_DATA ELFDATA2MSB
89#else 89#else
90#error no endian defined 90#error no endian defined
diff --git a/arch/m32r/kernel/.gitignore b/arch/m32r/kernel/.gitignore
new file mode 100644
index 000000000000..c5f676c3c224
--- /dev/null
+++ b/arch/m32r/kernel/.gitignore
@@ -0,0 +1 @@
vmlinux.lds
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c
index 7bbe38645ed5..a08697f0886d 100644
--- a/arch/m32r/kernel/signal.c
+++ b/arch/m32r/kernel/signal.c
@@ -28,6 +28,8 @@
28 28
29#define DEBUG_SIG 0 29#define DEBUG_SIG 0
30 30
31#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
32
31asmlinkage int 33asmlinkage int
32sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, 34sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
33 unsigned long r2, unsigned long r3, unsigned long r4, 35 unsigned long r2, unsigned long r3, unsigned long r4,
@@ -254,7 +256,7 @@ give_sigsegv:
254static int prev_insn(struct pt_regs *regs) 256static int prev_insn(struct pt_regs *regs)
255{ 257{
256 u16 inst; 258 u16 inst;
257 if (get_user(&inst, (u16 __user *)(regs->bpc - 2))) 259 if (get_user(inst, (u16 __user *)(regs->bpc - 2)))
258 return -EFAULT; 260 return -EFAULT;
259 if ((inst & 0xfff0) == 0x10f0) /* trap ? */ 261 if ((inst & 0xfff0) == 0x10f0) /* trap ? */
260 regs->bpc -= 2; 262 regs->bpc -= 2;
diff --git a/arch/mips/Kbuild b/arch/mips/Kbuild
index e322d65f33a4..7dd65cfae837 100644
--- a/arch/mips/Kbuild
+++ b/arch/mips/Kbuild
@@ -7,6 +7,10 @@ subdir-ccflags-y := -Werror
7include arch/mips/Kbuild.platforms 7include arch/mips/Kbuild.platforms
8obj-y := $(platform-y) 8obj-y := $(platform-y)
9 9
10# make clean traverses $(obj-) without having included .config, so
11# everything ends up here
12obj- := $(platform-)
13
10# mips object files 14# mips object files
11# The object files are linked as core-y files would be linked 15# The object files are linked as core-y files would be linked
12 16
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 5526faabfc21..4c9f402295dd 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -881,11 +881,15 @@ config NO_IOPORT
881config GENERIC_ISA_DMA 881config GENERIC_ISA_DMA
882 bool 882 bool
883 select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n 883 select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n
884 select ISA_DMA_API
884 885
885config GENERIC_ISA_DMA_SUPPORT_BROKEN 886config GENERIC_ISA_DMA_SUPPORT_BROKEN
886 bool 887 bool
887 select GENERIC_ISA_DMA 888 select GENERIC_ISA_DMA
888 889
890config ISA_DMA_API
891 bool
892
889config GENERIC_GPIO 893config GENERIC_GPIO
890 bool 894 bool
891 895
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
index 5fd7f7a58b7e..5042d51b0512 100644
--- a/arch/mips/boot/compressed/Makefile
+++ b/arch/mips/boot/compressed/Makefile
@@ -105,4 +105,4 @@ OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec
105vmlinuz.srec: vmlinuz 105vmlinuz.srec: vmlinuz
106 $(call cmd,objcopy) 106 $(call cmd,objcopy)
107 107
108clean-files := $(objtree)/vmlinuz.* 108clean-files := $(objtree)/vmlinuz $(objtree)/vmlinuz.{32,ecoff,bin,srec}
diff --git a/arch/mips/dec/Platform b/arch/mips/dec/Platform
index 3adbcbd95db1..cf55a6f4e720 100644
--- a/arch/mips/dec/Platform
+++ b/arch/mips/dec/Platform
@@ -1,7 +1,7 @@
1# 1#
2# DECstation family 2# DECstation family
3# 3#
4platform-$(CONFIG_MACH_DECSTATION) = dec/ 4platform-$(CONFIG_MACH_DECSTATION) += dec/
5cflags-$(CONFIG_MACH_DECSTATION) += \ 5cflags-$(CONFIG_MACH_DECSTATION) += \
6 -I$(srctree)/arch/mips/include/asm/mach-dec 6 -I$(srctree)/arch/mips/include/asm/mach-dec
7libs-$(CONFIG_MACH_DECSTATION) += arch/mips/dec/prom/ 7libs-$(CONFIG_MACH_DECSTATION) += arch/mips/dec/prom/
diff --git a/arch/mips/include/asm/fcntl.h b/arch/mips/include/asm/fcntl.h
index e482fe90fe88..75eddedcfc3e 100644
--- a/arch/mips/include/asm/fcntl.h
+++ b/arch/mips/include/asm/fcntl.h
@@ -56,6 +56,7 @@
56 */ 56 */
57 57
58#ifdef CONFIG_32BIT 58#ifdef CONFIG_32BIT
59#include <linux/types.h>
59 60
60struct flock { 61struct flock {
61 short l_type; 62 short l_type;
diff --git a/arch/mips/jz4740/Platform b/arch/mips/jz4740/Platform
index 6a97230e3d05..ba91be9c21ef 100644
--- a/arch/mips/jz4740/Platform
+++ b/arch/mips/jz4740/Platform
@@ -1,3 +1,3 @@
1core-$(CONFIG_MACH_JZ4740) += arch/mips/jz4740/ 1platform-$(CONFIG_MACH_JZ4740) += jz4740/
2cflags-$(CONFIG_MACH_JZ4740) += -I$(srctree)/arch/mips/include/asm/mach-jz4740 2cflags-$(CONFIG_MACH_JZ4740) += -I$(srctree)/arch/mips/include/asm/mach-jz4740
3load-$(CONFIG_MACH_JZ4740) += 0xffffffff80010000 3load-$(CONFIG_MACH_JZ4740) += 0xffffffff80010000
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c
index 0176ed015c89..32103cc2a257 100644
--- a/arch/mips/kernel/branch.c
+++ b/arch/mips/kernel/branch.c
@@ -40,7 +40,6 @@ int __compute_return_epc(struct pt_regs *regs)
40 return -EFAULT; 40 return -EFAULT;
41 } 41 }
42 42
43 regs->regs[0] = 0;
44 switch (insn.i_format.opcode) { 43 switch (insn.i_format.opcode) {
45 /* 44 /*
46 * jr and jalr are in r_format format. 45 * jr and jalr are in r_format format.
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c
index c51b95ff8644..c8777333e198 100644
--- a/arch/mips/kernel/ptrace.c
+++ b/arch/mips/kernel/ptrace.c
@@ -536,7 +536,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
536{ 536{
537 /* do the secure computing check first */ 537 /* do the secure computing check first */
538 if (!entryexit) 538 if (!entryexit)
539 secure_computing(regs->regs[0]); 539 secure_computing(regs->regs[2]);
540 540
541 if (unlikely(current->audit_context) && entryexit) 541 if (unlikely(current->audit_context) && entryexit)
542 audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]), 542 audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
@@ -565,7 +565,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
565 565
566out: 566out:
567 if (unlikely(current->audit_context) && !entryexit) 567 if (unlikely(current->audit_context) && !entryexit)
568 audit_syscall_entry(audit_arch(), regs->regs[0], 568 audit_syscall_entry(audit_arch(), regs->regs[2],
569 regs->regs[4], regs->regs[5], 569 regs->regs[4], regs->regs[5],
570 regs->regs[6], regs->regs[7]); 570 regs->regs[6], regs->regs[7]);
571} 571}
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
index 584415eef8c9..fbaabad0e6e2 100644
--- a/arch/mips/kernel/scall32-o32.S
+++ b/arch/mips/kernel/scall32-o32.S
@@ -63,9 +63,9 @@ stack_done:
63 sw t0, PT_R7(sp) # set error flag 63 sw t0, PT_R7(sp) # set error flag
64 beqz t0, 1f 64 beqz t0, 1f
65 65
66 lw t1, PT_R2(sp) # syscall number
66 negu v0 # error 67 negu v0 # error
67 sw v0, PT_R0(sp) # set flag for syscall 68 sw t1, PT_R0(sp) # save it for syscall restarting
68 # restarting
691: sw v0, PT_R2(sp) # result 691: sw v0, PT_R2(sp) # result
70 70
71o32_syscall_exit: 71o32_syscall_exit:
@@ -104,9 +104,9 @@ syscall_trace_entry:
104 sw t0, PT_R7(sp) # set error flag 104 sw t0, PT_R7(sp) # set error flag
105 beqz t0, 1f 105 beqz t0, 1f
106 106
107 lw t1, PT_R2(sp) # syscall number
107 negu v0 # error 108 negu v0 # error
108 sw v0, PT_R0(sp) # set flag for syscall 109 sw t1, PT_R0(sp) # save it for syscall restarting
109 # restarting
1101: sw v0, PT_R2(sp) # result 1101: sw v0, PT_R2(sp) # result
111 111
112 j syscall_exit 112 j syscall_exit
@@ -169,8 +169,7 @@ stackargs:
169 * We probably should handle this case a bit more drastic. 169 * We probably should handle this case a bit more drastic.
170 */ 170 */
171bad_stack: 171bad_stack:
172 negu v0 # error 172 li v0, EFAULT
173 sw v0, PT_R0(sp)
174 sw v0, PT_R2(sp) 173 sw v0, PT_R2(sp)
175 li t0, 1 # set error flag 174 li t0, 1 # set error flag
176 sw t0, PT_R7(sp) 175 sw t0, PT_R7(sp)
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
index 5573f8e4e326..3f4179283207 100644
--- a/arch/mips/kernel/scall64-64.S
+++ b/arch/mips/kernel/scall64-64.S
@@ -66,9 +66,9 @@ NESTED(handle_sys64, PT_SIZE, sp)
66 sd t0, PT_R7(sp) # set error flag 66 sd t0, PT_R7(sp) # set error flag
67 beqz t0, 1f 67 beqz t0, 1f
68 68
69 ld t1, PT_R2(sp) # syscall number
69 dnegu v0 # error 70 dnegu v0 # error
70 sd v0, PT_R0(sp) # set flag for syscall 71 sd t1, PT_R0(sp) # save it for syscall restarting
71 # restarting
721: sd v0, PT_R2(sp) # result 721: sd v0, PT_R2(sp) # result
73 73
74n64_syscall_exit: 74n64_syscall_exit:
@@ -109,8 +109,9 @@ syscall_trace_entry:
109 sd t0, PT_R7(sp) # set error flag 109 sd t0, PT_R7(sp) # set error flag
110 beqz t0, 1f 110 beqz t0, 1f
111 111
112 ld t1, PT_R2(sp) # syscall number
112 dnegu v0 # error 113 dnegu v0 # error
113 sd v0, PT_R0(sp) # set flag for syscall restarting 114 sd t1, PT_R0(sp) # save it for syscall restarting
1141: sd v0, PT_R2(sp) # result 1151: sd v0, PT_R2(sp) # result
115 116
116 j syscall_exit 117 j syscall_exit
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
index 1e38ec97672e..f08ece6d8acc 100644
--- a/arch/mips/kernel/scall64-n32.S
+++ b/arch/mips/kernel/scall64-n32.S
@@ -65,8 +65,9 @@ NESTED(handle_sysn32, PT_SIZE, sp)
65 sd t0, PT_R7(sp) # set error flag 65 sd t0, PT_R7(sp) # set error flag
66 beqz t0, 1f 66 beqz t0, 1f
67 67
68 ld t1, PT_R2(sp) # syscall number
68 dnegu v0 # error 69 dnegu v0 # error
69 sd v0, PT_R0(sp) # set flag for syscall restarting 70 sd t1, PT_R0(sp) # save it for syscall restarting
701: sd v0, PT_R2(sp) # result 711: sd v0, PT_R2(sp) # result
71 72
72 local_irq_disable # make sure need_resched and 73 local_irq_disable # make sure need_resched and
@@ -106,8 +107,9 @@ n32_syscall_trace_entry:
106 sd t0, PT_R7(sp) # set error flag 107 sd t0, PT_R7(sp) # set error flag
107 beqz t0, 1f 108 beqz t0, 1f
108 109
110 ld t1, PT_R2(sp) # syscall number
109 dnegu v0 # error 111 dnegu v0 # error
110 sd v0, PT_R0(sp) # set flag for syscall restarting 112 sd t1, PT_R0(sp) # save it for syscall restarting
1111: sd v0, PT_R2(sp) # result 1131: sd v0, PT_R2(sp) # result
112 114
113 j syscall_exit 115 j syscall_exit
@@ -320,10 +322,10 @@ EXPORT(sysn32_call_table)
320 PTR sys_cacheflush 322 PTR sys_cacheflush
321 PTR sys_cachectl 323 PTR sys_cachectl
322 PTR sys_sysmips 324 PTR sys_sysmips
323 PTR sys_io_setup /* 6200 */ 325 PTR compat_sys_io_setup /* 6200 */
324 PTR sys_io_destroy 326 PTR sys_io_destroy
325 PTR sys_io_getevents 327 PTR compat_sys_io_getevents
326 PTR sys_io_submit 328 PTR compat_sys_io_submit
327 PTR sys_io_cancel 329 PTR sys_io_cancel
328 PTR sys_exit_group /* 6205 */ 330 PTR sys_exit_group /* 6205 */
329 PTR sys_lookup_dcookie 331 PTR sys_lookup_dcookie
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
index 171979fc98e5..78d768a3e19d 100644
--- a/arch/mips/kernel/scall64-o32.S
+++ b/arch/mips/kernel/scall64-o32.S
@@ -93,8 +93,9 @@ NESTED(handle_sys, PT_SIZE, sp)
93 sd t0, PT_R7(sp) # set error flag 93 sd t0, PT_R7(sp) # set error flag
94 beqz t0, 1f 94 beqz t0, 1f
95 95
96 ld t1, PT_R2(sp) # syscall number
96 dnegu v0 # error 97 dnegu v0 # error
97 sd v0, PT_R0(sp) # flag for syscall restarting 98 sd t1, PT_R0(sp) # save it for syscall restarting
981: sd v0, PT_R2(sp) # result 991: sd v0, PT_R2(sp) # result
99 100
100o32_syscall_exit: 101o32_syscall_exit:
@@ -142,8 +143,9 @@ trace_a_syscall:
142 sd t0, PT_R7(sp) # set error flag 143 sd t0, PT_R7(sp) # set error flag
143 beqz t0, 1f 144 beqz t0, 1f
144 145
146 ld t1, PT_R2(sp) # syscall number
145 dnegu v0 # error 147 dnegu v0 # error
146 sd v0, PT_R0(sp) # set flag for syscall restarting 148 sd t1, PT_R0(sp) # save it for syscall restarting
1471: sd v0, PT_R2(sp) # result 1491: sd v0, PT_R2(sp) # result
148 150
149 j syscall_exit 151 j syscall_exit
@@ -154,8 +156,7 @@ trace_a_syscall:
154 * The stackpointer for a call with more than 4 arguments is bad. 156 * The stackpointer for a call with more than 4 arguments is bad.
155 */ 157 */
156bad_stack: 158bad_stack:
157 dnegu v0 # error 159 li v0, EFAULT
158 sd v0, PT_R0(sp)
159 sd v0, PT_R2(sp) 160 sd v0, PT_R2(sp)
160 li t0, 1 # set error flag 161 li t0, 1 # set error flag
161 sd t0, PT_R7(sp) 162 sd t0, PT_R7(sp)
@@ -444,10 +445,10 @@ sys_call_table:
444 PTR compat_sys_futex 445 PTR compat_sys_futex
445 PTR compat_sys_sched_setaffinity 446 PTR compat_sys_sched_setaffinity
446 PTR compat_sys_sched_getaffinity /* 4240 */ 447 PTR compat_sys_sched_getaffinity /* 4240 */
447 PTR sys_io_setup 448 PTR compat_sys_io_setup
448 PTR sys_io_destroy 449 PTR sys_io_destroy
449 PTR sys_io_getevents 450 PTR compat_sys_io_getevents
450 PTR sys_io_submit 451 PTR compat_sys_io_submit
451 PTR sys_io_cancel /* 4245 */ 452 PTR sys_io_cancel /* 4245 */
452 PTR sys_exit_group 453 PTR sys_exit_group
453 PTR sys32_lookup_dcookie 454 PTR sys32_lookup_dcookie
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
index 2099d5a4c4b7..5922342bca39 100644
--- a/arch/mips/kernel/signal.c
+++ b/arch/mips/kernel/signal.c
@@ -390,7 +390,6 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
390{ 390{
391 struct rt_sigframe __user *frame; 391 struct rt_sigframe __user *frame;
392 sigset_t set; 392 sigset_t set;
393 stack_t st;
394 int sig; 393 int sig;
395 394
396 frame = (struct rt_sigframe __user *) regs.regs[29]; 395 frame = (struct rt_sigframe __user *) regs.regs[29];
@@ -411,11 +410,9 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
411 else if (sig) 410 else if (sig)
412 force_sig(sig, current); 411 force_sig(sig, current);
413 412
414 if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
415 goto badframe;
416 /* It is more difficult to avoid calling this function than to 413 /* It is more difficult to avoid calling this function than to
417 call it and ignore errors. */ 414 call it and ignore errors. */
418 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); 415 do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]);
419 416
420 /* 417 /*
421 * Don't let your children do this ... 418 * Don't let your children do this ...
@@ -550,23 +547,26 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
550 struct mips_abi *abi = current->thread.abi; 547 struct mips_abi *abi = current->thread.abi;
551 void *vdso = current->mm->context.vdso; 548 void *vdso = current->mm->context.vdso;
552 549
553 switch(regs->regs[0]) { 550 if (regs->regs[0]) {
554 case ERESTART_RESTARTBLOCK: 551 switch(regs->regs[2]) {
555 case ERESTARTNOHAND: 552 case ERESTART_RESTARTBLOCK:
556 regs->regs[2] = EINTR; 553 case ERESTARTNOHAND:
557 break;
558 case ERESTARTSYS:
559 if (!(ka->sa.sa_flags & SA_RESTART)) {
560 regs->regs[2] = EINTR; 554 regs->regs[2] = EINTR;
561 break; 555 break;
556 case ERESTARTSYS:
557 if (!(ka->sa.sa_flags & SA_RESTART)) {
558 regs->regs[2] = EINTR;
559 break;
560 }
561 /* fallthrough */
562 case ERESTARTNOINTR:
563 regs->regs[7] = regs->regs[26];
564 regs->regs[2] = regs->regs[0];
565 regs->cp0_epc -= 4;
562 } 566 }
563 /* fallthrough */
564 case ERESTARTNOINTR: /* Userland will reload $v0. */
565 regs->regs[7] = regs->regs[26];
566 regs->cp0_epc -= 8;
567 }
568 567
569 regs->regs[0] = 0; /* Don't deal with this again. */ 568 regs->regs[0] = 0; /* Don't deal with this again. */
569 }
570 570
571 if (sig_uses_siginfo(ka)) 571 if (sig_uses_siginfo(ka))
572 ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset, 572 ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
@@ -575,6 +575,9 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
575 ret = abi->setup_frame(vdso + abi->signal_return_offset, 575 ret = abi->setup_frame(vdso + abi->signal_return_offset,
576 ka, regs, sig, oldset); 576 ka, regs, sig, oldset);
577 577
578 if (ret)
579 return ret;
580
578 spin_lock_irq(&current->sighand->siglock); 581 spin_lock_irq(&current->sighand->siglock);
579 sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask); 582 sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
580 if (!(ka->sa.sa_flags & SA_NODEFER)) 583 if (!(ka->sa.sa_flags & SA_NODEFER))
@@ -622,17 +625,13 @@ static void do_signal(struct pt_regs *regs)
622 return; 625 return;
623 } 626 }
624 627
625 /*
626 * Who's code doesn't conform to the restartable syscall convention
627 * dies here!!! The li instruction, a single machine instruction,
628 * must directly be followed by the syscall instruction.
629 */
630 if (regs->regs[0]) { 628 if (regs->regs[0]) {
631 if (regs->regs[2] == ERESTARTNOHAND || 629 if (regs->regs[2] == ERESTARTNOHAND ||
632 regs->regs[2] == ERESTARTSYS || 630 regs->regs[2] == ERESTARTSYS ||
633 regs->regs[2] == ERESTARTNOINTR) { 631 regs->regs[2] == ERESTARTNOINTR) {
632 regs->regs[2] = regs->regs[0];
634 regs->regs[7] = regs->regs[26]; 633 regs->regs[7] = regs->regs[26];
635 regs->cp0_epc -= 8; 634 regs->cp0_epc -= 4;
636 } 635 }
637 if (regs->regs[2] == ERESTART_RESTARTBLOCK) { 636 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
638 regs->regs[2] = current->thread.abi->restart; 637 regs->regs[2] = current->thread.abi->restart;
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c
index 2c5df818c65a..ee24d814d5b9 100644
--- a/arch/mips/kernel/signal_n32.c
+++ b/arch/mips/kernel/signal_n32.c
@@ -109,6 +109,7 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
109asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) 109asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
110{ 110{
111 struct rt_sigframe_n32 __user *frame; 111 struct rt_sigframe_n32 __user *frame;
112 mm_segment_t old_fs;
112 sigset_t set; 113 sigset_t set;
113 stack_t st; 114 stack_t st;
114 s32 sp; 115 s32 sp;
@@ -143,7 +144,11 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
143 144
144 /* It is more difficult to avoid calling this function than to 145 /* It is more difficult to avoid calling this function than to
145 call it and ignore errors. */ 146 call it and ignore errors. */
147 old_fs = get_fs();
148 set_fs(KERNEL_DS);
146 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); 149 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
150 set_fs(old_fs);
151
147 152
148 /* 153 /*
149 * Don't let your children do this ... 154 * Don't let your children do this ...
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c
index 69b039ca8d83..33d5a5ce4a29 100644
--- a/arch/mips/kernel/unaligned.c
+++ b/arch/mips/kernel/unaligned.c
@@ -109,8 +109,6 @@ static void emulate_load_store_insn(struct pt_regs *regs,
109 unsigned long value; 109 unsigned long value;
110 unsigned int res; 110 unsigned int res;
111 111
112 regs->regs[0] = 0;
113
114 /* 112 /*
115 * This load never faults. 113 * This load never faults.
116 */ 114 */
diff --git a/arch/um/drivers/hostaudio_kern.c b/arch/um/drivers/hostaudio_kern.c
index 0c46e398cd8f..63c740a85b4c 100644
--- a/arch/um/drivers/hostaudio_kern.c
+++ b/arch/um/drivers/hostaudio_kern.c
@@ -40,6 +40,11 @@ static char *mixer = HOSTAUDIO_DEV_MIXER;
40" This is used to specify the host mixer device to the hostaudio driver.\n"\ 40" This is used to specify the host mixer device to the hostaudio driver.\n"\
41" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n" 41" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n"
42 42
43module_param(dsp, charp, 0644);
44MODULE_PARM_DESC(dsp, DSP_HELP);
45module_param(mixer, charp, 0644);
46MODULE_PARM_DESC(mixer, MIXER_HELP);
47
43#ifndef MODULE 48#ifndef MODULE
44static int set_dsp(char *name, int *add) 49static int set_dsp(char *name, int *add)
45{ 50{
@@ -56,15 +61,6 @@ static int set_mixer(char *name, int *add)
56} 61}
57 62
58__uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP); 63__uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP);
59
60#else /*MODULE*/
61
62module_param(dsp, charp, 0644);
63MODULE_PARM_DESC(dsp, DSP_HELP);
64
65module_param(mixer, charp, 0644);
66MODULE_PARM_DESC(mixer, MIXER_HELP);
67
68#endif 64#endif
69 65
70/* /dev/dsp file operations */ 66/* /dev/dsp file operations */
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 1bcd208c459f..9734994cba1e 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -163,6 +163,7 @@ struct ubd {
163 struct scatterlist sg[MAX_SG]; 163 struct scatterlist sg[MAX_SG];
164 struct request *request; 164 struct request *request;
165 int start_sg, end_sg; 165 int start_sg, end_sg;
166 sector_t rq_pos;
166}; 167};
167 168
168#define DEFAULT_COW { \ 169#define DEFAULT_COW { \
@@ -187,6 +188,7 @@ struct ubd {
187 .request = NULL, \ 188 .request = NULL, \
188 .start_sg = 0, \ 189 .start_sg = 0, \
189 .end_sg = 0, \ 190 .end_sg = 0, \
191 .rq_pos = 0, \
190} 192}
191 193
192/* Protected by ubd_lock */ 194/* Protected by ubd_lock */
@@ -1228,7 +1230,6 @@ static void do_ubd_request(struct request_queue *q)
1228{ 1230{
1229 struct io_thread_req *io_req; 1231 struct io_thread_req *io_req;
1230 struct request *req; 1232 struct request *req;
1231 sector_t sector;
1232 int n; 1233 int n;
1233 1234
1234 while(1){ 1235 while(1){
@@ -1239,12 +1240,12 @@ static void do_ubd_request(struct request_queue *q)
1239 return; 1240 return;
1240 1241
1241 dev->request = req; 1242 dev->request = req;
1243 dev->rq_pos = blk_rq_pos(req);
1242 dev->start_sg = 0; 1244 dev->start_sg = 0;
1243 dev->end_sg = blk_rq_map_sg(q, req, dev->sg); 1245 dev->end_sg = blk_rq_map_sg(q, req, dev->sg);
1244 } 1246 }
1245 1247
1246 req = dev->request; 1248 req = dev->request;
1247 sector = blk_rq_pos(req);
1248 while(dev->start_sg < dev->end_sg){ 1249 while(dev->start_sg < dev->end_sg){
1249 struct scatterlist *sg = &dev->sg[dev->start_sg]; 1250 struct scatterlist *sg = &dev->sg[dev->start_sg];
1250 1251
@@ -1256,10 +1257,9 @@ static void do_ubd_request(struct request_queue *q)
1256 return; 1257 return;
1257 } 1258 }
1258 prepare_request(req, io_req, 1259 prepare_request(req, io_req,
1259 (unsigned long long)sector << 9, 1260 (unsigned long long)dev->rq_pos << 9,
1260 sg->offset, sg->length, sg_page(sg)); 1261 sg->offset, sg->length, sg_page(sg));
1261 1262
1262 sector += sg->length >> 9;
1263 n = os_write_file(thread_fd, &io_req, 1263 n = os_write_file(thread_fd, &io_req,
1264 sizeof(struct io_thread_req *)); 1264 sizeof(struct io_thread_req *));
1265 if(n != sizeof(struct io_thread_req *)){ 1265 if(n != sizeof(struct io_thread_req *)){
@@ -1272,6 +1272,7 @@ static void do_ubd_request(struct request_queue *q)
1272 return; 1272 return;
1273 } 1273 }
1274 1274
1275 dev->rq_pos += sg->length >> 9;
1275 dev->start_sg++; 1276 dev->start_sg++;
1276 } 1277 }
1277 dev->end_sg = 0; 1278 dev->end_sg = 0;
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
index 0350311906ae..2d93bdbc9ac0 100644
--- a/arch/x86/ia32/ia32_aout.c
+++ b/arch/x86/ia32/ia32_aout.c
@@ -34,7 +34,7 @@
34#include <asm/ia32.h> 34#include <asm/ia32.h>
35 35
36#undef WARN_OLD 36#undef WARN_OLD
37#undef CORE_DUMP /* probably broken */ 37#undef CORE_DUMP /* definitely broken */
38 38
39static int load_aout_binary(struct linux_binprm *, struct pt_regs *regs); 39static int load_aout_binary(struct linux_binprm *, struct pt_regs *regs);
40static int load_aout_library(struct file *); 40static int load_aout_library(struct file *);
@@ -131,21 +131,15 @@ static void set_brk(unsigned long start, unsigned long end)
131 * macros to write out all the necessary info. 131 * macros to write out all the necessary info.
132 */ 132 */
133 133
134static int dump_write(struct file *file, const void *addr, int nr) 134#include <linux/coredump.h>
135{
136 return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
137}
138 135
139#define DUMP_WRITE(addr, nr) \ 136#define DUMP_WRITE(addr, nr) \
140 if (!dump_write(file, (void *)(addr), (nr))) \ 137 if (!dump_write(file, (void *)(addr), (nr))) \
141 goto end_coredump; 138 goto end_coredump;
142 139
143#define DUMP_SEEK(offset) \ 140#define DUMP_SEEK(offset) \
144 if (file->f_op->llseek) { \ 141 if (!dump_seek(file, offset)) \
145 if (file->f_op->llseek(file, (offset), 0) != (offset)) \ 142 goto end_coredump;
146 goto end_coredump; \
147 } else \
148 file->f_pos = (offset)
149 143
150#define START_DATA() (u.u_tsize << PAGE_SHIFT) 144#define START_DATA() (u.u_tsize << PAGE_SHIFT)
151#define START_STACK(u) (u.start_stack) 145#define START_STACK(u) (u.start_stack)
@@ -217,12 +211,6 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
217 dump_size = dump.u_ssize << PAGE_SHIFT; 211 dump_size = dump.u_ssize << PAGE_SHIFT;
218 DUMP_WRITE(dump_start, dump_size); 212 DUMP_WRITE(dump_start, dump_size);
219 } 213 }
220 /*
221 * Finally dump the task struct. Not be used by gdb, but
222 * could be useful
223 */
224 set_fs(KERNEL_DS);
225 DUMP_WRITE(current, sizeof(*current));
226end_coredump: 214end_coredump:
227 set_fs(fs); 215 set_fs(fs);
228 return has_dumped; 216 return has_dumped;
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 502e53f999cf..c52e2eb40a1e 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -652,20 +652,6 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page)
652 return (struct kvm_mmu_page *)page_private(page); 652 return (struct kvm_mmu_page *)page_private(page);
653} 653}
654 654
655static inline u16 kvm_read_fs(void)
656{
657 u16 seg;
658 asm("mov %%fs, %0" : "=g"(seg));
659 return seg;
660}
661
662static inline u16 kvm_read_gs(void)
663{
664 u16 seg;
665 asm("mov %%gs, %0" : "=g"(seg));
666 return seg;
667}
668
669static inline u16 kvm_read_ldt(void) 655static inline u16 kvm_read_ldt(void)
670{ 656{
671 u16 ldt; 657 u16 ldt;
@@ -673,16 +659,6 @@ static inline u16 kvm_read_ldt(void)
673 return ldt; 659 return ldt;
674} 660}
675 661
676static inline void kvm_load_fs(u16 sel)
677{
678 asm("mov %0, %%fs" : : "rm"(sel));
679}
680
681static inline void kvm_load_gs(u16 sel)
682{
683 asm("mov %0, %%gs" : : "rm"(sel));
684}
685
686static inline void kvm_load_ldt(u16 sel) 662static inline void kvm_load_ldt(u16 sel)
687{ 663{
688 asm("lldt %0" : : "rm"(sel)); 664 asm("lldt %0" : : "rm"(sel));
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
index 5e975298fa81..39aaee5c1ab2 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -141,6 +141,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
141 address = (low & MASK_BLKPTR_LO) >> 21; 141 address = (low & MASK_BLKPTR_LO) >> 21;
142 if (!address) 142 if (!address)
143 break; 143 break;
144
144 address += MCG_XBLK_ADDR; 145 address += MCG_XBLK_ADDR;
145 } else 146 } else
146 ++address; 147 ++address;
@@ -148,12 +149,8 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
148 if (rdmsr_safe(address, &low, &high)) 149 if (rdmsr_safe(address, &low, &high))
149 break; 150 break;
150 151
151 if (!(high & MASK_VALID_HI)) { 152 if (!(high & MASK_VALID_HI))
152 if (block) 153 continue;
153 continue;
154 else
155 break;
156 }
157 154
158 if (!(high & MASK_CNTP_HI) || 155 if (!(high & MASK_CNTP_HI) ||
159 (high & MASK_LOCKED_HI)) 156 (high & MASK_LOCKED_HI))
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
index d9368eeda309..169d8804a9f8 100644
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
@@ -216,7 +216,7 @@ static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev,
216 err = sysfs_add_file_to_group(&sys_dev->kobj, 216 err = sysfs_add_file_to_group(&sys_dev->kobj,
217 &attr_core_power_limit_count.attr, 217 &attr_core_power_limit_count.attr,
218 thermal_attr_group.name); 218 thermal_attr_group.name);
219 if (cpu_has(c, X86_FEATURE_PTS)) 219 if (cpu_has(c, X86_FEATURE_PTS)) {
220 err = sysfs_add_file_to_group(&sys_dev->kobj, 220 err = sysfs_add_file_to_group(&sys_dev->kobj,
221 &attr_package_throttle_count.attr, 221 &attr_package_throttle_count.attr,
222 thermal_attr_group.name); 222 thermal_attr_group.name);
@@ -224,6 +224,7 @@ static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev,
224 err = sysfs_add_file_to_group(&sys_dev->kobj, 224 err = sysfs_add_file_to_group(&sys_dev->kobj,
225 &attr_package_power_limit_count.attr, 225 &attr_package_power_limit_count.attr,
226 thermal_attr_group.name); 226 thermal_attr_group.name);
227 }
227 228
228 return err; 229 return err;
229} 230}
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index bc5b9b8d4a33..8a3f9f64f86f 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -766,7 +766,6 @@ static void init_vmcb(struct vcpu_svm *svm)
766 766
767 control->iopm_base_pa = iopm_base; 767 control->iopm_base_pa = iopm_base;
768 control->msrpm_base_pa = __pa(svm->msrpm); 768 control->msrpm_base_pa = __pa(svm->msrpm);
769 control->tsc_offset = 0;
770 control->int_ctl = V_INTR_MASKING_MASK; 769 control->int_ctl = V_INTR_MASKING_MASK;
771 770
772 init_seg(&save->es); 771 init_seg(&save->es);
@@ -902,6 +901,7 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
902 svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT; 901 svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
903 svm->asid_generation = 0; 902 svm->asid_generation = 0;
904 init_vmcb(svm); 903 init_vmcb(svm);
904 svm->vmcb->control.tsc_offset = 0-native_read_tsc();
905 905
906 err = fx_init(&svm->vcpu); 906 err = fx_init(&svm->vcpu);
907 if (err) 907 if (err)
@@ -3163,8 +3163,8 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
3163 sync_lapic_to_cr8(vcpu); 3163 sync_lapic_to_cr8(vcpu);
3164 3164
3165 save_host_msrs(vcpu); 3165 save_host_msrs(vcpu);
3166 fs_selector = kvm_read_fs(); 3166 savesegment(fs, fs_selector);
3167 gs_selector = kvm_read_gs(); 3167 savesegment(gs, gs_selector);
3168 ldt_selector = kvm_read_ldt(); 3168 ldt_selector = kvm_read_ldt();
3169 svm->vmcb->save.cr2 = vcpu->arch.cr2; 3169 svm->vmcb->save.cr2 = vcpu->arch.cr2;
3170 /* required for live migration with NPT */ 3170 /* required for live migration with NPT */
@@ -3251,10 +3251,15 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
3251 vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; 3251 vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp;
3252 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; 3252 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip;
3253 3253
3254 kvm_load_fs(fs_selector);
3255 kvm_load_gs(gs_selector);
3256 kvm_load_ldt(ldt_selector);
3257 load_host_msrs(vcpu); 3254 load_host_msrs(vcpu);
3255 loadsegment(fs, fs_selector);
3256#ifdef CONFIG_X86_64
3257 load_gs_index(gs_selector);
3258 wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs);
3259#else
3260 loadsegment(gs, gs_selector);
3261#endif
3262 kvm_load_ldt(ldt_selector);
3258 3263
3259 reload_tss(vcpu); 3264 reload_tss(vcpu);
3260 3265
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 49b25eee25ac..7bddfab12013 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -803,7 +803,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
803 */ 803 */
804 vmx->host_state.ldt_sel = kvm_read_ldt(); 804 vmx->host_state.ldt_sel = kvm_read_ldt();
805 vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; 805 vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel;
806 vmx->host_state.fs_sel = kvm_read_fs(); 806 savesegment(fs, vmx->host_state.fs_sel);
807 if (!(vmx->host_state.fs_sel & 7)) { 807 if (!(vmx->host_state.fs_sel & 7)) {
808 vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); 808 vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel);
809 vmx->host_state.fs_reload_needed = 0; 809 vmx->host_state.fs_reload_needed = 0;
@@ -811,7 +811,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
811 vmcs_write16(HOST_FS_SELECTOR, 0); 811 vmcs_write16(HOST_FS_SELECTOR, 0);
812 vmx->host_state.fs_reload_needed = 1; 812 vmx->host_state.fs_reload_needed = 1;
813 } 813 }
814 vmx->host_state.gs_sel = kvm_read_gs(); 814 savesegment(gs, vmx->host_state.gs_sel);
815 if (!(vmx->host_state.gs_sel & 7)) 815 if (!(vmx->host_state.gs_sel & 7))
816 vmcs_write16(HOST_GS_SELECTOR, vmx->host_state.gs_sel); 816 vmcs_write16(HOST_GS_SELECTOR, vmx->host_state.gs_sel);
817 else { 817 else {
@@ -841,27 +841,21 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
841 841
842static void __vmx_load_host_state(struct vcpu_vmx *vmx) 842static void __vmx_load_host_state(struct vcpu_vmx *vmx)
843{ 843{
844 unsigned long flags;
845
846 if (!vmx->host_state.loaded) 844 if (!vmx->host_state.loaded)
847 return; 845 return;
848 846
849 ++vmx->vcpu.stat.host_state_reload; 847 ++vmx->vcpu.stat.host_state_reload;
850 vmx->host_state.loaded = 0; 848 vmx->host_state.loaded = 0;
851 if (vmx->host_state.fs_reload_needed) 849 if (vmx->host_state.fs_reload_needed)
852 kvm_load_fs(vmx->host_state.fs_sel); 850 loadsegment(fs, vmx->host_state.fs_sel);
853 if (vmx->host_state.gs_ldt_reload_needed) { 851 if (vmx->host_state.gs_ldt_reload_needed) {
854 kvm_load_ldt(vmx->host_state.ldt_sel); 852 kvm_load_ldt(vmx->host_state.ldt_sel);
855 /*
856 * If we have to reload gs, we must take care to
857 * preserve our gs base.
858 */
859 local_irq_save(flags);
860 kvm_load_gs(vmx->host_state.gs_sel);
861#ifdef CONFIG_X86_64 853#ifdef CONFIG_X86_64
862 wrmsrl(MSR_GS_BASE, vmcs_readl(HOST_GS_BASE)); 854 load_gs_index(vmx->host_state.gs_sel);
855 wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs);
856#else
857 loadsegment(gs, vmx->host_state.gs_sel);
863#endif 858#endif
864 local_irq_restore(flags);
865 } 859 }
866 reload_tss(); 860 reload_tss();
867#ifdef CONFIG_X86_64 861#ifdef CONFIG_X86_64
@@ -2589,8 +2583,8 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
2589 vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */ 2583 vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */
2590 vmcs_write16(HOST_DS_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2584 vmcs_write16(HOST_DS_SELECTOR, __KERNEL_DS); /* 22.2.4 */
2591 vmcs_write16(HOST_ES_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2585 vmcs_write16(HOST_ES_SELECTOR, __KERNEL_DS); /* 22.2.4 */
2592 vmcs_write16(HOST_FS_SELECTOR, kvm_read_fs()); /* 22.2.4 */ 2586 vmcs_write16(HOST_FS_SELECTOR, 0); /* 22.2.4 */
2593 vmcs_write16(HOST_GS_SELECTOR, kvm_read_gs()); /* 22.2.4 */ 2587 vmcs_write16(HOST_GS_SELECTOR, 0); /* 22.2.4 */
2594 vmcs_write16(HOST_SS_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2588 vmcs_write16(HOST_SS_SELECTOR, __KERNEL_DS); /* 22.2.4 */
2595#ifdef CONFIG_X86_64 2589#ifdef CONFIG_X86_64
2596 rdmsrl(MSR_FS_BASE, a); 2590 rdmsrl(MSR_FS_BASE, a);
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
index f9897f7a9ef1..9c0d0d399c30 100644
--- a/arch/x86/mm/srat_64.c
+++ b/arch/x86/mm/srat_64.c
@@ -420,9 +420,11 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
420 return -1; 420 return -1;
421 } 421 }
422 422
423 for_each_node_mask(i, nodes_parsed) 423 for (i = 0; i < num_node_memblks; i++)
424 e820_register_active_regions(i, nodes[i].start >> PAGE_SHIFT, 424 e820_register_active_regions(memblk_nodeid[i],
425 nodes[i].end >> PAGE_SHIFT); 425 node_memblk_range[i].start >> PAGE_SHIFT,
426 node_memblk_range[i].end >> PAGE_SHIFT);
427
426 /* for out of order entries in SRAT */ 428 /* for out of order entries in SRAT */
427 sort_node_map(); 429 sort_node_map();
428 if (!nodes_cover_memory(nodes)) { 430 if (!nodes_cover_memory(nodes)) {
diff --git a/block/bsg.c b/block/bsg.c
index 82d58829ba59..0c00870553a3 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -426,7 +426,7 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
426 /* 426 /*
427 * fill in all the output members 427 * fill in all the output members
428 */ 428 */
429 hdr->device_status = status_byte(rq->errors); 429 hdr->device_status = rq->errors & 0xff;
430 hdr->transport_status = host_byte(rq->errors); 430 hdr->transport_status = host_byte(rq->errors);
431 hdr->driver_status = driver_byte(rq->errors); 431 hdr->driver_status = driver_byte(rq->errors);
432 hdr->info = 0; 432 hdr->info = 0;
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 88681aca88c5..0f9de2b44c0c 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -66,7 +66,6 @@ config ACPI_PROCFS
66config ACPI_PROCFS_POWER 66config ACPI_PROCFS_POWER
67 bool "Deprecated power /proc/acpi directories" 67 bool "Deprecated power /proc/acpi directories"
68 depends on PROC_FS 68 depends on PROC_FS
69 default y
70 help 69 help
71 For backwards compatibility, this option allows 70 For backwards compatibility, this option allows
72 deprecated power /proc/acpi/ directories to exist, even when 71 deprecated power /proc/acpi/ directories to exist, even when
@@ -90,13 +89,6 @@ config ACPI_POWER_METER
90 To compile this driver as a module, choose M here: 89 To compile this driver as a module, choose M here:
91 the module will be called power-meter. 90 the module will be called power-meter.
92 91
93config ACPI_SYSFS_POWER
94 bool "Future power /sys interface"
95 select POWER_SUPPLY
96 default y
97 help
98 Say N to disable power /sys interface
99
100config ACPI_EC_DEBUGFS 92config ACPI_EC_DEBUGFS
101 tristate "EC read/write access through /sys/kernel/debug/ec" 93 tristate "EC read/write access through /sys/kernel/debug/ec"
102 default n 94 default n
@@ -136,6 +128,7 @@ config ACPI_PROC_EVENT
136config ACPI_AC 128config ACPI_AC
137 tristate "AC Adapter" 129 tristate "AC Adapter"
138 depends on X86 130 depends on X86
131 select POWER_SUPPLY
139 default y 132 default y
140 help 133 help
141 This driver supports the AC Adapter object, which indicates 134 This driver supports the AC Adapter object, which indicates
@@ -148,6 +141,7 @@ config ACPI_AC
148config ACPI_BATTERY 141config ACPI_BATTERY
149 tristate "Battery" 142 tristate "Battery"
150 depends on X86 143 depends on X86
144 select POWER_SUPPLY
151 default y 145 default y
152 help 146 help
153 This driver adds support for battery information through 147 This driver adds support for battery information through
@@ -364,6 +358,7 @@ config ACPI_HOTPLUG_MEMORY
364config ACPI_SBS 358config ACPI_SBS
365 tristate "Smart Battery System" 359 tristate "Smart Battery System"
366 depends on X86 360 depends on X86
361 select POWER_SUPPLY
367 help 362 help
368 This driver supports the Smart Battery System, another 363 This driver supports the Smart Battery System, another
369 type of access to battery information, found on some laptops. 364 type of access to battery information, found on some laptops.
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
index 56205a0b85df..ba9afeaa23ac 100644
--- a/drivers/acpi/ac.c
+++ b/drivers/acpi/ac.c
@@ -32,9 +32,7 @@
32#include <linux/proc_fs.h> 32#include <linux/proc_fs.h>
33#include <linux/seq_file.h> 33#include <linux/seq_file.h>
34#endif 34#endif
35#ifdef CONFIG_ACPI_SYSFS_POWER
36#include <linux/power_supply.h> 35#include <linux/power_supply.h>
37#endif
38#include <acpi/acpi_bus.h> 36#include <acpi/acpi_bus.h>
39#include <acpi/acpi_drivers.h> 37#include <acpi/acpi_drivers.h>
40 38
@@ -86,9 +84,7 @@ static struct acpi_driver acpi_ac_driver = {
86}; 84};
87 85
88struct acpi_ac { 86struct acpi_ac {
89#ifdef CONFIG_ACPI_SYSFS_POWER
90 struct power_supply charger; 87 struct power_supply charger;
91#endif
92 struct acpi_device * device; 88 struct acpi_device * device;
93 unsigned long long state; 89 unsigned long long state;
94}; 90};
@@ -104,7 +100,6 @@ static const struct file_operations acpi_ac_fops = {
104 .release = single_release, 100 .release = single_release,
105}; 101};
106#endif 102#endif
107#ifdef CONFIG_ACPI_SYSFS_POWER
108static int get_ac_property(struct power_supply *psy, 103static int get_ac_property(struct power_supply *psy,
109 enum power_supply_property psp, 104 enum power_supply_property psp,
110 union power_supply_propval *val) 105 union power_supply_propval *val)
@@ -123,7 +118,6 @@ static int get_ac_property(struct power_supply *psy,
123static enum power_supply_property ac_props[] = { 118static enum power_supply_property ac_props[] = {
124 POWER_SUPPLY_PROP_ONLINE, 119 POWER_SUPPLY_PROP_ONLINE,
125}; 120};
126#endif
127/* -------------------------------------------------------------------------- 121/* --------------------------------------------------------------------------
128 AC Adapter Management 122 AC Adapter Management
129 -------------------------------------------------------------------------- */ 123 -------------------------------------------------------------------------- */
@@ -247,9 +241,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
247 dev_name(&device->dev), event, 241 dev_name(&device->dev), event,
248 (u32) ac->state); 242 (u32) ac->state);
249 acpi_notifier_call_chain(device, event, (u32) ac->state); 243 acpi_notifier_call_chain(device, event, (u32) ac->state);
250#ifdef CONFIG_ACPI_SYSFS_POWER
251 kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); 244 kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
252#endif
253 } 245 }
254 246
255 return; 247 return;
@@ -282,14 +274,12 @@ static int acpi_ac_add(struct acpi_device *device)
282#endif 274#endif
283 if (result) 275 if (result)
284 goto end; 276 goto end;
285#ifdef CONFIG_ACPI_SYSFS_POWER
286 ac->charger.name = acpi_device_bid(device); 277 ac->charger.name = acpi_device_bid(device);
287 ac->charger.type = POWER_SUPPLY_TYPE_MAINS; 278 ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
288 ac->charger.properties = ac_props; 279 ac->charger.properties = ac_props;
289 ac->charger.num_properties = ARRAY_SIZE(ac_props); 280 ac->charger.num_properties = ARRAY_SIZE(ac_props);
290 ac->charger.get_property = get_ac_property; 281 ac->charger.get_property = get_ac_property;
291 power_supply_register(&ac->device->dev, &ac->charger); 282 power_supply_register(&ac->device->dev, &ac->charger);
292#endif
293 283
294 printk(KERN_INFO PREFIX "%s [%s] (%s)\n", 284 printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
295 acpi_device_name(device), acpi_device_bid(device), 285 acpi_device_name(device), acpi_device_bid(device),
@@ -316,10 +306,8 @@ static int acpi_ac_resume(struct acpi_device *device)
316 old_state = ac->state; 306 old_state = ac->state;
317 if (acpi_ac_get_state(ac)) 307 if (acpi_ac_get_state(ac))
318 return 0; 308 return 0;
319#ifdef CONFIG_ACPI_SYSFS_POWER
320 if (old_state != ac->state) 309 if (old_state != ac->state)
321 kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); 310 kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
322#endif
323 return 0; 311 return 0;
324} 312}
325 313
@@ -333,10 +321,8 @@ static int acpi_ac_remove(struct acpi_device *device, int type)
333 321
334 ac = acpi_driver_data(device); 322 ac = acpi_driver_data(device);
335 323
336#ifdef CONFIG_ACPI_SYSFS_POWER
337 if (ac->charger.dev) 324 if (ac->charger.dev)
338 power_supply_unregister(&ac->charger); 325 power_supply_unregister(&ac->charger);
339#endif
340#ifdef CONFIG_ACPI_PROCFS_POWER 326#ifdef CONFIG_ACPI_PROCFS_POWER
341 acpi_ac_remove_fs(device); 327 acpi_ac_remove_fs(device);
342#endif 328#endif
diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile
index d93cc06f4bf8..a7e1d1aa4107 100644
--- a/drivers/acpi/acpica/Makefile
+++ b/drivers/acpi/acpica/Makefile
@@ -21,7 +21,7 @@ acpi-y += exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o\
21 excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o \ 21 excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o \
22 exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o exdebug.o 22 exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o exdebug.o
23 23
24acpi-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o 24acpi-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o hwpci.o
25 25
26acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o 26acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o
27 27
@@ -44,4 +44,5 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
44 44
45acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \ 45acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
46 utcopy.o utdelete.o utglobal.o utmath.o utobject.o \ 46 utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
47 utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o 47 utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o \
48 utosi.o utxferror.o
diff --git a/drivers/acpi/acpica/acdebug.h b/drivers/acpi/acpica/acdebug.h
index 48faf3eba9fb..72e9d5eb083c 100644
--- a/drivers/acpi/acpica/acdebug.h
+++ b/drivers/acpi/acpica/acdebug.h
@@ -105,6 +105,8 @@ void acpi_db_set_method_data(char *type_arg, char *index_arg, char *value_arg);
105acpi_status 105acpi_status
106acpi_db_display_objects(char *obj_type_arg, char *display_count_arg); 106acpi_db_display_objects(char *obj_type_arg, char *display_count_arg);
107 107
108void acpi_db_display_interfaces(char *action_arg, char *interface_name_arg);
109
108acpi_status acpi_db_find_name_in_namespace(char *name_arg); 110acpi_status acpi_db_find_name_in_namespace(char *name_arg);
109 111
110void acpi_db_set_scope(char *name); 112void acpi_db_set_scope(char *name);
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
index 1d192142c691..b8dbb9bd6962 100644
--- a/drivers/acpi/acpica/acglobal.h
+++ b/drivers/acpi/acpica/acglobal.h
@@ -132,6 +132,7 @@ struct acpi_table_fadt acpi_gbl_FADT;
132u32 acpi_current_gpe_count; 132u32 acpi_current_gpe_count;
133u32 acpi_gbl_trace_flags; 133u32 acpi_gbl_trace_flags;
134acpi_name acpi_gbl_trace_method_name; 134acpi_name acpi_gbl_trace_method_name;
135u8 acpi_gbl_system_awake_and_running;
135 136
136#endif 137#endif
137 138
@@ -187,6 +188,10 @@ ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
187ACPI_EXTERN u8 acpi_gbl_integer_byte_width; 188ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
188ACPI_EXTERN u8 acpi_gbl_integer_nybble_width; 189ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
189 190
191/* Mutex for _OSI support */
192
193ACPI_EXTERN acpi_mutex acpi_gbl_osi_mutex;
194
190/* Reader/Writer lock is used for namespace walk and dynamic table unload */ 195/* Reader/Writer lock is used for namespace walk and dynamic table unload */
191 196
192ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock; 197ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock;
@@ -255,6 +260,7 @@ ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
255ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler; 260ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler;
256ACPI_EXTERN void *acpi_gbl_table_handler_context; 261ACPI_EXTERN void *acpi_gbl_table_handler_context;
257ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk; 262ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;
263ACPI_EXTERN acpi_interface_handler acpi_gbl_interface_handler;
258 264
259/* Owner ID support */ 265/* Owner ID support */
260 266
@@ -273,8 +279,8 @@ ACPI_EXTERN u8 acpi_gbl_debugger_configuration;
273ACPI_EXTERN u8 acpi_gbl_step_to_next_call; 279ACPI_EXTERN u8 acpi_gbl_step_to_next_call;
274ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present; 280ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present;
275ACPI_EXTERN u8 acpi_gbl_events_initialized; 281ACPI_EXTERN u8 acpi_gbl_events_initialized;
276ACPI_EXTERN u8 acpi_gbl_system_awake_and_running;
277ACPI_EXTERN u8 acpi_gbl_osi_data; 282ACPI_EXTERN u8 acpi_gbl_osi_data;
283ACPI_EXTERN struct acpi_interface_info *acpi_gbl_supported_interfaces;
278 284
279#ifndef DEFINE_ACPI_GLOBALS 285#ifndef DEFINE_ACPI_GLOBALS
280 286
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h
index 120b3af56596..167470ad2d21 100644
--- a/drivers/acpi/acpica/achware.h
+++ b/drivers/acpi/acpica/achware.h
@@ -121,6 +121,13 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
121 struct acpi_gpe_block_info *gpe_block, 121 struct acpi_gpe_block_info *gpe_block,
122 void *context); 122 void *context);
123 123
124/*
125 * hwpci - PCI configuration support
126 */
127acpi_status
128acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id,
129 acpi_handle root_pci_device, acpi_handle pci_region);
130
124#ifdef ACPI_FUTURE_USAGE 131#ifdef ACPI_FUTURE_USAGE
125/* 132/*
126 * hwtimer - ACPI Timer prototypes 133 * hwtimer - ACPI Timer prototypes
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h
index 7dad9160f209..8acf1e8e479f 100644
--- a/drivers/acpi/acpica/aclocal.h
+++ b/drivers/acpi/acpica/aclocal.h
@@ -854,7 +854,7 @@ struct acpi_bit_register_info {
854 ACPI_BITMASK_POWER_BUTTON_STATUS | \ 854 ACPI_BITMASK_POWER_BUTTON_STATUS | \
855 ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ 855 ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
856 ACPI_BITMASK_RT_CLOCK_STATUS | \ 856 ACPI_BITMASK_RT_CLOCK_STATUS | \
857 ACPI_BITMASK_PCIEXP_WAKE_DISABLE | \ 857 ACPI_BITMASK_PCIEXP_WAKE_STATUS | \
858 ACPI_BITMASK_WAKE_STATUS) 858 ACPI_BITMASK_WAKE_STATUS)
859 859
860#define ACPI_BITMASK_TIMER_ENABLE 0x0001 860#define ACPI_BITMASK_TIMER_ENABLE 0x0001
@@ -909,15 +909,21 @@ struct acpi_bit_register_info {
909#define ACPI_OSI_WIN_VISTA 0x07 909#define ACPI_OSI_WIN_VISTA 0x07
910#define ACPI_OSI_WINSRV_2008 0x08 910#define ACPI_OSI_WINSRV_2008 0x08
911#define ACPI_OSI_WIN_VISTA_SP1 0x09 911#define ACPI_OSI_WIN_VISTA_SP1 0x09
912#define ACPI_OSI_WIN_7 0x0A 912#define ACPI_OSI_WIN_VISTA_SP2 0x0A
913#define ACPI_OSI_WIN_7 0x0B
913 914
914#define ACPI_ALWAYS_ILLEGAL 0x00 915#define ACPI_ALWAYS_ILLEGAL 0x00
915 916
916struct acpi_interface_info { 917struct acpi_interface_info {
917 char *name; 918 char *name;
919 struct acpi_interface_info *next;
920 u8 flags;
918 u8 value; 921 u8 value;
919}; 922};
920 923
924#define ACPI_OSI_INVALID 0x01
925#define ACPI_OSI_DYNAMIC 0x02
926
921struct acpi_port_info { 927struct acpi_port_info {
922 char *name; 928 char *name;
923 u16 start; 929 u16 start;
@@ -997,7 +1003,7 @@ struct acpi_port_info {
997struct acpi_db_method_info { 1003struct acpi_db_method_info {
998 acpi_handle main_thread_gate; 1004 acpi_handle main_thread_gate;
999 acpi_handle thread_complete_gate; 1005 acpi_handle thread_complete_gate;
1000 u32 *threads; 1006 acpi_thread_id *threads;
1001 u32 num_threads; 1007 u32 num_threads;
1002 u32 num_created; 1008 u32 num_created;
1003 u32 num_completed; 1009 u32 num_completed;
diff --git a/drivers/acpi/acpica/acmacros.h b/drivers/acpi/acpica/acmacros.h
index 9894929a2abb..8d5c9e0a495f 100644
--- a/drivers/acpi/acpica/acmacros.h
+++ b/drivers/acpi/acpica/acmacros.h
@@ -338,8 +338,8 @@
338 * the plist contains a set of parens to allow variable-length lists. 338 * the plist contains a set of parens to allow variable-length lists.
339 * These macros are used for both the debug and non-debug versions of the code. 339 * These macros are used for both the debug and non-debug versions of the code.
340 */ 340 */
341#define ACPI_ERROR_NAMESPACE(s, e) acpi_ns_report_error (AE_INFO, s, e); 341#define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e);
342#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ns_report_method_error (AE_INFO, s, n, p, e); 342#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e);
343#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist 343#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist
344#define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist 344#define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist
345 345
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h
index 9f60ff002203..d44d3bc5b847 100644
--- a/drivers/acpi/acpica/acnamesp.h
+++ b/drivers/acpi/acpica/acnamesp.h
@@ -339,18 +339,6 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node *node);
339u32 acpi_ns_local(acpi_object_type type); 339u32 acpi_ns_local(acpi_object_type type);
340 340
341void 341void
342acpi_ns_report_error(const char *module_name,
343 u32 line_number,
344 const char *internal_name, acpi_status lookup_status);
345
346void
347acpi_ns_report_method_error(const char *module_name,
348 u32 line_number,
349 const char *message,
350 struct acpi_namespace_node *node,
351 const char *path, acpi_status lookup_status);
352
353void
354acpi_ns_print_node_pathname(struct acpi_namespace_node *node, const char *msg); 342acpi_ns_print_node_pathname(struct acpi_namespace_node *node, const char *msg);
355 343
356acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info); 344acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info);
diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h
index 54857fa87aaf..bdbfaf22bd14 100644
--- a/drivers/acpi/acpica/acobject.h
+++ b/drivers/acpi/acpica/acobject.h
@@ -248,7 +248,7 @@ ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO};
248 u32 base_byte_offset; /* Byte offset within containing object */\ 248 u32 base_byte_offset; /* Byte offset within containing object */\
249 u32 value; /* Value to store into the Bank or Index register */\ 249 u32 value; /* Value to store into the Bank or Index register */\
250 u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ 250 u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\
251 u8 access_bit_width; /* Read/Write size in bits (8-64) */ 251
252 252
253struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ 253struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
254 ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */ 254 ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h
index 35df755251ce..72e4183c1937 100644
--- a/drivers/acpi/acpica/acutils.h
+++ b/drivers/acpi/acpica/acutils.h
@@ -312,8 +312,6 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list);
312/* 312/*
313 * uteval - object evaluation 313 * uteval - object evaluation
314 */ 314 */
315acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
316
317acpi_status 315acpi_status
318acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, 316acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
319 char *path, 317 char *path,
@@ -395,6 +393,21 @@ acpi_status
395acpi_ut_get_object_size(union acpi_operand_object *obj, acpi_size * obj_length); 393acpi_ut_get_object_size(union acpi_operand_object *obj, acpi_size * obj_length);
396 394
397/* 395/*
396 * utosi - Support for the _OSI predefined control method
397 */
398acpi_status acpi_ut_initialize_interfaces(void);
399
400void acpi_ut_interface_terminate(void);
401
402acpi_status acpi_ut_install_interface(acpi_string interface_name);
403
404acpi_status acpi_ut_remove_interface(acpi_string interface_name);
405
406struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name);
407
408acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
409
410/*
398 * utstate - Generic state creation/cache routines 411 * utstate - Generic state creation/cache routines
399 */ 412 */
400void 413void
@@ -473,17 +486,6 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position);
473 486
474acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 * ret_integer); 487acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 * ret_integer);
475 488
476void ACPI_INTERNAL_VAR_XFACE
477acpi_ut_predefined_warning(const char *module_name,
478 u32 line_number,
479 char *pathname,
480 u8 node_flags, const char *format, ...);
481
482void ACPI_INTERNAL_VAR_XFACE
483acpi_ut_predefined_info(const char *module_name,
484 u32 line_number,
485 char *pathname, u8 node_flags, const char *format, ...);
486
487/* Values for Base above (16=Hex, 10=Decimal) */ 489/* Values for Base above (16=Hex, 10=Decimal) */
488 490
489#define ACPI_ANY_BASE 0 491#define ACPI_ANY_BASE 0
@@ -574,6 +576,32 @@ acpi_status
574acpi_ut_create_list(char *list_name, 576acpi_ut_create_list(char *list_name,
575 u16 object_size, struct acpi_memory_list **return_cache); 577 u16 object_size, struct acpi_memory_list **return_cache);
576 578
577#endif 579#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
580
581/*
582 * utxferror - various error/warning output functions
583 */
584void ACPI_INTERNAL_VAR_XFACE
585acpi_ut_predefined_warning(const char *module_name,
586 u32 line_number,
587 char *pathname,
588 u8 node_flags, const char *format, ...);
589
590void ACPI_INTERNAL_VAR_XFACE
591acpi_ut_predefined_info(const char *module_name,
592 u32 line_number,
593 char *pathname, u8 node_flags, const char *format, ...);
594
595void
596acpi_ut_namespace_error(const char *module_name,
597 u32 line_number,
598 const char *internal_name, acpi_status lookup_status);
599
600void
601acpi_ut_method_error(const char *module_name,
602 u32 line_number,
603 const char *message,
604 struct acpi_namespace_node *node,
605 const char *path, acpi_status lookup_status);
578 606
579#endif /* _ACUTILS_H */ 607#endif /* _ACUTILS_H */
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c
index 64750ee96e20..d94dd8974b55 100644
--- a/drivers/acpi/acpica/dsmethod.c
+++ b/drivers/acpi/acpica/dsmethod.c
@@ -573,7 +573,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
573 573
574 acpi_os_release_mutex(method_desc->method. 574 acpi_os_release_mutex(method_desc->method.
575 mutex->mutex.os_mutex); 575 mutex->mutex.os_mutex);
576 method_desc->method.mutex->mutex.thread_id = NULL; 576 method_desc->method.mutex->mutex.thread_id = 0;
577 } 577 }
578 } 578 }
579 579
diff --git a/drivers/acpi/acpica/dswexec.c b/drivers/acpi/acpica/dswexec.c
index d555b374e314..6b0b5d08d97a 100644
--- a/drivers/acpi/acpica/dswexec.c
+++ b/drivers/acpi/acpica/dswexec.c
@@ -300,10 +300,25 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
300 * we must enter this object into the namespace. The created 300 * we must enter this object into the namespace. The created
301 * object is temporary and will be deleted upon completion of 301 * object is temporary and will be deleted upon completion of
302 * the execution of this method. 302 * the execution of this method.
303 *
304 * Note 10/2010: Except for the Scope() op. This opcode does
305 * not actually create a new object, it refers to an existing
306 * object. However, for Scope(), we want to indeed open a
307 * new scope.
303 */ 308 */
304 status = acpi_ds_load2_begin_op(walk_state, NULL); 309 if (op->common.aml_opcode != AML_SCOPE_OP) {
310 status =
311 acpi_ds_load2_begin_op(walk_state, NULL);
312 } else {
313 status =
314 acpi_ds_scope_stack_push(op->named.node,
315 op->named.node->
316 type, walk_state);
317 if (ACPI_FAILURE(status)) {
318 return_ACPI_STATUS(status);
319 }
320 }
305 } 321 }
306
307 break; 322 break;
308 323
309 case AML_CLASS_EXECUTE: 324 case AML_CLASS_EXECUTE:
diff --git a/drivers/acpi/acpica/evmisc.c b/drivers/acpi/acpica/evmisc.c
index df0aea9a8cfd..fcaed9fb44ff 100644
--- a/drivers/acpi/acpica/evmisc.c
+++ b/drivers/acpi/acpica/evmisc.c
@@ -553,7 +553,7 @@ acpi_status acpi_ev_release_global_lock(void)
553 acpi_gbl_global_lock_acquired = FALSE; 553 acpi_gbl_global_lock_acquired = FALSE;
554 554
555 /* Release the local GL mutex */ 555 /* Release the local GL mutex */
556 acpi_ev_global_lock_thread_id = NULL; 556 acpi_ev_global_lock_thread_id = 0;
557 acpi_ev_global_lock_acquired = 0; 557 acpi_ev_global_lock_acquired = 0;
558 acpi_os_release_mutex(acpi_gbl_global_lock_mutex->mutex.os_mutex); 558 acpi_os_release_mutex(acpi_gbl_global_lock_mutex->mutex.os_mutex);
559 return_ACPI_STATUS(status); 559 return_ACPI_STATUS(status);
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c
index f40d271bf568..0b47a6dc9290 100644
--- a/drivers/acpi/acpica/evrgnini.c
+++ b/drivers/acpi/acpica/evrgnini.c
@@ -289,8 +289,8 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
289 } 289 }
290 290
291 /* 291 /*
292 * Get the PCI device and function numbers from the _ADR object contained 292 * Get the PCI device and function numbers from the _ADR object
293 * in the parent's scope. 293 * contained in the parent's scope.
294 */ 294 */
295 status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, 295 status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR,
296 pci_device_node, &pci_value); 296 pci_device_node, &pci_value);
@@ -320,9 +320,15 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
320 pci_id->bus = ACPI_LOWORD(pci_value); 320 pci_id->bus = ACPI_LOWORD(pci_value);
321 } 321 }
322 322
323 /* Complete this device's pci_id */ 323 /* Complete/update the PCI ID for this device */
324 324
325 acpi_os_derive_pci_id(pci_root_node, region_obj->region.node, &pci_id); 325 status =
326 acpi_hw_derive_pci_id(pci_id, pci_root_node,
327 region_obj->region.node);
328 if (ACPI_FAILURE(status)) {
329 ACPI_FREE(pci_id);
330 return_ACPI_STATUS(status);
331 }
326 332
327 *region_context = pci_id; 333 *region_context = pci_id;
328 return_ACPI_STATUS(AE_OK); 334 return_ACPI_STATUS(AE_OK);
diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c
index 541cbc1544d5..ce9314f79451 100644
--- a/drivers/acpi/acpica/evxfregn.c
+++ b/drivers/acpi/acpica/evxfregn.c
@@ -64,6 +64,12 @@ ACPI_MODULE_NAME("evxfregn")
64 * 64 *
65 * DESCRIPTION: Install a handler for all op_regions of a given space_id. 65 * DESCRIPTION: Install a handler for all op_regions of a given space_id.
66 * 66 *
67 * NOTE: This function should only be called after acpi_enable_subsystem has
68 * been called. This is because any _REG methods associated with the Space ID
69 * are executed here, and these methods can only be safely executed after
70 * the default handlers have been installed and the hardware has been
71 * initialized (via acpi_enable_subsystem.)
72 *
67 ******************************************************************************/ 73 ******************************************************************************/
68acpi_status 74acpi_status
69acpi_install_address_space_handler(acpi_handle device, 75acpi_install_address_space_handler(acpi_handle device,
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c
index 047217303a4b..38293fd3e088 100644
--- a/drivers/acpi/acpica/exfldio.c
+++ b/drivers/acpi/acpica/exfldio.c
@@ -119,8 +119,8 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
119 } 119 }
120 120
121 /* 121 /*
122 * Exit now for SMBus or IPMI address space, it has a non-linear address space 122 * Exit now for SMBus or IPMI address space, it has a non-linear
123 * and the request cannot be directly validated 123 * address space and the request cannot be directly validated
124 */ 124 */
125 if (rgn_desc->region.space_id == ACPI_ADR_SPACE_SMBUS || 125 if (rgn_desc->region.space_id == ACPI_ADR_SPACE_SMBUS ||
126 rgn_desc->region.space_id == ACPI_ADR_SPACE_IPMI) { 126 rgn_desc->region.space_id == ACPI_ADR_SPACE_IPMI) {
@@ -147,8 +147,7 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
147 * (Region length is specified in bytes) 147 * (Region length is specified in bytes)
148 */ 148 */
149 if (rgn_desc->region.length < 149 if (rgn_desc->region.length <
150 (obj_desc->common_field.base_byte_offset + 150 (obj_desc->common_field.base_byte_offset + field_datum_byte_offset +
151 field_datum_byte_offset +
152 obj_desc->common_field.access_byte_width)) { 151 obj_desc->common_field.access_byte_width)) {
153 if (acpi_gbl_enable_interpreter_slack) { 152 if (acpi_gbl_enable_interpreter_slack) {
154 /* 153 /*
@@ -680,6 +679,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
680 u32 buffer_tail_bits; 679 u32 buffer_tail_bits;
681 u32 datum_count; 680 u32 datum_count;
682 u32 field_datum_count; 681 u32 field_datum_count;
682 u32 access_bit_width;
683 u32 i; 683 u32 i;
684 684
685 ACPI_FUNCTION_TRACE(ex_extract_from_field); 685 ACPI_FUNCTION_TRACE(ex_extract_from_field);
@@ -694,16 +694,36 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
694 694
695 return_ACPI_STATUS(AE_BUFFER_OVERFLOW); 695 return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
696 } 696 }
697
697 ACPI_MEMSET(buffer, 0, buffer_length); 698 ACPI_MEMSET(buffer, 0, buffer_length);
699 access_bit_width = ACPI_MUL_8(obj_desc->common_field.access_byte_width);
700
701 /* Handle the simple case here */
702
703 if ((obj_desc->common_field.start_field_bit_offset == 0) &&
704 (obj_desc->common_field.bit_length == access_bit_width)) {
705 status = acpi_ex_field_datum_io(obj_desc, 0, buffer, ACPI_READ);
706 return_ACPI_STATUS(status);
707 }
708
709/* TBD: Move to common setup code */
710
711 /* Field algorithm is limited to sizeof(u64), truncate if needed */
712
713 if (obj_desc->common_field.access_byte_width > sizeof(u64)) {
714 obj_desc->common_field.access_byte_width = sizeof(u64);
715 access_bit_width = sizeof(u64) * 8;
716 }
698 717
699 /* Compute the number of datums (access width data items) */ 718 /* Compute the number of datums (access width data items) */
700 719
701 datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length, 720 datum_count =
702 obj_desc->common_field.access_bit_width); 721 ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length,
722 access_bit_width);
723
703 field_datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length + 724 field_datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length +
704 obj_desc->common_field. 725 obj_desc->common_field.
705 start_field_bit_offset, 726 start_field_bit_offset,
706 obj_desc->common_field.
707 access_bit_width); 727 access_bit_width);
708 728
709 /* Priming read from the field */ 729 /* Priming read from the field */
@@ -738,12 +758,11 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
738 * This avoids the differences in behavior between different compilers 758 * This avoids the differences in behavior between different compilers
739 * concerning shift values larger than the target data width. 759 * concerning shift values larger than the target data width.
740 */ 760 */
741 if ((obj_desc->common_field.access_bit_width - 761 if (access_bit_width -
742 obj_desc->common_field.start_field_bit_offset) < 762 obj_desc->common_field.start_field_bit_offset <
743 ACPI_INTEGER_BIT_SIZE) { 763 ACPI_INTEGER_BIT_SIZE) {
744 merged_datum |= 764 merged_datum |=
745 raw_datum << (obj_desc->common_field. 765 raw_datum << (access_bit_width -
746 access_bit_width -
747 obj_desc->common_field. 766 obj_desc->common_field.
748 start_field_bit_offset); 767 start_field_bit_offset);
749 } 768 }
@@ -765,8 +784,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
765 784
766 /* Mask off any extra bits in the last datum */ 785 /* Mask off any extra bits in the last datum */
767 786
768 buffer_tail_bits = obj_desc->common_field.bit_length % 787 buffer_tail_bits = obj_desc->common_field.bit_length % access_bit_width;
769 obj_desc->common_field.access_bit_width;
770 if (buffer_tail_bits) { 788 if (buffer_tail_bits) {
771 merged_datum &= ACPI_MASK_BITS_ABOVE(buffer_tail_bits); 789 merged_datum &= ACPI_MASK_BITS_ABOVE(buffer_tail_bits);
772 } 790 }
@@ -798,6 +816,7 @@ acpi_status
798acpi_ex_insert_into_field(union acpi_operand_object *obj_desc, 816acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
799 void *buffer, u32 buffer_length) 817 void *buffer, u32 buffer_length)
800{ 818{
819 void *new_buffer;
801 acpi_status status; 820 acpi_status status;
802 u64 mask; 821 u64 mask;
803 u64 width_mask; 822 u64 width_mask;
@@ -808,9 +827,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
808 u32 buffer_tail_bits; 827 u32 buffer_tail_bits;
809 u32 datum_count; 828 u32 datum_count;
810 u32 field_datum_count; 829 u32 field_datum_count;
811 u32 i; 830 u32 access_bit_width;
812 u32 required_length; 831 u32 required_length;
813 void *new_buffer; 832 u32 i;
814 833
815 ACPI_FUNCTION_TRACE(ex_insert_into_field); 834 ACPI_FUNCTION_TRACE(ex_insert_into_field);
816 835
@@ -844,17 +863,24 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
844 buffer_length = required_length; 863 buffer_length = required_length;
845 } 864 }
846 865
866/* TBD: Move to common setup code */
867
868 /* Algo is limited to sizeof(u64), so cut the access_byte_width */
869 if (obj_desc->common_field.access_byte_width > sizeof(u64)) {
870 obj_desc->common_field.access_byte_width = sizeof(u64);
871 }
872
873 access_bit_width = ACPI_MUL_8(obj_desc->common_field.access_byte_width);
874
847 /* 875 /*
848 * Create the bitmasks used for bit insertion. 876 * Create the bitmasks used for bit insertion.
849 * Note: This if/else is used to bypass compiler differences with the 877 * Note: This if/else is used to bypass compiler differences with the
850 * shift operator 878 * shift operator
851 */ 879 */
852 if (obj_desc->common_field.access_bit_width == ACPI_INTEGER_BIT_SIZE) { 880 if (access_bit_width == ACPI_INTEGER_BIT_SIZE) {
853 width_mask = ACPI_UINT64_MAX; 881 width_mask = ACPI_UINT64_MAX;
854 } else { 882 } else {
855 width_mask = 883 width_mask = ACPI_MASK_BITS_ABOVE(access_bit_width);
856 ACPI_MASK_BITS_ABOVE(obj_desc->common_field.
857 access_bit_width);
858 } 884 }
859 885
860 mask = width_mask & 886 mask = width_mask &
@@ -863,12 +889,11 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
863 /* Compute the number of datums (access width data items) */ 889 /* Compute the number of datums (access width data items) */
864 890
865 datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length, 891 datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length,
866 obj_desc->common_field.access_bit_width); 892 access_bit_width);
867 893
868 field_datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length + 894 field_datum_count = ACPI_ROUND_UP_TO(obj_desc->common_field.bit_length +
869 obj_desc->common_field. 895 obj_desc->common_field.
870 start_field_bit_offset, 896 start_field_bit_offset,
871 obj_desc->common_field.
872 access_bit_width); 897 access_bit_width);
873 898
874 /* Get initial Datum from the input buffer */ 899 /* Get initial Datum from the input buffer */
@@ -905,12 +930,11 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
905 * This avoids the differences in behavior between different compilers 930 * This avoids the differences in behavior between different compilers
906 * concerning shift values larger than the target data width. 931 * concerning shift values larger than the target data width.
907 */ 932 */
908 if ((obj_desc->common_field.access_bit_width - 933 if ((access_bit_width -
909 obj_desc->common_field.start_field_bit_offset) < 934 obj_desc->common_field.start_field_bit_offset) <
910 ACPI_INTEGER_BIT_SIZE) { 935 ACPI_INTEGER_BIT_SIZE) {
911 merged_datum = 936 merged_datum =
912 raw_datum >> (obj_desc->common_field. 937 raw_datum >> (access_bit_width -
913 access_bit_width -
914 obj_desc->common_field. 938 obj_desc->common_field.
915 start_field_bit_offset); 939 start_field_bit_offset);
916 } else { 940 } else {
@@ -929,6 +953,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
929 ACPI_MEMCPY(&raw_datum, ((char *)buffer) + buffer_offset, 953 ACPI_MEMCPY(&raw_datum, ((char *)buffer) + buffer_offset,
930 ACPI_MIN(obj_desc->common_field.access_byte_width, 954 ACPI_MIN(obj_desc->common_field.access_byte_width,
931 buffer_length - buffer_offset)); 955 buffer_length - buffer_offset));
956
932 merged_datum |= 957 merged_datum |=
933 raw_datum << obj_desc->common_field.start_field_bit_offset; 958 raw_datum << obj_desc->common_field.start_field_bit_offset;
934 } 959 }
@@ -937,7 +962,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
937 962
938 buffer_tail_bits = (obj_desc->common_field.bit_length + 963 buffer_tail_bits = (obj_desc->common_field.bit_length +
939 obj_desc->common_field.start_field_bit_offset) % 964 obj_desc->common_field.start_field_bit_offset) %
940 obj_desc->common_field.access_bit_width; 965 access_bit_width;
941 if (buffer_tail_bits) { 966 if (buffer_tail_bits) {
942 mask &= ACPI_MASK_BITS_ABOVE(buffer_tail_bits); 967 mask &= ACPI_MASK_BITS_ABOVE(buffer_tail_bits);
943 } 968 }
diff --git a/drivers/acpi/acpica/exmutex.c b/drivers/acpi/acpica/exmutex.c
index f73be97043c0..6af14e43f839 100644
--- a/drivers/acpi/acpica/exmutex.c
+++ b/drivers/acpi/acpica/exmutex.c
@@ -336,7 +336,7 @@ acpi_status acpi_ex_release_mutex_object(union acpi_operand_object *obj_desc)
336 336
337 /* Clear mutex info */ 337 /* Clear mutex info */
338 338
339 obj_desc->mutex.thread_id = NULL; 339 obj_desc->mutex.thread_id = 0;
340 return_ACPI_STATUS(status); 340 return_ACPI_STATUS(status);
341} 341}
342 342
@@ -393,10 +393,10 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
393 if ((owner_thread->thread_id != walk_state->thread->thread_id) && 393 if ((owner_thread->thread_id != walk_state->thread->thread_id) &&
394 (obj_desc != acpi_gbl_global_lock_mutex)) { 394 (obj_desc != acpi_gbl_global_lock_mutex)) {
395 ACPI_ERROR((AE_INFO, 395 ACPI_ERROR((AE_INFO,
396 "Thread %p cannot release Mutex [%4.4s] acquired by thread %p", 396 "Thread %u cannot release Mutex [%4.4s] acquired by thread %u",
397 ACPI_CAST_PTR(void, walk_state->thread->thread_id), 397 (u32)walk_state->thread->thread_id,
398 acpi_ut_get_node_name(obj_desc->mutex.node), 398 acpi_ut_get_node_name(obj_desc->mutex.node),
399 ACPI_CAST_PTR(void, owner_thread->thread_id))); 399 (u32)owner_thread->thread_id));
400 return_ACPI_STATUS(AE_AML_NOT_OWNER); 400 return_ACPI_STATUS(AE_AML_NOT_OWNER);
401 } 401 }
402 402
@@ -488,7 +488,7 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
488 /* Mark mutex unowned */ 488 /* Mark mutex unowned */
489 489
490 obj_desc->mutex.owner_thread = NULL; 490 obj_desc->mutex.owner_thread = NULL;
491 obj_desc->mutex.thread_id = NULL; 491 obj_desc->mutex.thread_id = 0;
492 492
493 /* Update Thread sync_level (Last mutex is the important one) */ 493 /* Update Thread sync_level (Last mutex is the important one) */
494 494
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c
index 98a331d2249b..7aae29f73d3f 100644
--- a/drivers/acpi/acpica/exprep.c
+++ b/drivers/acpi/acpica/exprep.c
@@ -355,12 +355,10 @@ acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,
355 return_ACPI_STATUS(AE_AML_OPERAND_VALUE); 355 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
356 } 356 }
357 357
358 /* Setup width (access granularity) fields */ 358 /* Setup width (access granularity) fields (values are: 1, 2, 4, 8) */
359 359
360 obj_desc->common_field.access_byte_width = (u8) 360 obj_desc->common_field.access_byte_width = (u8)
361 ACPI_DIV_8(access_bit_width); /* 1, 2, 4, 8 */ 361 ACPI_DIV_8(access_bit_width);
362
363 obj_desc->common_field.access_bit_width = (u8) access_bit_width;
364 362
365 /* 363 /*
366 * base_byte_offset is the address of the start of the field within the 364 * base_byte_offset is the address of the start of the field within the
@@ -405,8 +403,9 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
405{ 403{
406 union acpi_operand_object *obj_desc; 404 union acpi_operand_object *obj_desc;
407 union acpi_operand_object *second_desc = NULL; 405 union acpi_operand_object *second_desc = NULL;
408 u32 type;
409 acpi_status status; 406 acpi_status status;
407 u32 access_byte_width;
408 u32 type;
410 409
411 ACPI_FUNCTION_TRACE(ex_prep_field_value); 410 ACPI_FUNCTION_TRACE(ex_prep_field_value);
412 411
@@ -421,8 +420,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
421 type = acpi_ns_get_type(info->region_node); 420 type = acpi_ns_get_type(info->region_node);
422 if (type != ACPI_TYPE_REGION) { 421 if (type != ACPI_TYPE_REGION) {
423 ACPI_ERROR((AE_INFO, 422 ACPI_ERROR((AE_INFO,
424 "Needed Region, found type 0x%X (%s)", 423 "Needed Region, found type 0x%X (%s)", type,
425 type, acpi_ut_get_type_name(type))); 424 acpi_ut_get_type_name(type)));
426 425
427 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 426 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
428 } 427 }
@@ -438,7 +437,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
438 /* Initialize areas of the object that are common to all fields */ 437 /* Initialize areas of the object that are common to all fields */
439 438
440 obj_desc->common_field.node = info->field_node; 439 obj_desc->common_field.node = info->field_node;
441 status = acpi_ex_prep_common_field_object(obj_desc, info->field_flags, 440 status = acpi_ex_prep_common_field_object(obj_desc,
441 info->field_flags,
442 info->attribute, 442 info->attribute,
443 info->field_bit_position, 443 info->field_bit_position,
444 info->field_bit_length); 444 info->field_bit_length);
@@ -455,26 +455,25 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
455 obj_desc->field.region_obj = 455 obj_desc->field.region_obj =
456 acpi_ns_get_attached_object(info->region_node); 456 acpi_ns_get_attached_object(info->region_node);
457 457
458 /* An additional reference for the container */ 458 /* Allow full data read from EC address space */
459 459
460 acpi_ut_add_reference(obj_desc->field.region_obj); 460 if ((obj_desc->field.region_obj->region.space_id ==
461 ACPI_ADR_SPACE_EC)
462 && (obj_desc->common_field.bit_length > 8)) {
463 access_byte_width =
464 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.
465 bit_length);
466
467 /* Maximum byte width supported is 255 */
461 468
462 /* allow full data read from EC address space */ 469 if (access_byte_width < 256) {
463 if (obj_desc->field.region_obj->region.space_id ==
464 ACPI_ADR_SPACE_EC) {
465 if (obj_desc->common_field.bit_length > 8) {
466 unsigned width =
467 ACPI_ROUND_BITS_UP_TO_BYTES(
468 obj_desc->common_field.bit_length);
469 // access_bit_width is u8, don't overflow it
470 if (width > 8)
471 width = 8;
472 obj_desc->common_field.access_byte_width = 470 obj_desc->common_field.access_byte_width =
473 width; 471 (u8)access_byte_width;
474 obj_desc->common_field.access_bit_width =
475 8 * width;
476 } 472 }
477 } 473 }
474 /* An additional reference for the container */
475
476 acpi_ut_add_reference(obj_desc->field.region_obj);
478 477
479 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 478 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
480 "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", 479 "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n",
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c
index 8819d2ac5aee..de17e10da0ed 100644
--- a/drivers/acpi/acpica/exregion.c
+++ b/drivers/acpi/acpica/exregion.c
@@ -353,7 +353,6 @@ acpi_ex_pci_config_space_handler(u32 function,
353 acpi_status status = AE_OK; 353 acpi_status status = AE_OK;
354 struct acpi_pci_id *pci_id; 354 struct acpi_pci_id *pci_id;
355 u16 pci_register; 355 u16 pci_register;
356 u32 value32;
357 356
358 ACPI_FUNCTION_TRACE(ex_pci_config_space_handler); 357 ACPI_FUNCTION_TRACE(ex_pci_config_space_handler);
359 358
@@ -381,8 +380,7 @@ acpi_ex_pci_config_space_handler(u32 function,
381 case ACPI_READ: 380 case ACPI_READ:
382 381
383 status = acpi_os_read_pci_configuration(pci_id, pci_register, 382 status = acpi_os_read_pci_configuration(pci_id, pci_register,
384 &value32, bit_width); 383 value, bit_width);
385 *value = value32;
386 break; 384 break;
387 385
388 case ACPI_WRITE: 386 case ACPI_WRITE:
diff --git a/drivers/acpi/acpica/hwpci.c b/drivers/acpi/acpica/hwpci.c
new file mode 100644
index 000000000000..ad21c7d8bf4f
--- /dev/null
+++ b/drivers/acpi/acpica/hwpci.c
@@ -0,0 +1,412 @@
1/*******************************************************************************
2 *
3 * Module Name: hwpci - Obtain PCI bus, device, and function numbers
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2010, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46
47#define _COMPONENT ACPI_NAMESPACE
48ACPI_MODULE_NAME("hwpci")
49
50/* PCI configuration space values */
51#define PCI_CFG_HEADER_TYPE_REG 0x0E
52#define PCI_CFG_PRIMARY_BUS_NUMBER_REG 0x18
53#define PCI_CFG_SECONDARY_BUS_NUMBER_REG 0x19
54/* PCI header values */
55#define PCI_HEADER_TYPE_MASK 0x7F
56#define PCI_TYPE_BRIDGE 0x01
57#define PCI_TYPE_CARDBUS_BRIDGE 0x02
58typedef struct acpi_pci_device {
59 acpi_handle device;
60 struct acpi_pci_device *next;
61
62} acpi_pci_device;
63
64/* Local prototypes */
65
66static acpi_status
67acpi_hw_build_pci_list(acpi_handle root_pci_device,
68 acpi_handle pci_region,
69 struct acpi_pci_device **return_list_head);
70
71static acpi_status
72acpi_hw_process_pci_list(struct acpi_pci_id *pci_id,
73 struct acpi_pci_device *list_head);
74
75static void acpi_hw_delete_pci_list(struct acpi_pci_device *list_head);
76
77static acpi_status
78acpi_hw_get_pci_device_info(struct acpi_pci_id *pci_id,
79 acpi_handle pci_device,
80 u16 *bus_number, u8 *is_bridge);
81
82/*******************************************************************************
83 *
84 * FUNCTION: acpi_hw_derive_pci_id
85 *
86 * PARAMETERS: pci_id - Initial values for the PCI ID. May be
87 * modified by this function.
88 * root_pci_device - A handle to a PCI device object. This
89 * object must be a PCI Root Bridge having a
90 * _HID value of either PNP0A03 or PNP0A08
91 * pci_region - A handle to a PCI configuration space
92 * Operation Region being initialized
93 *
94 * RETURN: Status
95 *
96 * DESCRIPTION: This function derives a full PCI ID for a PCI device,
97 * consisting of a Segment number, Bus number, Device number,
98 * and function code.
99 *
100 * The PCI hardware dynamically configures PCI bus numbers
101 * depending on the bus topology discovered during system
102 * initialization. This function is invoked during configuration
103 * of a PCI_Config Operation Region in order to (possibly) update
104 * the Bus/Device/Function numbers in the pci_id with the actual
105 * values as determined by the hardware and operating system
106 * configuration.
107 *
108 * The pci_id parameter is initially populated during the Operation
109 * Region initialization. This function is then called, and is
110 * will make any necessary modifications to the Bus, Device, or
111 * Function number PCI ID subfields as appropriate for the
112 * current hardware and OS configuration.
113 *
114 * NOTE: Created 08/2010. Replaces the previous OSL acpi_os_derive_pci_id
115 * interface since this feature is OS-independent. This module
116 * specifically avoids any use of recursion by building a local
117 * temporary device list.
118 *
119 ******************************************************************************/
120
121acpi_status
122acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id,
123 acpi_handle root_pci_device, acpi_handle pci_region)
124{
125 acpi_status status;
126 struct acpi_pci_device *list_head = NULL;
127
128 ACPI_FUNCTION_TRACE(hw_derive_pci_id);
129
130 if (!pci_id) {
131 return_ACPI_STATUS(AE_BAD_PARAMETER);
132 }
133
134 /* Build a list of PCI devices, from pci_region up to root_pci_device */
135
136 status =
137 acpi_hw_build_pci_list(root_pci_device, pci_region, &list_head);
138 if (ACPI_SUCCESS(status)) {
139
140 /* Walk the list, updating the PCI device/function/bus numbers */
141
142 status = acpi_hw_process_pci_list(pci_id, list_head);
143 }
144
145 /* Always delete the list */
146
147 acpi_hw_delete_pci_list(list_head);
148 return_ACPI_STATUS(status);
149}
150
151/*******************************************************************************
152 *
153 * FUNCTION: acpi_hw_build_pci_list
154 *
155 * PARAMETERS: root_pci_device - A handle to a PCI device object. This
156 * object is guaranteed to be a PCI Root
157 * Bridge having a _HID value of either
158 * PNP0A03 or PNP0A08
159 * pci_region - A handle to the PCI configuration space
160 * Operation Region
161 * return_list_head - Where the PCI device list is returned
162 *
163 * RETURN: Status
164 *
165 * DESCRIPTION: Builds a list of devices from the input PCI region up to the
166 * Root PCI device for this namespace subtree.
167 *
168 ******************************************************************************/
169
170static acpi_status
171acpi_hw_build_pci_list(acpi_handle root_pci_device,
172 acpi_handle pci_region,
173 struct acpi_pci_device **return_list_head)
174{
175 acpi_handle current_device;
176 acpi_handle parent_device;
177 acpi_status status;
178 struct acpi_pci_device *list_element;
179 struct acpi_pci_device *list_head = NULL;
180
181 /*
182 * Ascend namespace branch until the root_pci_device is reached, building
183 * a list of device nodes. Loop will exit when either the PCI device is
184 * found, or the root of the namespace is reached.
185 */
186 current_device = pci_region;
187 while (1) {
188 status = acpi_get_parent(current_device, &parent_device);
189 if (ACPI_FAILURE(status)) {
190 return (status);
191 }
192
193 /* Finished when we reach the PCI root device (PNP0A03 or PNP0A08) */
194
195 if (parent_device == root_pci_device) {
196 *return_list_head = list_head;
197 return (AE_OK);
198 }
199
200 list_element = ACPI_ALLOCATE(sizeof(struct acpi_pci_device));
201 if (!list_element) {
202 return (AE_NO_MEMORY);
203 }
204
205 /* Put new element at the head of the list */
206
207 list_element->next = list_head;
208 list_element->device = parent_device;
209 list_head = list_element;
210
211 current_device = parent_device;
212 }
213}
214
215/*******************************************************************************
216 *
217 * FUNCTION: acpi_hw_process_pci_list
218 *
219 * PARAMETERS: pci_id - Initial values for the PCI ID. May be
220 * modified by this function.
221 * list_head - Device list created by
222 * acpi_hw_build_pci_list
223 *
224 * RETURN: Status
225 *
226 * DESCRIPTION: Walk downward through the PCI device list, getting the device
227 * info for each, via the PCI configuration space and updating
228 * the PCI ID as necessary. Deletes the list during traversal.
229 *
230 ******************************************************************************/
231
232static acpi_status
233acpi_hw_process_pci_list(struct acpi_pci_id *pci_id,
234 struct acpi_pci_device *list_head)
235{
236 acpi_status status = AE_OK;
237 struct acpi_pci_device *info;
238 u16 bus_number;
239 u8 is_bridge = TRUE;
240
241 ACPI_FUNCTION_NAME(hw_process_pci_list);
242
243 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
244 "Input PciId: Seg %4.4X Bus %4.4X Dev %4.4X Func %4.4X\n",
245 pci_id->segment, pci_id->bus, pci_id->device,
246 pci_id->function));
247
248 bus_number = pci_id->bus;
249
250 /*
251 * Descend down the namespace tree, collecting PCI device, function,
252 * and bus numbers. bus_number is only important for PCI bridges.
253 * Algorithm: As we descend the tree, use the last valid PCI device,
254 * function, and bus numbers that are discovered, and assign them
255 * to the PCI ID for the target device.
256 */
257 info = list_head;
258 while (info) {
259 status = acpi_hw_get_pci_device_info(pci_id, info->device,
260 &bus_number, &is_bridge);
261 if (ACPI_FAILURE(status)) {
262 return_ACPI_STATUS(status);
263 }
264
265 info = info->next;
266 }
267
268 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
269 "Output PciId: Seg %4.4X Bus %4.4X Dev %4.4X Func %4.4X "
270 "Status %X BusNumber %X IsBridge %X\n",
271 pci_id->segment, pci_id->bus, pci_id->device,
272 pci_id->function, status, bus_number, is_bridge));
273
274 return_ACPI_STATUS(AE_OK);
275}
276
277/*******************************************************************************
278 *
279 * FUNCTION: acpi_hw_delete_pci_list
280 *
281 * PARAMETERS: list_head - Device list created by
282 * acpi_hw_build_pci_list
283 *
284 * RETURN: None
285 *
286 * DESCRIPTION: Free the entire PCI list.
287 *
288 ******************************************************************************/
289
290static void acpi_hw_delete_pci_list(struct acpi_pci_device *list_head)
291{
292 struct acpi_pci_device *next;
293 struct acpi_pci_device *previous;
294
295 next = list_head;
296 while (next) {
297 previous = next;
298 next = previous->next;
299 ACPI_FREE(previous);
300 }
301}
302
303/*******************************************************************************
304 *
305 * FUNCTION: acpi_hw_get_pci_device_info
306 *
307 * PARAMETERS: pci_id - Initial values for the PCI ID. May be
308 * modified by this function.
309 * pci_device - Handle for the PCI device object
310 * bus_number - Where a PCI bridge bus number is returned
311 * is_bridge - Return value, indicates if this PCI
312 * device is a PCI bridge
313 *
314 * RETURN: Status
315 *
316 * DESCRIPTION: Get the device info for a single PCI device object. Get the
317 * _ADR (contains PCI device and function numbers), and for PCI
318 * bridge devices, get the bus number from PCI configuration
319 * space.
320 *
321 ******************************************************************************/
322
323static acpi_status
324acpi_hw_get_pci_device_info(struct acpi_pci_id *pci_id,
325 acpi_handle pci_device,
326 u16 *bus_number, u8 *is_bridge)
327{
328 acpi_status status;
329 acpi_object_type object_type;
330 u64 return_value;
331 u64 pci_value;
332
333 /* We only care about objects of type Device */
334
335 status = acpi_get_type(pci_device, &object_type);
336 if (ACPI_FAILURE(status)) {
337 return (status);
338 }
339
340 if (object_type != ACPI_TYPE_DEVICE) {
341 return (AE_OK);
342 }
343
344 /* We need an _ADR. Ignore device if not present */
345
346 status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR,
347 pci_device, &return_value);
348 if (ACPI_FAILURE(status)) {
349 return (AE_OK);
350 }
351
352 /*
353 * From _ADR, get the PCI Device and Function and
354 * update the PCI ID.
355 */
356 pci_id->device = ACPI_HIWORD(ACPI_LODWORD(return_value));
357 pci_id->function = ACPI_LOWORD(ACPI_LODWORD(return_value));
358
359 /*
360 * If the previous device was a bridge, use the previous
361 * device bus number
362 */
363 if (*is_bridge) {
364 pci_id->bus = *bus_number;
365 }
366
367 /*
368 * Get the bus numbers from PCI Config space:
369 *
370 * First, get the PCI header_type
371 */
372 *is_bridge = FALSE;
373 status = acpi_os_read_pci_configuration(pci_id,
374 PCI_CFG_HEADER_TYPE_REG,
375 &pci_value, 8);
376 if (ACPI_FAILURE(status)) {
377 return (status);
378 }
379
380 /* We only care about bridges (1=pci_bridge, 2=card_bus_bridge) */
381
382 pci_value &= PCI_HEADER_TYPE_MASK;
383
384 if ((pci_value != PCI_TYPE_BRIDGE) &&
385 (pci_value != PCI_TYPE_CARDBUS_BRIDGE)) {
386 return (AE_OK);
387 }
388
389 /* Bridge: Get the Primary bus_number */
390
391 status = acpi_os_read_pci_configuration(pci_id,
392 PCI_CFG_PRIMARY_BUS_NUMBER_REG,
393 &pci_value, 8);
394 if (ACPI_FAILURE(status)) {
395 return (status);
396 }
397
398 *is_bridge = TRUE;
399 pci_id->bus = (u16)pci_value;
400
401 /* Bridge: Get the Secondary bus_number */
402
403 status = acpi_os_read_pci_configuration(pci_id,
404 PCI_CFG_SECONDARY_BUS_NUMBER_REG,
405 &pci_value, 8);
406 if (ACPI_FAILURE(status)) {
407 return (status);
408 }
409
410 *bus_number = (u16)pci_value;
411 return (AE_OK);
412}
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c
index 4009498fbabd..4ef9f43ea926 100644
--- a/drivers/acpi/acpica/nsrepair2.c
+++ b/drivers/acpi/acpica/nsrepair2.c
@@ -74,10 +74,18 @@ acpi_ns_repair_ALR(struct acpi_predefined_data *data,
74 union acpi_operand_object **return_object_ptr); 74 union acpi_operand_object **return_object_ptr);
75 75
76static acpi_status 76static acpi_status
77acpi_ns_repair_CID(struct acpi_predefined_data *data,
78 union acpi_operand_object **return_object_ptr);
79
80static acpi_status
77acpi_ns_repair_FDE(struct acpi_predefined_data *data, 81acpi_ns_repair_FDE(struct acpi_predefined_data *data,
78 union acpi_operand_object **return_object_ptr); 82 union acpi_operand_object **return_object_ptr);
79 83
80static acpi_status 84static acpi_status
85acpi_ns_repair_HID(struct acpi_predefined_data *data,
86 union acpi_operand_object **return_object_ptr);
87
88static acpi_status
81acpi_ns_repair_PSS(struct acpi_predefined_data *data, 89acpi_ns_repair_PSS(struct acpi_predefined_data *data,
82 union acpi_operand_object **return_object_ptr); 90 union acpi_operand_object **return_object_ptr);
83 91
@@ -108,8 +116,10 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
108 * As necessary: 116 * As necessary:
109 * 117 *
110 * _ALR: Sort the list ascending by ambient_illuminance 118 * _ALR: Sort the list ascending by ambient_illuminance
119 * _CID: Strings: uppercase all, remove any leading asterisk
111 * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs 120 * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs
112 * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs 121 * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs
122 * _HID: Strings: uppercase all, remove any leading asterisk
113 * _PSS: Sort the list descending by Power 123 * _PSS: Sort the list descending by Power
114 * _TSS: Sort the list descending by Power 124 * _TSS: Sort the list descending by Power
115 * 125 *
@@ -122,8 +132,10 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
122 */ 132 */
123static const struct acpi_repair_info acpi_ns_repairable_names[] = { 133static const struct acpi_repair_info acpi_ns_repairable_names[] = {
124 {"_ALR", acpi_ns_repair_ALR}, 134 {"_ALR", acpi_ns_repair_ALR},
135 {"_CID", acpi_ns_repair_CID},
125 {"_FDE", acpi_ns_repair_FDE}, 136 {"_FDE", acpi_ns_repair_FDE},
126 {"_GTM", acpi_ns_repair_FDE}, /* _GTM has same repair as _FDE */ 137 {"_GTM", acpi_ns_repair_FDE}, /* _GTM has same repair as _FDE */
138 {"_HID", acpi_ns_repair_HID},
127 {"_PSS", acpi_ns_repair_PSS}, 139 {"_PSS", acpi_ns_repair_PSS},
128 {"_TSS", acpi_ns_repair_TSS}, 140 {"_TSS", acpi_ns_repair_TSS},
129 {{0, 0, 0, 0}, NULL} /* Table terminator */ 141 {{0, 0, 0, 0}, NULL} /* Table terminator */
@@ -321,6 +333,157 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
321 333
322/****************************************************************************** 334/******************************************************************************
323 * 335 *
336 * FUNCTION: acpi_ns_repair_CID
337 *
338 * PARAMETERS: Data - Pointer to validation data structure
339 * return_object_ptr - Pointer to the object returned from the
340 * evaluation of a method or object
341 *
342 * RETURN: Status. AE_OK if object is OK or was repaired successfully
343 *
344 * DESCRIPTION: Repair for the _CID object. If a string, ensure that all
345 * letters are uppercase and that there is no leading asterisk.
346 * If a Package, ensure same for all string elements.
347 *
348 *****************************************************************************/
349
350static acpi_status
351acpi_ns_repair_CID(struct acpi_predefined_data *data,
352 union acpi_operand_object **return_object_ptr)
353{
354 acpi_status status;
355 union acpi_operand_object *return_object = *return_object_ptr;
356 union acpi_operand_object **element_ptr;
357 union acpi_operand_object *original_element;
358 u16 original_ref_count;
359 u32 i;
360
361 /* Check for _CID as a simple string */
362
363 if (return_object->common.type == ACPI_TYPE_STRING) {
364 status = acpi_ns_repair_HID(data, return_object_ptr);
365 return (status);
366 }
367
368 /* Exit if not a Package */
369
370 if (return_object->common.type != ACPI_TYPE_PACKAGE) {
371 return (AE_OK);
372 }
373
374 /* Examine each element of the _CID package */
375
376 element_ptr = return_object->package.elements;
377 for (i = 0; i < return_object->package.count; i++) {
378 original_element = *element_ptr;
379 original_ref_count = original_element->common.reference_count;
380
381 status = acpi_ns_repair_HID(data, element_ptr);
382 if (ACPI_FAILURE(status)) {
383 return (status);
384 }
385
386 /* Take care with reference counts */
387
388 if (original_element != *element_ptr) {
389
390 /* Element was replaced */
391
392 (*element_ptr)->common.reference_count =
393 original_ref_count;
394
395 acpi_ut_remove_reference(original_element);
396 }
397
398 element_ptr++;
399 }
400
401 return (AE_OK);
402}
403
404/******************************************************************************
405 *
406 * FUNCTION: acpi_ns_repair_HID
407 *
408 * PARAMETERS: Data - Pointer to validation data structure
409 * return_object_ptr - Pointer to the object returned from the
410 * evaluation of a method or object
411 *
412 * RETURN: Status. AE_OK if object is OK or was repaired successfully
413 *
414 * DESCRIPTION: Repair for the _HID object. If a string, ensure that all
415 * letters are uppercase and that there is no leading asterisk.
416 *
417 *****************************************************************************/
418
419static acpi_status
420acpi_ns_repair_HID(struct acpi_predefined_data *data,
421 union acpi_operand_object **return_object_ptr)
422{
423 union acpi_operand_object *return_object = *return_object_ptr;
424 union acpi_operand_object *new_string;
425 char *source;
426 char *dest;
427
428 ACPI_FUNCTION_NAME(ns_repair_HID);
429
430 /* We only care about string _HID objects (not integers) */
431
432 if (return_object->common.type != ACPI_TYPE_STRING) {
433 return (AE_OK);
434 }
435
436 if (return_object->string.length == 0) {
437 ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
438 "Invalid zero-length _HID or _CID string"));
439
440 /* Return AE_OK anyway, let driver handle it */
441
442 data->flags |= ACPI_OBJECT_REPAIRED;
443 return (AE_OK);
444 }
445
446 /* It is simplest to always create a new string object */
447
448 new_string = acpi_ut_create_string_object(return_object->string.length);
449 if (!new_string) {
450 return (AE_NO_MEMORY);
451 }
452
453 /*
454 * Remove a leading asterisk if present. For some unknown reason, there
455 * are many machines in the field that contains IDs like this.
456 *
457 * Examples: "*PNP0C03", "*ACPI0003"
458 */
459 source = return_object->string.pointer;
460 if (*source == '*') {
461 source++;
462 new_string->string.length--;
463
464 ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
465 "%s: Removed invalid leading asterisk\n",
466 data->pathname));
467 }
468
469 /*
470 * Copy and uppercase the string. From the ACPI specification:
471 *
472 * A valid PNP ID must be of the form "AAA####" where A is an uppercase
473 * letter and # is a hex digit. A valid ACPI ID must be of the form
474 * "ACPI####" where # is a hex digit.
475 */
476 for (dest = new_string->string.pointer; *source; dest++, source++) {
477 *dest = (char)ACPI_TOUPPER(*source);
478 }
479
480 acpi_ut_remove_reference(return_object);
481 *return_object_ptr = new_string;
482 return (AE_OK);
483}
484
485/******************************************************************************
486 *
324 * FUNCTION: acpi_ns_repair_TSS 487 * FUNCTION: acpi_ns_repair_TSS
325 * 488 *
326 * PARAMETERS: Data - Pointer to validation data structure 489 * PARAMETERS: Data - Pointer to validation data structure
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c
index e1add3491b04..a7d6ad9c111b 100644
--- a/drivers/acpi/acpica/nsutils.c
+++ b/drivers/acpi/acpica/nsutils.c
@@ -60,104 +60,6 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
60 60
61/******************************************************************************* 61/*******************************************************************************
62 * 62 *
63 * FUNCTION: acpi_ns_report_error
64 *
65 * PARAMETERS: module_name - Caller's module name (for error output)
66 * line_number - Caller's line number (for error output)
67 * internal_name - Name or path of the namespace node
68 * lookup_status - Exception code from NS lookup
69 *
70 * RETURN: None
71 *
72 * DESCRIPTION: Print warning message with full pathname
73 *
74 ******************************************************************************/
75
76void
77acpi_ns_report_error(const char *module_name,
78 u32 line_number,
79 const char *internal_name, acpi_status lookup_status)
80{
81 acpi_status status;
82 u32 bad_name;
83 char *name = NULL;
84
85 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
86
87 if (lookup_status == AE_BAD_CHARACTER) {
88
89 /* There is a non-ascii character in the name */
90
91 ACPI_MOVE_32_TO_32(&bad_name,
92 ACPI_CAST_PTR(u32, internal_name));
93 acpi_os_printf("[0x%4.4X] (NON-ASCII)", bad_name);
94 } else {
95 /* Convert path to external format */
96
97 status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
98 internal_name, NULL, &name);
99
100 /* Print target name */
101
102 if (ACPI_SUCCESS(status)) {
103 acpi_os_printf("[%s]", name);
104 } else {
105 acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
106 }
107
108 if (name) {
109 ACPI_FREE(name);
110 }
111 }
112
113 acpi_os_printf(" Namespace lookup failure, %s\n",
114 acpi_format_exception(lookup_status));
115}
116
117/*******************************************************************************
118 *
119 * FUNCTION: acpi_ns_report_method_error
120 *
121 * PARAMETERS: module_name - Caller's module name (for error output)
122 * line_number - Caller's line number (for error output)
123 * Message - Error message to use on failure
124 * prefix_node - Prefix relative to the path
125 * Path - Path to the node (optional)
126 * method_status - Execution status
127 *
128 * RETURN: None
129 *
130 * DESCRIPTION: Print warning message with full pathname
131 *
132 ******************************************************************************/
133
134void
135acpi_ns_report_method_error(const char *module_name,
136 u32 line_number,
137 const char *message,
138 struct acpi_namespace_node *prefix_node,
139 const char *path, acpi_status method_status)
140{
141 acpi_status status;
142 struct acpi_namespace_node *node = prefix_node;
143
144 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
145
146 if (path) {
147 status =
148 acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
149 &node);
150 if (ACPI_FAILURE(status)) {
151 acpi_os_printf("[Could not get node by pathname]");
152 }
153 }
154
155 acpi_ns_print_node_pathname(node, message);
156 acpi_os_printf(", %s\n", acpi_format_exception(method_status));
157}
158
159/*******************************************************************************
160 *
161 * FUNCTION: acpi_ns_print_node_pathname 63 * FUNCTION: acpi_ns_print_node_pathname
162 * 64 *
163 * PARAMETERS: Node - Object 65 * PARAMETERS: Node - Object
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
index 1728cb9bf600..d2ff4325c427 100644
--- a/drivers/acpi/acpica/tbfadt.c
+++ b/drivers/acpi/acpica/tbfadt.c
@@ -49,7 +49,7 @@
49ACPI_MODULE_NAME("tbfadt") 49ACPI_MODULE_NAME("tbfadt")
50 50
51/* Local prototypes */ 51/* Local prototypes */
52static inline void 52static ACPI_INLINE void
53acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, 53acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
54 u8 space_id, u8 byte_width, u64 address); 54 u8 space_id, u8 byte_width, u64 address);
55 55
@@ -181,7 +181,7 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = {
181 * 181 *
182 ******************************************************************************/ 182 ******************************************************************************/
183 183
184static inline void 184static ACPI_INLINE void
185acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, 185acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
186 u8 space_id, u8 byte_width, u64 address) 186 u8 space_id, u8 byte_width, u64 address)
187{ 187{
diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c
index 983510640059..f21c486929a5 100644
--- a/drivers/acpi/acpica/utdebug.c
+++ b/drivers/acpi/acpica/utdebug.c
@@ -179,9 +179,8 @@ acpi_debug_print(u32 requested_debug_level,
179 if (thread_id != acpi_gbl_prev_thread_id) { 179 if (thread_id != acpi_gbl_prev_thread_id) {
180 if (ACPI_LV_THREADS & acpi_dbg_level) { 180 if (ACPI_LV_THREADS & acpi_dbg_level) {
181 acpi_os_printf 181 acpi_os_printf
182 ("\n**** Context Switch from TID %p to TID %p ****\n\n", 182 ("\n**** Context Switch from TID %u to TID %u ****\n\n",
183 ACPI_CAST_PTR(void, acpi_gbl_prev_thread_id), 183 (u32)acpi_gbl_prev_thread_id, (u32)thread_id);
184 ACPI_CAST_PTR(void, thread_id));
185 } 184 }
186 185
187 acpi_gbl_prev_thread_id = thread_id; 186 acpi_gbl_prev_thread_id = thread_id;
@@ -194,7 +193,7 @@ acpi_debug_print(u32 requested_debug_level,
194 acpi_os_printf("%8s-%04ld ", module_name, line_number); 193 acpi_os_printf("%8s-%04ld ", module_name, line_number);
195 194
196 if (ACPI_LV_THREADS & acpi_dbg_level) { 195 if (ACPI_LV_THREADS & acpi_dbg_level) {
197 acpi_os_printf("[%p] ", ACPI_CAST_PTR(void, thread_id)); 196 acpi_os_printf("[%u] ", (u32)thread_id);
198 } 197 }
199 198
200 acpi_os_printf("[%02ld] %-22.22s: ", 199 acpi_os_printf("[%02ld] %-22.22s: ",
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c
index 6dfdeb653490..22f59ef604e0 100644
--- a/drivers/acpi/acpica/uteval.c
+++ b/drivers/acpi/acpica/uteval.c
@@ -48,153 +48,6 @@
48#define _COMPONENT ACPI_UTILITIES 48#define _COMPONENT ACPI_UTILITIES
49ACPI_MODULE_NAME("uteval") 49ACPI_MODULE_NAME("uteval")
50 50
51/*
52 * Strings supported by the _OSI predefined (internal) method.
53 *
54 * March 2009: Removed "Linux" as this host no longer wants to respond true
55 * for this string. Basically, the only safe OS strings are windows-related
56 * and in many or most cases represent the only test path within the
57 * BIOS-provided ASL code.
58 *
59 * The second element of each entry is used to track the newest version of
60 * Windows that the BIOS has requested.
61 */
62static struct acpi_interface_info acpi_interfaces_supported[] = {
63 /* Operating System Vendor Strings */
64
65 {"Windows 2000", ACPI_OSI_WIN_2000}, /* Windows 2000 */
66 {"Windows 2001", ACPI_OSI_WIN_XP}, /* Windows XP */
67 {"Windows 2001 SP1", ACPI_OSI_WIN_XP_SP1}, /* Windows XP SP1 */
68 {"Windows 2001.1", ACPI_OSI_WINSRV_2003}, /* Windows Server 2003 */
69 {"Windows 2001 SP2", ACPI_OSI_WIN_XP_SP2}, /* Windows XP SP2 */
70 {"Windows 2001.1 SP1", ACPI_OSI_WINSRV_2003_SP1}, /* Windows Server 2003 SP1 - Added 03/2006 */
71 {"Windows 2006", ACPI_OSI_WIN_VISTA}, /* Windows Vista - Added 03/2006 */
72 {"Windows 2006.1", ACPI_OSI_WINSRV_2008}, /* Windows Server 2008 - Added 09/2009 */
73 {"Windows 2006 SP1", ACPI_OSI_WIN_VISTA_SP1}, /* Windows Vista SP1 - Added 09/2009 */
74 {"Windows 2009", ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */
75
76 /* Feature Group Strings */
77
78 {"Extended Address Space Descriptor", 0}
79
80 /*
81 * All "optional" feature group strings (features that are implemented
82 * by the host) should be implemented in the host version of
83 * acpi_os_validate_interface and should not be added here.
84 */
85};
86
87/*******************************************************************************
88 *
89 * FUNCTION: acpi_ut_osi_implementation
90 *
91 * PARAMETERS: walk_state - Current walk state
92 *
93 * RETURN: Status
94 *
95 * DESCRIPTION: Implementation of the _OSI predefined control method
96 *
97 ******************************************************************************/
98
99acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
100{
101 acpi_status status;
102 union acpi_operand_object *string_desc;
103 union acpi_operand_object *return_desc;
104 u32 return_value;
105 u32 i;
106
107 ACPI_FUNCTION_TRACE(ut_osi_implementation);
108
109 /* Validate the string input argument */
110
111 string_desc = walk_state->arguments[0].object;
112 if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
113 return_ACPI_STATUS(AE_TYPE);
114 }
115
116 /* Create a return object */
117
118 return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
119 if (!return_desc) {
120 return_ACPI_STATUS(AE_NO_MEMORY);
121 }
122
123 /* Default return value is 0, NOT SUPPORTED */
124
125 return_value = 0;
126
127 /* Compare input string to static table of supported interfaces */
128
129 for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
130 if (!ACPI_STRCMP(string_desc->string.pointer,
131 acpi_interfaces_supported[i].name)) {
132 /*
133 * The interface is supported.
134 * Update the osi_data if necessary. We keep track of the latest
135 * version of Windows that has been requested by the BIOS.
136 */
137 if (acpi_interfaces_supported[i].value >
138 acpi_gbl_osi_data) {
139 acpi_gbl_osi_data =
140 acpi_interfaces_supported[i].value;
141 }
142
143 return_value = ACPI_UINT32_MAX;
144 goto exit;
145 }
146 }
147
148 /*
149 * Did not match the string in the static table, call the host OSL to
150 * check for a match with one of the optional strings (such as
151 * "Module Device", "3.0 Thermal Model", etc.)
152 */
153 status = acpi_os_validate_interface(string_desc->string.pointer);
154 if (ACPI_SUCCESS(status)) {
155
156 /* The interface is supported */
157
158 return_value = ACPI_UINT32_MAX;
159 }
160
161exit:
162 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,
163 "ACPI: BIOS _OSI(%s) is %ssupported\n",
164 string_desc->string.pointer, return_value == 0 ? "not " : ""));
165
166 /* Complete the return value */
167
168 return_desc->integer.value = return_value;
169 walk_state->return_desc = return_desc;
170 return_ACPI_STATUS (AE_OK);
171}
172
173/*******************************************************************************
174 *
175 * FUNCTION: acpi_osi_invalidate
176 *
177 * PARAMETERS: interface_string
178 *
179 * RETURN: Status
180 *
181 * DESCRIPTION: invalidate string in pre-defiend _OSI string list
182 *
183 ******************************************************************************/
184
185acpi_status acpi_osi_invalidate(char *interface)
186{
187 int i;
188
189 for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
190 if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i].name)) {
191 *acpi_interfaces_supported[i].name = '\0';
192 return AE_OK;
193 }
194 }
195 return AE_NOT_FOUND;
196}
197
198/******************************************************************************* 51/*******************************************************************************
199 * 52 *
200 * FUNCTION: acpi_ut_evaluate_object 53 * FUNCTION: acpi_ut_evaluate_object
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c
index 0558747579ef..4a5dcaa268de 100644
--- a/drivers/acpi/acpica/utglobal.c
+++ b/drivers/acpi/acpica/utglobal.c
@@ -154,14 +154,16 @@ ACPI_EXPORT_SYMBOL(acpi_format_exception)
154 * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run 154 * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run
155 * during the initialization sequence. 155 * during the initialization sequence.
156 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to 156 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
157 * perform a Notify() operation on it. 157 * perform a Notify() operation on it. 09/2010: Changed to type Device.
158 * This still allows notifies, but does not confuse host code that
159 * searches for valid thermal_zone objects.
158 */ 160 */
159const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = { 161const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
160 {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL}, 162 {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
161 {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL}, 163 {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
162 {"_SB_", ACPI_TYPE_DEVICE, NULL}, 164 {"_SB_", ACPI_TYPE_DEVICE, NULL},
163 {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL}, 165 {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
164 {"_TZ_", ACPI_TYPE_THERMAL, NULL}, 166 {"_TZ_", ACPI_TYPE_DEVICE, NULL},
165 {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL}, 167 {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
166 {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, 168 {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
167 {"_GL_", ACPI_TYPE_MUTEX, (char *)1}, 169 {"_GL_", ACPI_TYPE_MUTEX, (char *)1},
@@ -774,6 +776,7 @@ acpi_status acpi_ut_init_globals(void)
774 acpi_gbl_exception_handler = NULL; 776 acpi_gbl_exception_handler = NULL;
775 acpi_gbl_init_handler = NULL; 777 acpi_gbl_init_handler = NULL;
776 acpi_gbl_table_handler = NULL; 778 acpi_gbl_table_handler = NULL;
779 acpi_gbl_interface_handler = NULL;
777 780
778 /* Global Lock support */ 781 /* Global Lock support */
779 782
@@ -800,6 +803,7 @@ acpi_status acpi_ut_init_globals(void)
800 acpi_gbl_debugger_configuration = DEBUGGER_THREADING; 803 acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
801 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT; 804 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
802 acpi_gbl_osi_data = 0; 805 acpi_gbl_osi_data = 0;
806 acpi_gbl_osi_mutex = NULL;
803 807
804 /* Hardware oriented */ 808 /* Hardware oriented */
805 809
diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c
index 1397fadd0d4b..d2906328535d 100644
--- a/drivers/acpi/acpica/utids.c
+++ b/drivers/acpi/acpica/utids.c
@@ -48,42 +48,6 @@
48#define _COMPONENT ACPI_UTILITIES 48#define _COMPONENT ACPI_UTILITIES
49ACPI_MODULE_NAME("utids") 49ACPI_MODULE_NAME("utids")
50 50
51/* Local prototypes */
52static void acpi_ut_copy_id_string(char *destination, char *source);
53
54/*******************************************************************************
55 *
56 * FUNCTION: acpi_ut_copy_id_string
57 *
58 * PARAMETERS: Destination - Where to copy the string
59 * Source - Source string
60 *
61 * RETURN: None
62 *
63 * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
64 * Performs removal of a leading asterisk if present -- workaround
65 * for a known issue on a bunch of machines.
66 *
67 ******************************************************************************/
68
69static void acpi_ut_copy_id_string(char *destination, char *source)
70{
71
72 /*
73 * Workaround for ID strings that have a leading asterisk. This construct
74 * is not allowed by the ACPI specification (ID strings must be
75 * alphanumeric), but enough existing machines have this embedded in their
76 * ID strings that the following code is useful.
77 */
78 if (*source == '*') {
79 source++;
80 }
81
82 /* Do the actual copy */
83
84 ACPI_STRCPY(destination, source);
85}
86
87/******************************************************************************* 51/*******************************************************************************
88 * 52 *
89 * FUNCTION: acpi_ut_execute_HID 53 * FUNCTION: acpi_ut_execute_HID
@@ -101,7 +65,6 @@ static void acpi_ut_copy_id_string(char *destination, char *source)
101 * NOTE: Internal function, no parameter validation 65 * NOTE: Internal function, no parameter validation
102 * 66 *
103 ******************************************************************************/ 67 ******************************************************************************/
104
105acpi_status 68acpi_status
106acpi_ut_execute_HID(struct acpi_namespace_node *device_node, 69acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
107 struct acpica_device_id **return_id) 70 struct acpica_device_id **return_id)
@@ -147,7 +110,7 @@ acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
147 if (obj_desc->common.type == ACPI_TYPE_INTEGER) { 110 if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
148 acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value); 111 acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value);
149 } else { 112 } else {
150 acpi_ut_copy_id_string(hid->string, obj_desc->string.pointer); 113 ACPI_STRCPY(hid->string, obj_desc->string.pointer);
151 } 114 }
152 115
153 hid->length = length; 116 hid->length = length;
@@ -224,7 +187,7 @@ acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
224 if (obj_desc->common.type == ACPI_TYPE_INTEGER) { 187 if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
225 acpi_ex_integer_to_string(uid->string, obj_desc->integer.value); 188 acpi_ex_integer_to_string(uid->string, obj_desc->integer.value);
226 } else { 189 } else {
227 acpi_ut_copy_id_string(uid->string, obj_desc->string.pointer); 190 ACPI_STRCPY(uid->string, obj_desc->string.pointer);
228 } 191 }
229 192
230 uid->length = length; 193 uid->length = length;
@@ -357,8 +320,8 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
357 320
358 /* Copy the String CID from the returned object */ 321 /* Copy the String CID from the returned object */
359 322
360 acpi_ut_copy_id_string(next_id_string, 323 ACPI_STRCPY(next_id_string,
361 cid_objects[i]->string.pointer); 324 cid_objects[i]->string.pointer);
362 length = cid_objects[i]->string.length + 1; 325 length = cid_objects[i]->string.length + 1;
363 } 326 }
364 327
diff --git a/drivers/acpi/acpica/utinit.c b/drivers/acpi/acpica/utinit.c
index a39c93dac719..c1b1c803ea9b 100644
--- a/drivers/acpi/acpica/utinit.c
+++ b/drivers/acpi/acpica/utinit.c
@@ -117,6 +117,10 @@ void acpi_ut_subsystem_shutdown(void)
117 /* Close the acpi_event Handling */ 117 /* Close the acpi_event Handling */
118 118
119 acpi_ev_terminate(); 119 acpi_ev_terminate();
120
121 /* Delete any dynamic _OSI interfaces */
122
123 acpi_ut_interface_terminate();
120#endif 124#endif
121 125
122 /* Close the Namespace */ 126 /* Close the Namespace */
diff --git a/drivers/acpi/acpica/utmath.c b/drivers/acpi/acpica/utmath.c
index 35059a14eb72..49cf7b7fd816 100644
--- a/drivers/acpi/acpica/utmath.c
+++ b/drivers/acpi/acpica/utmath.c
@@ -48,11 +48,27 @@
48ACPI_MODULE_NAME("utmath") 48ACPI_MODULE_NAME("utmath")
49 49
50/* 50/*
51 * Support for double-precision integer divide. This code is included here 51 * Optional support for 64-bit double-precision integer divide. This code
52 * in order to support kernel environments where the double-precision math 52 * is configurable and is implemented in order to support 32-bit kernel
53 * library is not available. 53 * environments where a 64-bit double-precision math library is not available.
54 *
55 * Support for a more normal 64-bit divide/modulo (with check for a divide-
56 * by-zero) appears after this optional section of code.
54 */ 57 */
55#ifndef ACPI_USE_NATIVE_DIVIDE 58#ifndef ACPI_USE_NATIVE_DIVIDE
59/* Structures used only for 64-bit divide */
60typedef struct uint64_struct {
61 u32 lo;
62 u32 hi;
63
64} uint64_struct;
65
66typedef union uint64_overlay {
67 u64 full;
68 struct uint64_struct part;
69
70} uint64_overlay;
71
56/******************************************************************************* 72/*******************************************************************************
57 * 73 *
58 * FUNCTION: acpi_ut_short_divide 74 * FUNCTION: acpi_ut_short_divide
@@ -69,6 +85,7 @@ ACPI_MODULE_NAME("utmath")
69 * 32-bit remainder. 85 * 32-bit remainder.
70 * 86 *
71 ******************************************************************************/ 87 ******************************************************************************/
88
72acpi_status 89acpi_status
73acpi_ut_short_divide(u64 dividend, 90acpi_ut_short_divide(u64 dividend,
74 u32 divisor, u64 *out_quotient, u32 *out_remainder) 91 u32 divisor, u64 *out_quotient, u32 *out_remainder)
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c
index e8d0724ee403..c7d0e05ef5a4 100644
--- a/drivers/acpi/acpica/utmisc.c
+++ b/drivers/acpi/acpica/utmisc.c
@@ -50,11 +50,6 @@
50#define _COMPONENT ACPI_UTILITIES 50#define _COMPONENT ACPI_UTILITIES
51ACPI_MODULE_NAME("utmisc") 51ACPI_MODULE_NAME("utmisc")
52 52
53/*
54 * Common suffix for messages
55 */
56#define ACPI_COMMON_MSG_SUFFIX \
57 acpi_os_printf(" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
58/******************************************************************************* 53/*******************************************************************************
59 * 54 *
60 * FUNCTION: acpi_ut_validate_exception 55 * FUNCTION: acpi_ut_validate_exception
@@ -1044,160 +1039,3 @@ acpi_ut_walk_package_tree(union acpi_operand_object * source_object,
1044 1039
1045 return_ACPI_STATUS(AE_AML_INTERNAL); 1040 return_ACPI_STATUS(AE_AML_INTERNAL);
1046} 1041}
1047
1048/*******************************************************************************
1049 *
1050 * FUNCTION: acpi_error, acpi_exception, acpi_warning, acpi_info
1051 *
1052 * PARAMETERS: module_name - Caller's module name (for error output)
1053 * line_number - Caller's line number (for error output)
1054 * Format - Printf format string + additional args
1055 *
1056 * RETURN: None
1057 *
1058 * DESCRIPTION: Print message with module/line/version info
1059 *
1060 ******************************************************************************/
1061
1062void ACPI_INTERNAL_VAR_XFACE
1063acpi_error(const char *module_name, u32 line_number, const char *format, ...)
1064{
1065 va_list args;
1066
1067 acpi_os_printf("ACPI Error: ");
1068
1069 va_start(args, format);
1070 acpi_os_vprintf(format, args);
1071 ACPI_COMMON_MSG_SUFFIX;
1072 va_end(args);
1073}
1074
1075void ACPI_INTERNAL_VAR_XFACE
1076acpi_exception(const char *module_name,
1077 u32 line_number, acpi_status status, const char *format, ...)
1078{
1079 va_list args;
1080
1081 acpi_os_printf("ACPI Exception: %s, ", acpi_format_exception(status));
1082
1083 va_start(args, format);
1084 acpi_os_vprintf(format, args);
1085 ACPI_COMMON_MSG_SUFFIX;
1086 va_end(args);
1087}
1088
1089void ACPI_INTERNAL_VAR_XFACE
1090acpi_warning(const char *module_name, u32 line_number, const char *format, ...)
1091{
1092 va_list args;
1093
1094 acpi_os_printf("ACPI Warning: ");
1095
1096 va_start(args, format);
1097 acpi_os_vprintf(format, args);
1098 ACPI_COMMON_MSG_SUFFIX;
1099 va_end(args);
1100}
1101
1102void ACPI_INTERNAL_VAR_XFACE
1103acpi_info(const char *module_name, u32 line_number, const char *format, ...)
1104{
1105 va_list args;
1106
1107 acpi_os_printf("ACPI: ");
1108
1109 va_start(args, format);
1110 acpi_os_vprintf(format, args);
1111 acpi_os_printf("\n");
1112 va_end(args);
1113}
1114
1115ACPI_EXPORT_SYMBOL(acpi_error)
1116ACPI_EXPORT_SYMBOL(acpi_exception)
1117ACPI_EXPORT_SYMBOL(acpi_warning)
1118ACPI_EXPORT_SYMBOL(acpi_info)
1119
1120/*******************************************************************************
1121 *
1122 * FUNCTION: acpi_ut_predefined_warning
1123 *
1124 * PARAMETERS: module_name - Caller's module name (for error output)
1125 * line_number - Caller's line number (for error output)
1126 * Pathname - Full pathname to the node
1127 * node_flags - From Namespace node for the method/object
1128 * Format - Printf format string + additional args
1129 *
1130 * RETURN: None
1131 *
1132 * DESCRIPTION: Warnings for the predefined validation module. Messages are
1133 * only emitted the first time a problem with a particular
1134 * method/object is detected. This prevents a flood of error
1135 * messages for methods that are repeatedly evaluated.
1136 *
1137******************************************************************************/
1138
1139void ACPI_INTERNAL_VAR_XFACE
1140acpi_ut_predefined_warning(const char *module_name,
1141 u32 line_number,
1142 char *pathname,
1143 u8 node_flags, const char *format, ...)
1144{
1145 va_list args;
1146
1147 /*
1148 * Warning messages for this method/object will be disabled after the
1149 * first time a validation fails or an object is successfully repaired.
1150 */
1151 if (node_flags & ANOBJ_EVALUATED) {
1152 return;
1153 }
1154
1155 acpi_os_printf("ACPI Warning for %s: ", pathname);
1156
1157 va_start(args, format);
1158 acpi_os_vprintf(format, args);
1159 ACPI_COMMON_MSG_SUFFIX;
1160 va_end(args);
1161}
1162
1163/*******************************************************************************
1164 *
1165 * FUNCTION: acpi_ut_predefined_info
1166 *
1167 * PARAMETERS: module_name - Caller's module name (for error output)
1168 * line_number - Caller's line number (for error output)
1169 * Pathname - Full pathname to the node
1170 * node_flags - From Namespace node for the method/object
1171 * Format - Printf format string + additional args
1172 *
1173 * RETURN: None
1174 *
1175 * DESCRIPTION: Info messages for the predefined validation module. Messages
1176 * are only emitted the first time a problem with a particular
1177 * method/object is detected. This prevents a flood of
1178 * messages for methods that are repeatedly evaluated.
1179 *
1180 ******************************************************************************/
1181
1182void ACPI_INTERNAL_VAR_XFACE
1183acpi_ut_predefined_info(const char *module_name,
1184 u32 line_number,
1185 char *pathname, u8 node_flags, const char *format, ...)
1186{
1187 va_list args;
1188
1189 /*
1190 * Warning messages for this method/object will be disabled after the
1191 * first time a validation fails or an object is successfully repaired.
1192 */
1193 if (node_flags & ANOBJ_EVALUATED) {
1194 return;
1195 }
1196
1197 acpi_os_printf("ACPI Info for %s: ", pathname);
1198
1199 va_start(args, format);
1200 acpi_os_vprintf(format, args);
1201 ACPI_COMMON_MSG_SUFFIX;
1202 va_end(args);
1203}
diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c
index f5cca3a1300c..d9efa495b433 100644
--- a/drivers/acpi/acpica/utmutex.c
+++ b/drivers/acpi/acpica/utmutex.c
@@ -86,6 +86,12 @@ acpi_status acpi_ut_mutex_initialize(void)
86 spin_lock_init(acpi_gbl_gpe_lock); 86 spin_lock_init(acpi_gbl_gpe_lock);
87 spin_lock_init(acpi_gbl_hardware_lock); 87 spin_lock_init(acpi_gbl_hardware_lock);
88 88
89 /* Mutex for _OSI support */
90 status = acpi_os_create_mutex(&acpi_gbl_osi_mutex);
91 if (ACPI_FAILURE(status)) {
92 return_ACPI_STATUS(status);
93 }
94
89 /* Create the reader/writer lock for namespace access */ 95 /* Create the reader/writer lock for namespace access */
90 96
91 status = acpi_ut_create_rw_lock(&acpi_gbl_namespace_rw_lock); 97 status = acpi_ut_create_rw_lock(&acpi_gbl_namespace_rw_lock);
@@ -117,6 +123,8 @@ void acpi_ut_mutex_terminate(void)
117 acpi_ut_delete_mutex(i); 123 acpi_ut_delete_mutex(i);
118 } 124 }
119 125
126 acpi_os_delete_mutex(acpi_gbl_osi_mutex);
127
120 /* Delete the spinlocks */ 128 /* Delete the spinlocks */
121 129
122 acpi_os_delete_lock(acpi_gbl_gpe_lock); 130 acpi_os_delete_lock(acpi_gbl_gpe_lock);
@@ -220,18 +228,17 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
220 if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) { 228 if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {
221 if (i == mutex_id) { 229 if (i == mutex_id) {
222 ACPI_ERROR((AE_INFO, 230 ACPI_ERROR((AE_INFO,
223 "Mutex [%s] already acquired by this thread [%p]", 231 "Mutex [%s] already acquired by this thread [%u]",
224 acpi_ut_get_mutex_name 232 acpi_ut_get_mutex_name
225 (mutex_id), 233 (mutex_id),
226 ACPI_CAST_PTR(void, 234 (u32)this_thread_id));
227 this_thread_id)));
228 235
229 return (AE_ALREADY_ACQUIRED); 236 return (AE_ALREADY_ACQUIRED);
230 } 237 }
231 238
232 ACPI_ERROR((AE_INFO, 239 ACPI_ERROR((AE_INFO,
233 "Invalid acquire order: Thread %p owns [%s], wants [%s]", 240 "Invalid acquire order: Thread %u owns [%s], wants [%s]",
234 ACPI_CAST_PTR(void, this_thread_id), 241 (u32)this_thread_id,
235 acpi_ut_get_mutex_name(i), 242 acpi_ut_get_mutex_name(i),
236 acpi_ut_get_mutex_name(mutex_id))); 243 acpi_ut_get_mutex_name(mutex_id)));
237 244
@@ -242,24 +249,24 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
242#endif 249#endif
243 250
244 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, 251 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
245 "Thread %p attempting to acquire Mutex [%s]\n", 252 "Thread %u attempting to acquire Mutex [%s]\n",
246 ACPI_CAST_PTR(void, this_thread_id), 253 (u32)this_thread_id,
247 acpi_ut_get_mutex_name(mutex_id))); 254 acpi_ut_get_mutex_name(mutex_id)));
248 255
249 status = acpi_os_acquire_mutex(acpi_gbl_mutex_info[mutex_id].mutex, 256 status = acpi_os_acquire_mutex(acpi_gbl_mutex_info[mutex_id].mutex,
250 ACPI_WAIT_FOREVER); 257 ACPI_WAIT_FOREVER);
251 if (ACPI_SUCCESS(status)) { 258 if (ACPI_SUCCESS(status)) {
252 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, 259 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
253 "Thread %p acquired Mutex [%s]\n", 260 "Thread %u acquired Mutex [%s]\n",
254 ACPI_CAST_PTR(void, this_thread_id), 261 (u32)this_thread_id,
255 acpi_ut_get_mutex_name(mutex_id))); 262 acpi_ut_get_mutex_name(mutex_id)));
256 263
257 acpi_gbl_mutex_info[mutex_id].use_count++; 264 acpi_gbl_mutex_info[mutex_id].use_count++;
258 acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id; 265 acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id;
259 } else { 266 } else {
260 ACPI_EXCEPTION((AE_INFO, status, 267 ACPI_EXCEPTION((AE_INFO, status,
261 "Thread %p could not acquire Mutex [0x%X]", 268 "Thread %u could not acquire Mutex [0x%X]",
262 ACPI_CAST_PTR(void, this_thread_id), mutex_id)); 269 (u32)this_thread_id, mutex_id));
263 } 270 }
264 271
265 return (status); 272 return (status);
@@ -279,10 +286,14 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
279 286
280acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id) 287acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
281{ 288{
289 acpi_thread_id this_thread_id;
290
282 ACPI_FUNCTION_NAME(ut_release_mutex); 291 ACPI_FUNCTION_NAME(ut_release_mutex);
283 292
284 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Thread %p releasing Mutex [%s]\n", 293 this_thread_id = acpi_os_get_thread_id();
285 ACPI_CAST_PTR(void, acpi_os_get_thread_id()), 294
295 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Thread %u releasing Mutex [%s]\n",
296 (u32)this_thread_id,
286 acpi_ut_get_mutex_name(mutex_id))); 297 acpi_ut_get_mutex_name(mutex_id)));
287 298
288 if (mutex_id > ACPI_MAX_MUTEX) { 299 if (mutex_id > ACPI_MAX_MUTEX) {
diff --git a/drivers/acpi/acpica/utosi.c b/drivers/acpi/acpica/utosi.c
new file mode 100644
index 000000000000..18c59a85fdca
--- /dev/null
+++ b/drivers/acpi/acpica/utosi.c
@@ -0,0 +1,380 @@
1/******************************************************************************
2 *
3 * Module Name: utosi - Support for the _OSI predefined control method
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2010, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46
47#define _COMPONENT ACPI_UTILITIES
48ACPI_MODULE_NAME("utosi")
49
50/*
51 * Strings supported by the _OSI predefined control method (which is
52 * implemented internally within this module.)
53 *
54 * March 2009: Removed "Linux" as this host no longer wants to respond true
55 * for this string. Basically, the only safe OS strings are windows-related
56 * and in many or most cases represent the only test path within the
57 * BIOS-provided ASL code.
58 *
59 * The last element of each entry is used to track the newest version of
60 * Windows that the BIOS has requested.
61 */
62static struct acpi_interface_info acpi_default_supported_interfaces[] = {
63 /* Operating System Vendor Strings */
64
65 {"Windows 2000", NULL, 0, ACPI_OSI_WIN_2000}, /* Windows 2000 */
66 {"Windows 2001", NULL, 0, ACPI_OSI_WIN_XP}, /* Windows XP */
67 {"Windows 2001 SP1", NULL, 0, ACPI_OSI_WIN_XP_SP1}, /* Windows XP SP1 */
68 {"Windows 2001.1", NULL, 0, ACPI_OSI_WINSRV_2003}, /* Windows Server 2003 */
69 {"Windows 2001 SP2", NULL, 0, ACPI_OSI_WIN_XP_SP2}, /* Windows XP SP2 */
70 {"Windows 2001.1 SP1", NULL, 0, ACPI_OSI_WINSRV_2003_SP1}, /* Windows Server 2003 SP1 - Added 03/2006 */
71 {"Windows 2006", NULL, 0, ACPI_OSI_WIN_VISTA}, /* Windows Vista - Added 03/2006 */
72 {"Windows 2006.1", NULL, 0, ACPI_OSI_WINSRV_2008}, /* Windows Server 2008 - Added 09/2009 */
73 {"Windows 2006 SP1", NULL, 0, ACPI_OSI_WIN_VISTA_SP1}, /* Windows Vista SP1 - Added 09/2009 */
74 {"Windows 2006 SP2", NULL, 0, ACPI_OSI_WIN_VISTA_SP2}, /* Windows Vista SP2 - Added 09/2010 */
75 {"Windows 2009", NULL, 0, ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */
76
77 /* Feature Group Strings */
78
79 {"Extended Address Space Descriptor", NULL, 0, 0}
80
81 /*
82 * All "optional" feature group strings (features that are implemented
83 * by the host) should be dynamically added by the host via
84 * acpi_install_interface and should not be manually added here.
85 *
86 * Examples of optional feature group strings:
87 *
88 * "Module Device"
89 * "Processor Device"
90 * "3.0 Thermal Model"
91 * "3.0 _SCP Extensions"
92 * "Processor Aggregator Device"
93 */
94};
95
96/*******************************************************************************
97 *
98 * FUNCTION: acpi_ut_initialize_interfaces
99 *
100 * PARAMETERS: None
101 *
102 * RETURN: Status
103 *
104 * DESCRIPTION: Initialize the global _OSI supported interfaces list
105 *
106 ******************************************************************************/
107
108acpi_status acpi_ut_initialize_interfaces(void)
109{
110 u32 i;
111
112 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
113 acpi_gbl_supported_interfaces = acpi_default_supported_interfaces;
114
115 /* Link the static list of supported interfaces */
116
117 for (i = 0;
118 i < (ACPI_ARRAY_LENGTH(acpi_default_supported_interfaces) - 1);
119 i++) {
120 acpi_default_supported_interfaces[i].next =
121 &acpi_default_supported_interfaces[(acpi_size) i + 1];
122 }
123
124 acpi_os_release_mutex(acpi_gbl_osi_mutex);
125 return (AE_OK);
126}
127
128/*******************************************************************************
129 *
130 * FUNCTION: acpi_ut_interface_terminate
131 *
132 * PARAMETERS: None
133 *
134 * RETURN: None
135 *
136 * DESCRIPTION: Delete all interfaces in the global list. Sets
137 * acpi_gbl_supported_interfaces to NULL.
138 *
139 ******************************************************************************/
140
141void acpi_ut_interface_terminate(void)
142{
143 struct acpi_interface_info *next_interface;
144
145 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
146 next_interface = acpi_gbl_supported_interfaces;
147
148 while (next_interface) {
149 acpi_gbl_supported_interfaces = next_interface->next;
150
151 /* Only interfaces added at runtime can be freed */
152
153 if (next_interface->flags & ACPI_OSI_DYNAMIC) {
154 ACPI_FREE(next_interface->name);
155 ACPI_FREE(next_interface);
156 }
157
158 next_interface = acpi_gbl_supported_interfaces;
159 }
160
161 acpi_os_release_mutex(acpi_gbl_osi_mutex);
162}
163
164/*******************************************************************************
165 *
166 * FUNCTION: acpi_ut_install_interface
167 *
168 * PARAMETERS: interface_name - The interface to install
169 *
170 * RETURN: Status
171 *
172 * DESCRIPTION: Install the interface into the global interface list.
173 * Caller MUST hold acpi_gbl_osi_mutex
174 *
175 ******************************************************************************/
176
177acpi_status acpi_ut_install_interface(acpi_string interface_name)
178{
179 struct acpi_interface_info *interface_info;
180
181 /* Allocate info block and space for the name string */
182
183 interface_info =
184 ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_interface_info));
185 if (!interface_info) {
186 return (AE_NO_MEMORY);
187 }
188
189 interface_info->name =
190 ACPI_ALLOCATE_ZEROED(ACPI_STRLEN(interface_name) + 1);
191 if (!interface_info->name) {
192 ACPI_FREE(interface_info);
193 return (AE_NO_MEMORY);
194 }
195
196 /* Initialize new info and insert at the head of the global list */
197
198 ACPI_STRCPY(interface_info->name, interface_name);
199 interface_info->flags = ACPI_OSI_DYNAMIC;
200 interface_info->next = acpi_gbl_supported_interfaces;
201
202 acpi_gbl_supported_interfaces = interface_info;
203 return (AE_OK);
204}
205
206/*******************************************************************************
207 *
208 * FUNCTION: acpi_ut_remove_interface
209 *
210 * PARAMETERS: interface_name - The interface to remove
211 *
212 * RETURN: Status
213 *
214 * DESCRIPTION: Remove the interface from the global interface list.
215 * Caller MUST hold acpi_gbl_osi_mutex
216 *
217 ******************************************************************************/
218
219acpi_status acpi_ut_remove_interface(acpi_string interface_name)
220{
221 struct acpi_interface_info *previous_interface;
222 struct acpi_interface_info *next_interface;
223
224 previous_interface = next_interface = acpi_gbl_supported_interfaces;
225 while (next_interface) {
226 if (!ACPI_STRCMP(interface_name, next_interface->name)) {
227
228 /* Found: name is in either the static list or was added at runtime */
229
230 if (next_interface->flags & ACPI_OSI_DYNAMIC) {
231
232 /* Interface was added dynamically, remove and free it */
233
234 if (previous_interface == next_interface) {
235 acpi_gbl_supported_interfaces =
236 next_interface->next;
237 } else {
238 previous_interface->next =
239 next_interface->next;
240 }
241
242 ACPI_FREE(next_interface->name);
243 ACPI_FREE(next_interface);
244 } else {
245 /*
246 * Interface is in static list. If marked invalid, then it
247 * does not actually exist. Else, mark it invalid.
248 */
249 if (next_interface->flags & ACPI_OSI_INVALID) {
250 return (AE_NOT_EXIST);
251 }
252
253 next_interface->flags |= ACPI_OSI_INVALID;
254 }
255
256 return (AE_OK);
257 }
258
259 previous_interface = next_interface;
260 next_interface = next_interface->next;
261 }
262
263 /* Interface was not found */
264
265 return (AE_NOT_EXIST);
266}
267
268/*******************************************************************************
269 *
270 * FUNCTION: acpi_ut_get_interface
271 *
272 * PARAMETERS: interface_name - The interface to find
273 *
274 * RETURN: struct acpi_interface_info if found. NULL if not found.
275 *
276 * DESCRIPTION: Search for the specified interface name in the global list.
277 * Caller MUST hold acpi_gbl_osi_mutex
278 *
279 ******************************************************************************/
280
281struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name)
282{
283 struct acpi_interface_info *next_interface;
284
285 next_interface = acpi_gbl_supported_interfaces;
286 while (next_interface) {
287 if (!ACPI_STRCMP(interface_name, next_interface->name)) {
288 return (next_interface);
289 }
290
291 next_interface = next_interface->next;
292 }
293
294 return (NULL);
295}
296
297/*******************************************************************************
298 *
299 * FUNCTION: acpi_ut_osi_implementation
300 *
301 * PARAMETERS: walk_state - Current walk state
302 *
303 * RETURN: Status
304 *
305 * DESCRIPTION: Implementation of the _OSI predefined control method. When
306 * an invocation of _OSI is encountered in the system AML,
307 * control is transferred to this function.
308 *
309 ******************************************************************************/
310
311acpi_status acpi_ut_osi_implementation(struct acpi_walk_state * walk_state)
312{
313 union acpi_operand_object *string_desc;
314 union acpi_operand_object *return_desc;
315 struct acpi_interface_info *interface_info;
316 acpi_interface_handler interface_handler;
317 u32 return_value;
318
319 ACPI_FUNCTION_TRACE(ut_osi_implementation);
320
321 /* Validate the string input argument (from the AML caller) */
322
323 string_desc = walk_state->arguments[0].object;
324 if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
325 return_ACPI_STATUS(AE_TYPE);
326 }
327
328 /* Create a return object */
329
330 return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
331 if (!return_desc) {
332 return_ACPI_STATUS(AE_NO_MEMORY);
333 }
334
335 /* Default return value is 0, NOT SUPPORTED */
336
337 return_value = 0;
338 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
339
340 /* Lookup the interface in the global _OSI list */
341
342 interface_info = acpi_ut_get_interface(string_desc->string.pointer);
343 if (interface_info && !(interface_info->flags & ACPI_OSI_INVALID)) {
344 /*
345 * The interface is supported.
346 * Update the osi_data if necessary. We keep track of the latest
347 * version of Windows that has been requested by the BIOS.
348 */
349 if (interface_info->value > acpi_gbl_osi_data) {
350 acpi_gbl_osi_data = interface_info->value;
351 }
352
353 return_value = ACPI_UINT32_MAX;
354 }
355
356 acpi_os_release_mutex(acpi_gbl_osi_mutex);
357
358 /*
359 * Invoke an optional _OSI interface handler. The host OS may wish
360 * to do some interface-specific handling. For example, warn about
361 * certain interfaces or override the true/false support value.
362 */
363 interface_handler = acpi_gbl_interface_handler;
364 if (interface_handler) {
365 return_value =
366 interface_handler(string_desc->string.pointer,
367 return_value);
368 }
369
370 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO,
371 "ACPI: BIOS _OSI(\"%s\") is %ssupported\n",
372 string_desc->string.pointer,
373 return_value == 0 ? "not " : ""));
374
375 /* Complete the return object */
376
377 return_desc->integer.value = return_value;
378 walk_state->return_desc = return_desc;
379 return_ACPI_STATUS(AE_OK);
380}
diff --git a/drivers/acpi/acpica/utxface.c b/drivers/acpi/acpica/utxface.c
index 7f8cefcb2b32..c2da90f5fbe9 100644
--- a/drivers/acpi/acpica/utxface.c
+++ b/drivers/acpi/acpica/utxface.c
@@ -110,6 +110,15 @@ acpi_status __init acpi_initialize_subsystem(void)
110 return_ACPI_STATUS(status); 110 return_ACPI_STATUS(status);
111 } 111 }
112 112
113 /* Initialize the global OSI interfaces list with the static names */
114
115 status = acpi_ut_initialize_interfaces();
116 if (ACPI_FAILURE(status)) {
117 ACPI_EXCEPTION((AE_INFO, status,
118 "During OSI interfaces initialization"));
119 return_ACPI_STATUS(status);
120 }
121
113 /* If configured, initialize the AML debugger */ 122 /* If configured, initialize the AML debugger */
114 123
115 ACPI_DEBUGGER_EXEC(status = acpi_db_initialize()); 124 ACPI_DEBUGGER_EXEC(status = acpi_db_initialize());
@@ -506,6 +515,7 @@ acpi_install_initialization_handler(acpi_init_handler handler, u32 function)
506 515
507ACPI_EXPORT_SYMBOL(acpi_install_initialization_handler) 516ACPI_EXPORT_SYMBOL(acpi_install_initialization_handler)
508#endif /* ACPI_FUTURE_USAGE */ 517#endif /* ACPI_FUTURE_USAGE */
518
509/***************************************************************************** 519/*****************************************************************************
510 * 520 *
511 * FUNCTION: acpi_purge_cached_objects 521 * FUNCTION: acpi_purge_cached_objects
@@ -529,4 +539,117 @@ acpi_status acpi_purge_cached_objects(void)
529} 539}
530 540
531ACPI_EXPORT_SYMBOL(acpi_purge_cached_objects) 541ACPI_EXPORT_SYMBOL(acpi_purge_cached_objects)
532#endif 542
543/*****************************************************************************
544 *
545 * FUNCTION: acpi_install_interface
546 *
547 * PARAMETERS: interface_name - The interface to install
548 *
549 * RETURN: Status
550 *
551 * DESCRIPTION: Install an _OSI interface to the global list
552 *
553 ****************************************************************************/
554acpi_status acpi_install_interface(acpi_string interface_name)
555{
556 acpi_status status;
557 struct acpi_interface_info *interface_info;
558
559 /* Parameter validation */
560
561 if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) {
562 return (AE_BAD_PARAMETER);
563 }
564
565 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
566
567 /* Check if the interface name is already in the global list */
568
569 interface_info = acpi_ut_get_interface(interface_name);
570 if (interface_info) {
571 /*
572 * The interface already exists in the list. This is OK if the
573 * interface has been marked invalid -- just clear the bit.
574 */
575 if (interface_info->flags & ACPI_OSI_INVALID) {
576 interface_info->flags &= ~ACPI_OSI_INVALID;
577 status = AE_OK;
578 } else {
579 status = AE_ALREADY_EXISTS;
580 }
581 } else {
582 /* New interface name, install into the global list */
583
584 status = acpi_ut_install_interface(interface_name);
585 }
586
587 acpi_os_release_mutex(acpi_gbl_osi_mutex);
588 return (status);
589}
590
591ACPI_EXPORT_SYMBOL(acpi_install_interface)
592
593/*****************************************************************************
594 *
595 * FUNCTION: acpi_remove_interface
596 *
597 * PARAMETERS: interface_name - The interface to remove
598 *
599 * RETURN: Status
600 *
601 * DESCRIPTION: Remove an _OSI interface from the global list
602 *
603 ****************************************************************************/
604acpi_status acpi_remove_interface(acpi_string interface_name)
605{
606 acpi_status status;
607
608 /* Parameter validation */
609
610 if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) {
611 return (AE_BAD_PARAMETER);
612 }
613
614 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
615
616 status = acpi_ut_remove_interface(interface_name);
617
618 acpi_os_release_mutex(acpi_gbl_osi_mutex);
619 return (status);
620}
621
622ACPI_EXPORT_SYMBOL(acpi_remove_interface)
623
624/*****************************************************************************
625 *
626 * FUNCTION: acpi_install_interface_handler
627 *
628 * PARAMETERS: Handler - The _OSI interface handler to install
629 * NULL means "remove existing handler"
630 *
631 * RETURN: Status
632 *
633 * DESCRIPTION: Install a handler for the predefined _OSI ACPI method.
634 * invoked during execution of the internal implementation of
635 * _OSI. A NULL handler simply removes any existing handler.
636 *
637 ****************************************************************************/
638acpi_status acpi_install_interface_handler(acpi_interface_handler handler)
639{
640 acpi_status status = AE_OK;
641
642 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
643
644 if (handler && acpi_gbl_interface_handler) {
645 status = AE_ALREADY_EXISTS;
646 } else {
647 acpi_gbl_interface_handler = handler;
648 }
649
650 acpi_os_release_mutex(acpi_gbl_osi_mutex);
651 return (status);
652}
653
654ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
655#endif /* !ACPI_ASL_COMPILER */
diff --git a/drivers/acpi/acpica/utxferror.c b/drivers/acpi/acpica/utxferror.c
new file mode 100644
index 000000000000..6f12e314fbae
--- /dev/null
+++ b/drivers/acpi/acpica/utxferror.c
@@ -0,0 +1,415 @@
1/*******************************************************************************
2 *
3 * Module Name: utxferror - Various error/warning output functions
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2010, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46#include "acnamesp.h"
47
48#define _COMPONENT ACPI_UTILITIES
49ACPI_MODULE_NAME("utxferror")
50
51/*
52 * This module is used for the in-kernel ACPICA as well as the ACPICA
53 * tools/applications.
54 *
55 * For the i_aSL compiler case, the output is redirected to stderr so that
56 * any of the various ACPI errors and warnings do not appear in the output
57 * files, for either the compiler or disassembler portions of the tool.
58 */
59#ifdef ACPI_ASL_COMPILER
60#include <stdio.h>
61extern FILE *acpi_gbl_output_file;
62
63#define ACPI_MSG_REDIRECT_BEGIN \
64 FILE *output_file = acpi_gbl_output_file; \
65 acpi_os_redirect_output (stderr);
66
67#define ACPI_MSG_REDIRECT_END \
68 acpi_os_redirect_output (output_file);
69
70#else
71/*
72 * non-i_aSL case - no redirection, nothing to do
73 */
74#define ACPI_MSG_REDIRECT_BEGIN
75#define ACPI_MSG_REDIRECT_END
76#endif
77/*
78 * Common message prefixes
79 */
80#define ACPI_MSG_ERROR "ACPI Error: "
81#define ACPI_MSG_EXCEPTION "ACPI Exception: "
82#define ACPI_MSG_WARNING "ACPI Warning: "
83#define ACPI_MSG_INFO "ACPI: "
84/*
85 * Common message suffix
86 */
87#define ACPI_MSG_SUFFIX \
88 acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
89/*******************************************************************************
90 *
91 * FUNCTION: acpi_error
92 *
93 * PARAMETERS: module_name - Caller's module name (for error output)
94 * line_number - Caller's line number (for error output)
95 * Format - Printf format string + additional args
96 *
97 * RETURN: None
98 *
99 * DESCRIPTION: Print "ACPI Error" message with module/line/version info
100 *
101 ******************************************************************************/
102void ACPI_INTERNAL_VAR_XFACE
103acpi_error(const char *module_name, u32 line_number, const char *format, ...)
104{
105 va_list arg_list;
106
107 ACPI_MSG_REDIRECT_BEGIN;
108 acpi_os_printf(ACPI_MSG_ERROR);
109
110 va_start(arg_list, format);
111 acpi_os_vprintf(format, arg_list);
112 ACPI_MSG_SUFFIX;
113 va_end(arg_list);
114
115 ACPI_MSG_REDIRECT_END;
116}
117
118ACPI_EXPORT_SYMBOL(acpi_error)
119
120/*******************************************************************************
121 *
122 * FUNCTION: acpi_exception
123 *
124 * PARAMETERS: module_name - Caller's module name (for error output)
125 * line_number - Caller's line number (for error output)
126 * Status - Status to be formatted
127 * Format - Printf format string + additional args
128 *
129 * RETURN: None
130 *
131 * DESCRIPTION: Print "ACPI Exception" message with module/line/version info
132 * and decoded acpi_status.
133 *
134 ******************************************************************************/
135void ACPI_INTERNAL_VAR_XFACE
136acpi_exception(const char *module_name,
137 u32 line_number, acpi_status status, const char *format, ...)
138{
139 va_list arg_list;
140
141 ACPI_MSG_REDIRECT_BEGIN;
142 acpi_os_printf(ACPI_MSG_EXCEPTION "%s, ",
143 acpi_format_exception(status));
144
145 va_start(arg_list, format);
146 acpi_os_vprintf(format, arg_list);
147 ACPI_MSG_SUFFIX;
148 va_end(arg_list);
149
150 ACPI_MSG_REDIRECT_END;
151}
152
153ACPI_EXPORT_SYMBOL(acpi_exception)
154
155/*******************************************************************************
156 *
157 * FUNCTION: acpi_warning
158 *
159 * PARAMETERS: module_name - Caller's module name (for error output)
160 * line_number - Caller's line number (for error output)
161 * Format - Printf format string + additional args
162 *
163 * RETURN: None
164 *
165 * DESCRIPTION: Print "ACPI Warning" message with module/line/version info
166 *
167 ******************************************************************************/
168void ACPI_INTERNAL_VAR_XFACE
169acpi_warning(const char *module_name, u32 line_number, const char *format, ...)
170{
171 va_list arg_list;
172
173 ACPI_MSG_REDIRECT_BEGIN;
174 acpi_os_printf(ACPI_MSG_WARNING);
175
176 va_start(arg_list, format);
177 acpi_os_vprintf(format, arg_list);
178 ACPI_MSG_SUFFIX;
179 va_end(arg_list);
180
181 ACPI_MSG_REDIRECT_END;
182}
183
184ACPI_EXPORT_SYMBOL(acpi_warning)
185
186/*******************************************************************************
187 *
188 * FUNCTION: acpi_info
189 *
190 * PARAMETERS: module_name - Caller's module name (for error output)
191 * line_number - Caller's line number (for error output)
192 * Format - Printf format string + additional args
193 *
194 * RETURN: None
195 *
196 * DESCRIPTION: Print generic "ACPI:" information message. There is no
197 * module/line/version info in order to keep the message simple.
198 *
199 * TBD: module_name and line_number args are not needed, should be removed.
200 *
201 ******************************************************************************/
202void ACPI_INTERNAL_VAR_XFACE
203acpi_info(const char *module_name, u32 line_number, const char *format, ...)
204{
205 va_list arg_list;
206
207 ACPI_MSG_REDIRECT_BEGIN;
208 acpi_os_printf(ACPI_MSG_INFO);
209
210 va_start(arg_list, format);
211 acpi_os_vprintf(format, arg_list);
212 acpi_os_printf("\n");
213 va_end(arg_list);
214
215 ACPI_MSG_REDIRECT_END;
216}
217
218ACPI_EXPORT_SYMBOL(acpi_info)
219
220/*
221 * The remainder of this module contains internal error functions that may
222 * be configured out.
223 */
224#if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
225/*******************************************************************************
226 *
227 * FUNCTION: acpi_ut_predefined_warning
228 *
229 * PARAMETERS: module_name - Caller's module name (for error output)
230 * line_number - Caller's line number (for error output)
231 * Pathname - Full pathname to the node
232 * node_flags - From Namespace node for the method/object
233 * Format - Printf format string + additional args
234 *
235 * RETURN: None
236 *
237 * DESCRIPTION: Warnings for the predefined validation module. Messages are
238 * only emitted the first time a problem with a particular
239 * method/object is detected. This prevents a flood of error
240 * messages for methods that are repeatedly evaluated.
241 *
242 ******************************************************************************/
243void ACPI_INTERNAL_VAR_XFACE
244acpi_ut_predefined_warning(const char *module_name,
245 u32 line_number,
246 char *pathname,
247 u8 node_flags, const char *format, ...)
248{
249 va_list arg_list;
250
251 /*
252 * Warning messages for this method/object will be disabled after the
253 * first time a validation fails or an object is successfully repaired.
254 */
255 if (node_flags & ANOBJ_EVALUATED) {
256 return;
257 }
258
259 acpi_os_printf(ACPI_MSG_WARNING "For %s: ", pathname);
260
261 va_start(arg_list, format);
262 acpi_os_vprintf(format, arg_list);
263 ACPI_MSG_SUFFIX;
264 va_end(arg_list);
265}
266
267/*******************************************************************************
268 *
269 * FUNCTION: acpi_ut_predefined_info
270 *
271 * PARAMETERS: module_name - Caller's module name (for error output)
272 * line_number - Caller's line number (for error output)
273 * Pathname - Full pathname to the node
274 * node_flags - From Namespace node for the method/object
275 * Format - Printf format string + additional args
276 *
277 * RETURN: None
278 *
279 * DESCRIPTION: Info messages for the predefined validation module. Messages
280 * are only emitted the first time a problem with a particular
281 * method/object is detected. This prevents a flood of
282 * messages for methods that are repeatedly evaluated.
283 *
284 ******************************************************************************/
285
286void ACPI_INTERNAL_VAR_XFACE
287acpi_ut_predefined_info(const char *module_name,
288 u32 line_number,
289 char *pathname, u8 node_flags, const char *format, ...)
290{
291 va_list arg_list;
292
293 /*
294 * Warning messages for this method/object will be disabled after the
295 * first time a validation fails or an object is successfully repaired.
296 */
297 if (node_flags & ANOBJ_EVALUATED) {
298 return;
299 }
300
301 acpi_os_printf(ACPI_MSG_INFO "For %s: ", pathname);
302
303 va_start(arg_list, format);
304 acpi_os_vprintf(format, arg_list);
305 ACPI_MSG_SUFFIX;
306 va_end(arg_list);
307}
308
309/*******************************************************************************
310 *
311 * FUNCTION: acpi_ut_namespace_error
312 *
313 * PARAMETERS: module_name - Caller's module name (for error output)
314 * line_number - Caller's line number (for error output)
315 * internal_name - Name or path of the namespace node
316 * lookup_status - Exception code from NS lookup
317 *
318 * RETURN: None
319 *
320 * DESCRIPTION: Print error message with the full pathname for the NS node.
321 *
322 ******************************************************************************/
323
324void
325acpi_ut_namespace_error(const char *module_name,
326 u32 line_number,
327 const char *internal_name, acpi_status lookup_status)
328{
329 acpi_status status;
330 u32 bad_name;
331 char *name = NULL;
332
333 ACPI_MSG_REDIRECT_BEGIN;
334 acpi_os_printf(ACPI_MSG_ERROR);
335
336 if (lookup_status == AE_BAD_CHARACTER) {
337
338 /* There is a non-ascii character in the name */
339
340 ACPI_MOVE_32_TO_32(&bad_name,
341 ACPI_CAST_PTR(u32, internal_name));
342 acpi_os_printf("[0x%4.4X] (NON-ASCII)", bad_name);
343 } else {
344 /* Convert path to external format */
345
346 status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
347 internal_name, NULL, &name);
348
349 /* Print target name */
350
351 if (ACPI_SUCCESS(status)) {
352 acpi_os_printf("[%s]", name);
353 } else {
354 acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
355 }
356
357 if (name) {
358 ACPI_FREE(name);
359 }
360 }
361
362 acpi_os_printf(" Namespace lookup failure, %s",
363 acpi_format_exception(lookup_status));
364
365 ACPI_MSG_SUFFIX;
366 ACPI_MSG_REDIRECT_END;
367}
368
369/*******************************************************************************
370 *
371 * FUNCTION: acpi_ut_method_error
372 *
373 * PARAMETERS: module_name - Caller's module name (for error output)
374 * line_number - Caller's line number (for error output)
375 * Message - Error message to use on failure
376 * prefix_node - Prefix relative to the path
377 * Path - Path to the node (optional)
378 * method_status - Execution status
379 *
380 * RETURN: None
381 *
382 * DESCRIPTION: Print error message with the full pathname for the method.
383 *
384 ******************************************************************************/
385
386void
387acpi_ut_method_error(const char *module_name,
388 u32 line_number,
389 const char *message,
390 struct acpi_namespace_node *prefix_node,
391 const char *path, acpi_status method_status)
392{
393 acpi_status status;
394 struct acpi_namespace_node *node = prefix_node;
395
396 ACPI_MSG_REDIRECT_BEGIN;
397 acpi_os_printf(ACPI_MSG_ERROR);
398
399 if (path) {
400 status =
401 acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
402 &node);
403 if (ACPI_FAILURE(status)) {
404 acpi_os_printf("[Could not get node by pathname]");
405 }
406 }
407
408 acpi_ns_print_node_pathname(node, message);
409 acpi_os_printf(", %s", acpi_format_exception(method_status));
410
411 ACPI_MSG_SUFFIX;
412 ACPI_MSG_REDIRECT_END;
413}
414
415#endif /* ACPI_NO_ERROR_MESSAGES */
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 98417201e9ce..0b2707ee094b 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -42,10 +42,7 @@
42 42
43#include <acpi/acpi_bus.h> 43#include <acpi/acpi_bus.h>
44#include <acpi/acpi_drivers.h> 44#include <acpi/acpi_drivers.h>
45
46#ifdef CONFIG_ACPI_SYSFS_POWER
47#include <linux/power_supply.h> 45#include <linux/power_supply.h>
48#endif
49 46
50#define PREFIX "ACPI: " 47#define PREFIX "ACPI: "
51 48
@@ -98,13 +95,12 @@ enum {
98 * due to bad math. 95 * due to bad math.
99 */ 96 */
100 ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, 97 ACPI_BATTERY_QUIRK_SIGNED16_CURRENT,
98 ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY,
101}; 99};
102 100
103struct acpi_battery { 101struct acpi_battery {
104 struct mutex lock; 102 struct mutex lock;
105#ifdef CONFIG_ACPI_SYSFS_POWER
106 struct power_supply bat; 103 struct power_supply bat;
107#endif
108 struct acpi_device *device; 104 struct acpi_device *device;
109 unsigned long update_time; 105 unsigned long update_time;
110 int rate_now; 106 int rate_now;
@@ -141,7 +137,6 @@ inline int acpi_battery_present(struct acpi_battery *battery)
141 return battery->device->status.battery_present; 137 return battery->device->status.battery_present;
142} 138}
143 139
144#ifdef CONFIG_ACPI_SYSFS_POWER
145static int acpi_battery_technology(struct acpi_battery *battery) 140static int acpi_battery_technology(struct acpi_battery *battery)
146{ 141{
147 if (!strcasecmp("NiCd", battery->type)) 142 if (!strcasecmp("NiCd", battery->type))
@@ -281,7 +276,6 @@ static enum power_supply_property energy_battery_props[] = {
281 POWER_SUPPLY_PROP_MANUFACTURER, 276 POWER_SUPPLY_PROP_MANUFACTURER,
282 POWER_SUPPLY_PROP_SERIAL_NUMBER, 277 POWER_SUPPLY_PROP_SERIAL_NUMBER,
283}; 278};
284#endif
285 279
286#ifdef CONFIG_ACPI_PROCFS_POWER 280#ifdef CONFIG_ACPI_PROCFS_POWER
287inline char *acpi_battery_units(struct acpi_battery *battery) 281inline char *acpi_battery_units(struct acpi_battery *battery)
@@ -412,6 +406,8 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
412 result = extract_package(battery, buffer.pointer, 406 result = extract_package(battery, buffer.pointer,
413 info_offsets, ARRAY_SIZE(info_offsets)); 407 info_offsets, ARRAY_SIZE(info_offsets));
414 kfree(buffer.pointer); 408 kfree(buffer.pointer);
409 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
410 battery->full_charge_capacity = battery->design_capacity;
415 return result; 411 return result;
416} 412}
417 413
@@ -448,6 +444,10 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
448 battery->rate_now != -1) 444 battery->rate_now != -1)
449 battery->rate_now = abs((s16)battery->rate_now); 445 battery->rate_now = abs((s16)battery->rate_now);
450 446
447 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
448 && battery->capacity_now >= 0 && battery->capacity_now <= 100)
449 battery->capacity_now = (battery->capacity_now *
450 battery->full_charge_capacity) / 100;
451 return result; 451 return result;
452} 452}
453 453
@@ -492,7 +492,6 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
492 return acpi_battery_set_alarm(battery); 492 return acpi_battery_set_alarm(battery);
493} 493}
494 494
495#ifdef CONFIG_ACPI_SYSFS_POWER
496static ssize_t acpi_battery_alarm_show(struct device *dev, 495static ssize_t acpi_battery_alarm_show(struct device *dev,
497 struct device_attribute *attr, 496 struct device_attribute *attr,
498 char *buf) 497 char *buf)
@@ -552,7 +551,6 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
552 power_supply_unregister(&battery->bat); 551 power_supply_unregister(&battery->bat);
553 battery->bat.dev = NULL; 552 battery->bat.dev = NULL;
554} 553}
555#endif
556 554
557static void acpi_battery_quirks(struct acpi_battery *battery) 555static void acpi_battery_quirks(struct acpi_battery *battery)
558{ 556{
@@ -561,6 +559,33 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
561 } 559 }
562} 560}
563 561
562/*
563 * According to the ACPI spec, some kinds of primary batteries can
564 * report percentage battery remaining capacity directly to OS.
565 * In this case, it reports the Last Full Charged Capacity == 100
566 * and BatteryPresentRate == 0xFFFFFFFF.
567 *
568 * Now we found some battery reports percentage remaining capacity
569 * even if it's rechargeable.
570 * https://bugzilla.kernel.org/show_bug.cgi?id=15979
571 *
572 * Handle this correctly so that they won't break userspace.
573 */
574static void acpi_battery_quirks2(struct acpi_battery *battery)
575{
576 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
577 return ;
578
579 if (battery->full_charge_capacity == 100 &&
580 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
581 battery->capacity_now >=0 && battery->capacity_now <= 100) {
582 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
583 battery->full_charge_capacity = battery->design_capacity;
584 battery->capacity_now = (battery->capacity_now *
585 battery->full_charge_capacity) / 100;
586 }
587}
588
564static int acpi_battery_update(struct acpi_battery *battery) 589static int acpi_battery_update(struct acpi_battery *battery)
565{ 590{
566 int result, old_present = acpi_battery_present(battery); 591 int result, old_present = acpi_battery_present(battery);
@@ -568,9 +593,7 @@ static int acpi_battery_update(struct acpi_battery *battery)
568 if (result) 593 if (result)
569 return result; 594 return result;
570 if (!acpi_battery_present(battery)) { 595 if (!acpi_battery_present(battery)) {
571#ifdef CONFIG_ACPI_SYSFS_POWER
572 sysfs_remove_battery(battery); 596 sysfs_remove_battery(battery);
573#endif
574 battery->update_time = 0; 597 battery->update_time = 0;
575 return 0; 598 return 0;
576 } 599 }
@@ -582,11 +605,11 @@ static int acpi_battery_update(struct acpi_battery *battery)
582 acpi_battery_quirks(battery); 605 acpi_battery_quirks(battery);
583 acpi_battery_init_alarm(battery); 606 acpi_battery_init_alarm(battery);
584 } 607 }
585#ifdef CONFIG_ACPI_SYSFS_POWER
586 if (!battery->bat.dev) 608 if (!battery->bat.dev)
587 sysfs_add_battery(battery); 609 sysfs_add_battery(battery);
588#endif 610 result = acpi_battery_get_state(battery);
589 return acpi_battery_get_state(battery); 611 acpi_battery_quirks2(battery);
612 return result;
590} 613}
591 614
592/* -------------------------------------------------------------------------- 615/* --------------------------------------------------------------------------
@@ -867,26 +890,20 @@ static void acpi_battery_remove_fs(struct acpi_device *device)
867static void acpi_battery_notify(struct acpi_device *device, u32 event) 890static void acpi_battery_notify(struct acpi_device *device, u32 event)
868{ 891{
869 struct acpi_battery *battery = acpi_driver_data(device); 892 struct acpi_battery *battery = acpi_driver_data(device);
870#ifdef CONFIG_ACPI_SYSFS_POWER
871 struct device *old; 893 struct device *old;
872#endif
873 894
874 if (!battery) 895 if (!battery)
875 return; 896 return;
876#ifdef CONFIG_ACPI_SYSFS_POWER
877 old = battery->bat.dev; 897 old = battery->bat.dev;
878#endif
879 acpi_battery_update(battery); 898 acpi_battery_update(battery);
880 acpi_bus_generate_proc_event(device, event, 899 acpi_bus_generate_proc_event(device, event,
881 acpi_battery_present(battery)); 900 acpi_battery_present(battery));
882 acpi_bus_generate_netlink_event(device->pnp.device_class, 901 acpi_bus_generate_netlink_event(device->pnp.device_class,
883 dev_name(&device->dev), event, 902 dev_name(&device->dev), event,
884 acpi_battery_present(battery)); 903 acpi_battery_present(battery));
885#ifdef CONFIG_ACPI_SYSFS_POWER
886 /* acpi_battery_update could remove power_supply object */ 904 /* acpi_battery_update could remove power_supply object */
887 if (old && battery->bat.dev) 905 if (old && battery->bat.dev)
888 power_supply_changed(&battery->bat); 906 power_supply_changed(&battery->bat);
889#endif
890} 907}
891 908
892static int acpi_battery_add(struct acpi_device *device) 909static int acpi_battery_add(struct acpi_device *device)
@@ -934,9 +951,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
934#ifdef CONFIG_ACPI_PROCFS_POWER 951#ifdef CONFIG_ACPI_PROCFS_POWER
935 acpi_battery_remove_fs(device); 952 acpi_battery_remove_fs(device);
936#endif 953#endif
937#ifdef CONFIG_ACPI_SYSFS_POWER
938 sysfs_remove_battery(battery); 954 sysfs_remove_battery(battery);
939#endif
940 mutex_destroy(&battery->lock); 955 mutex_destroy(&battery->lock);
941 kfree(battery); 956 kfree(battery);
942 return 0; 957 return 0;
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 1575a9b51f1d..71ef9cd0735f 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -338,7 +338,8 @@ static int acpi_button_add(struct acpi_device *device)
338{ 338{
339 struct acpi_button *button; 339 struct acpi_button *button;
340 struct input_dev *input; 340 struct input_dev *input;
341 char *hid, *name, *class; 341 const char *hid = acpi_device_hid(device);
342 char *name, *class;
342 int error; 343 int error;
343 344
344 button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL); 345 button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL);
@@ -353,7 +354,6 @@ static int acpi_button_add(struct acpi_device *device)
353 goto err_free_button; 354 goto err_free_button;
354 } 355 }
355 356
356 hid = acpi_device_hid(device);
357 name = acpi_device_name(device); 357 name = acpi_device_name(device);
358 class = acpi_device_class(device); 358 class = acpi_device_class(device);
359 359
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index d94d2953c974..60049080c869 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -27,8 +27,6 @@
27#include <linux/module.h> 27#include <linux/module.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/types.h> 29#include <linux/types.h>
30#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
32#include <asm/uaccess.h> 30#include <asm/uaccess.h>
33#include <linux/thermal.h> 31#include <linux/thermal.h>
34#include <acpi/acpi_bus.h> 32#include <acpi/acpi_bus.h>
@@ -119,122 +117,6 @@ static struct thermal_cooling_device_ops fan_cooling_ops = {
119}; 117};
120 118
121/* -------------------------------------------------------------------------- 119/* --------------------------------------------------------------------------
122 FS Interface (/proc)
123 -------------------------------------------------------------------------- */
124#ifdef CONFIG_ACPI_PROCFS
125
126static struct proc_dir_entry *acpi_fan_dir;
127
128static int acpi_fan_read_state(struct seq_file *seq, void *offset)
129{
130 struct acpi_device *device = seq->private;
131 int state = 0;
132
133
134 if (device) {
135 if (acpi_bus_get_power(device->handle, &state))
136 seq_printf(seq, "status: ERROR\n");
137 else
138 seq_printf(seq, "status: %s\n",
139 !state ? "on" : "off");
140 }
141 return 0;
142}
143
144static int acpi_fan_state_open_fs(struct inode *inode, struct file *file)
145{
146 return single_open(file, acpi_fan_read_state, PDE(inode)->data);
147}
148
149static ssize_t
150acpi_fan_write_state(struct file *file, const char __user * buffer,
151 size_t count, loff_t * ppos)
152{
153 int result = 0;
154 struct seq_file *m = file->private_data;
155 struct acpi_device *device = m->private;
156 char state_string[3] = { '\0' };
157
158 if (count > sizeof(state_string) - 1)
159 return -EINVAL;
160
161 if (copy_from_user(state_string, buffer, count))
162 return -EFAULT;
163
164 state_string[count] = '\0';
165 if ((state_string[0] < '0') || (state_string[0] > '3'))
166 return -EINVAL;
167 if (state_string[1] == '\n')
168 state_string[1] = '\0';
169 if (state_string[1] != '\0')
170 return -EINVAL;
171
172 result = acpi_bus_set_power(device->handle,
173 simple_strtoul(state_string, NULL, 0));
174 if (result)
175 return result;
176
177 return count;
178}
179
180static const struct file_operations acpi_fan_state_ops = {
181 .open = acpi_fan_state_open_fs,
182 .read = seq_read,
183 .write = acpi_fan_write_state,
184 .llseek = seq_lseek,
185 .release = single_release,
186 .owner = THIS_MODULE,
187};
188
189static int acpi_fan_add_fs(struct acpi_device *device)
190{
191 struct proc_dir_entry *entry = NULL;
192
193
194 if (!device)
195 return -EINVAL;
196
197 if (!acpi_device_dir(device)) {
198 acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
199 acpi_fan_dir);
200 if (!acpi_device_dir(device))
201 return -ENODEV;
202 }
203
204 /* 'status' [R/W] */
205 entry = proc_create_data(ACPI_FAN_FILE_STATE,
206 S_IFREG | S_IRUGO | S_IWUSR,
207 acpi_device_dir(device),
208 &acpi_fan_state_ops,
209 device);
210 if (!entry)
211 return -ENODEV;
212 return 0;
213}
214
215static int acpi_fan_remove_fs(struct acpi_device *device)
216{
217
218 if (acpi_device_dir(device)) {
219 remove_proc_entry(ACPI_FAN_FILE_STATE, acpi_device_dir(device));
220 remove_proc_entry(acpi_device_bid(device), acpi_fan_dir);
221 acpi_device_dir(device) = NULL;
222 }
223
224 return 0;
225}
226#else
227static int acpi_fan_add_fs(struct acpi_device *device)
228{
229 return 0;
230}
231
232static int acpi_fan_remove_fs(struct acpi_device *device)
233{
234 return 0;
235}
236#endif
237/* --------------------------------------------------------------------------
238 Driver Interface 120 Driver Interface
239 -------------------------------------------------------------------------- */ 121 -------------------------------------------------------------------------- */
240 122
@@ -284,10 +166,6 @@ static int acpi_fan_add(struct acpi_device *device)
284 dev_err(&device->dev, "Failed to create sysfs link " 166 dev_err(&device->dev, "Failed to create sysfs link "
285 "'device'\n"); 167 "'device'\n");
286 168
287 result = acpi_fan_add_fs(device);
288 if (result)
289 goto end;
290
291 printk(KERN_INFO PREFIX "%s [%s] (%s)\n", 169 printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
292 acpi_device_name(device), acpi_device_bid(device), 170 acpi_device_name(device), acpi_device_bid(device),
293 !device->power.state ? "on" : "off"); 171 !device->power.state ? "on" : "off");
@@ -303,7 +181,6 @@ static int acpi_fan_remove(struct acpi_device *device, int type)
303 if (!device || !cdev) 181 if (!device || !cdev)
304 return -EINVAL; 182 return -EINVAL;
305 183
306 acpi_fan_remove_fs(device);
307 sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); 184 sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
308 sysfs_remove_link(&cdev->device.kobj, "device"); 185 sysfs_remove_link(&cdev->device.kobj, "device");
309 thermal_cooling_device_unregister(cdev); 186 thermal_cooling_device_unregister(cdev);
@@ -347,19 +224,9 @@ static int __init acpi_fan_init(void)
347{ 224{
348 int result = 0; 225 int result = 0;
349 226
350#ifdef CONFIG_ACPI_PROCFS
351 acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir);
352 if (!acpi_fan_dir)
353 return -ENODEV;
354#endif
355
356 result = acpi_bus_register_driver(&acpi_fan_driver); 227 result = acpi_bus_register_driver(&acpi_fan_driver);
357 if (result < 0) { 228 if (result < 0)
358#ifdef CONFIG_ACPI_PROCFS
359 remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir);
360#endif
361 return -ENODEV; 229 return -ENODEV;
362 }
363 230
364 return 0; 231 return 0;
365} 232}
@@ -369,10 +236,6 @@ static void __exit acpi_fan_exit(void)
369 236
370 acpi_bus_unregister_driver(&acpi_fan_driver); 237 acpi_bus_unregister_driver(&acpi_fan_driver);
371 238
372#ifdef CONFIG_ACPI_PROCFS
373 remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir);
374#endif
375
376 return; 239 return;
377} 240}
378 241
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 65b25a303b86..d3bed219c442 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -96,7 +96,9 @@ static LIST_HEAD(resource_list_head);
96static DEFINE_SPINLOCK(acpi_res_lock); 96static DEFINE_SPINLOCK(acpi_res_lock);
97 97
98#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */ 98#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
99static char osi_additional_string[OSI_STRING_LENGTH_MAX]; 99static char osi_setup_string[OSI_STRING_LENGTH_MAX];
100
101static void __init acpi_osi_setup_late(void);
100 102
101/* 103/*
102 * The story of _OSI(Linux) 104 * The story of _OSI(Linux)
@@ -138,6 +140,20 @@ static struct osi_linux {
138 unsigned int known:1; 140 unsigned int known:1;
139} osi_linux = { 0, 0, 0, 0}; 141} osi_linux = { 0, 0, 0, 0};
140 142
143static u32 acpi_osi_handler(acpi_string interface, u32 supported)
144{
145 if (!strcmp("Linux", interface)) {
146
147 printk(KERN_NOTICE FW_BUG PREFIX
148 "BIOS _OSI(Linux) query %s%s\n",
149 osi_linux.enable ? "honored" : "ignored",
150 osi_linux.cmdline ? " via cmdline" :
151 osi_linux.dmi ? " via DMI" : "");
152 }
153
154 return supported;
155}
156
141static void __init acpi_request_region (struct acpi_generic_address *addr, 157static void __init acpi_request_region (struct acpi_generic_address *addr,
142 unsigned int length, char *desc) 158 unsigned int length, char *desc)
143{ 159{
@@ -198,6 +214,8 @@ acpi_status acpi_os_initialize1(void)
198 BUG_ON(!kacpid_wq); 214 BUG_ON(!kacpid_wq);
199 BUG_ON(!kacpi_notify_wq); 215 BUG_ON(!kacpi_notify_wq);
200 BUG_ON(!kacpi_hotplug_wq); 216 BUG_ON(!kacpi_hotplug_wq);
217 acpi_install_interface_handler(acpi_osi_handler);
218 acpi_osi_setup_late();
201 return AE_OK; 219 return AE_OK;
202} 220}
203 221
@@ -547,9 +565,10 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
547 565
548acpi_status 566acpi_status
549acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, 567acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
550 u32 *value, u32 width) 568 u64 *value, u32 width)
551{ 569{
552 int result, size; 570 int result, size;
571 u32 value32;
553 572
554 if (!value) 573 if (!value)
555 return AE_BAD_PARAMETER; 574 return AE_BAD_PARAMETER;
@@ -570,7 +589,8 @@ acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
570 589
571 result = raw_pci_read(pci_id->segment, pci_id->bus, 590 result = raw_pci_read(pci_id->segment, pci_id->bus,
572 PCI_DEVFN(pci_id->device, pci_id->function), 591 PCI_DEVFN(pci_id->device, pci_id->function),
573 reg, size, value); 592 reg, size, &value32);
593 *value = value32;
574 594
575 return (result ? AE_ERROR : AE_OK); 595 return (result ? AE_ERROR : AE_OK);
576} 596}
@@ -602,74 +622,6 @@ acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
602 return (result ? AE_ERROR : AE_OK); 622 return (result ? AE_ERROR : AE_OK);
603} 623}
604 624
605/* TODO: Change code to take advantage of driver model more */
606static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
607 acpi_handle chandle, /* current node */
608 struct acpi_pci_id **id,
609 int *is_bridge, u8 * bus_number)
610{
611 acpi_handle handle;
612 struct acpi_pci_id *pci_id = *id;
613 acpi_status status;
614 unsigned long long temp;
615 acpi_object_type type;
616
617 acpi_get_parent(chandle, &handle);
618 if (handle != rhandle) {
619 acpi_os_derive_pci_id_2(rhandle, handle, &pci_id, is_bridge,
620 bus_number);
621
622 status = acpi_get_type(handle, &type);
623 if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE))
624 return;
625
626 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
627 &temp);
628 if (ACPI_SUCCESS(status)) {
629 u32 val;
630 pci_id->device = ACPI_HIWORD(ACPI_LODWORD(temp));
631 pci_id->function = ACPI_LOWORD(ACPI_LODWORD(temp));
632
633 if (*is_bridge)
634 pci_id->bus = *bus_number;
635
636 /* any nicer way to get bus number of bridge ? */
637 status =
638 acpi_os_read_pci_configuration(pci_id, 0x0e, &val,
639 8);
640 if (ACPI_SUCCESS(status)
641 && ((val & 0x7f) == 1 || (val & 0x7f) == 2)) {
642 status =
643 acpi_os_read_pci_configuration(pci_id, 0x18,
644 &val, 8);
645 if (!ACPI_SUCCESS(status)) {
646 /* Certainly broken... FIX ME */
647 return;
648 }
649 *is_bridge = 1;
650 pci_id->bus = val;
651 status =
652 acpi_os_read_pci_configuration(pci_id, 0x19,
653 &val, 8);
654 if (ACPI_SUCCESS(status)) {
655 *bus_number = val;
656 }
657 } else
658 *is_bridge = 0;
659 }
660 }
661}
662
663void acpi_os_derive_pci_id(acpi_handle rhandle, /* upper bound */
664 acpi_handle chandle, /* current node */
665 struct acpi_pci_id **id)
666{
667 int is_bridge = 1;
668 u8 bus_number = (*id)->bus;
669
670 acpi_os_derive_pci_id_2(rhandle, chandle, id, &is_bridge, &bus_number);
671}
672
673static void acpi_os_execute_deferred(struct work_struct *work) 625static void acpi_os_execute_deferred(struct work_struct *work)
674{ 626{
675 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work); 627 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
@@ -977,6 +929,12 @@ static void __init set_osi_linux(unsigned int enable)
977 printk(KERN_NOTICE PREFIX "%sed _OSI(Linux)\n", 929 printk(KERN_NOTICE PREFIX "%sed _OSI(Linux)\n",
978 enable ? "Add": "Delet"); 930 enable ? "Add": "Delet");
979 } 931 }
932
933 if (osi_linux.enable)
934 acpi_osi_setup("Linux");
935 else
936 acpi_osi_setup("!Linux");
937
980 return; 938 return;
981} 939}
982 940
@@ -1011,21 +969,33 @@ void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
1011 * string starting with '!' disables that string 969 * string starting with '!' disables that string
1012 * otherwise string is added to list, augmenting built-in strings 970 * otherwise string is added to list, augmenting built-in strings
1013 */ 971 */
1014int __init acpi_osi_setup(char *str) 972static void __init acpi_osi_setup_late(void)
1015{ 973{
1016 if (str == NULL || *str == '\0') { 974 char *str = osi_setup_string;
1017 printk(KERN_INFO PREFIX "_OSI method disabled\n"); 975
1018 acpi_gbl_create_osi_method = FALSE; 976 if (*str == '\0')
1019 } else if (!strcmp("!Linux", str)) { 977 return;
978
979 if (!strcmp("!Linux", str)) {
1020 acpi_cmdline_osi_linux(0); /* !enable */ 980 acpi_cmdline_osi_linux(0); /* !enable */
1021 } else if (*str == '!') { 981 } else if (*str == '!') {
1022 if (acpi_osi_invalidate(++str) == AE_OK) 982 if (acpi_remove_interface(++str) == AE_OK)
1023 printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str); 983 printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
1024 } else if (!strcmp("Linux", str)) { 984 } else if (!strcmp("Linux", str)) {
1025 acpi_cmdline_osi_linux(1); /* enable */ 985 acpi_cmdline_osi_linux(1); /* enable */
1026 } else if (*osi_additional_string == '\0') { 986 } else {
1027 strncpy(osi_additional_string, str, OSI_STRING_LENGTH_MAX); 987 if (acpi_install_interface(str) == AE_OK)
1028 printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str); 988 printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
989 }
990}
991
992int __init acpi_osi_setup(char *str)
993{
994 if (str == NULL || *str == '\0') {
995 printk(KERN_INFO PREFIX "_OSI method disabled\n");
996 acpi_gbl_create_osi_method = FALSE;
997 } else {
998 strncpy(osi_setup_string, str, OSI_STRING_LENGTH_MAX);
1029 } 999 }
1030 1000
1031 return 1; 1001 return 1;
@@ -1282,38 +1252,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
1282 return (AE_OK); 1252 return (AE_OK);
1283} 1253}
1284 1254
1285/******************************************************************************
1286 *
1287 * FUNCTION: acpi_os_validate_interface
1288 *
1289 * PARAMETERS: interface - Requested interface to be validated
1290 *
1291 * RETURN: AE_OK if interface is supported, AE_SUPPORT otherwise
1292 *
1293 * DESCRIPTION: Match an interface string to the interfaces supported by the
1294 * host. Strings originate from an AML call to the _OSI method.
1295 *
1296 *****************************************************************************/
1297
1298acpi_status
1299acpi_os_validate_interface (char *interface)
1300{
1301 if (!strncmp(osi_additional_string, interface, OSI_STRING_LENGTH_MAX))
1302 return AE_OK;
1303 if (!strcmp("Linux", interface)) {
1304
1305 printk(KERN_NOTICE PREFIX
1306 "BIOS _OSI(Linux) query %s%s\n",
1307 osi_linux.enable ? "honored" : "ignored",
1308 osi_linux.cmdline ? " via cmdline" :
1309 osi_linux.dmi ? " via DMI" : "");
1310
1311 if (osi_linux.enable)
1312 return AE_OK;
1313 }
1314 return AE_SUPPORT;
1315}
1316
1317static inline int acpi_res_list_add(struct acpi_res_list *res) 1255static inline int acpi_res_list_add(struct acpi_res_list *res)
1318{ 1256{
1319 struct acpi_res_list *res_list_elem; 1257 struct acpi_res_list *res_list_elem;
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index e4804fb05e23..f907cfbfa13c 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -32,7 +32,6 @@
32#include <linux/module.h> 32#include <linux/module.h>
33#include <linux/init.h> 33#include <linux/init.h>
34#include <linux/types.h> 34#include <linux/types.h>
35#include <linux/proc_fs.h>
36#include <linux/spinlock.h> 35#include <linux/spinlock.h>
37#include <linux/pm.h> 36#include <linux/pm.h>
38#include <linux/pci.h> 37#include <linux/pci.h>
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 8d47a5846aeb..9ff80a7e9f6a 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -34,7 +34,6 @@
34#include <linux/module.h> 34#include <linux/module.h>
35#include <linux/init.h> 35#include <linux/init.h>
36#include <linux/types.h> 36#include <linux/types.h>
37#include <linux/proc_fs.h>
38#include <linux/spinlock.h> 37#include <linux/spinlock.h>
39#include <linux/pm.h> 38#include <linux/pm.h>
40#include <linux/pci.h> 39#include <linux/pci.h>
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index 3ba8d1f44a73..96668ad09622 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -27,7 +27,6 @@
27#include <linux/module.h> 27#include <linux/module.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/types.h> 29#include <linux/types.h>
30#include <linux/proc_fs.h>
31#include <linux/spinlock.h> 30#include <linux/spinlock.h>
32#include <linux/pm.h> 31#include <linux/pm.h>
33#include <linux/pm_runtime.h> 32#include <linux/pm_runtime.h>
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
index 347eb21b2353..356c320bdd08 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -40,8 +40,10 @@
40#include <linux/pm.h> 40#include <linux/pm.h>
41#include <linux/cpufreq.h> 41#include <linux/cpufreq.h>
42#include <linux/cpu.h> 42#include <linux/cpu.h>
43#ifdef CONFIG_ACPI_PROCFS
43#include <linux/proc_fs.h> 44#include <linux/proc_fs.h>
44#include <linux/seq_file.h> 45#include <linux/seq_file.h>
46#endif
45#include <linux/dmi.h> 47#include <linux/dmi.h>
46#include <linux/moduleparam.h> 48#include <linux/moduleparam.h>
47#include <linux/cpuidle.h> 49#include <linux/cpuidle.h>
@@ -244,6 +246,7 @@ static int acpi_processor_errata(struct acpi_processor *pr)
244 return result; 246 return result;
245} 247}
246 248
249#ifdef CONFIG_ACPI_PROCFS
247static struct proc_dir_entry *acpi_processor_dir = NULL; 250static struct proc_dir_entry *acpi_processor_dir = NULL;
248 251
249static int __cpuinit acpi_processor_add_fs(struct acpi_device *device) 252static int __cpuinit acpi_processor_add_fs(struct acpi_device *device)
@@ -280,7 +283,16 @@ static int acpi_processor_remove_fs(struct acpi_device *device)
280 283
281 return 0; 284 return 0;
282} 285}
283 286#else
287static inline int acpi_processor_add_fs(struct acpi_device *device)
288{
289 return 0;
290}
291static inline int acpi_processor_remove_fs(struct acpi_device *device)
292{
293 return 0;
294}
295#endif
284/* -------------------------------------------------------------------------- 296/* --------------------------------------------------------------------------
285 Driver Interface 297 Driver Interface
286 -------------------------------------------------------------------------- */ 298 -------------------------------------------------------------------------- */
@@ -842,9 +854,11 @@ static int __init acpi_processor_init(void)
842 854
843 memset(&errata, 0, sizeof(errata)); 855 memset(&errata, 0, sizeof(errata));
844 856
857#ifdef CONFIG_ACPI_PROCFS
845 acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir); 858 acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
846 if (!acpi_processor_dir) 859 if (!acpi_processor_dir)
847 return -ENOMEM; 860 return -ENOMEM;
861#endif
848 862
849 if (!cpuidle_register_driver(&acpi_idle_driver)) { 863 if (!cpuidle_register_driver(&acpi_idle_driver)) {
850 printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n", 864 printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n",
@@ -871,7 +885,9 @@ static int __init acpi_processor_init(void)
871out_cpuidle: 885out_cpuidle:
872 cpuidle_unregister_driver(&acpi_idle_driver); 886 cpuidle_unregister_driver(&acpi_idle_driver);
873 887
888#ifdef CONFIG_ACPI_PROCFS
874 remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); 889 remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
890#endif
875 891
876 return result; 892 return result;
877} 893}
@@ -891,7 +907,9 @@ static void __exit acpi_processor_exit(void)
891 907
892 cpuidle_unregister_driver(&acpi_idle_driver); 908 cpuidle_unregister_driver(&acpi_idle_driver);
893 909
910#ifdef CONFIG_ACPI_PROCFS
894 remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); 911 remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
912#endif
895 913
896 return; 914 return;
897} 915}
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
index 730863855ed5..ff3632717c51 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -32,8 +32,10 @@
32#include <linux/init.h> 32#include <linux/init.h>
33#include <linux/sched.h> 33#include <linux/sched.h>
34#include <linux/cpufreq.h> 34#include <linux/cpufreq.h>
35#ifdef CONFIG_ACPI_PROCFS
35#include <linux/proc_fs.h> 36#include <linux/proc_fs.h>
36#include <linux/seq_file.h> 37#include <linux/seq_file.h>
38#endif
37 39
38#include <asm/io.h> 40#include <asm/io.h>
39#include <asm/uaccess.h> 41#include <asm/uaccess.h>
@@ -1214,6 +1216,7 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
1214 return result; 1216 return result;
1215} 1217}
1216 1218
1219#ifdef CONFIG_ACPI_PROCFS
1217/* proc interface */ 1220/* proc interface */
1218static int acpi_processor_throttling_seq_show(struct seq_file *seq, 1221static int acpi_processor_throttling_seq_show(struct seq_file *seq,
1219 void *offset) 1222 void *offset)
@@ -1322,3 +1325,4 @@ const struct file_operations acpi_processor_throttling_fops = {
1322 .llseek = seq_lseek, 1325 .llseek = seq_lseek,
1323 .release = single_release, 1326 .release = single_release,
1324}; 1327};
1328#endif
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
index 4ff76e8174eb..e5dbedb16bbf 100644
--- a/drivers/acpi/sbs.c
+++ b/drivers/acpi/sbs.c
@@ -40,10 +40,7 @@
40#include <linux/timer.h> 40#include <linux/timer.h>
41#include <linux/jiffies.h> 41#include <linux/jiffies.h>
42#include <linux/delay.h> 42#include <linux/delay.h>
43
44#ifdef CONFIG_ACPI_SYSFS_POWER
45#include <linux/power_supply.h> 43#include <linux/power_supply.h>
46#endif
47 44
48#include "sbshc.h" 45#include "sbshc.h"
49 46
@@ -85,9 +82,7 @@ static const struct acpi_device_id sbs_device_ids[] = {
85MODULE_DEVICE_TABLE(acpi, sbs_device_ids); 82MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
86 83
87struct acpi_battery { 84struct acpi_battery {
88#ifdef CONFIG_ACPI_SYSFS_POWER
89 struct power_supply bat; 85 struct power_supply bat;
90#endif
91 struct acpi_sbs *sbs; 86 struct acpi_sbs *sbs;
92#ifdef CONFIG_ACPI_PROCFS_POWER 87#ifdef CONFIG_ACPI_PROCFS_POWER
93 struct proc_dir_entry *proc_entry; 88 struct proc_dir_entry *proc_entry;
@@ -120,9 +115,7 @@ struct acpi_battery {
120#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat); 115#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
121 116
122struct acpi_sbs { 117struct acpi_sbs {
123#ifdef CONFIG_ACPI_SYSFS_POWER
124 struct power_supply charger; 118 struct power_supply charger;
125#endif
126 struct acpi_device *device; 119 struct acpi_device *device;
127 struct acpi_smb_hc *hc; 120 struct acpi_smb_hc *hc;
128 struct mutex lock; 121 struct mutex lock;
@@ -166,7 +159,6 @@ static inline int acpi_battery_scale(struct acpi_battery *battery)
166 acpi_battery_ipscale(battery); 159 acpi_battery_ipscale(battery);
167} 160}
168 161
169#ifdef CONFIG_ACPI_SYSFS_POWER
170static int sbs_get_ac_property(struct power_supply *psy, 162static int sbs_get_ac_property(struct power_supply *psy,
171 enum power_supply_property psp, 163 enum power_supply_property psp,
172 union power_supply_propval *val) 164 union power_supply_propval *val)
@@ -313,7 +305,6 @@ static enum power_supply_property sbs_energy_battery_props[] = {
313 POWER_SUPPLY_PROP_MANUFACTURER, 305 POWER_SUPPLY_PROP_MANUFACTURER,
314}; 306};
315 307
316#endif
317 308
318/* -------------------------------------------------------------------------- 309/* --------------------------------------------------------------------------
319 Smart Battery System Management 310 Smart Battery System Management
@@ -449,7 +440,6 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
449 return result; 440 return result;
450} 441}
451 442
452#ifdef CONFIG_ACPI_SYSFS_POWER
453static ssize_t acpi_battery_alarm_show(struct device *dev, 443static ssize_t acpi_battery_alarm_show(struct device *dev,
454 struct device_attribute *attr, 444 struct device_attribute *attr,
455 char *buf) 445 char *buf)
@@ -479,7 +469,6 @@ static struct device_attribute alarm_attr = {
479 .show = acpi_battery_alarm_show, 469 .show = acpi_battery_alarm_show,
480 .store = acpi_battery_alarm_store, 470 .store = acpi_battery_alarm_store,
481}; 471};
482#endif
483 472
484/* -------------------------------------------------------------------------- 473/* --------------------------------------------------------------------------
485 FS Interface (/proc/acpi) 474 FS Interface (/proc/acpi)
@@ -798,7 +787,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
798 &acpi_battery_state_fops, &acpi_battery_alarm_fops, 787 &acpi_battery_state_fops, &acpi_battery_alarm_fops,
799 battery); 788 battery);
800#endif 789#endif
801#ifdef CONFIG_ACPI_SYSFS_POWER
802 battery->bat.name = battery->name; 790 battery->bat.name = battery->name;
803 battery->bat.type = POWER_SUPPLY_TYPE_BATTERY; 791 battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
804 if (!acpi_battery_mode(battery)) { 792 if (!acpi_battery_mode(battery)) {
@@ -819,7 +807,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
819 goto end; 807 goto end;
820 battery->have_sysfs_alarm = 1; 808 battery->have_sysfs_alarm = 1;
821 end: 809 end:
822#endif
823 printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n", 810 printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
824 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), 811 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
825 battery->name, battery->present ? "present" : "absent"); 812 battery->name, battery->present ? "present" : "absent");
@@ -828,17 +815,13 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
828 815
829static void acpi_battery_remove(struct acpi_sbs *sbs, int id) 816static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
830{ 817{
831#if defined(CONFIG_ACPI_SYSFS_POWER) || defined(CONFIG_ACPI_PROCFS_POWER)
832 struct acpi_battery *battery = &sbs->battery[id]; 818 struct acpi_battery *battery = &sbs->battery[id];
833#endif
834 819
835#ifdef CONFIG_ACPI_SYSFS_POWER
836 if (battery->bat.dev) { 820 if (battery->bat.dev) {
837 if (battery->have_sysfs_alarm) 821 if (battery->have_sysfs_alarm)
838 device_remove_file(battery->bat.dev, &alarm_attr); 822 device_remove_file(battery->bat.dev, &alarm_attr);
839 power_supply_unregister(&battery->bat); 823 power_supply_unregister(&battery->bat);
840 } 824 }
841#endif
842#ifdef CONFIG_ACPI_PROCFS_POWER 825#ifdef CONFIG_ACPI_PROCFS_POWER
843 if (battery->proc_entry) 826 if (battery->proc_entry)
844 acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir); 827 acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
@@ -859,14 +842,12 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
859 if (result) 842 if (result)
860 goto end; 843 goto end;
861#endif 844#endif
862#ifdef CONFIG_ACPI_SYSFS_POWER
863 sbs->charger.name = "sbs-charger"; 845 sbs->charger.name = "sbs-charger";
864 sbs->charger.type = POWER_SUPPLY_TYPE_MAINS; 846 sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
865 sbs->charger.properties = sbs_ac_props; 847 sbs->charger.properties = sbs_ac_props;
866 sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props); 848 sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
867 sbs->charger.get_property = sbs_get_ac_property; 849 sbs->charger.get_property = sbs_get_ac_property;
868 power_supply_register(&sbs->device->dev, &sbs->charger); 850 power_supply_register(&sbs->device->dev, &sbs->charger);
869#endif
870 printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n", 851 printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
871 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), 852 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
872 ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line"); 853 ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
@@ -876,10 +857,8 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
876 857
877static void acpi_charger_remove(struct acpi_sbs *sbs) 858static void acpi_charger_remove(struct acpi_sbs *sbs)
878{ 859{
879#ifdef CONFIG_ACPI_SYSFS_POWER
880 if (sbs->charger.dev) 860 if (sbs->charger.dev)
881 power_supply_unregister(&sbs->charger); 861 power_supply_unregister(&sbs->charger);
882#endif
883#ifdef CONFIG_ACPI_PROCFS_POWER 862#ifdef CONFIG_ACPI_PROCFS_POWER
884 if (sbs->charger_entry) 863 if (sbs->charger_entry)
885 acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir); 864 acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
@@ -900,9 +879,7 @@ static void acpi_sbs_callback(void *context)
900 ACPI_SBS_NOTIFY_STATUS, 879 ACPI_SBS_NOTIFY_STATUS,
901 sbs->charger_present); 880 sbs->charger_present);
902#endif 881#endif
903#ifdef CONFIG_ACPI_SYSFS_POWER
904 kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE); 882 kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
905#endif
906 } 883 }
907 if (sbs->manager_present) { 884 if (sbs->manager_present) {
908 for (id = 0; id < MAX_SBS_BAT; ++id) { 885 for (id = 0; id < MAX_SBS_BAT; ++id) {
@@ -919,9 +896,7 @@ static void acpi_sbs_callback(void *context)
919 ACPI_SBS_NOTIFY_STATUS, 896 ACPI_SBS_NOTIFY_STATUS,
920 bat->present); 897 bat->present);
921#endif 898#endif
922#ifdef CONFIG_ACPI_SYSFS_POWER
923 kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE); 899 kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
924#endif
925 } 900 }
926 } 901 }
927} 902}
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index b23825ecfa37..6155eeb2e89a 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -26,6 +26,8 @@ extern struct acpi_device *acpi_root;
26 26
27#define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent) 27#define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent)
28 28
29static const char *dummy_hid = "device";
30
29static LIST_HEAD(acpi_device_list); 31static LIST_HEAD(acpi_device_list);
30static LIST_HEAD(acpi_bus_id_list); 32static LIST_HEAD(acpi_bus_id_list);
31DEFINE_MUTEX(acpi_device_lock); 33DEFINE_MUTEX(acpi_device_lock);
@@ -49,6 +51,9 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
49 int count; 51 int count;
50 struct acpi_hardware_id *id; 52 struct acpi_hardware_id *id;
51 53
54 if (list_empty(&acpi_dev->pnp.ids))
55 return 0;
56
52 len = snprintf(modalias, size, "acpi:"); 57 len = snprintf(modalias, size, "acpi:");
53 size -= len; 58 size -= len;
54 59
@@ -202,13 +207,15 @@ static int acpi_device_setup_files(struct acpi_device *dev)
202 goto end; 207 goto end;
203 } 208 }
204 209
205 result = device_create_file(&dev->dev, &dev_attr_hid); 210 if (!list_empty(&dev->pnp.ids)) {
206 if (result) 211 result = device_create_file(&dev->dev, &dev_attr_hid);
207 goto end; 212 if (result)
213 goto end;
208 214
209 result = device_create_file(&dev->dev, &dev_attr_modalias); 215 result = device_create_file(&dev->dev, &dev_attr_modalias);
210 if (result) 216 if (result)
211 goto end; 217 goto end;
218 }
212 219
213 /* 220 /*
214 * If device has _EJ0, 'eject' file is created that is used to trigger 221 * If device has _EJ0, 'eject' file is created that is used to trigger
@@ -316,6 +323,9 @@ static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env)
316 struct acpi_device *acpi_dev = to_acpi_device(dev); 323 struct acpi_device *acpi_dev = to_acpi_device(dev);
317 int len; 324 int len;
318 325
326 if (list_empty(&acpi_dev->pnp.ids))
327 return 0;
328
319 if (add_uevent_var(env, "MODALIAS=")) 329 if (add_uevent_var(env, "MODALIAS="))
320 return -ENOMEM; 330 return -ENOMEM;
321 len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], 331 len = create_modalias(acpi_dev, &env->buf[env->buflen - 1],
@@ -1010,10 +1020,13 @@ static int acpi_dock_match(struct acpi_device *device)
1010 return acpi_get_handle(device->handle, "_DCK", &tmp); 1020 return acpi_get_handle(device->handle, "_DCK", &tmp);
1011} 1021}
1012 1022
1013char *acpi_device_hid(struct acpi_device *device) 1023const char *acpi_device_hid(struct acpi_device *device)
1014{ 1024{
1015 struct acpi_hardware_id *hid; 1025 struct acpi_hardware_id *hid;
1016 1026
1027 if (list_empty(&device->pnp.ids))
1028 return dummy_hid;
1029
1017 hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list); 1030 hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list);
1018 return hid->id; 1031 return hid->id;
1019} 1032}
@@ -1142,16 +1155,6 @@ static void acpi_device_set_id(struct acpi_device *device)
1142 acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF); 1155 acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF);
1143 break; 1156 break;
1144 } 1157 }
1145
1146 /*
1147 * We build acpi_devices for some objects that don't have _HID or _CID,
1148 * e.g., PCI bridges and slots. Drivers can't bind to these objects,
1149 * but we do use them indirectly by traversing the acpi_device tree.
1150 * This generic ID isn't useful for driver binding, but it provides
1151 * the useful property that "every acpi_device has an ID."
1152 */
1153 if (list_empty(&device->pnp.ids))
1154 acpi_add_id(device, "device");
1155} 1158}
1156 1159
1157static int acpi_device_set_context(struct acpi_device *device) 1160static int acpi_device_set_context(struct acpi_device *device)
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 2f8f17131d9f..5a27b0a31315 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -37,12 +37,6 @@
37#include <linux/init.h> 37#include <linux/init.h>
38#include <linux/slab.h> 38#include <linux/slab.h>
39#include <linux/types.h> 39#include <linux/types.h>
40
41#ifdef CONFIG_ACPI_PROCFS
42#include <linux/proc_fs.h>
43#include <linux/seq_file.h>
44#endif
45
46#include <linux/jiffies.h> 40#include <linux/jiffies.h>
47#include <linux/kmod.h> 41#include <linux/kmod.h>
48#include <linux/reboot.h> 42#include <linux/reboot.h>
@@ -195,61 +189,6 @@ struct acpi_thermal {
195 struct mutex lock; 189 struct mutex lock;
196}; 190};
197 191
198#ifdef CONFIG_ACPI_PROCFS
199static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file);
200static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file);
201static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file);
202static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file);
203static ssize_t acpi_thermal_write_cooling_mode(struct file *,
204 const char __user *, size_t,
205 loff_t *);
206static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file);
207static ssize_t acpi_thermal_write_polling(struct file *, const char __user *,
208 size_t, loff_t *);
209
210static const struct file_operations acpi_thermal_state_fops = {
211 .owner = THIS_MODULE,
212 .open = acpi_thermal_state_open_fs,
213 .read = seq_read,
214 .llseek = seq_lseek,
215 .release = single_release,
216};
217
218static const struct file_operations acpi_thermal_temp_fops = {
219 .owner = THIS_MODULE,
220 .open = acpi_thermal_temp_open_fs,
221 .read = seq_read,
222 .llseek = seq_lseek,
223 .release = single_release,
224};
225
226static const struct file_operations acpi_thermal_trip_fops = {
227 .owner = THIS_MODULE,
228 .open = acpi_thermal_trip_open_fs,
229 .read = seq_read,
230 .llseek = seq_lseek,
231 .release = single_release,
232};
233
234static const struct file_operations acpi_thermal_cooling_fops = {
235 .owner = THIS_MODULE,
236 .open = acpi_thermal_cooling_open_fs,
237 .read = seq_read,
238 .write = acpi_thermal_write_cooling_mode,
239 .llseek = seq_lseek,
240 .release = single_release,
241};
242
243static const struct file_operations acpi_thermal_polling_fops = {
244 .owner = THIS_MODULE,
245 .open = acpi_thermal_polling_open_fs,
246 .read = seq_read,
247 .write = acpi_thermal_write_polling,
248 .llseek = seq_lseek,
249 .release = single_release,
250};
251#endif /* CONFIG_ACPI_PROCFS*/
252
253/* -------------------------------------------------------------------------- 192/* --------------------------------------------------------------------------
254 Thermal Zone Management 193 Thermal Zone Management
255 -------------------------------------------------------------------------- */ 194 -------------------------------------------------------------------------- */
@@ -958,358 +897,6 @@ static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
958 897
959 898
960/* -------------------------------------------------------------------------- 899/* --------------------------------------------------------------------------
961 FS Interface (/proc)
962 -------------------------------------------------------------------------- */
963#ifdef CONFIG_ACPI_PROCFS
964static struct proc_dir_entry *acpi_thermal_dir;
965
966static int acpi_thermal_state_seq_show(struct seq_file *seq, void *offset)
967{
968 struct acpi_thermal *tz = seq->private;
969
970
971 if (!tz)
972 goto end;
973
974 seq_puts(seq, "state: ");
975
976 if (!tz->state.critical && !tz->state.hot && !tz->state.passive
977 && !tz->state.active)
978 seq_puts(seq, "ok\n");
979 else {
980 if (tz->state.critical)
981 seq_puts(seq, "critical ");
982 if (tz->state.hot)
983 seq_puts(seq, "hot ");
984 if (tz->state.passive)
985 seq_puts(seq, "passive ");
986 if (tz->state.active)
987 seq_printf(seq, "active[%d]", tz->state.active_index);
988 seq_puts(seq, "\n");
989 }
990
991 end:
992 return 0;
993}
994
995static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file)
996{
997 return single_open(file, acpi_thermal_state_seq_show, PDE(inode)->data);
998}
999
1000static int acpi_thermal_temp_seq_show(struct seq_file *seq, void *offset)
1001{
1002 int result = 0;
1003 struct acpi_thermal *tz = seq->private;
1004
1005
1006 if (!tz)
1007 goto end;
1008
1009 result = acpi_thermal_get_temperature(tz);
1010 if (result)
1011 goto end;
1012
1013 seq_printf(seq, "temperature: %ld C\n",
1014 KELVIN_TO_CELSIUS(tz->temperature));
1015
1016 end:
1017 return 0;
1018}
1019
1020static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file)
1021{
1022 return single_open(file, acpi_thermal_temp_seq_show, PDE(inode)->data);
1023}
1024
1025static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
1026{
1027 struct acpi_thermal *tz = seq->private;
1028 struct acpi_device *device;
1029 acpi_status status;
1030
1031 int i = 0;
1032 int j = 0;
1033
1034
1035 if (!tz)
1036 goto end;
1037
1038 if (tz->trips.critical.flags.valid)
1039 seq_printf(seq, "critical (S5): %ld C%s",
1040 KELVIN_TO_CELSIUS(tz->trips.critical.temperature),
1041 nocrt ? " <disabled>\n" : "\n");
1042
1043 if (tz->trips.hot.flags.valid)
1044 seq_printf(seq, "hot (S4): %ld C%s",
1045 KELVIN_TO_CELSIUS(tz->trips.hot.temperature),
1046 nocrt ? " <disabled>\n" : "\n");
1047
1048 if (tz->trips.passive.flags.valid) {
1049 seq_printf(seq,
1050 "passive: %ld C: tc1=%lu tc2=%lu tsp=%lu devices=",
1051 KELVIN_TO_CELSIUS(tz->trips.passive.temperature),
1052 tz->trips.passive.tc1, tz->trips.passive.tc2,
1053 tz->trips.passive.tsp);
1054 for (j = 0; j < tz->trips.passive.devices.count; j++) {
1055 status = acpi_bus_get_device(tz->trips.passive.devices.
1056 handles[j], &device);
1057 seq_printf(seq, "%4.4s ", status ? "" :
1058 acpi_device_bid(device));
1059 }
1060 seq_puts(seq, "\n");
1061 } else {
1062 seq_printf(seq, "passive (forced):");
1063 if (tz->thermal_zone->forced_passive)
1064 seq_printf(seq, " %i C\n",
1065 tz->thermal_zone->forced_passive / 1000);
1066 else
1067 seq_printf(seq, "<not set>\n");
1068 }
1069
1070 for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
1071 if (!(tz->trips.active[i].flags.valid))
1072 break;
1073 seq_printf(seq, "active[%d]: %ld C: devices=",
1074 i,
1075 KELVIN_TO_CELSIUS(tz->trips.active[i].temperature));
1076 for (j = 0; j < tz->trips.active[i].devices.count; j++){
1077 status = acpi_bus_get_device(tz->trips.active[i].
1078 devices.handles[j],
1079 &device);
1080 seq_printf(seq, "%4.4s ", status ? "" :
1081 acpi_device_bid(device));
1082 }
1083 seq_puts(seq, "\n");
1084 }
1085
1086 end:
1087 return 0;
1088}
1089
1090static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file)
1091{
1092 return single_open(file, acpi_thermal_trip_seq_show, PDE(inode)->data);
1093}
1094
1095static int acpi_thermal_cooling_seq_show(struct seq_file *seq, void *offset)
1096{
1097 struct acpi_thermal *tz = seq->private;
1098
1099
1100 if (!tz)
1101 goto end;
1102
1103 if (!tz->flags.cooling_mode)
1104 seq_puts(seq, "<setting not supported>\n");
1105 else
1106 seq_puts(seq, "0 - Active; 1 - Passive\n");
1107
1108 end:
1109 return 0;
1110}
1111
1112static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file)
1113{
1114 return single_open(file, acpi_thermal_cooling_seq_show,
1115 PDE(inode)->data);
1116}
1117
1118static ssize_t
1119acpi_thermal_write_cooling_mode(struct file *file,
1120 const char __user * buffer,
1121 size_t count, loff_t * ppos)
1122{
1123 struct seq_file *m = file->private_data;
1124 struct acpi_thermal *tz = m->private;
1125 int result = 0;
1126 char mode_string[12] = { '\0' };
1127
1128
1129 if (!tz || (count > sizeof(mode_string) - 1))
1130 return -EINVAL;
1131
1132 if (!tz->flags.cooling_mode)
1133 return -ENODEV;
1134
1135 if (copy_from_user(mode_string, buffer, count))
1136 return -EFAULT;
1137
1138 mode_string[count] = '\0';
1139
1140 result = acpi_thermal_set_cooling_mode(tz,
1141 simple_strtoul(mode_string, NULL,
1142 0));
1143 if (result)
1144 return result;
1145
1146 acpi_thermal_check(tz);
1147
1148 return count;
1149}
1150
1151static int acpi_thermal_polling_seq_show(struct seq_file *seq, void *offset)
1152{
1153 struct acpi_thermal *tz = seq->private;
1154
1155
1156 if (!tz)
1157 goto end;
1158
1159 if (!tz->thermal_zone->polling_delay) {
1160 seq_puts(seq, "<polling disabled>\n");
1161 goto end;
1162 }
1163
1164 seq_printf(seq, "polling frequency: %d seconds\n",
1165 (tz->thermal_zone->polling_delay / 1000));
1166
1167 end:
1168 return 0;
1169}
1170
1171static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file)
1172{
1173 return single_open(file, acpi_thermal_polling_seq_show,
1174 PDE(inode)->data);
1175}
1176
1177static int acpi_thermal_set_polling(struct acpi_thermal *tz, int seconds)
1178{
1179 if (!tz)
1180 return -EINVAL;
1181
1182 /* Convert value to deci-seconds */
1183 tz->polling_frequency = seconds * 10;
1184
1185 tz->thermal_zone->polling_delay = seconds * 1000;
1186
1187 if (tz->tz_enabled)
1188 thermal_zone_device_update(tz->thermal_zone);
1189
1190 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1191 "Polling frequency set to %lu seconds\n",
1192 tz->polling_frequency/10));
1193
1194 return 0;
1195}
1196
1197static ssize_t
1198acpi_thermal_write_polling(struct file *file,
1199 const char __user * buffer,
1200 size_t count, loff_t * ppos)
1201{
1202 struct seq_file *m = file->private_data;
1203 struct acpi_thermal *tz = m->private;
1204 int result = 0;
1205 char polling_string[12] = { '\0' };
1206 int seconds = 0;
1207
1208
1209 if (!tz || (count > sizeof(polling_string) - 1))
1210 return -EINVAL;
1211
1212 if (copy_from_user(polling_string, buffer, count))
1213 return -EFAULT;
1214
1215 polling_string[count] = '\0';
1216
1217 seconds = simple_strtoul(polling_string, NULL, 0);
1218
1219 result = acpi_thermal_set_polling(tz, seconds);
1220 if (result)
1221 return result;
1222
1223 acpi_thermal_check(tz);
1224
1225 return count;
1226}
1227
1228static int acpi_thermal_add_fs(struct acpi_device *device)
1229{
1230 struct proc_dir_entry *entry = NULL;
1231
1232
1233 if (!acpi_device_dir(device)) {
1234 acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
1235 acpi_thermal_dir);
1236 if (!acpi_device_dir(device))
1237 return -ENODEV;
1238 }
1239
1240 /* 'state' [R] */
1241 entry = proc_create_data(ACPI_THERMAL_FILE_STATE,
1242 S_IRUGO, acpi_device_dir(device),
1243 &acpi_thermal_state_fops,
1244 acpi_driver_data(device));
1245 if (!entry)
1246 return -ENODEV;
1247
1248 /* 'temperature' [R] */
1249 entry = proc_create_data(ACPI_THERMAL_FILE_TEMPERATURE,
1250 S_IRUGO, acpi_device_dir(device),
1251 &acpi_thermal_temp_fops,
1252 acpi_driver_data(device));
1253 if (!entry)
1254 return -ENODEV;
1255
1256 /* 'trip_points' [R] */
1257 entry = proc_create_data(ACPI_THERMAL_FILE_TRIP_POINTS,
1258 S_IRUGO,
1259 acpi_device_dir(device),
1260 &acpi_thermal_trip_fops,
1261 acpi_driver_data(device));
1262 if (!entry)
1263 return -ENODEV;
1264
1265 /* 'cooling_mode' [R/W] */
1266 entry = proc_create_data(ACPI_THERMAL_FILE_COOLING_MODE,
1267 S_IFREG | S_IRUGO | S_IWUSR,
1268 acpi_device_dir(device),
1269 &acpi_thermal_cooling_fops,
1270 acpi_driver_data(device));
1271 if (!entry)
1272 return -ENODEV;
1273
1274 /* 'polling_frequency' [R/W] */
1275 entry = proc_create_data(ACPI_THERMAL_FILE_POLLING_FREQ,
1276 S_IFREG | S_IRUGO | S_IWUSR,
1277 acpi_device_dir(device),
1278 &acpi_thermal_polling_fops,
1279 acpi_driver_data(device));
1280 if (!entry)
1281 return -ENODEV;
1282 return 0;
1283}
1284
1285static int acpi_thermal_remove_fs(struct acpi_device *device)
1286{
1287
1288 if (acpi_device_dir(device)) {
1289 remove_proc_entry(ACPI_THERMAL_FILE_POLLING_FREQ,
1290 acpi_device_dir(device));
1291 remove_proc_entry(ACPI_THERMAL_FILE_COOLING_MODE,
1292 acpi_device_dir(device));
1293 remove_proc_entry(ACPI_THERMAL_FILE_TRIP_POINTS,
1294 acpi_device_dir(device));
1295 remove_proc_entry(ACPI_THERMAL_FILE_TEMPERATURE,
1296 acpi_device_dir(device));
1297 remove_proc_entry(ACPI_THERMAL_FILE_STATE,
1298 acpi_device_dir(device));
1299 remove_proc_entry(acpi_device_bid(device), acpi_thermal_dir);
1300 acpi_device_dir(device) = NULL;
1301 }
1302
1303 return 0;
1304}
1305#else
1306static inline int acpi_thermal_add_fs(struct acpi_device *device) { return 0; }
1307static inline int acpi_thermal_remove_fs(struct acpi_device *device)
1308{
1309 return 0;
1310}
1311#endif /* CONFIG_ACPI_PROCFS */
1312/* --------------------------------------------------------------------------
1313 Driver Interface 900 Driver Interface
1314 -------------------------------------------------------------------------- */ 901 -------------------------------------------------------------------------- */
1315 902
@@ -1428,17 +1015,11 @@ static int acpi_thermal_add(struct acpi_device *device)
1428 if (result) 1015 if (result)
1429 goto free_memory; 1016 goto free_memory;
1430 1017
1431 result = acpi_thermal_add_fs(device);
1432 if (result)
1433 goto unregister_thermal_zone;
1434
1435 printk(KERN_INFO PREFIX "%s [%s] (%ld C)\n", 1018 printk(KERN_INFO PREFIX "%s [%s] (%ld C)\n",
1436 acpi_device_name(device), acpi_device_bid(device), 1019 acpi_device_name(device), acpi_device_bid(device),
1437 KELVIN_TO_CELSIUS(tz->temperature)); 1020 KELVIN_TO_CELSIUS(tz->temperature));
1438 goto end; 1021 goto end;
1439 1022
1440unregister_thermal_zone:
1441 thermal_zone_device_unregister(tz->thermal_zone);
1442free_memory: 1023free_memory:
1443 kfree(tz); 1024 kfree(tz);
1444end: 1025end:
@@ -1454,7 +1035,6 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
1454 1035
1455 tz = acpi_driver_data(device); 1036 tz = acpi_driver_data(device);
1456 1037
1457 acpi_thermal_remove_fs(device);
1458 acpi_thermal_unregister_thermal_zone(tz); 1038 acpi_thermal_unregister_thermal_zone(tz);
1459 mutex_destroy(&tz->lock); 1039 mutex_destroy(&tz->lock);
1460 kfree(tz); 1040 kfree(tz);
@@ -1580,19 +1160,9 @@ static int __init acpi_thermal_init(void)
1580 return -ENODEV; 1160 return -ENODEV;
1581 } 1161 }
1582 1162
1583#ifdef CONFIG_ACPI_PROCFS
1584 acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir);
1585 if (!acpi_thermal_dir)
1586 return -ENODEV;
1587#endif
1588
1589 result = acpi_bus_register_driver(&acpi_thermal_driver); 1163 result = acpi_bus_register_driver(&acpi_thermal_driver);
1590 if (result < 0) { 1164 if (result < 0)
1591#ifdef CONFIG_ACPI_PROCFS
1592 remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
1593#endif
1594 return -ENODEV; 1165 return -ENODEV;
1595 }
1596 1166
1597 return 0; 1167 return 0;
1598} 1168}
@@ -1602,10 +1172,6 @@ static void __exit acpi_thermal_exit(void)
1602 1172
1603 acpi_bus_unregister_driver(&acpi_thermal_driver); 1173 acpi_bus_unregister_driver(&acpi_thermal_driver);
1604 1174
1605#ifdef CONFIG_ACPI_PROCFS
1606 remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
1607#endif
1608
1609 return; 1175 return;
1610} 1176}
1611 1177
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 67dec0c675aa..5cd0228d2daa 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -30,8 +30,6 @@
30#include <linux/types.h> 30#include <linux/types.h>
31#include <linux/list.h> 31#include <linux/list.h>
32#include <linux/mutex.h> 32#include <linux/mutex.h>
33#include <linux/proc_fs.h>
34#include <linux/seq_file.h>
35#include <linux/input.h> 33#include <linux/input.h>
36#include <linux/backlight.h> 34#include <linux/backlight.h>
37#include <linux/thermal.h> 35#include <linux/thermal.h>
@@ -152,9 +150,6 @@ struct acpi_video_bus {
152 struct acpi_video_bus_flags flags; 150 struct acpi_video_bus_flags flags;
153 struct list_head video_device_list; 151 struct list_head video_device_list;
154 struct mutex device_list_lock; /* protects video_device_list */ 152 struct mutex device_list_lock; /* protects video_device_list */
155#ifdef CONFIG_ACPI_PROCFS
156 struct proc_dir_entry *dir;
157#endif
158 struct input_dev *input; 153 struct input_dev *input;
159 char phys[32]; /* for input device */ 154 char phys[32]; /* for input device */
160 struct notifier_block pm_nb; 155 struct notifier_block pm_nb;
@@ -210,108 +205,6 @@ struct acpi_video_device {
210 struct output_device *output_dev; 205 struct output_device *output_dev;
211}; 206};
212 207
213#ifdef CONFIG_ACPI_PROCFS
214/* bus */
215static int acpi_video_bus_info_open_fs(struct inode *inode, struct file *file);
216static const struct file_operations acpi_video_bus_info_fops = {
217 .owner = THIS_MODULE,
218 .open = acpi_video_bus_info_open_fs,
219 .read = seq_read,
220 .llseek = seq_lseek,
221 .release = single_release,
222};
223
224static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file);
225static const struct file_operations acpi_video_bus_ROM_fops = {
226 .owner = THIS_MODULE,
227 .open = acpi_video_bus_ROM_open_fs,
228 .read = seq_read,
229 .llseek = seq_lseek,
230 .release = single_release,
231};
232
233static int acpi_video_bus_POST_info_open_fs(struct inode *inode,
234 struct file *file);
235static const struct file_operations acpi_video_bus_POST_info_fops = {
236 .owner = THIS_MODULE,
237 .open = acpi_video_bus_POST_info_open_fs,
238 .read = seq_read,
239 .llseek = seq_lseek,
240 .release = single_release,
241};
242
243static int acpi_video_bus_POST_open_fs(struct inode *inode, struct file *file);
244static ssize_t acpi_video_bus_write_POST(struct file *file,
245 const char __user *buffer, size_t count, loff_t *data);
246static const struct file_operations acpi_video_bus_POST_fops = {
247 .owner = THIS_MODULE,
248 .open = acpi_video_bus_POST_open_fs,
249 .read = seq_read,
250 .write = acpi_video_bus_write_POST,
251 .llseek = seq_lseek,
252 .release = single_release,
253};
254
255static int acpi_video_bus_DOS_open_fs(struct inode *inode, struct file *file);
256static ssize_t acpi_video_bus_write_DOS(struct file *file,
257 const char __user *buffer, size_t count, loff_t *data);
258static const struct file_operations acpi_video_bus_DOS_fops = {
259 .owner = THIS_MODULE,
260 .open = acpi_video_bus_DOS_open_fs,
261 .read = seq_read,
262 .write = acpi_video_bus_write_DOS,
263 .llseek = seq_lseek,
264 .release = single_release,
265};
266
267/* device */
268static int acpi_video_device_info_open_fs(struct inode *inode,
269 struct file *file);
270static const struct file_operations acpi_video_device_info_fops = {
271 .owner = THIS_MODULE,
272 .open = acpi_video_device_info_open_fs,
273 .read = seq_read,
274 .llseek = seq_lseek,
275 .release = single_release,
276};
277
278static int acpi_video_device_state_open_fs(struct inode *inode,
279 struct file *file);
280static ssize_t acpi_video_device_write_state(struct file *file,
281 const char __user *buffer, size_t count, loff_t *data);
282static const struct file_operations acpi_video_device_state_fops = {
283 .owner = THIS_MODULE,
284 .open = acpi_video_device_state_open_fs,
285 .read = seq_read,
286 .write = acpi_video_device_write_state,
287 .llseek = seq_lseek,
288 .release = single_release,
289};
290
291static int acpi_video_device_brightness_open_fs(struct inode *inode,
292 struct file *file);
293static ssize_t acpi_video_device_write_brightness(struct file *file,
294 const char __user *buffer, size_t count, loff_t *data);
295static const struct file_operations acpi_video_device_brightness_fops = {
296 .owner = THIS_MODULE,
297 .open = acpi_video_device_brightness_open_fs,
298 .read = seq_read,
299 .write = acpi_video_device_write_brightness,
300 .llseek = seq_lseek,
301 .release = single_release,
302};
303
304static int acpi_video_device_EDID_open_fs(struct inode *inode,
305 struct file *file);
306static const struct file_operations acpi_video_device_EDID_fops = {
307 .owner = THIS_MODULE,
308 .open = acpi_video_device_EDID_open_fs,
309 .read = seq_read,
310 .llseek = seq_lseek,
311 .release = single_release,
312};
313#endif /* CONFIG_ACPI_PROCFS */
314
315static const char device_decode[][30] = { 208static const char device_decode[][30] = {
316 "motherboard VGA device", 209 "motherboard VGA device",
317 "PCI VGA device", 210 "PCI VGA device",
@@ -1111,646 +1004,6 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
1111} 1004}
1112 1005
1113/* -------------------------------------------------------------------------- 1006/* --------------------------------------------------------------------------
1114 FS Interface (/proc)
1115 -------------------------------------------------------------------------- */
1116#ifdef CONFIG_ACPI_PROCFS
1117
1118static struct proc_dir_entry *acpi_video_dir;
1119
1120/* video devices */
1121
1122static int acpi_video_device_info_seq_show(struct seq_file *seq, void *offset)
1123{
1124 struct acpi_video_device *dev = seq->private;
1125
1126
1127 if (!dev)
1128 goto end;
1129
1130 seq_printf(seq, "device_id: 0x%04x\n", (u32) dev->device_id);
1131 seq_printf(seq, "type: ");
1132 if (dev->flags.crt)
1133 seq_printf(seq, "CRT\n");
1134 else if (dev->flags.lcd)
1135 seq_printf(seq, "LCD\n");
1136 else if (dev->flags.tvout)
1137 seq_printf(seq, "TVOUT\n");
1138 else if (dev->flags.dvi)
1139 seq_printf(seq, "DVI\n");
1140 else
1141 seq_printf(seq, "UNKNOWN\n");
1142
1143 seq_printf(seq, "known by bios: %s\n", dev->flags.bios ? "yes" : "no");
1144
1145 end:
1146 return 0;
1147}
1148
1149static int
1150acpi_video_device_info_open_fs(struct inode *inode, struct file *file)
1151{
1152 return single_open(file, acpi_video_device_info_seq_show,
1153 PDE(inode)->data);
1154}
1155
1156static int
1157acpi_video_device_query(struct acpi_video_device *device,
1158 unsigned long long *state)
1159{
1160 int status;
1161
1162 status = acpi_evaluate_integer(device->dev->handle, "_DGS",
1163 NULL, state);
1164
1165 return status;
1166}
1167
1168static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
1169{
1170 int status;
1171 struct acpi_video_device *dev = seq->private;
1172 unsigned long long state;
1173
1174
1175 if (!dev)
1176 goto end;
1177
1178 status = acpi_video_device_get_state(dev, &state);
1179 seq_printf(seq, "state: ");
1180 if (ACPI_SUCCESS(status))
1181 seq_printf(seq, "0x%02llx\n", state);
1182 else
1183 seq_printf(seq, "<not supported>\n");
1184
1185 status = acpi_video_device_query(dev, &state);
1186 seq_printf(seq, "query: ");
1187 if (ACPI_SUCCESS(status))
1188 seq_printf(seq, "0x%02llx\n", state);
1189 else
1190 seq_printf(seq, "<not supported>\n");
1191
1192 end:
1193 return 0;
1194}
1195
1196static int
1197acpi_video_device_state_open_fs(struct inode *inode, struct file *file)
1198{
1199 return single_open(file, acpi_video_device_state_seq_show,
1200 PDE(inode)->data);
1201}
1202
1203static ssize_t
1204acpi_video_device_write_state(struct file *file,
1205 const char __user * buffer,
1206 size_t count, loff_t * data)
1207{
1208 int status;
1209 struct seq_file *m = file->private_data;
1210 struct acpi_video_device *dev = m->private;
1211 char str[12] = { 0 };
1212 u32 state = 0;
1213
1214
1215 if (!dev || count >= sizeof(str))
1216 return -EINVAL;
1217
1218 if (copy_from_user(str, buffer, count))
1219 return -EFAULT;
1220
1221 str[count] = 0;
1222 state = simple_strtoul(str, NULL, 0);
1223 state &= ((1ul << 31) | (1ul << 30) | (1ul << 0));
1224
1225 status = acpi_video_device_set_state(dev, state);
1226
1227 if (status)
1228 return -EFAULT;
1229
1230 return count;
1231}
1232
1233static int
1234acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset)
1235{
1236 struct acpi_video_device *dev = seq->private;
1237 int i;
1238
1239
1240 if (!dev || !dev->brightness) {
1241 seq_printf(seq, "<not supported>\n");
1242 return 0;
1243 }
1244
1245 seq_printf(seq, "levels: ");
1246 for (i = 2; i < dev->brightness->count; i++)
1247 seq_printf(seq, " %d", dev->brightness->levels[i]);
1248 seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
1249
1250 return 0;
1251}
1252
1253static int
1254acpi_video_device_brightness_open_fs(struct inode *inode, struct file *file)
1255{
1256 return single_open(file, acpi_video_device_brightness_seq_show,
1257 PDE(inode)->data);
1258}
1259
1260static ssize_t
1261acpi_video_device_write_brightness(struct file *file,
1262 const char __user * buffer,
1263 size_t count, loff_t * data)
1264{
1265 struct seq_file *m = file->private_data;
1266 struct acpi_video_device *dev = m->private;
1267 char str[5] = { 0 };
1268 unsigned int level = 0;
1269 int i;
1270
1271
1272 if (!dev || !dev->brightness || count >= sizeof(str))
1273 return -EINVAL;
1274
1275 if (copy_from_user(str, buffer, count))
1276 return -EFAULT;
1277
1278 str[count] = 0;
1279 level = simple_strtoul(str, NULL, 0);
1280
1281 if (level > 100)
1282 return -EFAULT;
1283
1284 /* validate through the list of available levels */
1285 for (i = 2; i < dev->brightness->count; i++)
1286 if (level == dev->brightness->levels[i]) {
1287 if (!acpi_video_device_lcd_set_level(dev, level))
1288 return count;
1289 break;
1290 }
1291
1292 return -EINVAL;
1293}
1294
1295static int acpi_video_device_EDID_seq_show(struct seq_file *seq, void *offset)
1296{
1297 struct acpi_video_device *dev = seq->private;
1298 int status;
1299 int i;
1300 union acpi_object *edid = NULL;
1301
1302
1303 if (!dev)
1304 goto out;
1305
1306 status = acpi_video_device_EDID(dev, &edid, 128);
1307 if (ACPI_FAILURE(status)) {
1308 status = acpi_video_device_EDID(dev, &edid, 256);
1309 }
1310
1311 if (ACPI_FAILURE(status)) {
1312 goto out;
1313 }
1314
1315 if (edid && edid->type == ACPI_TYPE_BUFFER) {
1316 for (i = 0; i < edid->buffer.length; i++)
1317 seq_putc(seq, edid->buffer.pointer[i]);
1318 }
1319
1320 out:
1321 if (!edid)
1322 seq_printf(seq, "<not supported>\n");
1323 else
1324 kfree(edid);
1325
1326 return 0;
1327}
1328
1329static int
1330acpi_video_device_EDID_open_fs(struct inode *inode, struct file *file)
1331{
1332 return single_open(file, acpi_video_device_EDID_seq_show,
1333 PDE(inode)->data);
1334}
1335
1336static int acpi_video_device_add_fs(struct acpi_device *device)
1337{
1338 struct proc_dir_entry *entry, *device_dir;
1339 struct acpi_video_device *vid_dev;
1340
1341 vid_dev = acpi_driver_data(device);
1342 if (!vid_dev)
1343 return -ENODEV;
1344
1345 device_dir = proc_mkdir(acpi_device_bid(device),
1346 vid_dev->video->dir);
1347 if (!device_dir)
1348 return -ENOMEM;
1349
1350 /* 'info' [R] */
1351 entry = proc_create_data("info", S_IRUGO, device_dir,
1352 &acpi_video_device_info_fops, acpi_driver_data(device));
1353 if (!entry)
1354 goto err_remove_dir;
1355
1356 /* 'state' [R/W] */
1357 entry = proc_create_data("state", S_IFREG | S_IRUGO | S_IWUSR,
1358 device_dir,
1359 &acpi_video_device_state_fops,
1360 acpi_driver_data(device));
1361 if (!entry)
1362 goto err_remove_info;
1363
1364 /* 'brightness' [R/W] */
1365 entry = proc_create_data("brightness", S_IFREG | S_IRUGO | S_IWUSR,
1366 device_dir,
1367 &acpi_video_device_brightness_fops,
1368 acpi_driver_data(device));
1369 if (!entry)
1370 goto err_remove_state;
1371
1372 /* 'EDID' [R] */
1373 entry = proc_create_data("EDID", S_IRUGO, device_dir,
1374 &acpi_video_device_EDID_fops,
1375 acpi_driver_data(device));
1376 if (!entry)
1377 goto err_remove_brightness;
1378
1379 acpi_device_dir(device) = device_dir;
1380
1381 return 0;
1382
1383 err_remove_brightness:
1384 remove_proc_entry("brightness", device_dir);
1385 err_remove_state:
1386 remove_proc_entry("state", device_dir);
1387 err_remove_info:
1388 remove_proc_entry("info", device_dir);
1389 err_remove_dir:
1390 remove_proc_entry(acpi_device_bid(device), vid_dev->video->dir);
1391 return -ENOMEM;
1392}
1393
1394static int acpi_video_device_remove_fs(struct acpi_device *device)
1395{
1396 struct acpi_video_device *vid_dev;
1397 struct proc_dir_entry *device_dir;
1398
1399 vid_dev = acpi_driver_data(device);
1400 if (!vid_dev || !vid_dev->video || !vid_dev->video->dir)
1401 return -ENODEV;
1402
1403 device_dir = acpi_device_dir(device);
1404 if (device_dir) {
1405 remove_proc_entry("info", device_dir);
1406 remove_proc_entry("state", device_dir);
1407 remove_proc_entry("brightness", device_dir);
1408 remove_proc_entry("EDID", device_dir);
1409 remove_proc_entry(acpi_device_bid(device), vid_dev->video->dir);
1410 acpi_device_dir(device) = NULL;
1411 }
1412
1413 return 0;
1414}
1415
1416/* video bus */
1417static int acpi_video_bus_info_seq_show(struct seq_file *seq, void *offset)
1418{
1419 struct acpi_video_bus *video = seq->private;
1420
1421
1422 if (!video)
1423 goto end;
1424
1425 seq_printf(seq, "Switching heads: %s\n",
1426 video->flags.multihead ? "yes" : "no");
1427 seq_printf(seq, "Video ROM: %s\n",
1428 video->flags.rom ? "yes" : "no");
1429 seq_printf(seq, "Device to be POSTed on boot: %s\n",
1430 video->flags.post ? "yes" : "no");
1431
1432 end:
1433 return 0;
1434}
1435
1436static int acpi_video_bus_info_open_fs(struct inode *inode, struct file *file)
1437{
1438 return single_open(file, acpi_video_bus_info_seq_show,
1439 PDE(inode)->data);
1440}
1441
1442static int acpi_video_bus_ROM_seq_show(struct seq_file *seq, void *offset)
1443{
1444 struct acpi_video_bus *video = seq->private;
1445
1446
1447 if (!video)
1448 goto end;
1449
1450 printk(KERN_INFO PREFIX "Please implement %s\n", __func__);
1451 seq_printf(seq, "<TODO>\n");
1452
1453 end:
1454 return 0;
1455}
1456
1457static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file)
1458{
1459 return single_open(file, acpi_video_bus_ROM_seq_show, PDE(inode)->data);
1460}
1461
1462static int
1463acpi_video_bus_POST_options(struct acpi_video_bus *video,
1464 unsigned long long *options)
1465{
1466 int status;
1467
1468 status = acpi_evaluate_integer(video->device->handle, "_VPO",
1469 NULL, options);
1470 *options &= 3;
1471
1472 return status;
1473}
1474
1475static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
1476{
1477 struct acpi_video_bus *video = seq->private;
1478 unsigned long long options;
1479 int status;
1480
1481
1482 if (!video)
1483 goto end;
1484
1485 status = acpi_video_bus_POST_options(video, &options);
1486 if (ACPI_SUCCESS(status)) {
1487 if (!(options & 1)) {
1488 printk(KERN_WARNING PREFIX
1489 "The motherboard VGA device is not listed as a possible POST device.\n");
1490 printk(KERN_WARNING PREFIX
1491 "This indicates a BIOS bug. Please contact the manufacturer.\n");
1492 }
1493 printk(KERN_WARNING "%llx\n", options);
1494 seq_printf(seq, "can POST: <integrated video>");
1495 if (options & 2)
1496 seq_printf(seq, " <PCI video>");
1497 if (options & 4)
1498 seq_printf(seq, " <AGP video>");
1499 seq_putc(seq, '\n');
1500 } else
1501 seq_printf(seq, "<not supported>\n");
1502 end:
1503 return 0;
1504}
1505
1506static int
1507acpi_video_bus_POST_info_open_fs(struct inode *inode, struct file *file)
1508{
1509 return single_open(file, acpi_video_bus_POST_info_seq_show,
1510 PDE(inode)->data);
1511}
1512
1513static int
1514acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long long *id)
1515{
1516 int status;
1517
1518 status = acpi_evaluate_integer(video->device->handle, "_GPD", NULL, id);
1519
1520 return status;
1521}
1522
1523static int acpi_video_bus_POST_seq_show(struct seq_file *seq, void *offset)
1524{
1525 struct acpi_video_bus *video = seq->private;
1526 int status;
1527 unsigned long long id;
1528
1529
1530 if (!video)
1531 goto end;
1532
1533 status = acpi_video_bus_get_POST(video, &id);
1534 if (!ACPI_SUCCESS(status)) {
1535 seq_printf(seq, "<not supported>\n");
1536 goto end;
1537 }
1538 seq_printf(seq, "device POSTed is <%s>\n", device_decode[id & 3]);
1539
1540 end:
1541 return 0;
1542}
1543
1544static int acpi_video_bus_DOS_seq_show(struct seq_file *seq, void *offset)
1545{
1546 struct acpi_video_bus *video = seq->private;
1547
1548
1549 seq_printf(seq, "DOS setting: <%d>\n", video->dos_setting);
1550
1551 return 0;
1552}
1553
1554static int acpi_video_bus_POST_open_fs(struct inode *inode, struct file *file)
1555{
1556 return single_open(file, acpi_video_bus_POST_seq_show,
1557 PDE(inode)->data);
1558}
1559
1560static int acpi_video_bus_DOS_open_fs(struct inode *inode, struct file *file)
1561{
1562 return single_open(file, acpi_video_bus_DOS_seq_show, PDE(inode)->data);
1563}
1564
1565static int
1566acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
1567{
1568 int status;
1569 unsigned long long tmp;
1570 union acpi_object arg0 = { ACPI_TYPE_INTEGER };
1571 struct acpi_object_list args = { 1, &arg0 };
1572
1573
1574 arg0.integer.value = option;
1575
1576 status = acpi_evaluate_integer(video->device->handle, "_SPD",
1577 &args, &tmp);
1578 if (ACPI_SUCCESS(status))
1579 status = tmp ? (-EINVAL) : (AE_OK);
1580
1581 return status;
1582}
1583
1584static ssize_t
1585acpi_video_bus_write_POST(struct file *file,
1586 const char __user * buffer,
1587 size_t count, loff_t * data)
1588{
1589 int status;
1590 struct seq_file *m = file->private_data;
1591 struct acpi_video_bus *video = m->private;
1592 char str[12] = { 0 };
1593 unsigned long long opt, options;
1594
1595
1596 if (!video || count >= sizeof(str))
1597 return -EINVAL;
1598
1599 status = acpi_video_bus_POST_options(video, &options);
1600 if (!ACPI_SUCCESS(status))
1601 return -EINVAL;
1602
1603 if (copy_from_user(str, buffer, count))
1604 return -EFAULT;
1605
1606 str[count] = 0;
1607 opt = strtoul(str, NULL, 0);
1608 if (opt > 3)
1609 return -EFAULT;
1610
1611 /* just in case an OEM 'forgot' the motherboard... */
1612 options |= 1;
1613
1614 if (options & (1ul << opt)) {
1615 status = acpi_video_bus_set_POST(video, opt);
1616 if (!ACPI_SUCCESS(status))
1617 return -EFAULT;
1618
1619 }
1620
1621 return count;
1622}
1623
1624static ssize_t
1625acpi_video_bus_write_DOS(struct file *file,
1626 const char __user * buffer,
1627 size_t count, loff_t * data)
1628{
1629 int status;
1630 struct seq_file *m = file->private_data;
1631 struct acpi_video_bus *video = m->private;
1632 char str[12] = { 0 };
1633 unsigned long opt;
1634
1635
1636 if (!video || count >= sizeof(str))
1637 return -EINVAL;
1638
1639 if (copy_from_user(str, buffer, count))
1640 return -EFAULT;
1641
1642 str[count] = 0;
1643 opt = strtoul(str, NULL, 0);
1644 if (opt > 7)
1645 return -EFAULT;
1646
1647 status = acpi_video_bus_DOS(video, opt & 0x3, (opt & 0x4) >> 2);
1648
1649 if (!ACPI_SUCCESS(status))
1650 return -EFAULT;
1651
1652 return count;
1653}
1654
1655static int acpi_video_bus_add_fs(struct acpi_device *device)
1656{
1657 struct acpi_video_bus *video = acpi_driver_data(device);
1658 struct proc_dir_entry *device_dir;
1659 struct proc_dir_entry *entry;
1660
1661 device_dir = proc_mkdir(acpi_device_bid(device), acpi_video_dir);
1662 if (!device_dir)
1663 return -ENOMEM;
1664
1665 /* 'info' [R] */
1666 entry = proc_create_data("info", S_IRUGO, device_dir,
1667 &acpi_video_bus_info_fops,
1668 acpi_driver_data(device));
1669 if (!entry)
1670 goto err_remove_dir;
1671
1672 /* 'ROM' [R] */
1673 entry = proc_create_data("ROM", S_IRUGO, device_dir,
1674 &acpi_video_bus_ROM_fops,
1675 acpi_driver_data(device));
1676 if (!entry)
1677 goto err_remove_info;
1678
1679 /* 'POST_info' [R] */
1680 entry = proc_create_data("POST_info", S_IRUGO, device_dir,
1681 &acpi_video_bus_POST_info_fops,
1682 acpi_driver_data(device));
1683 if (!entry)
1684 goto err_remove_rom;
1685
1686 /* 'POST' [R/W] */
1687 entry = proc_create_data("POST", S_IFREG | S_IRUGO | S_IWUSR,
1688 device_dir,
1689 &acpi_video_bus_POST_fops,
1690 acpi_driver_data(device));
1691 if (!entry)
1692 goto err_remove_post_info;
1693
1694 /* 'DOS' [R/W] */
1695 entry = proc_create_data("DOS", S_IFREG | S_IRUGO | S_IWUSR,
1696 device_dir,
1697 &acpi_video_bus_DOS_fops,
1698 acpi_driver_data(device));
1699 if (!entry)
1700 goto err_remove_post;
1701
1702 video->dir = acpi_device_dir(device) = device_dir;
1703 return 0;
1704
1705 err_remove_post:
1706 remove_proc_entry("POST", device_dir);
1707 err_remove_post_info:
1708 remove_proc_entry("POST_info", device_dir);
1709 err_remove_rom:
1710 remove_proc_entry("ROM", device_dir);
1711 err_remove_info:
1712 remove_proc_entry("info", device_dir);
1713 err_remove_dir:
1714 remove_proc_entry(acpi_device_bid(device), acpi_video_dir);
1715 return -ENOMEM;
1716}
1717
1718static int acpi_video_bus_remove_fs(struct acpi_device *device)
1719{
1720 struct proc_dir_entry *device_dir = acpi_device_dir(device);
1721
1722 if (device_dir) {
1723 remove_proc_entry("info", device_dir);
1724 remove_proc_entry("ROM", device_dir);
1725 remove_proc_entry("POST_info", device_dir);
1726 remove_proc_entry("POST", device_dir);
1727 remove_proc_entry("DOS", device_dir);
1728 remove_proc_entry(acpi_device_bid(device), acpi_video_dir);
1729 acpi_device_dir(device) = NULL;
1730 }
1731
1732 return 0;
1733}
1734#else
1735static inline int acpi_video_device_add_fs(struct acpi_device *device)
1736{
1737 return 0;
1738}
1739static inline int acpi_video_device_remove_fs(struct acpi_device *device)
1740{
1741 return 0;
1742}
1743static inline int acpi_video_bus_add_fs(struct acpi_device *device)
1744{
1745 return 0;
1746}
1747static inline int acpi_video_bus_remove_fs(struct acpi_device *device)
1748{
1749 return 0;
1750}
1751#endif /* CONFIG_ACPI_PROCFS */
1752
1753/* --------------------------------------------------------------------------
1754 Driver Interface 1007 Driver Interface
1755 -------------------------------------------------------------------------- */ 1008 -------------------------------------------------------------------------- */
1756 1009
@@ -1877,8 +1130,6 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
1877 list_add_tail(&data->entry, &video->video_device_list); 1130 list_add_tail(&data->entry, &video->video_device_list);
1878 mutex_unlock(&video->device_list_lock); 1131 mutex_unlock(&video->device_list_lock);
1879 1132
1880 acpi_video_device_add_fs(device);
1881
1882 return 0; 1133 return 0;
1883 } 1134 }
1884 1135
@@ -2181,8 +1432,6 @@ static int acpi_video_bus_put_one_device(struct acpi_video_device *device)
2181 if (!device || !device->video) 1432 if (!device || !device->video)
2182 return -ENOENT; 1433 return -ENOENT;
2183 1434
2184 acpi_video_device_remove_fs(device->dev);
2185
2186 status = acpi_remove_notify_handler(device->dev->handle, 1435 status = acpi_remove_notify_handler(device->dev->handle,
2187 ACPI_DEVICE_NOTIFY, 1436 ACPI_DEVICE_NOTIFY,
2188 acpi_video_device_notify); 1437 acpi_video_device_notify);
@@ -2466,10 +1715,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
2466 if (error) 1715 if (error)
2467 goto err_free_video; 1716 goto err_free_video;
2468 1717
2469 error = acpi_video_bus_add_fs(device);
2470 if (error)
2471 goto err_free_video;
2472
2473 mutex_init(&video->device_list_lock); 1718 mutex_init(&video->device_list_lock);
2474 INIT_LIST_HEAD(&video->video_device_list); 1719 INIT_LIST_HEAD(&video->video_device_list);
2475 1720
@@ -2522,7 +1767,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
2522 acpi_video_bus_stop_devices(video); 1767 acpi_video_bus_stop_devices(video);
2523 acpi_video_bus_put_devices(video); 1768 acpi_video_bus_put_devices(video);
2524 kfree(video->attached_array); 1769 kfree(video->attached_array);
2525 acpi_video_bus_remove_fs(device);
2526 err_free_video: 1770 err_free_video:
2527 kfree(video); 1771 kfree(video);
2528 device->driver_data = NULL; 1772 device->driver_data = NULL;
@@ -2544,7 +1788,6 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)
2544 1788
2545 acpi_video_bus_stop_devices(video); 1789 acpi_video_bus_stop_devices(video);
2546 acpi_video_bus_put_devices(video); 1790 acpi_video_bus_put_devices(video);
2547 acpi_video_bus_remove_fs(device);
2548 1791
2549 input_unregister_device(video->input); 1792 input_unregister_device(video->input);
2550 kfree(video->attached_array); 1793 kfree(video->attached_array);
@@ -2584,17 +1827,9 @@ int acpi_video_register(void)
2584 return 0; 1827 return 0;
2585 } 1828 }
2586 1829
2587#ifdef CONFIG_ACPI_PROCFS
2588 acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir);
2589 if (!acpi_video_dir)
2590 return -ENODEV;
2591#endif
2592
2593 result = acpi_bus_register_driver(&acpi_video_bus); 1830 result = acpi_bus_register_driver(&acpi_video_bus);
2594 if (result < 0) { 1831 if (result < 0)
2595 remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
2596 return -ENODEV; 1832 return -ENODEV;
2597 }
2598 1833
2599 /* 1834 /*
2600 * When the acpi_video_bus is loaded successfully, increase 1835 * When the acpi_video_bus is loaded successfully, increase
@@ -2617,10 +1852,6 @@ void acpi_video_unregister(void)
2617 } 1852 }
2618 acpi_bus_unregister_driver(&acpi_video_bus); 1853 acpi_bus_unregister_driver(&acpi_video_bus);
2619 1854
2620#ifdef CONFIG_ACPI_PROCFS
2621 remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
2622#endif
2623
2624 register_count = 0; 1855 register_count = 0;
2625 1856
2626 return; 1857 return;
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c
index ee9ddeb53417..8cb0347dec28 100644
--- a/drivers/atm/iphase.c
+++ b/drivers/atm/iphase.c
@@ -3156,7 +3156,6 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
3156{ 3156{
3157 struct atm_dev *dev; 3157 struct atm_dev *dev;
3158 IADEV *iadev; 3158 IADEV *iadev;
3159 unsigned long flags;
3160 int ret; 3159 int ret;
3161 3160
3162 iadev = kzalloc(sizeof(*iadev), GFP_KERNEL); 3161 iadev = kzalloc(sizeof(*iadev), GFP_KERNEL);
@@ -3188,19 +3187,14 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
3188 ia_dev[iadev_count] = iadev; 3187 ia_dev[iadev_count] = iadev;
3189 _ia_dev[iadev_count] = dev; 3188 _ia_dev[iadev_count] = dev;
3190 iadev_count++; 3189 iadev_count++;
3191 spin_lock_init(&iadev->misc_lock);
3192 /* First fixes first. I don't want to think about this now. */
3193 spin_lock_irqsave(&iadev->misc_lock, flags);
3194 if (ia_init(dev) || ia_start(dev)) { 3190 if (ia_init(dev) || ia_start(dev)) {
3195 IF_INIT(printk("IA register failed!\n");) 3191 IF_INIT(printk("IA register failed!\n");)
3196 iadev_count--; 3192 iadev_count--;
3197 ia_dev[iadev_count] = NULL; 3193 ia_dev[iadev_count] = NULL;
3198 _ia_dev[iadev_count] = NULL; 3194 _ia_dev[iadev_count] = NULL;
3199 spin_unlock_irqrestore(&iadev->misc_lock, flags);
3200 ret = -EINVAL; 3195 ret = -EINVAL;
3201 goto err_out_deregister_dev; 3196 goto err_out_deregister_dev;
3202 } 3197 }
3203 spin_unlock_irqrestore(&iadev->misc_lock, flags);
3204 IF_EVENT(printk("iadev_count = %d\n", iadev_count);) 3198 IF_EVENT(printk("iadev_count = %d\n", iadev_count);)
3205 3199
3206 iadev->next_board = ia_boards; 3200 iadev->next_board = ia_boards;
diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h
index b2cd20f549cb..077735e0e04b 100644
--- a/drivers/atm/iphase.h
+++ b/drivers/atm/iphase.h
@@ -1022,7 +1022,7 @@ typedef struct iadev_t {
1022 struct dle_q rx_dle_q; 1022 struct dle_q rx_dle_q;
1023 struct free_desc_q *rx_free_desc_qhead; 1023 struct free_desc_q *rx_free_desc_qhead;
1024 struct sk_buff_head rx_dma_q; 1024 struct sk_buff_head rx_dma_q;
1025 spinlock_t rx_lock, misc_lock; 1025 spinlock_t rx_lock;
1026 struct atm_vcc **rx_open; /* list of all open VCs */ 1026 struct atm_vcc **rx_open; /* list of all open VCs */
1027 u16 num_rx_desc, rx_buf_sz, rxing; 1027 u16 num_rx_desc, rx_buf_sz, rxing;
1028 u32 rx_pkt_ram, rx_tmp_cnt; 1028 u32 rx_pkt_ram, rx_tmp_cnt;
diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c
index f916ddf63938..f46138ab38b6 100644
--- a/drivers/atm/solos-pci.c
+++ b/drivers/atm/solos-pci.c
@@ -444,6 +444,7 @@ static ssize_t console_show(struct device *dev, struct device_attribute *attr,
444 struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev); 444 struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
445 struct solos_card *card = atmdev->dev_data; 445 struct solos_card *card = atmdev->dev_data;
446 struct sk_buff *skb; 446 struct sk_buff *skb;
447 unsigned int len;
447 448
448 spin_lock(&card->cli_queue_lock); 449 spin_lock(&card->cli_queue_lock);
449 skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]); 450 skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]);
@@ -451,11 +452,12 @@ static ssize_t console_show(struct device *dev, struct device_attribute *attr,
451 if(skb == NULL) 452 if(skb == NULL)
452 return sprintf(buf, "No data.\n"); 453 return sprintf(buf, "No data.\n");
453 454
454 memcpy(buf, skb->data, skb->len); 455 len = skb->len;
455 dev_dbg(&card->dev->dev, "len: %d\n", skb->len); 456 memcpy(buf, skb->data, len);
457 dev_dbg(&card->dev->dev, "len: %d\n", len);
456 458
457 kfree_skb(skb); 459 kfree_skb(skb);
458 return skb->len; 460 return len;
459} 461}
460 462
461static int send_command(struct solos_card *card, int dev, const char *buf, size_t size) 463static int send_command(struct solos_card *card, int dev, const char *buf, size_t size)
diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c
index e9da874d0419..03688c2da319 100644
--- a/drivers/block/ps3disk.c
+++ b/drivers/block/ps3disk.c
@@ -113,7 +113,7 @@ static void ps3disk_scatter_gather(struct ps3_storage_device *dev,
113 memcpy(buf, dev->bounce_buf+offset, size); 113 memcpy(buf, dev->bounce_buf+offset, size);
114 offset += size; 114 offset += size;
115 flush_kernel_dcache_page(bvec->bv_page); 115 flush_kernel_dcache_page(bvec->bv_page);
116 bvec_kunmap_irq(bvec, &flags); 116 bvec_kunmap_irq(buf, &flags);
117 i++; 117 i++;
118 } 118 }
119} 119}
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index c810481a5bc2..0f69c5ec0ecd 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -459,9 +459,12 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count,
459 459
460 /* 460 /*
461 * Wait till the host acknowledges it pushed out the data we 461 * Wait till the host acknowledges it pushed out the data we
462 * sent. This is done for ports in blocking mode or for data 462 * sent. This is done for data from the hvc_console; the tty
463 * from the hvc_console; the tty operations are performed with 463 * operations are performed with spinlocks held so we can't
464 * spinlocks held so we can't sleep here. 464 * sleep here. An alternative would be to copy the data to a
465 * buffer and relax the spinning requirement. The downside is
466 * we need to kmalloc a GFP_ATOMIC buffer each time the
467 * console driver writes something out.
465 */ 468 */
466 while (!virtqueue_get_buf(out_vq, &len)) 469 while (!virtqueue_get_buf(out_vq, &len))
467 cpu_relax(); 470 cpu_relax();
@@ -626,6 +629,14 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,
626 goto free_buf; 629 goto free_buf;
627 } 630 }
628 631
632 /*
633 * We now ask send_buf() to not spin for generic ports -- we
634 * can re-use the same code path that non-blocking file
635 * descriptors take for blocking file descriptors since the
636 * wait is already done and we're certain the write will go
637 * through to the host.
638 */
639 nonblock = true;
629 ret = send_buf(port, buf, count, nonblock); 640 ret = send_buf(port, buf, count, nonblock);
630 641
631 if (nonblock && ret > 0) 642 if (nonblock && ret > 0)
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c
index 216f9d383b5b..effd140fc042 100644
--- a/drivers/dma/ioat/dma_v2.c
+++ b/drivers/dma/ioat/dma_v2.c
@@ -879,7 +879,7 @@ int __devinit ioat2_dma_probe(struct ioatdma_device *device, int dca)
879 dma->device_issue_pending = ioat2_issue_pending; 879 dma->device_issue_pending = ioat2_issue_pending;
880 dma->device_alloc_chan_resources = ioat2_alloc_chan_resources; 880 dma->device_alloc_chan_resources = ioat2_alloc_chan_resources;
881 dma->device_free_chan_resources = ioat2_free_chan_resources; 881 dma->device_free_chan_resources = ioat2_free_chan_resources;
882 dma->device_tx_status = ioat_tx_status; 882 dma->device_tx_status = ioat_dma_tx_status;
883 883
884 err = ioat_probe(device); 884 err = ioat_probe(device);
885 if (err) 885 if (err)
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 1b05896648bc..9dcb17d51aee 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -2840,7 +2840,7 @@ static int __devinit pci_probe(struct pci_dev *dev,
2840 const struct pci_device_id *ent) 2840 const struct pci_device_id *ent)
2841{ 2841{
2842 struct fw_ohci *ohci; 2842 struct fw_ohci *ohci;
2843 u32 bus_options, max_receive, link_speed, version, link_enh; 2843 u32 bus_options, max_receive, link_speed, version;
2844 u64 guid; 2844 u64 guid;
2845 int i, err, n_ir, n_it; 2845 int i, err, n_ir, n_it;
2846 size_t size; 2846 size_t size;
@@ -2894,23 +2894,6 @@ static int __devinit pci_probe(struct pci_dev *dev,
2894 if (param_quirks) 2894 if (param_quirks)
2895 ohci->quirks = param_quirks; 2895 ohci->quirks = param_quirks;
2896 2896
2897 /* TI OHCI-Lynx and compatible: set recommended configuration bits. */
2898 if (dev->vendor == PCI_VENDOR_ID_TI) {
2899 pci_read_config_dword(dev, PCI_CFG_TI_LinkEnh, &link_enh);
2900
2901 /* adjust latency of ATx FIFO: use 1.7 KB threshold */
2902 link_enh &= ~TI_LinkEnh_atx_thresh_mask;
2903 link_enh |= TI_LinkEnh_atx_thresh_1_7K;
2904
2905 /* use priority arbitration for asynchronous responses */
2906 link_enh |= TI_LinkEnh_enab_unfair;
2907
2908 /* required for aPhyEnhanceEnable to work */
2909 link_enh |= TI_LinkEnh_enab_accel;
2910
2911 pci_write_config_dword(dev, PCI_CFG_TI_LinkEnh, link_enh);
2912 }
2913
2914 ar_context_init(&ohci->ar_request_ctx, ohci, 2897 ar_context_init(&ohci->ar_request_ctx, ohci,
2915 OHCI1394_AsReqRcvContextControlSet); 2898 OHCI1394_AsReqRcvContextControlSet);
2916 2899
diff --git a/drivers/firewire/ohci.h b/drivers/firewire/ohci.h
index 0e6c5a466908..ef5e7336da68 100644
--- a/drivers/firewire/ohci.h
+++ b/drivers/firewire/ohci.h
@@ -155,12 +155,4 @@
155 155
156#define OHCI1394_phy_tcode 0xe 156#define OHCI1394_phy_tcode 0xe
157 157
158/* TI extensions */
159
160#define PCI_CFG_TI_LinkEnh 0xf4
161#define TI_LinkEnh_enab_accel 0x00000002
162#define TI_LinkEnh_enab_unfair 0x00000080
163#define TI_LinkEnh_atx_thresh_mask 0x00003000
164#define TI_LinkEnh_atx_thresh_1_7K 0x00001000
165
166#endif /* _FIREWIRE_OHCI_H */ 158#endif /* _FIREWIRE_OHCI_H */
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 79082d4398ae..2f93d46ae69a 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1137,7 +1137,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1137 1137
1138 WREG32(RCU_IND_INDEX, 0x203); 1138 WREG32(RCU_IND_INDEX, 0x203);
1139 efuse_straps_3 = RREG32(RCU_IND_DATA); 1139 efuse_straps_3 = RREG32(RCU_IND_DATA);
1140 efuse_box_bit_127_124 = (u8)(efuse_straps_3 & 0xF0000000) >> 28; 1140 efuse_box_bit_127_124 = (u8)((efuse_straps_3 & 0xF0000000) >> 28);
1141 1141
1142 switch(efuse_box_bit_127_124) { 1142 switch(efuse_box_bit_127_124) {
1143 case 0x0: 1143 case 0x0:
@@ -1407,6 +1407,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
1407 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1407 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
1408 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 1408 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
1409 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1409 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1410 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1410 r600_vram_gtt_location(rdev, &rdev->mc); 1411 r600_vram_gtt_location(rdev, &rdev->mc);
1411 radeon_update_bandwidth_info(rdev); 1412 radeon_update_bandwidth_info(rdev);
1412 1413
@@ -1520,7 +1521,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
1520{ 1521{
1521 u32 tmp; 1522 u32 tmp;
1522 1523
1523 WREG32(CP_INT_CNTL, 0); 1524 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
1524 WREG32(GRBM_INT_CNTL, 0); 1525 WREG32(GRBM_INT_CNTL, 0);
1525 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 1526 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
1526 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 1527 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index e151f16a8f86..e59422320bb6 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -1030,6 +1030,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1030 return r; 1030 return r;
1031 } 1031 }
1032 rdev->cp.ready = true; 1032 rdev->cp.ready = true;
1033 rdev->mc.active_vram_size = rdev->mc.real_vram_size;
1033 return 0; 1034 return 0;
1034} 1035}
1035 1036
@@ -1047,6 +1048,7 @@ void r100_cp_fini(struct radeon_device *rdev)
1047void r100_cp_disable(struct radeon_device *rdev) 1048void r100_cp_disable(struct radeon_device *rdev)
1048{ 1049{
1049 /* Disable ring */ 1050 /* Disable ring */
1051 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1050 rdev->cp.ready = false; 1052 rdev->cp.ready = false;
1051 WREG32(RADEON_CP_CSQ_MODE, 0); 1053 WREG32(RADEON_CP_CSQ_MODE, 0);
1052 WREG32(RADEON_CP_CSQ_CNTL, 0); 1054 WREG32(RADEON_CP_CSQ_CNTL, 0);
@@ -2295,6 +2297,7 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
2295 /* FIXME we don't use the second aperture yet when we could use it */ 2297 /* FIXME we don't use the second aperture yet when we could use it */
2296 if (rdev->mc.visible_vram_size > rdev->mc.aper_size) 2298 if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
2297 rdev->mc.visible_vram_size = rdev->mc.aper_size; 2299 rdev->mc.visible_vram_size = rdev->mc.aper_size;
2300 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
2298 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); 2301 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
2299 if (rdev->flags & RADEON_IS_IGP) { 2302 if (rdev->flags & RADEON_IS_IGP) {
2300 uint32_t tom; 2303 uint32_t tom;
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 7a04959ba0ee..7b65e4efe8af 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1248,6 +1248,7 @@ int r600_mc_init(struct radeon_device *rdev)
1248 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1248 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1249 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1249 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1250 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1250 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1251 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1251 r600_vram_gtt_location(rdev, &rdev->mc); 1252 r600_vram_gtt_location(rdev, &rdev->mc);
1252 1253
1253 if (rdev->flags & RADEON_IS_IGP) { 1254 if (rdev->flags & RADEON_IS_IGP) {
@@ -1917,6 +1918,7 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
1917 */ 1918 */
1918void r600_cp_stop(struct radeon_device *rdev) 1919void r600_cp_stop(struct radeon_device *rdev)
1919{ 1920{
1921 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1920 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1922 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
1921} 1923}
1922 1924
@@ -2910,7 +2912,7 @@ static void r600_disable_interrupt_state(struct radeon_device *rdev)
2910{ 2912{
2911 u32 tmp; 2913 u32 tmp;
2912 2914
2913 WREG32(CP_INT_CNTL, 0); 2915 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
2914 WREG32(GRBM_INT_CNTL, 0); 2916 WREG32(GRBM_INT_CNTL, 0);
2915 WREG32(DxMODE_INT_MASK, 0); 2917 WREG32(DxMODE_INT_MASK, 0);
2916 if (ASIC_IS_DCE3(rdev)) { 2918 if (ASIC_IS_DCE3(rdev)) {
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 9ceb2a1ce799..3473c00781ff 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -532,6 +532,7 @@ int r600_blit_init(struct radeon_device *rdev)
532 memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4); 532 memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4);
533 radeon_bo_kunmap(rdev->r600_blit.shader_obj); 533 radeon_bo_kunmap(rdev->r600_blit.shader_obj);
534 radeon_bo_unreserve(rdev->r600_blit.shader_obj); 534 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
535 rdev->mc.active_vram_size = rdev->mc.real_vram_size;
535 return 0; 536 return 0;
536} 537}
537 538
@@ -539,6 +540,7 @@ void r600_blit_fini(struct radeon_device *rdev)
539{ 540{
540 int r; 541 int r;
541 542
543 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
542 if (rdev->r600_blit.shader_obj == NULL) 544 if (rdev->r600_blit.shader_obj == NULL)
543 return; 545 return;
544 /* If we can't reserve the bo, unref should be enough to destroy 546 /* If we can't reserve the bo, unref should be enough to destroy
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index a168d644bf9e..9ff38c99a6ea 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -344,6 +344,7 @@ struct radeon_mc {
344 * about vram size near mc fb location */ 344 * about vram size near mc fb location */
345 u64 mc_vram_size; 345 u64 mc_vram_size;
346 u64 visible_vram_size; 346 u64 visible_vram_size;
347 u64 active_vram_size;
347 u64 gtt_size; 348 u64 gtt_size;
348 u64 gtt_start; 349 u64 gtt_start;
349 u64 gtt_end; 350 u64 gtt_end;
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 68932ba7b8a4..8e43ddae70cc 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1558,39 +1558,39 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev)
1558 switch (tv_info->ucTV_BootUpDefaultStandard) { 1558 switch (tv_info->ucTV_BootUpDefaultStandard) {
1559 case ATOM_TV_NTSC: 1559 case ATOM_TV_NTSC:
1560 tv_std = TV_STD_NTSC; 1560 tv_std = TV_STD_NTSC;
1561 DRM_INFO("Default TV standard: NTSC\n"); 1561 DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1562 break; 1562 break;
1563 case ATOM_TV_NTSCJ: 1563 case ATOM_TV_NTSCJ:
1564 tv_std = TV_STD_NTSC_J; 1564 tv_std = TV_STD_NTSC_J;
1565 DRM_INFO("Default TV standard: NTSC-J\n"); 1565 DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1566 break; 1566 break;
1567 case ATOM_TV_PAL: 1567 case ATOM_TV_PAL:
1568 tv_std = TV_STD_PAL; 1568 tv_std = TV_STD_PAL;
1569 DRM_INFO("Default TV standard: PAL\n"); 1569 DRM_DEBUG_KMS("Default TV standard: PAL\n");
1570 break; 1570 break;
1571 case ATOM_TV_PALM: 1571 case ATOM_TV_PALM:
1572 tv_std = TV_STD_PAL_M; 1572 tv_std = TV_STD_PAL_M;
1573 DRM_INFO("Default TV standard: PAL-M\n"); 1573 DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1574 break; 1574 break;
1575 case ATOM_TV_PALN: 1575 case ATOM_TV_PALN:
1576 tv_std = TV_STD_PAL_N; 1576 tv_std = TV_STD_PAL_N;
1577 DRM_INFO("Default TV standard: PAL-N\n"); 1577 DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1578 break; 1578 break;
1579 case ATOM_TV_PALCN: 1579 case ATOM_TV_PALCN:
1580 tv_std = TV_STD_PAL_CN; 1580 tv_std = TV_STD_PAL_CN;
1581 DRM_INFO("Default TV standard: PAL-CN\n"); 1581 DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1582 break; 1582 break;
1583 case ATOM_TV_PAL60: 1583 case ATOM_TV_PAL60:
1584 tv_std = TV_STD_PAL_60; 1584 tv_std = TV_STD_PAL_60;
1585 DRM_INFO("Default TV standard: PAL-60\n"); 1585 DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1586 break; 1586 break;
1587 case ATOM_TV_SECAM: 1587 case ATOM_TV_SECAM:
1588 tv_std = TV_STD_SECAM; 1588 tv_std = TV_STD_SECAM;
1589 DRM_INFO("Default TV standard: SECAM\n"); 1589 DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1590 break; 1590 break;
1591 default: 1591 default:
1592 tv_std = TV_STD_NTSC; 1592 tv_std = TV_STD_NTSC;
1593 DRM_INFO("Unknown TV standard; defaulting to NTSC\n"); 1593 DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1594 break; 1594 break;
1595 } 1595 }
1596 } 1596 }
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
index a04b7a6ad95f..7b7ea269549c 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -913,47 +913,47 @@ radeon_combios_get_tv_info(struct radeon_device *rdev)
913 switch (RBIOS8(tv_info + 7) & 0xf) { 913 switch (RBIOS8(tv_info + 7) & 0xf) {
914 case 1: 914 case 1:
915 tv_std = TV_STD_NTSC; 915 tv_std = TV_STD_NTSC;
916 DRM_INFO("Default TV standard: NTSC\n"); 916 DRM_DEBUG_KMS("Default TV standard: NTSC\n");
917 break; 917 break;
918 case 2: 918 case 2:
919 tv_std = TV_STD_PAL; 919 tv_std = TV_STD_PAL;
920 DRM_INFO("Default TV standard: PAL\n"); 920 DRM_DEBUG_KMS("Default TV standard: PAL\n");
921 break; 921 break;
922 case 3: 922 case 3:
923 tv_std = TV_STD_PAL_M; 923 tv_std = TV_STD_PAL_M;
924 DRM_INFO("Default TV standard: PAL-M\n"); 924 DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
925 break; 925 break;
926 case 4: 926 case 4:
927 tv_std = TV_STD_PAL_60; 927 tv_std = TV_STD_PAL_60;
928 DRM_INFO("Default TV standard: PAL-60\n"); 928 DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
929 break; 929 break;
930 case 5: 930 case 5:
931 tv_std = TV_STD_NTSC_J; 931 tv_std = TV_STD_NTSC_J;
932 DRM_INFO("Default TV standard: NTSC-J\n"); 932 DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
933 break; 933 break;
934 case 6: 934 case 6:
935 tv_std = TV_STD_SCART_PAL; 935 tv_std = TV_STD_SCART_PAL;
936 DRM_INFO("Default TV standard: SCART-PAL\n"); 936 DRM_DEBUG_KMS("Default TV standard: SCART-PAL\n");
937 break; 937 break;
938 default: 938 default:
939 tv_std = TV_STD_NTSC; 939 tv_std = TV_STD_NTSC;
940 DRM_INFO 940 DRM_DEBUG_KMS
941 ("Unknown TV standard; defaulting to NTSC\n"); 941 ("Unknown TV standard; defaulting to NTSC\n");
942 break; 942 break;
943 } 943 }
944 944
945 switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) { 945 switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) {
946 case 0: 946 case 0:
947 DRM_INFO("29.498928713 MHz TV ref clk\n"); 947 DRM_DEBUG_KMS("29.498928713 MHz TV ref clk\n");
948 break; 948 break;
949 case 1: 949 case 1:
950 DRM_INFO("28.636360000 MHz TV ref clk\n"); 950 DRM_DEBUG_KMS("28.636360000 MHz TV ref clk\n");
951 break; 951 break;
952 case 2: 952 case 2:
953 DRM_INFO("14.318180000 MHz TV ref clk\n"); 953 DRM_DEBUG_KMS("14.318180000 MHz TV ref clk\n");
954 break; 954 break;
955 case 3: 955 case 3:
956 DRM_INFO("27.000000000 MHz TV ref clk\n"); 956 DRM_DEBUG_KMS("27.000000000 MHz TV ref clk\n");
957 break; 957 break;
958 default: 958 default:
959 break; 959 break;
@@ -1324,7 +1324,7 @@ bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,
1324 1324
1325 if (tmds_info) { 1325 if (tmds_info) {
1326 ver = RBIOS8(tmds_info); 1326 ver = RBIOS8(tmds_info);
1327 DRM_INFO("DFP table revision: %d\n", ver); 1327 DRM_DEBUG_KMS("DFP table revision: %d\n", ver);
1328 if (ver == 3) { 1328 if (ver == 3) {
1329 n = RBIOS8(tmds_info + 5) + 1; 1329 n = RBIOS8(tmds_info + 5) + 1;
1330 if (n > 4) 1330 if (n > 4)
@@ -1408,7 +1408,7 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
1408 offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE); 1408 offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
1409 if (offset) { 1409 if (offset) {
1410 ver = RBIOS8(offset); 1410 ver = RBIOS8(offset);
1411 DRM_INFO("External TMDS Table revision: %d\n", ver); 1411 DRM_DEBUG_KMS("External TMDS Table revision: %d\n", ver);
1412 tmds->slave_addr = RBIOS8(offset + 4 + 2); 1412 tmds->slave_addr = RBIOS8(offset + 4 + 2);
1413 tmds->slave_addr >>= 1; /* 7 bit addressing */ 1413 tmds->slave_addr >>= 1; /* 7 bit addressing */
1414 gpio = RBIOS8(offset + 4 + 3); 1414 gpio = RBIOS8(offset + 4 + 3);
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c
index 5731fc9b1ae3..3eef567b0421 100644
--- a/drivers/gpu/drm/radeon/radeon_cursor.c
+++ b/drivers/gpu/drm/radeon/radeon_cursor.c
@@ -203,6 +203,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
203 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 203 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
204 struct radeon_device *rdev = crtc->dev->dev_private; 204 struct radeon_device *rdev = crtc->dev->dev_private;
205 int xorigin = 0, yorigin = 0; 205 int xorigin = 0, yorigin = 0;
206 int w = radeon_crtc->cursor_width;
206 207
207 if (x < 0) 208 if (x < 0)
208 xorigin = -x + 1; 209 xorigin = -x + 1;
@@ -213,22 +214,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
213 if (yorigin >= CURSOR_HEIGHT) 214 if (yorigin >= CURSOR_HEIGHT)
214 yorigin = CURSOR_HEIGHT - 1; 215 yorigin = CURSOR_HEIGHT - 1;
215 216
216 radeon_lock_cursor(crtc, true); 217 if (ASIC_IS_AVIVO(rdev)) {
217 if (ASIC_IS_DCE4(rdev)) {
218 /* cursors are offset into the total surface */
219 x += crtc->x;
220 y += crtc->y;
221 DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y);
222
223 /* XXX: check if evergreen has the same issues as avivo chips */
224 WREG32(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset,
225 ((xorigin ? 0 : x) << 16) |
226 (yorigin ? 0 : y));
227 WREG32(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin);
228 WREG32(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset,
229 ((radeon_crtc->cursor_width - 1) << 16) | (radeon_crtc->cursor_height - 1));
230 } else if (ASIC_IS_AVIVO(rdev)) {
231 int w = radeon_crtc->cursor_width;
232 int i = 0; 218 int i = 0;
233 struct drm_crtc *crtc_p; 219 struct drm_crtc *crtc_p;
234 220
@@ -260,7 +246,17 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
260 if (w <= 0) 246 if (w <= 0)
261 w = 1; 247 w = 1;
262 } 248 }
249 }
263 250
251 radeon_lock_cursor(crtc, true);
252 if (ASIC_IS_DCE4(rdev)) {
253 WREG32(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset,
254 ((xorigin ? 0 : x) << 16) |
255 (yorigin ? 0 : y));
256 WREG32(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin);
257 WREG32(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset,
258 ((w - 1) << 16) | (radeon_crtc->cursor_height - 1));
259 } else if (ASIC_IS_AVIVO(rdev)) {
264 WREG32(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset, 260 WREG32(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset,
265 ((xorigin ? 0 : x) << 16) | 261 ((xorigin ? 0 : x) << 16) |
266 (yorigin ? 0 : y)); 262 (yorigin ? 0 : y));
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 0afd1e62347d..b3b5306bb578 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -69,7 +69,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
69 u32 c = 0; 69 u32 c = 0;
70 70
71 rbo->placement.fpfn = 0; 71 rbo->placement.fpfn = 0;
72 rbo->placement.lpfn = 0; 72 rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT;
73 rbo->placement.placement = rbo->placements; 73 rbo->placement.placement = rbo->placements;
74 rbo->placement.busy_placement = rbo->placements; 74 rbo->placement.busy_placement = rbo->placements;
75 if (domain & RADEON_GEM_DOMAIN_VRAM) 75 if (domain & RADEON_GEM_DOMAIN_VRAM)
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 353998dc2c03..3481bc7f6f58 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -124,11 +124,8 @@ static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
124 int r; 124 int r;
125 125
126 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 126 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
127 if (unlikely(r != 0)) { 127 if (unlikely(r != 0))
128 if (r != -ERESTARTSYS)
129 dev_err(bo->rdev->dev, "%p reserve failed for wait\n", bo);
130 return r; 128 return r;
131 }
132 spin_lock(&bo->tbo.lock); 129 spin_lock(&bo->tbo.lock);
133 if (mem_type) 130 if (mem_type)
134 *mem_type = bo->tbo.mem.mem_type; 131 *mem_type = bo->tbo.mem.mem_type;
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index cc05b230d7ef..51d5f7b5ab21 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -693,6 +693,7 @@ void rs600_mc_init(struct radeon_device *rdev)
693 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 693 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
694 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 694 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
695 rdev->mc.visible_vram_size = rdev->mc.aper_size; 695 rdev->mc.visible_vram_size = rdev->mc.aper_size;
696 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
696 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 697 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
697 base = RREG32_MC(R_000004_MC_FB_LOCATION); 698 base = RREG32_MC(R_000004_MC_FB_LOCATION);
698 base = G_000004_MC_FB_START(base) << 16; 699 base = G_000004_MC_FB_START(base) << 16;
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 3e3f75718be3..4dc2a87ea680 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -157,6 +157,7 @@ void rs690_mc_init(struct radeon_device *rdev)
157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
159 rdev->mc.visible_vram_size = rdev->mc.aper_size; 159 rdev->mc.visible_vram_size = rdev->mc.aper_size;
160 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
160 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); 161 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
161 base = G_000100_MC_FB_START(base) << 16; 162 base = G_000100_MC_FB_START(base) << 16;
162 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 163 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index bfa59db374d2..9490da700749 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -267,6 +267,7 @@ static void rv770_mc_program(struct radeon_device *rdev)
267 */ 267 */
268void r700_cp_stop(struct radeon_device *rdev) 268void r700_cp_stop(struct radeon_device *rdev)
269{ 269{
270 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
270 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 271 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
271} 272}
272 273
@@ -992,6 +993,7 @@ int rv770_mc_init(struct radeon_device *rdev)
992 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 993 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
993 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 994 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
994 rdev->mc.visible_vram_size = rdev->mc.aper_size; 995 rdev->mc.visible_vram_size = rdev->mc.aper_size;
996 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
995 r600_vram_gtt_location(rdev, &rdev->mc); 997 r600_vram_gtt_location(rdev, &rdev->mc);
996 radeon_update_bandwidth_info(rdev); 998 radeon_update_bandwidth_info(rdev);
997 999
diff --git a/drivers/hid/hid-cando.c b/drivers/hid/hid-cando.c
index 4267a6fdc277..5925bdcd417d 100644
--- a/drivers/hid/hid-cando.c
+++ b/drivers/hid/hid-cando.c
@@ -237,6 +237,8 @@ static const struct hid_device_id cando_devices[] = {
237 USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, 237 USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
238 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, 238 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
239 USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, 239 USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
240 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
241 USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
240 { } 242 { }
241}; 243};
242MODULE_DEVICE_TABLE(hid, cando_devices); 244MODULE_DEVICE_TABLE(hid, cando_devices);
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 3f7292486024..a0dea3d1296e 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1292,6 +1292,7 @@ static const struct hid_device_id hid_blacklist[] = {
1292 { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) }, 1292 { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) },
1293 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, 1293 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
1294 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, 1294 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
1295 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
1295 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, 1296 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
1296 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, 1297 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
1297 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, 1298 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 765a4f53eb5c..c5ae5f1545bd 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -134,6 +134,7 @@
134#define USB_VENDOR_ID_CANDO 0x2087 134#define USB_VENDOR_ID_CANDO 0x2087
135#define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 135#define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01
136#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03 136#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03
137#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6 0x0f01
137 138
138#define USB_VENDOR_ID_CH 0x068e 139#define USB_VENDOR_ID_CH 0x068e
139#define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 140#define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2
@@ -503,6 +504,7 @@
503 504
504#define USB_VENDOR_ID_TURBOX 0x062a 505#define USB_VENDOR_ID_TURBOX 0x062a
505#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 506#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
507#define USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART 0x7100
506 508
507#define USB_VENDOR_ID_TWINHAN 0x6253 509#define USB_VENDOR_ID_TWINHAN 0x6253
508#define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100 510#define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index 47d70c523d93..a3866b5c0c43 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -109,6 +109,12 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t
109 int ret = 0; 109 int ret = 0;
110 110
111 mutex_lock(&minors_lock); 111 mutex_lock(&minors_lock);
112
113 if (!hidraw_table[minor]) {
114 ret = -ENODEV;
115 goto out;
116 }
117
112 dev = hidraw_table[minor]->hid; 118 dev = hidraw_table[minor]->hid;
113 119
114 if (!dev->hid_output_raw_report) { 120 if (!dev->hid_output_raw_report) {
@@ -244,6 +250,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
244 250
245 mutex_lock(&minors_lock); 251 mutex_lock(&minors_lock);
246 dev = hidraw_table[minor]; 252 dev = hidraw_table[minor];
253 if (!dev) {
254 ret = -ENODEV;
255 goto out;
256 }
247 257
248 switch (cmd) { 258 switch (cmd) {
249 case HIDIOCGRDESCSIZE: 259 case HIDIOCGRDESCSIZE:
@@ -317,6 +327,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
317 327
318 ret = -ENOTTY; 328 ret = -ENOTTY;
319 } 329 }
330out:
320 mutex_unlock(&minors_lock); 331 mutex_unlock(&minors_lock);
321 return ret; 332 return ret;
322} 333}
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 70da3181c8a0..f0260c699adb 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -36,6 +36,7 @@ static const struct hid_blacklist {
36 { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET }, 36 { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET },
37 { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH, HID_QUIRK_MULTI_INPUT }, 37 { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH, HID_QUIRK_MULTI_INPUT },
38 { USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER, HID_QUIRK_MULTI_INPUT }, 38 { USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER, HID_QUIRK_MULTI_INPUT },
39 { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART, HID_QUIRK_MULTI_INPUT },
39 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 40 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
40 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 41 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
41 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 42 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index b8feac5f2ef4..5795c8398c7c 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -331,21 +331,16 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
331 INIT_COMPLETION(dev->cmd_complete); 331 INIT_COMPLETION(dev->cmd_complete);
332 dev->cmd_err = 0; 332 dev->cmd_err = 0;
333 333
334 /* Take I2C out of reset, configure it as master and set the 334 /* Take I2C out of reset and configure it as master */
335 * start bit */ 335 flag = DAVINCI_I2C_MDR_IRS | DAVINCI_I2C_MDR_MST;
336 flag = DAVINCI_I2C_MDR_IRS | DAVINCI_I2C_MDR_MST | DAVINCI_I2C_MDR_STT;
337 336
338 /* if the slave address is ten bit address, enable XA bit */ 337 /* if the slave address is ten bit address, enable XA bit */
339 if (msg->flags & I2C_M_TEN) 338 if (msg->flags & I2C_M_TEN)
340 flag |= DAVINCI_I2C_MDR_XA; 339 flag |= DAVINCI_I2C_MDR_XA;
341 if (!(msg->flags & I2C_M_RD)) 340 if (!(msg->flags & I2C_M_RD))
342 flag |= DAVINCI_I2C_MDR_TRX; 341 flag |= DAVINCI_I2C_MDR_TRX;
343 if (stop) 342 if (msg->len == 0)
344 flag |= DAVINCI_I2C_MDR_STP;
345 if (msg->len == 0) {
346 flag |= DAVINCI_I2C_MDR_RM; 343 flag |= DAVINCI_I2C_MDR_RM;
347 flag &= ~DAVINCI_I2C_MDR_STP;
348 }
349 344
350 /* Enable receive or transmit interrupts */ 345 /* Enable receive or transmit interrupts */
351 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG); 346 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG);
@@ -358,17 +353,28 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
358 dev->terminate = 0; 353 dev->terminate = 0;
359 354
360 /* 355 /*
356 * Write mode register first as needed for correct behaviour
357 * on OMAP-L138, but don't set STT yet to avoid a race with XRDY
358 * occuring before we have loaded DXR
359 */
360 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
361
362 /*
361 * First byte should be set here, not after interrupt, 363 * First byte should be set here, not after interrupt,
362 * because transmit-data-ready interrupt can come before 364 * because transmit-data-ready interrupt can come before
363 * NACK-interrupt during sending of previous message and 365 * NACK-interrupt during sending of previous message and
364 * ICDXR may have wrong data 366 * ICDXR may have wrong data
367 * It also saves us one interrupt, slightly faster
365 */ 368 */
366 if ((!(msg->flags & I2C_M_RD)) && dev->buf_len) { 369 if ((!(msg->flags & I2C_M_RD)) && dev->buf_len) {
367 davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, *dev->buf++); 370 davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, *dev->buf++);
368 dev->buf_len--; 371 dev->buf_len--;
369 } 372 }
370 373
371 /* write the data into mode register; start transmitting */ 374 /* Set STT to begin transmit now DXR is loaded */
375 flag |= DAVINCI_I2C_MDR_STT;
376 if (stop && msg->len != 0)
377 flag |= DAVINCI_I2C_MDR_STP;
372 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); 378 davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
373 379
374 r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, 380 r = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index d1ff9408dc1f..4c2a62b75b5c 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -159,15 +159,9 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy)
159 159
160static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx) 160static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx)
161{ 161{
162 int result; 162 wait_event_timeout(i2c_imx->queue, i2c_imx->i2csr & I2SR_IIF, HZ / 10);
163
164 result = wait_event_interruptible_timeout(i2c_imx->queue,
165 i2c_imx->i2csr & I2SR_IIF, HZ / 10);
166 163
167 if (unlikely(result < 0)) { 164 if (unlikely(!(i2c_imx->i2csr & I2SR_IIF))) {
168 dev_dbg(&i2c_imx->adapter.dev, "<%s> result < 0\n", __func__);
169 return result;
170 } else if (unlikely(!(i2c_imx->i2csr & I2SR_IIF))) {
171 dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__); 165 dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__);
172 return -ETIMEDOUT; 166 return -ETIMEDOUT;
173 } 167 }
@@ -295,7 +289,7 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
295 i2c_imx->i2csr = temp; 289 i2c_imx->i2csr = temp;
296 temp &= ~I2SR_IIF; 290 temp &= ~I2SR_IIF;
297 writeb(temp, i2c_imx->base + IMX_I2C_I2SR); 291 writeb(temp, i2c_imx->base + IMX_I2C_I2SR);
298 wake_up_interruptible(&i2c_imx->queue); 292 wake_up(&i2c_imx->queue);
299 return IRQ_HANDLED; 293 return IRQ_HANDLED;
300 } 294 }
301 295
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index c908c5f83645..9ddafc30f432 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -669,6 +669,9 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
669 669
670 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) { 670 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {
671 671
672 if (!dev->absinfo)
673 return -EINVAL;
674
672 t = _IOC_NR(cmd) & ABS_MAX; 675 t = _IOC_NR(cmd) & ABS_MAX;
673 abs = dev->absinfo[t]; 676 abs = dev->absinfo[t];
674 677
@@ -680,10 +683,13 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
680 } 683 }
681 } 684 }
682 685
683 if (_IOC_DIR(cmd) == _IOC_READ) { 686 if (_IOC_DIR(cmd) == _IOC_WRITE) {
684 687
685 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) { 688 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
686 689
690 if (!dev->absinfo)
691 return -EINVAL;
692
687 t = _IOC_NR(cmd) & ABS_MAX; 693 t = _IOC_NR(cmd) & ABS_MAX;
688 694
689 if (copy_from_user(&abs, p, min_t(size_t, 695 if (copy_from_user(&abs, p, min_t(size_t,
diff --git a/drivers/media/video/v4l2-compat-ioctl32.c b/drivers/media/video/v4l2-compat-ioctl32.c
index 073f01390cdd..86294ed35c9b 100644
--- a/drivers/media/video/v4l2-compat-ioctl32.c
+++ b/drivers/media/video/v4l2-compat-ioctl32.c
@@ -193,17 +193,24 @@ static int put_video_window32(struct video_window *kp, struct video_window32 __u
193struct video_code32 { 193struct video_code32 {
194 char loadwhat[16]; /* name or tag of file being passed */ 194 char loadwhat[16]; /* name or tag of file being passed */
195 compat_int_t datasize; 195 compat_int_t datasize;
196 unsigned char *data; 196 compat_uptr_t data;
197}; 197};
198 198
199static int get_microcode32(struct video_code *kp, struct video_code32 __user *up) 199static struct video_code __user *get_microcode32(struct video_code32 *kp)
200{ 200{
201 if (!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || 201 struct video_code __user *up;
202 copy_from_user(kp->loadwhat, up->loadwhat, sizeof(up->loadwhat)) || 202
203 get_user(kp->datasize, &up->datasize) || 203 up = compat_alloc_user_space(sizeof(*up));
204 copy_from_user(kp->data, up->data, up->datasize)) 204
205 return -EFAULT; 205 /*
206 return 0; 206 * NOTE! We don't actually care if these fail. If the
207 * user address is invalid, the native ioctl will do
208 * the error handling for us
209 */
210 (void) copy_to_user(up->loadwhat, kp->loadwhat, sizeof(up->loadwhat));
211 (void) put_user(kp->datasize, &up->datasize);
212 (void) put_user(compat_ptr(kp->data), &up->data);
213 return up;
207} 214}
208 215
209#define VIDIOCGTUNER32 _IOWR('v', 4, struct video_tuner32) 216#define VIDIOCGTUNER32 _IOWR('v', 4, struct video_tuner32)
@@ -739,7 +746,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
739 struct video_tuner vt; 746 struct video_tuner vt;
740 struct video_buffer vb; 747 struct video_buffer vb;
741 struct video_window vw; 748 struct video_window vw;
742 struct video_code vc; 749 struct video_code32 vc;
743 struct video_audio va; 750 struct video_audio va;
744#endif 751#endif
745 struct v4l2_format v2f; 752 struct v4l2_format v2f;
@@ -818,8 +825,11 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
818 break; 825 break;
819 826
820 case VIDIOCSMICROCODE: 827 case VIDIOCSMICROCODE:
821 err = get_microcode32(&karg.vc, up); 828 /* Copy the 32-bit "video_code32" to kernel space */
822 compatible_arg = 0; 829 if (copy_from_user(&karg.vc, up, sizeof(karg.vc)))
830 return -EFAULT;
831 /* Convert the 32-bit version to a 64-bit version in user space */
832 up = get_microcode32(&karg.vc);
823 break; 833 break;
824 834
825 case VIDIOCSFREQ: 835 case VIDIOCSFREQ:
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 5db49b124ffa..09eee6df0653 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1631,6 +1631,19 @@ int mmc_suspend_host(struct mmc_host *host)
1631 if (host->bus_ops && !host->bus_dead) { 1631 if (host->bus_ops && !host->bus_dead) {
1632 if (host->bus_ops->suspend) 1632 if (host->bus_ops->suspend)
1633 err = host->bus_ops->suspend(host); 1633 err = host->bus_ops->suspend(host);
1634 if (err == -ENOSYS || !host->bus_ops->resume) {
1635 /*
1636 * We simply "remove" the card in this case.
1637 * It will be redetected on resume.
1638 */
1639 if (host->bus_ops->remove)
1640 host->bus_ops->remove(host);
1641 mmc_claim_host(host);
1642 mmc_detach_bus(host);
1643 mmc_release_host(host);
1644 host->pm_flags = 0;
1645 err = 0;
1646 }
1634 } 1647 }
1635 mmc_bus_put(host); 1648 mmc_bus_put(host);
1636 1649
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index b2828e84d243..214b03afdd48 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -30,6 +30,8 @@
30#include <linux/clk.h> 30#include <linux/clk.h>
31#include <linux/err.h> 31#include <linux/err.h>
32#include <linux/io.h> 32#include <linux/io.h>
33#include <linux/irq.h>
34#include <linux/completion.h>
33 35
34#include <asm/mach/flash.h> 36#include <asm/mach/flash.h>
35#include <mach/mxc_nand.h> 37#include <mach/mxc_nand.h>
@@ -151,7 +153,7 @@ struct mxc_nand_host {
151 int irq; 153 int irq;
152 int eccsize; 154 int eccsize;
153 155
154 wait_queue_head_t irq_waitq; 156 struct completion op_completion;
155 157
156 uint8_t *data_buf; 158 uint8_t *data_buf;
157 unsigned int buf_start; 159 unsigned int buf_start;
@@ -164,6 +166,7 @@ struct mxc_nand_host {
164 void (*send_read_id)(struct mxc_nand_host *); 166 void (*send_read_id)(struct mxc_nand_host *);
165 uint16_t (*get_dev_status)(struct mxc_nand_host *); 167 uint16_t (*get_dev_status)(struct mxc_nand_host *);
166 int (*check_int)(struct mxc_nand_host *); 168 int (*check_int)(struct mxc_nand_host *);
169 void (*irq_control)(struct mxc_nand_host *, int);
167}; 170};
168 171
169/* OOB placement block for use with hardware ecc generation */ 172/* OOB placement block for use with hardware ecc generation */
@@ -216,9 +219,12 @@ static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
216{ 219{
217 struct mxc_nand_host *host = dev_id; 220 struct mxc_nand_host *host = dev_id;
218 221
219 disable_irq_nosync(irq); 222 if (!host->check_int(host))
223 return IRQ_NONE;
220 224
221 wake_up(&host->irq_waitq); 225 host->irq_control(host, 0);
226
227 complete(&host->op_completion);
222 228
223 return IRQ_HANDLED; 229 return IRQ_HANDLED;
224} 230}
@@ -245,11 +251,54 @@ static int check_int_v1_v2(struct mxc_nand_host *host)
245 if (!(tmp & NFC_V1_V2_CONFIG2_INT)) 251 if (!(tmp & NFC_V1_V2_CONFIG2_INT))
246 return 0; 252 return 0;
247 253
248 writew(tmp & ~NFC_V1_V2_CONFIG2_INT, NFC_V1_V2_CONFIG2); 254 if (!cpu_is_mx21())
255 writew(tmp & ~NFC_V1_V2_CONFIG2_INT, NFC_V1_V2_CONFIG2);
249 256
250 return 1; 257 return 1;
251} 258}
252 259
260/*
261 * It has been observed that the i.MX21 cannot read the CONFIG2:INT bit
262 * if interrupts are masked (CONFIG1:INT_MSK is set). To handle this, the
263 * driver can enable/disable the irq line rather than simply masking the
264 * interrupts.
265 */
266static void irq_control_mx21(struct mxc_nand_host *host, int activate)
267{
268 if (activate)
269 enable_irq(host->irq);
270 else
271 disable_irq_nosync(host->irq);
272}
273
274static void irq_control_v1_v2(struct mxc_nand_host *host, int activate)
275{
276 uint16_t tmp;
277
278 tmp = readw(NFC_V1_V2_CONFIG1);
279
280 if (activate)
281 tmp &= ~NFC_V1_V2_CONFIG1_INT_MSK;
282 else
283 tmp |= NFC_V1_V2_CONFIG1_INT_MSK;
284
285 writew(tmp, NFC_V1_V2_CONFIG1);
286}
287
288static void irq_control_v3(struct mxc_nand_host *host, int activate)
289{
290 uint32_t tmp;
291
292 tmp = readl(NFC_V3_CONFIG2);
293
294 if (activate)
295 tmp &= ~NFC_V3_CONFIG2_INT_MSK;
296 else
297 tmp |= NFC_V3_CONFIG2_INT_MSK;
298
299 writel(tmp, NFC_V3_CONFIG2);
300}
301
253/* This function polls the NANDFC to wait for the basic operation to 302/* This function polls the NANDFC to wait for the basic operation to
254 * complete by checking the INT bit of config2 register. 303 * complete by checking the INT bit of config2 register.
255 */ 304 */
@@ -259,10 +308,9 @@ static void wait_op_done(struct mxc_nand_host *host, int useirq)
259 308
260 if (useirq) { 309 if (useirq) {
261 if (!host->check_int(host)) { 310 if (!host->check_int(host)) {
262 311 INIT_COMPLETION(host->op_completion);
263 enable_irq(host->irq); 312 host->irq_control(host, 1);
264 313 wait_for_completion(&host->op_completion);
265 wait_event(host->irq_waitq, host->check_int(host));
266 } 314 }
267 } else { 315 } else {
268 while (max_retries-- > 0) { 316 while (max_retries-- > 0) {
@@ -799,6 +847,7 @@ static void preset_v3(struct mtd_info *mtd)
799 NFC_V3_CONFIG2_2CMD_PHASES | 847 NFC_V3_CONFIG2_2CMD_PHASES |
800 NFC_V3_CONFIG2_SPAS(mtd->oobsize >> 1) | 848 NFC_V3_CONFIG2_SPAS(mtd->oobsize >> 1) |
801 NFC_V3_CONFIG2_ST_CMD(0x70) | 849 NFC_V3_CONFIG2_ST_CMD(0x70) |
850 NFC_V3_CONFIG2_INT_MSK |
802 NFC_V3_CONFIG2_NUM_ADDR_PHASE0; 851 NFC_V3_CONFIG2_NUM_ADDR_PHASE0;
803 852
804 if (chip->ecc.mode == NAND_ECC_HW) 853 if (chip->ecc.mode == NAND_ECC_HW)
@@ -1024,6 +1073,10 @@ static int __init mxcnd_probe(struct platform_device *pdev)
1024 host->send_read_id = send_read_id_v1_v2; 1073 host->send_read_id = send_read_id_v1_v2;
1025 host->get_dev_status = get_dev_status_v1_v2; 1074 host->get_dev_status = get_dev_status_v1_v2;
1026 host->check_int = check_int_v1_v2; 1075 host->check_int = check_int_v1_v2;
1076 if (cpu_is_mx21())
1077 host->irq_control = irq_control_mx21;
1078 else
1079 host->irq_control = irq_control_v1_v2;
1027 } 1080 }
1028 1081
1029 if (nfc_is_v21()) { 1082 if (nfc_is_v21()) {
@@ -1062,6 +1115,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
1062 host->send_read_id = send_read_id_v3; 1115 host->send_read_id = send_read_id_v3;
1063 host->check_int = check_int_v3; 1116 host->check_int = check_int_v3;
1064 host->get_dev_status = get_dev_status_v3; 1117 host->get_dev_status = get_dev_status_v3;
1118 host->irq_control = irq_control_v3;
1065 oob_smallpage = &nandv2_hw_eccoob_smallpage; 1119 oob_smallpage = &nandv2_hw_eccoob_smallpage;
1066 oob_largepage = &nandv2_hw_eccoob_largepage; 1120 oob_largepage = &nandv2_hw_eccoob_largepage;
1067 } else 1121 } else
@@ -1093,14 +1147,34 @@ static int __init mxcnd_probe(struct platform_device *pdev)
1093 this->options |= NAND_USE_FLASH_BBT; 1147 this->options |= NAND_USE_FLASH_BBT;
1094 } 1148 }
1095 1149
1096 init_waitqueue_head(&host->irq_waitq); 1150 init_completion(&host->op_completion);
1097 1151
1098 host->irq = platform_get_irq(pdev, 0); 1152 host->irq = platform_get_irq(pdev, 0);
1099 1153
1154 /*
1155 * mask the interrupt. For i.MX21 explicitely call
1156 * irq_control_v1_v2 to use the mask bit. We can't call
1157 * disable_irq_nosync() for an interrupt we do not own yet.
1158 */
1159 if (cpu_is_mx21())
1160 irq_control_v1_v2(host, 0);
1161 else
1162 host->irq_control(host, 0);
1163
1100 err = request_irq(host->irq, mxc_nfc_irq, IRQF_DISABLED, DRIVER_NAME, host); 1164 err = request_irq(host->irq, mxc_nfc_irq, IRQF_DISABLED, DRIVER_NAME, host);
1101 if (err) 1165 if (err)
1102 goto eirq; 1166 goto eirq;
1103 1167
1168 host->irq_control(host, 0);
1169
1170 /*
1171 * Now that the interrupt is disabled make sure the interrupt
1172 * mask bit is cleared on i.MX21. Otherwise we can't read
1173 * the interrupt status bit on this machine.
1174 */
1175 if (cpu_is_mx21())
1176 irq_control_v1_v2(host, 1);
1177
1104 /* first scan to find the device and get the page size */ 1178 /* first scan to find the device and get the page size */
1105 if (nand_scan_ident(mtd, 1, NULL)) { 1179 if (nand_scan_ident(mtd, 1, NULL)) {
1106 err = -ENXIO; 1180 err = -ENXIO;
diff --git a/drivers/net/b44.c b/drivers/net/b44.c
index 1e620e287ae0..efeffdf9e5fa 100644
--- a/drivers/net/b44.c
+++ b/drivers/net/b44.c
@@ -2170,8 +2170,6 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
2170 dev->irq = sdev->irq; 2170 dev->irq = sdev->irq;
2171 SET_ETHTOOL_OPS(dev, &b44_ethtool_ops); 2171 SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);
2172 2172
2173 netif_carrier_off(dev);
2174
2175 err = ssb_bus_powerup(sdev->bus, 0); 2173 err = ssb_bus_powerup(sdev->bus, 0);
2176 if (err) { 2174 if (err) {
2177 dev_err(sdev->dev, 2175 dev_err(sdev->dev,
@@ -2213,6 +2211,8 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
2213 goto err_out_powerdown; 2211 goto err_out_powerdown;
2214 } 2212 }
2215 2213
2214 netif_carrier_off(dev);
2215
2216 ssb_set_drvdata(sdev, dev); 2216 ssb_set_drvdata(sdev, dev);
2217 2217
2218 /* Chip reset provides power to the b44 MAC & PCI cores, which 2218 /* Chip reset provides power to the b44 MAC & PCI cores, which
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
index a333b42111b8..6372610ed240 100644
--- a/drivers/net/ehea/ehea_main.c
+++ b/drivers/net/ehea/ehea_main.c
@@ -533,8 +533,15 @@ static inline void ehea_fill_skb(struct net_device *dev,
533 int length = cqe->num_bytes_transfered - 4; /*remove CRC */ 533 int length = cqe->num_bytes_transfered - 4; /*remove CRC */
534 534
535 skb_put(skb, length); 535 skb_put(skb, length);
536 skb->ip_summed = CHECKSUM_UNNECESSARY;
537 skb->protocol = eth_type_trans(skb, dev); 536 skb->protocol = eth_type_trans(skb, dev);
537
538 /* The packet was not an IPV4 packet so a complemented checksum was
539 calculated. The value is found in the Internet Checksum field. */
540 if (cqe->status & EHEA_CQE_BLIND_CKSUM) {
541 skb->ip_summed = CHECKSUM_COMPLETE;
542 skb->csum = csum_unfold(~cqe->inet_checksum_value);
543 } else
544 skb->ip_summed = CHECKSUM_UNNECESSARY;
538} 545}
539 546
540static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array, 547static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array,
diff --git a/drivers/net/ehea/ehea_qmr.h b/drivers/net/ehea/ehea_qmr.h
index f608a6c54af5..38104734a3be 100644
--- a/drivers/net/ehea/ehea_qmr.h
+++ b/drivers/net/ehea/ehea_qmr.h
@@ -150,6 +150,7 @@ struct ehea_rwqe {
150#define EHEA_CQE_TYPE_RQ 0x60 150#define EHEA_CQE_TYPE_RQ 0x60
151#define EHEA_CQE_STAT_ERR_MASK 0x700F 151#define EHEA_CQE_STAT_ERR_MASK 0x700F
152#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF 152#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF
153#define EHEA_CQE_BLIND_CKSUM 0x8000
153#define EHEA_CQE_STAT_ERR_TCP 0x4000 154#define EHEA_CQE_STAT_ERR_TCP 0x4000
154#define EHEA_CQE_STAT_ERR_IP 0x2000 155#define EHEA_CQE_STAT_ERR_IP 0x2000
155#define EHEA_CQE_STAT_ERR_CRC 0x1000 156#define EHEA_CQE_STAT_ERR_CRC 0x1000
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 768b840aeb6b..cce32d43175f 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -678,24 +678,37 @@ static int fec_enet_mii_probe(struct net_device *dev)
678{ 678{
679 struct fec_enet_private *fep = netdev_priv(dev); 679 struct fec_enet_private *fep = netdev_priv(dev);
680 struct phy_device *phy_dev = NULL; 680 struct phy_device *phy_dev = NULL;
681 int ret; 681 char mdio_bus_id[MII_BUS_ID_SIZE];
682 char phy_name[MII_BUS_ID_SIZE + 3];
683 int phy_id;
682 684
683 fep->phy_dev = NULL; 685 fep->phy_dev = NULL;
684 686
685 /* find the first phy */ 687 /* check for attached phy */
686 phy_dev = phy_find_first(fep->mii_bus); 688 for (phy_id = 0; (phy_id < PHY_MAX_ADDR); phy_id++) {
687 if (!phy_dev) { 689 if ((fep->mii_bus->phy_mask & (1 << phy_id)))
688 printk(KERN_ERR "%s: no PHY found\n", dev->name); 690 continue;
689 return -ENODEV; 691 if (fep->mii_bus->phy_map[phy_id] == NULL)
692 continue;
693 if (fep->mii_bus->phy_map[phy_id]->phy_id == 0)
694 continue;
695 strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE);
696 break;
690 } 697 }
691 698
692 /* attach the mac to the phy */ 699 if (phy_id >= PHY_MAX_ADDR) {
693 ret = phy_connect_direct(dev, phy_dev, 700 printk(KERN_INFO "%s: no PHY, assuming direct connection "
694 &fec_enet_adjust_link, 0, 701 "to switch\n", dev->name);
695 PHY_INTERFACE_MODE_MII); 702 strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE);
696 if (ret) { 703 phy_id = 0;
697 printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); 704 }
698 return ret; 705
706 snprintf(phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT, mdio_bus_id, phy_id);
707 phy_dev = phy_connect(dev, phy_name, &fec_enet_adjust_link, 0,
708 PHY_INTERFACE_MODE_MII);
709 if (IS_ERR(phy_dev)) {
710 printk(KERN_ERR "%s: could not attach to PHY\n", dev->name);
711 return PTR_ERR(phy_dev);
699 } 712 }
700 713
701 /* mask with MAC supported features */ 714 /* mask with MAC supported features */
@@ -738,7 +751,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
738 fep->mii_bus->read = fec_enet_mdio_read; 751 fep->mii_bus->read = fec_enet_mdio_read;
739 fep->mii_bus->write = fec_enet_mdio_write; 752 fep->mii_bus->write = fec_enet_mdio_write;
740 fep->mii_bus->reset = fec_enet_mdio_reset; 753 fep->mii_bus->reset = fec_enet_mdio_reset;
741 snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id); 754 snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id + 1);
742 fep->mii_bus->priv = fep; 755 fep->mii_bus->priv = fep;
743 fep->mii_bus->parent = &pdev->dev; 756 fep->mii_bus->parent = &pdev->dev;
744 757
@@ -1311,6 +1324,9 @@ fec_probe(struct platform_device *pdev)
1311 if (ret) 1324 if (ret)
1312 goto failed_mii_init; 1325 goto failed_mii_init;
1313 1326
1327 /* Carrier starts down, phylib will bring it up */
1328 netif_carrier_off(ndev);
1329
1314 ret = register_netdev(ndev); 1330 ret = register_netdev(ndev);
1315 if (ret) 1331 if (ret)
1316 goto failed_register; 1332 goto failed_register;
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index a0da4a17b025..992db2fa136e 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -1212,7 +1212,8 @@ static void rtl8169_update_counters(struct net_device *dev)
1212 if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0) 1212 if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
1213 return; 1213 return;
1214 1214
1215 counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr); 1215 counters = dma_alloc_coherent(&tp->pci_dev->dev, sizeof(*counters),
1216 &paddr, GFP_KERNEL);
1216 if (!counters) 1217 if (!counters)
1217 return; 1218 return;
1218 1219
@@ -1233,7 +1234,8 @@ static void rtl8169_update_counters(struct net_device *dev)
1233 RTL_W32(CounterAddrLow, 0); 1234 RTL_W32(CounterAddrLow, 0);
1234 RTL_W32(CounterAddrHigh, 0); 1235 RTL_W32(CounterAddrHigh, 0);
1235 1236
1236 pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr); 1237 dma_free_coherent(&tp->pci_dev->dev, sizeof(*counters), counters,
1238 paddr);
1237} 1239}
1238 1240
1239static void rtl8169_get_ethtool_stats(struct net_device *dev, 1241static void rtl8169_get_ethtool_stats(struct net_device *dev,
@@ -3292,15 +3294,15 @@ static int rtl8169_open(struct net_device *dev)
3292 3294
3293 /* 3295 /*
3294 * Rx and Tx desscriptors needs 256 bytes alignment. 3296 * Rx and Tx desscriptors needs 256 bytes alignment.
3295 * pci_alloc_consistent provides more. 3297 * dma_alloc_coherent provides more.
3296 */ 3298 */
3297 tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES, 3299 tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
3298 &tp->TxPhyAddr); 3300 &tp->TxPhyAddr, GFP_KERNEL);
3299 if (!tp->TxDescArray) 3301 if (!tp->TxDescArray)
3300 goto err_pm_runtime_put; 3302 goto err_pm_runtime_put;
3301 3303
3302 tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES, 3304 tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
3303 &tp->RxPhyAddr); 3305 &tp->RxPhyAddr, GFP_KERNEL);
3304 if (!tp->RxDescArray) 3306 if (!tp->RxDescArray)
3305 goto err_free_tx_0; 3307 goto err_free_tx_0;
3306 3308
@@ -3334,12 +3336,12 @@ out:
3334err_release_ring_2: 3336err_release_ring_2:
3335 rtl8169_rx_clear(tp); 3337 rtl8169_rx_clear(tp);
3336err_free_rx_1: 3338err_free_rx_1:
3337 pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, 3339 dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
3338 tp->RxPhyAddr); 3340 tp->RxPhyAddr);
3339 tp->RxDescArray = NULL; 3341 tp->RxDescArray = NULL;
3340err_free_tx_0: 3342err_free_tx_0:
3341 pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, 3343 dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
3342 tp->TxPhyAddr); 3344 tp->TxPhyAddr);
3343 tp->TxDescArray = NULL; 3345 tp->TxDescArray = NULL;
3344err_pm_runtime_put: 3346err_pm_runtime_put:
3345 pm_runtime_put_noidle(&pdev->dev); 3347 pm_runtime_put_noidle(&pdev->dev);
@@ -3975,7 +3977,7 @@ static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
3975{ 3977{
3976 struct pci_dev *pdev = tp->pci_dev; 3978 struct pci_dev *pdev = tp->pci_dev;
3977 3979
3978 pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz, 3980 dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
3979 PCI_DMA_FROMDEVICE); 3981 PCI_DMA_FROMDEVICE);
3980 dev_kfree_skb(*sk_buff); 3982 dev_kfree_skb(*sk_buff);
3981 *sk_buff = NULL; 3983 *sk_buff = NULL;
@@ -4000,7 +4002,7 @@ static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
4000static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev, 4002static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
4001 struct net_device *dev, 4003 struct net_device *dev,
4002 struct RxDesc *desc, int rx_buf_sz, 4004 struct RxDesc *desc, int rx_buf_sz,
4003 unsigned int align) 4005 unsigned int align, gfp_t gfp)
4004{ 4006{
4005 struct sk_buff *skb; 4007 struct sk_buff *skb;
4006 dma_addr_t mapping; 4008 dma_addr_t mapping;
@@ -4008,13 +4010,13 @@ static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
4008 4010
4009 pad = align ? align : NET_IP_ALIGN; 4011 pad = align ? align : NET_IP_ALIGN;
4010 4012
4011 skb = netdev_alloc_skb(dev, rx_buf_sz + pad); 4013 skb = __netdev_alloc_skb(dev, rx_buf_sz + pad, gfp);
4012 if (!skb) 4014 if (!skb)
4013 goto err_out; 4015 goto err_out;
4014 4016
4015 skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad); 4017 skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
4016 4018
4017 mapping = pci_map_single(pdev, skb->data, rx_buf_sz, 4019 mapping = dma_map_single(&pdev->dev, skb->data, rx_buf_sz,
4018 PCI_DMA_FROMDEVICE); 4020 PCI_DMA_FROMDEVICE);
4019 4021
4020 rtl8169_map_to_asic(desc, mapping, rx_buf_sz); 4022 rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
@@ -4039,7 +4041,7 @@ static void rtl8169_rx_clear(struct rtl8169_private *tp)
4039} 4041}
4040 4042
4041static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev, 4043static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
4042 u32 start, u32 end) 4044 u32 start, u32 end, gfp_t gfp)
4043{ 4045{
4044 u32 cur; 4046 u32 cur;
4045 4047
@@ -4054,7 +4056,7 @@ static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
4054 4056
4055 skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev, 4057 skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
4056 tp->RxDescArray + i, 4058 tp->RxDescArray + i,
4057 tp->rx_buf_sz, tp->align); 4059 tp->rx_buf_sz, tp->align, gfp);
4058 if (!skb) 4060 if (!skb)
4059 break; 4061 break;
4060 4062
@@ -4082,7 +4084,7 @@ static int rtl8169_init_ring(struct net_device *dev)
4082 memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info)); 4084 memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
4083 memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *)); 4085 memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
4084 4086
4085 if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC) 4087 if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC, GFP_KERNEL) != NUM_RX_DESC)
4086 goto err_out; 4088 goto err_out;
4087 4089
4088 rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1); 4090 rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
@@ -4099,7 +4101,8 @@ static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
4099{ 4101{
4100 unsigned int len = tx_skb->len; 4102 unsigned int len = tx_skb->len;
4101 4103
4102 pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE); 4104 dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), len,
4105 PCI_DMA_TODEVICE);
4103 desc->opts1 = 0x00; 4106 desc->opts1 = 0x00;
4104 desc->opts2 = 0x00; 4107 desc->opts2 = 0x00;
4105 desc->addr = 0x00; 4108 desc->addr = 0x00;
@@ -4243,7 +4246,8 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
4243 txd = tp->TxDescArray + entry; 4246 txd = tp->TxDescArray + entry;
4244 len = frag->size; 4247 len = frag->size;
4245 addr = ((void *) page_address(frag->page)) + frag->page_offset; 4248 addr = ((void *) page_address(frag->page)) + frag->page_offset;
4246 mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE); 4249 mapping = dma_map_single(&tp->pci_dev->dev, addr, len,
4250 PCI_DMA_TODEVICE);
4247 4251
4248 /* anti gcc 2.95.3 bugware (sic) */ 4252 /* anti gcc 2.95.3 bugware (sic) */
4249 status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC)); 4253 status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
@@ -4313,7 +4317,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
4313 tp->tx_skb[entry].skb = skb; 4317 tp->tx_skb[entry].skb = skb;
4314 } 4318 }
4315 4319
4316 mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE); 4320 mapping = dma_map_single(&tp->pci_dev->dev, skb->data, len,
4321 PCI_DMA_TODEVICE);
4317 4322
4318 tp->tx_skb[entry].len = len; 4323 tp->tx_skb[entry].len = len;
4319 txd->addr = cpu_to_le64(mapping); 4324 txd->addr = cpu_to_le64(mapping);
@@ -4477,8 +4482,8 @@ static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
4477 if (!skb) 4482 if (!skb)
4478 goto out; 4483 goto out;
4479 4484
4480 pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size, 4485 dma_sync_single_for_cpu(&tp->pci_dev->dev, addr, pkt_size,
4481 PCI_DMA_FROMDEVICE); 4486 PCI_DMA_FROMDEVICE);
4482 skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size); 4487 skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
4483 *sk_buff = skb; 4488 *sk_buff = skb;
4484 done = true; 4489 done = true;
@@ -4549,11 +4554,11 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
4549 rtl8169_rx_csum(skb, desc); 4554 rtl8169_rx_csum(skb, desc);
4550 4555
4551 if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) { 4556 if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
4552 pci_dma_sync_single_for_device(pdev, addr, 4557 dma_sync_single_for_device(&pdev->dev, addr,
4553 pkt_size, PCI_DMA_FROMDEVICE); 4558 pkt_size, PCI_DMA_FROMDEVICE);
4554 rtl8169_mark_to_asic(desc, tp->rx_buf_sz); 4559 rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
4555 } else { 4560 } else {
4556 pci_unmap_single(pdev, addr, tp->rx_buf_sz, 4561 dma_unmap_single(&pdev->dev, addr, tp->rx_buf_sz,
4557 PCI_DMA_FROMDEVICE); 4562 PCI_DMA_FROMDEVICE);
4558 tp->Rx_skbuff[entry] = NULL; 4563 tp->Rx_skbuff[entry] = NULL;
4559 } 4564 }
@@ -4583,7 +4588,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
4583 count = cur_rx - tp->cur_rx; 4588 count = cur_rx - tp->cur_rx;
4584 tp->cur_rx = cur_rx; 4589 tp->cur_rx = cur_rx;
4585 4590
4586 delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx); 4591 delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx, GFP_ATOMIC);
4587 if (!delta && count) 4592 if (!delta && count)
4588 netif_info(tp, intr, dev, "no Rx buffer allocated\n"); 4593 netif_info(tp, intr, dev, "no Rx buffer allocated\n");
4589 tp->dirty_rx += delta; 4594 tp->dirty_rx += delta;
@@ -4769,10 +4774,10 @@ static int rtl8169_close(struct net_device *dev)
4769 4774
4770 free_irq(dev->irq, dev); 4775 free_irq(dev->irq, dev);
4771 4776
4772 pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, 4777 dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
4773 tp->RxPhyAddr); 4778 tp->RxPhyAddr);
4774 pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, 4779 dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
4775 tp->TxPhyAddr); 4780 tp->TxPhyAddr);
4776 tp->TxDescArray = NULL; 4781 tp->TxDescArray = NULL;
4777 tp->RxDescArray = NULL; 4782 tp->RxDescArray = NULL;
4778 4783
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index bc3af78a869f..1ec4b9e0239a 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -4666,7 +4666,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
4666 desc_idx, *post_ptr); 4666 desc_idx, *post_ptr);
4667 drop_it_no_recycle: 4667 drop_it_no_recycle:
4668 /* Other statistics kept track of by card. */ 4668 /* Other statistics kept track of by card. */
4669 tp->net_stats.rx_dropped++; 4669 tp->rx_dropped++;
4670 goto next_pkt; 4670 goto next_pkt;
4671 } 4671 }
4672 4672
@@ -4726,7 +4726,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
4726 if (len > (tp->dev->mtu + ETH_HLEN) && 4726 if (len > (tp->dev->mtu + ETH_HLEN) &&
4727 skb->protocol != htons(ETH_P_8021Q)) { 4727 skb->protocol != htons(ETH_P_8021Q)) {
4728 dev_kfree_skb(skb); 4728 dev_kfree_skb(skb);
4729 goto next_pkt; 4729 goto drop_it_no_recycle;
4730 } 4730 }
4731 4731
4732 if (desc->type_flags & RXD_FLAG_VLAN && 4732 if (desc->type_flags & RXD_FLAG_VLAN &&
@@ -9240,6 +9240,8 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
9240 stats->rx_missed_errors = old_stats->rx_missed_errors + 9240 stats->rx_missed_errors = old_stats->rx_missed_errors +
9241 get_stat64(&hw_stats->rx_discards); 9241 get_stat64(&hw_stats->rx_discards);
9242 9242
9243 stats->rx_dropped = tp->rx_dropped;
9244
9243 return stats; 9245 return stats;
9244} 9246}
9245 9247
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
index 4937bd190964..be7ff138a7f9 100644
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -2759,7 +2759,7 @@ struct tg3 {
2759 2759
2760 2760
2761 /* begin "everything else" cacheline(s) section */ 2761 /* begin "everything else" cacheline(s) section */
2762 struct rtnl_link_stats64 net_stats; 2762 unsigned long rx_dropped;
2763 struct rtnl_link_stats64 net_stats_prev; 2763 struct rtnl_link_stats64 net_stats_prev;
2764 struct tg3_ethtool_stats estats; 2764 struct tg3_ethtool_stats estats;
2765 struct tg3_ethtool_stats estats_prev; 2765 struct tg3_ethtool_stats estats_prev;
diff --git a/drivers/net/wimax/i2400m/rx.c b/drivers/net/wimax/i2400m/rx.c
index 8cc9e319f435..1737d1488b35 100644
--- a/drivers/net/wimax/i2400m/rx.c
+++ b/drivers/net/wimax/i2400m/rx.c
@@ -1244,16 +1244,16 @@ int i2400m_rx(struct i2400m *i2400m, struct sk_buff *skb)
1244 int i, result; 1244 int i, result;
1245 struct device *dev = i2400m_dev(i2400m); 1245 struct device *dev = i2400m_dev(i2400m);
1246 const struct i2400m_msg_hdr *msg_hdr; 1246 const struct i2400m_msg_hdr *msg_hdr;
1247 size_t pl_itr, pl_size, skb_len; 1247 size_t pl_itr, pl_size;
1248 unsigned long flags; 1248 unsigned long flags;
1249 unsigned num_pls, single_last; 1249 unsigned num_pls, single_last, skb_len;
1250 1250
1251 skb_len = skb->len; 1251 skb_len = skb->len;
1252 d_fnstart(4, dev, "(i2400m %p skb %p [size %zu])\n", 1252 d_fnstart(4, dev, "(i2400m %p skb %p [size %u])\n",
1253 i2400m, skb, skb_len); 1253 i2400m, skb, skb_len);
1254 result = -EIO; 1254 result = -EIO;
1255 msg_hdr = (void *) skb->data; 1255 msg_hdr = (void *) skb->data;
1256 result = i2400m_rx_msg_hdr_check(i2400m, msg_hdr, skb->len); 1256 result = i2400m_rx_msg_hdr_check(i2400m, msg_hdr, skb_len);
1257 if (result < 0) 1257 if (result < 0)
1258 goto error_msg_hdr_check; 1258 goto error_msg_hdr_check;
1259 result = -EIO; 1259 result = -EIO;
@@ -1261,10 +1261,10 @@ int i2400m_rx(struct i2400m *i2400m, struct sk_buff *skb)
1261 pl_itr = sizeof(*msg_hdr) + /* Check payload descriptor(s) */ 1261 pl_itr = sizeof(*msg_hdr) + /* Check payload descriptor(s) */
1262 num_pls * sizeof(msg_hdr->pld[0]); 1262 num_pls * sizeof(msg_hdr->pld[0]);
1263 pl_itr = ALIGN(pl_itr, I2400M_PL_ALIGN); 1263 pl_itr = ALIGN(pl_itr, I2400M_PL_ALIGN);
1264 if (pl_itr > skb->len) { /* got all the payload descriptors? */ 1264 if (pl_itr > skb_len) { /* got all the payload descriptors? */
1265 dev_err(dev, "RX: HW BUG? message too short (%u bytes) for " 1265 dev_err(dev, "RX: HW BUG? message too short (%u bytes) for "
1266 "%u payload descriptors (%zu each, total %zu)\n", 1266 "%u payload descriptors (%zu each, total %zu)\n",
1267 skb->len, num_pls, sizeof(msg_hdr->pld[0]), pl_itr); 1267 skb_len, num_pls, sizeof(msg_hdr->pld[0]), pl_itr);
1268 goto error_pl_descr_short; 1268 goto error_pl_descr_short;
1269 } 1269 }
1270 /* Walk each payload payload--check we really got it */ 1270 /* Walk each payload payload--check we really got it */
@@ -1272,7 +1272,7 @@ int i2400m_rx(struct i2400m *i2400m, struct sk_buff *skb)
1272 /* work around old gcc warnings */ 1272 /* work around old gcc warnings */
1273 pl_size = i2400m_pld_size(&msg_hdr->pld[i]); 1273 pl_size = i2400m_pld_size(&msg_hdr->pld[i]);
1274 result = i2400m_rx_pl_descr_check(i2400m, &msg_hdr->pld[i], 1274 result = i2400m_rx_pl_descr_check(i2400m, &msg_hdr->pld[i],
1275 pl_itr, skb->len); 1275 pl_itr, skb_len);
1276 if (result < 0) 1276 if (result < 0)
1277 goto error_pl_descr_check; 1277 goto error_pl_descr_check;
1278 single_last = num_pls == 1 || i == num_pls - 1; 1278 single_last = num_pls == 1 || i == num_pls - 1;
@@ -1290,16 +1290,16 @@ int i2400m_rx(struct i2400m *i2400m, struct sk_buff *skb)
1290 if (i < i2400m->rx_pl_min) 1290 if (i < i2400m->rx_pl_min)
1291 i2400m->rx_pl_min = i; 1291 i2400m->rx_pl_min = i;
1292 i2400m->rx_num++; 1292 i2400m->rx_num++;
1293 i2400m->rx_size_acc += skb->len; 1293 i2400m->rx_size_acc += skb_len;
1294 if (skb->len < i2400m->rx_size_min) 1294 if (skb_len < i2400m->rx_size_min)
1295 i2400m->rx_size_min = skb->len; 1295 i2400m->rx_size_min = skb_len;
1296 if (skb->len > i2400m->rx_size_max) 1296 if (skb_len > i2400m->rx_size_max)
1297 i2400m->rx_size_max = skb->len; 1297 i2400m->rx_size_max = skb_len;
1298 spin_unlock_irqrestore(&i2400m->rx_lock, flags); 1298 spin_unlock_irqrestore(&i2400m->rx_lock, flags);
1299error_pl_descr_check: 1299error_pl_descr_check:
1300error_pl_descr_short: 1300error_pl_descr_short:
1301error_msg_hdr_check: 1301error_msg_hdr_check:
1302 d_fnend(4, dev, "(i2400m %p skb %p [size %zu]) = %d\n", 1302 d_fnend(4, dev, "(i2400m %p skb %p [size %u]) = %d\n",
1303 i2400m, skb, skb_len, result); 1303 i2400m, skb, skb_len, result);
1304 return result; 1304 return result;
1305} 1305}
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
index 0bab84ebb15d..19bc73695475 100644
--- a/drivers/pnp/base.h
+++ b/drivers/pnp/base.h
@@ -12,11 +12,12 @@ void pnp_unregister_protocol(struct pnp_protocol *protocol);
12 12
13#define PNP_EISA_ID_MASK 0x7fffffff 13#define PNP_EISA_ID_MASK 0x7fffffff
14void pnp_eisa_id_to_string(u32 id, char *str); 14void pnp_eisa_id_to_string(u32 id, char *str);
15struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id, char *pnpid); 15struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id,
16 const char *pnpid);
16struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid); 17struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);
17 18
18int pnp_add_device(struct pnp_dev *dev); 19int pnp_add_device(struct pnp_dev *dev);
19struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id); 20struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id);
20 21
21int pnp_add_card(struct pnp_card *card); 22int pnp_add_card(struct pnp_card *card);
22void pnp_remove_card(struct pnp_card *card); 23void pnp_remove_card(struct pnp_card *card);
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c
index 88b3cde52596..c79ee1ded68d 100644
--- a/drivers/pnp/core.c
+++ b/drivers/pnp/core.c
@@ -124,7 +124,8 @@ static void pnp_release_device(struct device *dmdev)
124 kfree(dev); 124 kfree(dev);
125} 125}
126 126
127struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid) 127struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id,
128 const char *pnpid)
128{ 129{
129 struct pnp_dev *dev; 130 struct pnp_dev *dev;
130 struct pnp_id *dev_id; 131 struct pnp_id *dev_id;
diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c
index cd11b113494f..d1dbb9df53fa 100644
--- a/drivers/pnp/driver.c
+++ b/drivers/pnp/driver.c
@@ -236,7 +236,7 @@ void pnp_unregister_driver(struct pnp_driver *drv)
236 * @dev: pointer to the desired device 236 * @dev: pointer to the desired device
237 * @id: pointer to an EISA id string 237 * @id: pointer to an EISA id string
238 */ 238 */
239struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id) 239struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id)
240{ 240{
241 struct pnp_id *dev_id, *ptr; 241 struct pnp_id *dev_id, *ptr;
242 242
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index dc4e32e031e9..4aafcf89b03b 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -59,7 +59,7 @@ static inline int __init is_exclusive_device(struct acpi_device *dev)
59#define TEST_ALPHA(c) \ 59#define TEST_ALPHA(c) \
60 if (!('@' <= (c) || (c) <= 'Z')) \ 60 if (!('@' <= (c) || (c) <= 'Z')) \
61 return 0 61 return 0
62static int __init ispnpidacpi(char *id) 62static int __init ispnpidacpi(const char *id)
63{ 63{
64 TEST_ALPHA(id[0]); 64 TEST_ALPHA(id[0]);
65 TEST_ALPHA(id[1]); 65 TEST_ALPHA(id[1]);
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index ad0ed212db4a..348fba0a8976 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -1046,13 +1046,13 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
1046 1046
1047 /* If the user actually wanted this page, we can skip the rest */ 1047 /* If the user actually wanted this page, we can skip the rest */
1048 if (page == 0) 1048 if (page == 0)
1049 return -EINVAL; 1049 return 0;
1050 1050
1051 for (i = 0; i < min((int)buf[3], buf_len - 4); i++) 1051 for (i = 0; i < min((int)buf[3], buf_len - 4); i++)
1052 if (buf[i + 4] == page) 1052 if (buf[i + 4] == page)
1053 goto found; 1053 goto found;
1054 1054
1055 if (i < buf[3] && i > buf_len) 1055 if (i < buf[3] && i >= buf_len - 4)
1056 /* ran off the end of the buffer, give us benefit of doubt */ 1056 /* ran off the end of the buffer, give us benefit of doubt */
1057 goto found; 1057 goto found;
1058 /* The device claims it doesn't support the requested page */ 1058 /* The device claims it doesn't support the requested page */
diff --git a/drivers/serial/ioc3_serial.c b/drivers/serial/ioc3_serial.c
index 93de907b1208..800c54602339 100644
--- a/drivers/serial/ioc3_serial.c
+++ b/drivers/serial/ioc3_serial.c
@@ -2044,6 +2044,7 @@ ioc3uart_probe(struct ioc3_submodule *is, struct ioc3_driver_data *idd)
2044 if (!port) { 2044 if (!port) {
2045 printk(KERN_WARNING 2045 printk(KERN_WARNING
2046 "IOC3 serial memory not available for port\n"); 2046 "IOC3 serial memory not available for port\n");
2047 ret = -ENOMEM;
2047 goto out4; 2048 goto out4;
2048 } 2049 }
2049 spin_lock_init(&port->ip_lock); 2050 spin_lock_init(&port->ip_lock);
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c
index f96eff04e11a..a6395bdb26ae 100644
--- a/fs/binfmt_aout.c
+++ b/fs/binfmt_aout.c
@@ -134,10 +134,6 @@ static int aout_core_dump(struct coredump_params *cprm)
134 if (!dump_write(file, dump_start, dump_size)) 134 if (!dump_write(file, dump_start, dump_size))
135 goto end_coredump; 135 goto end_coredump;
136 } 136 }
137/* Finally dump the task struct. Not be used by gdb, but could be useful */
138 set_fs(KERNEL_DS);
139 if (!dump_write(file, current, sizeof(*current)))
140 goto end_coredump;
141end_coredump: 137end_coredump:
142 set_fs(fs); 138 set_fs(fs);
143 return has_dumped; 139 return has_dumped;
diff --git a/fs/exec.c b/fs/exec.c
index 828dd2461d6b..6d2b6f936858 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -2014,3 +2014,43 @@ fail_creds:
2014fail: 2014fail:
2015 return; 2015 return;
2016} 2016}
2017
2018/*
2019 * Core dumping helper functions. These are the only things you should
2020 * do on a core-file: use only these functions to write out all the
2021 * necessary info.
2022 */
2023int dump_write(struct file *file, const void *addr, int nr)
2024{
2025 return access_ok(VERIFY_READ, addr, nr) && file->f_op->write(file, addr, nr, &file->f_pos) == nr;
2026}
2027EXPORT_SYMBOL(dump_write);
2028
2029int dump_seek(struct file *file, loff_t off)
2030{
2031 int ret = 1;
2032
2033 if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
2034 if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
2035 return 0;
2036 } else {
2037 char *buf = (char *)get_zeroed_page(GFP_KERNEL);
2038
2039 if (!buf)
2040 return 0;
2041 while (off > 0) {
2042 unsigned long n = off;
2043
2044 if (n > PAGE_SIZE)
2045 n = PAGE_SIZE;
2046 if (!dump_write(file, buf, n)) {
2047 ret = 0;
2048 break;
2049 }
2050 off -= n;
2051 }
2052 free_page((unsigned long)buf);
2053 }
2054 return ret;
2055}
2056EXPORT_SYMBOL(dump_seek);
diff --git a/fs/nfsd/nfsfh.h b/fs/nfsd/nfsfh.h
index cdfb8c6a4206..c16f8d8331b5 100644
--- a/fs/nfsd/nfsfh.h
+++ b/fs/nfsd/nfsfh.h
@@ -196,8 +196,6 @@ fh_lock(struct svc_fh *fhp)
196static inline void 196static inline void
197fh_unlock(struct svc_fh *fhp) 197fh_unlock(struct svc_fh *fhp)
198{ 198{
199 BUG_ON(!fhp->fh_dentry);
200
201 if (fhp->fh_locked) { 199 if (fhp->fh_locked) {
202 fill_post_wcc(fhp); 200 fill_post_wcc(fhp);
203 mutex_unlock(&fhp->fh_dentry->d_inode->i_mutex); 201 mutex_unlock(&fhp->fh_dentry->d_inode->i_mutex);
diff --git a/fs/notify/Kconfig b/fs/notify/Kconfig
index 22c629eedd82..b388443c3a09 100644
--- a/fs/notify/Kconfig
+++ b/fs/notify/Kconfig
@@ -3,4 +3,4 @@ config FSNOTIFY
3 3
4source "fs/notify/dnotify/Kconfig" 4source "fs/notify/dnotify/Kconfig"
5source "fs/notify/inotify/Kconfig" 5source "fs/notify/inotify/Kconfig"
6source "fs/notify/fanotify/Kconfig" 6#source "fs/notify/fanotify/Kconfig"
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 4de84ce3a927..a47bb908ddcd 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -184,7 +184,7 @@ struct acpi_device_pnp {
184 184
185#define acpi_device_bid(d) ((d)->pnp.bus_id) 185#define acpi_device_bid(d) ((d)->pnp.bus_id)
186#define acpi_device_adr(d) ((d)->pnp.bus_address) 186#define acpi_device_adr(d) ((d)->pnp.bus_address)
187char *acpi_device_hid(struct acpi_device *device); 187const char *acpi_device_hid(struct acpi_device *device);
188#define acpi_device_name(d) ((d)->pnp.device_name) 188#define acpi_device_name(d) ((d)->pnp.device_name)
189#define acpi_device_class(d) ((d)->pnp.device_class) 189#define acpi_device_class(d) ((d)->pnp.device_class)
190 190
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
index 29bf945143e8..43027432a055 100644
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -223,25 +223,15 @@ acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width);
223 */ 223 */
224acpi_status 224acpi_status
225acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, 225acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id,
226 u32 reg, u32 *value, u32 width); 226 u32 reg, u64 *value, u32 width);
227 227
228acpi_status 228acpi_status
229acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, 229acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id,
230 u32 reg, u64 value, u32 width); 230 u32 reg, u64 value, u32 width);
231 231
232/* 232/*
233 * Interim function needed for PCI IRQ routing
234 */
235void
236acpi_os_derive_pci_id(acpi_handle device,
237 acpi_handle region, struct acpi_pci_id **pci_id);
238
239/*
240 * Miscellaneous 233 * Miscellaneous
241 */ 234 */
242acpi_status acpi_os_validate_interface(char *interface);
243acpi_status acpi_osi_invalidate(char* interface);
244
245acpi_status 235acpi_status
246acpi_os_validate_address(u8 space_id, acpi_physical_address address, 236acpi_os_validate_address(u8 space_id, acpi_physical_address address,
247 acpi_size length, char *name); 237 acpi_size length, char *name);
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index 984cdc62e30b..7db647c96283 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -47,7 +47,7 @@
47 47
48/* Current ACPICA subsystem version in YYYYMMDD format */ 48/* Current ACPICA subsystem version in YYYYMMDD format */
49 49
50#define ACPI_CA_VERSION 0x20100702 50#define ACPI_CA_VERSION 0x20101013
51 51
52#include "actypes.h" 52#include "actypes.h"
53#include "actbl.h" 53#include "actbl.h"
@@ -72,6 +72,7 @@ extern u8 acpi_gbl_truncate_io_addresses;
72 72
73extern u32 acpi_current_gpe_count; 73extern u32 acpi_current_gpe_count;
74extern struct acpi_table_fadt acpi_gbl_FADT; 74extern struct acpi_table_fadt acpi_gbl_FADT;
75extern u8 acpi_gbl_system_awake_and_running;
75 76
76extern u32 acpi_rsdt_forced; 77extern u32 acpi_rsdt_forced;
77/* 78/*
@@ -105,6 +106,10 @@ const char *acpi_format_exception(acpi_status exception);
105 106
106acpi_status acpi_purge_cached_objects(void); 107acpi_status acpi_purge_cached_objects(void);
107 108
109acpi_status acpi_install_interface(acpi_string interface_name);
110
111acpi_status acpi_remove_interface(acpi_string interface_name);
112
108/* 113/*
109 * ACPI Memory management 114 * ACPI Memory management
110 */ 115 */
@@ -263,6 +268,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
263acpi_status acpi_install_exception_handler(acpi_exception_handler handler); 268acpi_status acpi_install_exception_handler(acpi_exception_handler handler);
264#endif 269#endif
265 270
271acpi_status acpi_install_interface_handler(acpi_interface_handler handler);
272
266/* 273/*
267 * Event interfaces 274 * Event interfaces
268 */ 275 */
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
index 5db8f472fec9..2b134b691e34 100644
--- a/include/acpi/actypes.h
+++ b/include/acpi/actypes.h
@@ -115,7 +115,6 @@
115 * 115 *
116 * ACPI_SIZE 16/32/64-bit unsigned value 116 * ACPI_SIZE 16/32/64-bit unsigned value
117 * ACPI_NATIVE_INT 16/32/64-bit signed value 117 * ACPI_NATIVE_INT 16/32/64-bit signed value
118 *
119 */ 118 */
120 119
121/******************************************************************************* 120/*******************************************************************************
@@ -132,6 +131,16 @@ typedef COMPILER_DEPENDENT_INT64 INT64;
132 131
133/*! [End] no source code translation !*/ 132/*! [End] no source code translation !*/
134 133
134/*
135 * Value returned by acpi_os_get_thread_id. There is no standard "thread_id"
136 * across operating systems or even the various UNIX systems. Since ACPICA
137 * only needs the thread ID as a unique thread identifier, we use a u64
138 * as the only common data type - it will accommodate any type of pointer or
139 * any type of integer. It is up to the host-dependent OSL to cast the
140 * native thread ID type to a u64 (in acpi_os_get_thread_id).
141 */
142#define acpi_thread_id u64
143
135/******************************************************************************* 144/*******************************************************************************
136 * 145 *
137 * Types specific to 64-bit targets 146 * Types specific to 64-bit targets
@@ -211,12 +220,6 @@ typedef u32 acpi_physical_address;
211 * 220 *
212 ******************************************************************************/ 221 ******************************************************************************/
213 222
214/* Value returned by acpi_os_get_thread_id */
215
216#ifndef acpi_thread_id
217#define acpi_thread_id acpi_size
218#endif
219
220/* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ 223/* Flags for acpi_os_acquire_lock/acpi_os_release_lock */
221 224
222#ifndef acpi_cpu_flags 225#ifndef acpi_cpu_flags
@@ -375,16 +378,6 @@ typedef void *acpi_handle; /* Actually a ptr to a NS Node */
375typedef u8 acpi_owner_id; 378typedef u8 acpi_owner_id;
376#define ACPI_OWNER_ID_MAX 0xFF 379#define ACPI_OWNER_ID_MAX 0xFF
377 380
378struct uint64_struct {
379 u32 lo;
380 u32 hi;
381};
382
383union uint64_overlay {
384 u64 full;
385 struct uint64_struct part;
386};
387
388#define ACPI_INTEGER_BIT_SIZE 64 381#define ACPI_INTEGER_BIT_SIZE 64
389#define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */ 382#define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */
390 383
@@ -950,6 +943,9 @@ acpi_status(*acpi_walk_callback) (acpi_handle object,
950 u32 nesting_level, 943 u32 nesting_level,
951 void *context, void **return_value); 944 void *context, void **return_value);
952 945
946typedef
947u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported);
948
953/* Interrupt handler return values */ 949/* Interrupt handler return values */
954 950
955#define ACPI_INTERRUPT_NOT_HANDLED 0x00 951#define ACPI_INTERRUPT_NOT_HANDLED 0x00
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h
index c05aeba9e8f0..a3e334ab1119 100644
--- a/include/acpi/platform/acenv.h
+++ b/include/acpi/platform/acenv.h
@@ -193,6 +193,12 @@
193#define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE 193#define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE
194#endif 194#endif
195 195
196/* "inline" keywords - configurable since inline is not standardized */
197
198#ifndef ACPI_INLINE
199#define ACPI_INLINE
200#endif
201
196/* 202/*
197 * Debugger threading model 203 * Debugger threading model
198 * Use single threaded if the entire subsystem is contained in an application 204 * Use single threaded if the entire subsystem is contained in an application
diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h
index 0cd53e3cd1a3..5dcb9537343c 100644
--- a/include/acpi/platform/acgcc.h
+++ b/include/acpi/platform/acgcc.h
@@ -44,6 +44,8 @@
44#ifndef __ACGCC_H__ 44#ifndef __ACGCC_H__
45#define __ACGCC_H__ 45#define __ACGCC_H__
46 46
47#define ACPI_INLINE __inline__
48
47/* Function name is used for debug output. Non-ANSI, compiler-dependent */ 49/* Function name is used for debug output. Non-ANSI, compiler-dependent */
48 50
49#define ACPI_GET_FUNCTION_NAME __func__ 51#define ACPI_GET_FUNCTION_NAME __func__
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
index 103f08aca764..572189e37133 100644
--- a/include/acpi/platform/aclinux.h
+++ b/include/acpi/platform/aclinux.h
@@ -75,7 +75,6 @@
75#define acpi_cache_t struct kmem_cache 75#define acpi_cache_t struct kmem_cache
76#define acpi_spinlock spinlock_t * 76#define acpi_spinlock spinlock_t *
77#define acpi_cpu_flags unsigned long 77#define acpi_cpu_flags unsigned long
78#define acpi_thread_id struct task_struct *
79 78
80#else /* !__KERNEL__ */ 79#else /* !__KERNEL__ */
81 80
@@ -88,7 +87,7 @@
88/* Host-dependent types and defines for user-space ACPICA */ 87/* Host-dependent types and defines for user-space ACPICA */
89 88
90#define ACPI_FLUSH_CPU_CACHE() 89#define ACPI_FLUSH_CPU_CACHE()
91#define acpi_thread_id pthread_t 90#define ACPI_CAST_PTHREAD_T(pthread) ((acpi_thread_id) (pthread))
92 91
93#if defined(__ia64__) || defined(__x86_64__) 92#if defined(__ia64__) || defined(__x86_64__)
94#define ACPI_MACHINE_WIDTH 64 93#define ACPI_MACHINE_WIDTH 64
@@ -113,12 +112,13 @@
113 112
114 113
115#ifdef __KERNEL__ 114#ifdef __KERNEL__
115#include <acpi/actypes.h>
116/* 116/*
117 * Overrides for in-kernel ACPICA 117 * Overrides for in-kernel ACPICA
118 */ 118 */
119static inline acpi_thread_id acpi_os_get_thread_id(void) 119static inline acpi_thread_id acpi_os_get_thread_id(void)
120{ 120{
121 return current; 121 return (acpi_thread_id)(unsigned long)current;
122} 122}
123 123
124/* 124/*
@@ -127,7 +127,6 @@ static inline acpi_thread_id acpi_os_get_thread_id(void)
127 * However, boot has (system_state != SYSTEM_RUNNING) 127 * However, boot has (system_state != SYSTEM_RUNNING)
128 * to quiet __might_sleep() in kmalloc() and resume does not. 128 * to quiet __might_sleep() in kmalloc() and resume does not.
129 */ 129 */
130#include <acpi/actypes.h>
131static inline void *acpi_os_allocate(acpi_size size) 130static inline void *acpi_os_allocate(acpi_size size)
132{ 131{
133 return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); 132 return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
index 626b629429ff..4e8ea8c8ec1e 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
@@ -118,7 +118,6 @@ header-y += eventpoll.h
118header-y += ext2_fs.h 118header-y += ext2_fs.h
119header-y += fadvise.h 119header-y += fadvise.h
120header-y += falloc.h 120header-y += falloc.h
121header-y += fanotify.h
122header-y += fb.h 121header-y += fb.h
123header-y += fcntl.h 122header-y += fcntl.h
124header-y += fd.h 123header-y += fd.h
diff --git a/include/linux/coredump.h b/include/linux/coredump.h
index 8ba66a9d9022..ba4b85a6d9b8 100644
--- a/include/linux/coredump.h
+++ b/include/linux/coredump.h
@@ -9,37 +9,7 @@
9 * These are the only things you should do on a core-file: use only these 9 * These are the only things you should do on a core-file: use only these
10 * functions to write out all the necessary info. 10 * functions to write out all the necessary info.
11 */ 11 */
12static inline int dump_write(struct file *file, const void *addr, int nr) 12extern int dump_write(struct file *file, const void *addr, int nr);
13{ 13extern int dump_seek(struct file *file, loff_t off);
14 return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
15}
16
17static inline int dump_seek(struct file *file, loff_t off)
18{
19 int ret = 1;
20
21 if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
22 if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
23 return 0;
24 } else {
25 char *buf = (char *)get_zeroed_page(GFP_KERNEL);
26
27 if (!buf)
28 return 0;
29 while (off > 0) {
30 unsigned long n = off;
31
32 if (n > PAGE_SIZE)
33 n = PAGE_SIZE;
34 if (!dump_write(file, buf, n)) {
35 ret = 0;
36 break;
37 }
38 off -= n;
39 }
40 free_page((unsigned long)buf);
41 }
42 return ret;
43}
44 14
45#endif /* _LINUX_COREDUMP_H */ 15#endif /* _LINUX_COREDUMP_H */
diff --git a/include/linux/types.h b/include/linux/types.h
index 01a082f56ef4..357dbc19606f 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -121,7 +121,15 @@ typedef __u64 u_int64_t;
121typedef __s64 int64_t; 121typedef __s64 int64_t;
122#endif 122#endif
123 123
124/* this is a special 64bit data type that is 8-byte aligned */ 124/*
125 * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid
126 * common 32/64-bit compat problems.
127 * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other
128 * architectures) and to 8-byte boundaries on 64-bit architetures. The new
129 * aligned_64 type enforces 8-byte alignment so that structs containing
130 * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.
131 * No conversions are necessary between 32-bit user-space and a 64-bit kernel.
132 */
125#define aligned_u64 __u64 __attribute__((aligned(8))) 133#define aligned_u64 __u64 __attribute__((aligned(8)))
126#define aligned_be64 __be64 __attribute__((aligned(8))) 134#define aligned_be64 __be64 __attribute__((aligned(8)))
127#define aligned_le64 __le64 __attribute__((aligned(8))) 135#define aligned_le64 __le64 __attribute__((aligned(8)))
@@ -178,6 +186,11 @@ typedef __u64 __bitwise __be64;
178typedef __u16 __bitwise __sum16; 186typedef __u16 __bitwise __sum16;
179typedef __u32 __bitwise __wsum; 187typedef __u32 __bitwise __wsum;
180 188
189/* this is a special 64bit data type that is 8-byte aligned */
190#define __aligned_u64 __u64 __attribute__((aligned(8)))
191#define __aligned_be64 __be64 __attribute__((aligned(8)))
192#define __aligned_le64 __le64 __attribute__((aligned(8)))
193
181#ifdef __KERNEL__ 194#ifdef __KERNEL__
182typedef unsigned __bitwise__ gfp_t; 195typedef unsigned __bitwise__ gfp_t;
183typedef unsigned __bitwise__ fmode_t; 196typedef unsigned __bitwise__ fmode_t;
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 1decafbb6b1a..72206cf5c6cf 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -931,6 +931,7 @@ static inline int
931remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base) 931remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base)
932{ 932{
933 if (hrtimer_is_queued(timer)) { 933 if (hrtimer_is_queued(timer)) {
934 unsigned long state;
934 int reprogram; 935 int reprogram;
935 936
936 /* 937 /*
@@ -944,8 +945,13 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base)
944 debug_deactivate(timer); 945 debug_deactivate(timer);
945 timer_stats_hrtimer_clear_start_info(timer); 946 timer_stats_hrtimer_clear_start_info(timer);
946 reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases); 947 reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases);
947 __remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE, 948 /*
948 reprogram); 949 * We must preserve the CALLBACK state flag here,
950 * otherwise we could move the timer base in
951 * switch_hrtimer_base.
952 */
953 state = timer->state & HRTIMER_STATE_CALLBACK;
954 __remove_hrtimer(timer, base, state, reprogram);
949 return 1; 955 return 1;
950 } 956 }
951 return 0; 957 return 0;
@@ -1231,6 +1237,9 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now)
1231 BUG_ON(timer->state != HRTIMER_STATE_CALLBACK); 1237 BUG_ON(timer->state != HRTIMER_STATE_CALLBACK);
1232 enqueue_hrtimer(timer, base); 1238 enqueue_hrtimer(timer, base);
1233 } 1239 }
1240
1241 WARN_ON_ONCE(!(timer->state & HRTIMER_STATE_CALLBACK));
1242
1234 timer->state &= ~HRTIMER_STATE_CALLBACK; 1243 timer->state &= ~HRTIMER_STATE_CALLBACK;
1235} 1244}
1236 1245
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index db5b56064687..b98bed3d8182 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -2202,15 +2202,13 @@ static void perf_event_for_each(struct perf_event *event,
2202static int perf_event_period(struct perf_event *event, u64 __user *arg) 2202static int perf_event_period(struct perf_event *event, u64 __user *arg)
2203{ 2203{
2204 struct perf_event_context *ctx = event->ctx; 2204 struct perf_event_context *ctx = event->ctx;
2205 unsigned long size;
2206 int ret = 0; 2205 int ret = 0;
2207 u64 value; 2206 u64 value;
2208 2207
2209 if (!event->attr.sample_period) 2208 if (!event->attr.sample_period)
2210 return -EINVAL; 2209 return -EINVAL;
2211 2210
2212 size = copy_from_user(&value, arg, sizeof(value)); 2211 if (copy_from_user(&value, arg, sizeof(value)))
2213 if (size != sizeof(value))
2214 return -EFAULT; 2212 return -EFAULT;
2215 2213
2216 if (!value) 2214 if (!value)
diff --git a/kernel/sysctl_check.c b/kernel/sysctl_check.c
index 04cdcf72c827..10b90d8a03c4 100644
--- a/kernel/sysctl_check.c
+++ b/kernel/sysctl_check.c
@@ -143,15 +143,6 @@ int sysctl_check_table(struct nsproxy *namespaces, struct ctl_table *table)
143 if (!table->maxlen) 143 if (!table->maxlen)
144 set_fail(&fail, table, "No maxlen"); 144 set_fail(&fail, table, "No maxlen");
145 } 145 }
146 if ((table->proc_handler == proc_doulongvec_minmax) ||
147 (table->proc_handler == proc_doulongvec_ms_jiffies_minmax)) {
148 if (table->maxlen > sizeof (unsigned long)) {
149 if (!table->extra1)
150 set_fail(&fail, table, "No min");
151 if (!table->extra2)
152 set_fail(&fail, table, "No max");
153 }
154 }
155#ifdef CONFIG_PROC_SYSCTL 146#ifdef CONFIG_PROC_SYSCTL
156 if (table->procname && !table->proc_handler) 147 if (table->procname && !table->proc_handler)
157 set_fail(&fail, table, "No proc_handler"); 148 set_fail(&fail, table, "No proc_handler");
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 492197e2f86c..bca96377fd4e 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -405,7 +405,7 @@ static inline int test_time_stamp(u64 delta)
405#define BUF_MAX_DATA_SIZE (BUF_PAGE_SIZE - (sizeof(u32) * 2)) 405#define BUF_MAX_DATA_SIZE (BUF_PAGE_SIZE - (sizeof(u32) * 2))
406 406
407/* Max number of timestamps that can fit on a page */ 407/* Max number of timestamps that can fit on a page */
408#define RB_TIMESTAMPS_PER_PAGE (BUF_PAGE_SIZE / RB_LEN_TIME_STAMP) 408#define RB_TIMESTAMPS_PER_PAGE (BUF_PAGE_SIZE / RB_LEN_TIME_EXTEND)
409 409
410int ring_buffer_print_page_header(struct trace_seq *s) 410int ring_buffer_print_page_header(struct trace_seq *s)
411{ 411{
diff --git a/net/atm/mpc.c b/net/atm/mpc.c
index 622b471e14e0..74bcc662c3dd 100644
--- a/net/atm/mpc.c
+++ b/net/atm/mpc.c
@@ -778,7 +778,7 @@ static void mpc_push(struct atm_vcc *vcc, struct sk_buff *skb)
778 eg->packets_rcvd++; 778 eg->packets_rcvd++;
779 mpc->eg_ops->put(eg); 779 mpc->eg_ops->put(eg);
780 780
781 memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); 781 memset(ATM_SKB(new_skb), 0, sizeof(struct atm_skb_data));
782 netif_rx(new_skb); 782 netif_rx(new_skb);
783} 783}
784 784
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 4016ac6bdd5e..8451ab481095 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -397,7 +397,7 @@ static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
397 (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index)) 397 (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
398 return -ENOMEM; 398 return -ENOMEM;
399 full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size; 399 full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
400 indir = kmalloc(full_size, GFP_USER); 400 indir = kzalloc(full_size, GFP_USER);
401 if (!indir) 401 if (!indir)
402 return -ENOMEM; 402 return -ENOMEM;
403 403
@@ -538,7 +538,7 @@ static int ethtool_get_rx_ntuple(struct net_device *dev, void __user *useraddr)
538 538
539 gstrings.len = ret; 539 gstrings.len = ret;
540 540
541 data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); 541 data = kzalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
542 if (!data) 542 if (!data)
543 return -ENOMEM; 543 return -ENOMEM;
544 544
@@ -775,7 +775,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
775 if (regs.len > reglen) 775 if (regs.len > reglen)
776 regs.len = reglen; 776 regs.len = reglen;
777 777
778 regbuf = kmalloc(reglen, GFP_USER); 778 regbuf = kzalloc(reglen, GFP_USER);
779 if (!regbuf) 779 if (!regbuf)
780 return -ENOMEM; 780 return -ENOMEM;
781 781
diff --git a/net/rds/page.c b/net/rds/page.c
index 595a952d4b17..1dfbfea12e9b 100644
--- a/net/rds/page.c
+++ b/net/rds/page.c
@@ -57,30 +57,17 @@ int rds_page_copy_user(struct page *page, unsigned long offset,
57 unsigned long ret; 57 unsigned long ret;
58 void *addr; 58 void *addr;
59 59
60 if (to_user) 60 addr = kmap(page);
61 if (to_user) {
61 rds_stats_add(s_copy_to_user, bytes); 62 rds_stats_add(s_copy_to_user, bytes);
62 else 63 ret = copy_to_user(ptr, addr + offset, bytes);
64 } else {
63 rds_stats_add(s_copy_from_user, bytes); 65 rds_stats_add(s_copy_from_user, bytes);
64 66 ret = copy_from_user(addr + offset, ptr, bytes);
65 addr = kmap_atomic(page, KM_USER0);
66 if (to_user)
67 ret = __copy_to_user_inatomic(ptr, addr + offset, bytes);
68 else
69 ret = __copy_from_user_inatomic(addr + offset, ptr, bytes);
70 kunmap_atomic(addr, KM_USER0);
71
72 if (ret) {
73 addr = kmap(page);
74 if (to_user)
75 ret = copy_to_user(ptr, addr + offset, bytes);
76 else
77 ret = copy_from_user(addr + offset, ptr, bytes);
78 kunmap(page);
79 if (ret)
80 return -EFAULT;
81 } 67 }
68 kunmap(page);
82 69
83 return 0; 70 return ret ? -EFAULT : 0;
84} 71}
85EXPORT_SYMBOL_GPL(rds_page_copy_user); 72EXPORT_SYMBOL_GPL(rds_page_copy_user);
86 73
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index a7868ad4d530..cbbed0db9e56 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -535,13 +535,15 @@ static int snd_rawmidi_release(struct inode *inode, struct file *file)
535{ 535{
536 struct snd_rawmidi_file *rfile; 536 struct snd_rawmidi_file *rfile;
537 struct snd_rawmidi *rmidi; 537 struct snd_rawmidi *rmidi;
538 struct module *module;
538 539
539 rfile = file->private_data; 540 rfile = file->private_data;
540 rmidi = rfile->rmidi; 541 rmidi = rfile->rmidi;
541 rawmidi_release_priv(rfile); 542 rawmidi_release_priv(rfile);
542 kfree(rfile); 543 kfree(rfile);
544 module = rmidi->card->module;
543 snd_card_file_remove(rmidi->card, file); 545 snd_card_file_remove(rmidi->card, file);
544 module_put(rmidi->card->module); 546 module_put(module);
545 return 0; 547 return 0;
546} 548}
547 549
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index ef7aa0a0c526..95aaf565c704 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -73,6 +73,18 @@ void get_term_dimensions(struct winsize *ws);
73#define cpu_relax() asm volatile("":::"memory") 73#define cpu_relax() asm volatile("":::"memory")
74#endif 74#endif
75 75
76#ifdef __mips__
77#include "../../arch/mips/include/asm/unistd.h"
78#define rmb() asm volatile( \
79 ".set mips2\n\t" \
80 "sync\n\t" \
81 ".set mips0" \
82 : /* no output */ \
83 : /* no input */ \
84 : "memory")
85#define cpu_relax() asm volatile("" ::: "memory")
86#endif
87
76#include <time.h> 88#include <time.h>
77#include <unistd.h> 89#include <unistd.h>
78#include <sys/types.h> 90#include <sys/types.h>