I had the same problem.
I used an own compiled SMP kernel (it's a dual core machine) with APM and ACPI support.
When looking at the startup log (run
dmesg) I could see that when ACPI is started, it disables APM. Further on APM poweroff is disabled for multicore CPU-s anyhow, as it is considered not SMP-safe. (I don't know why.)
The solution was that I disabled ACPI and enabled APM power off even for SMP. I think the kernel boot parameters for that were
acpi=off apm=smp.
But then
shutdown -h worked
I used the 2.6.20 kernel.
The list of kernel parameters can be found in the file
Documentation/kernel-parameters.txt. Search for
acpi and
apm. The latter will redirect you to
arch/i386/kernel/apm.c where you can see this:
Code:
/*
* See Documentation/Config.help for the configuration options.
*
* Various options can be changed at boot time as follows:
* (We allow underscores for compatibility with the modules code)
* apm=on/off enable/disable APM
* [no-]allow[-_]ints allow interrupts during BIOS calls
* [no-]broken[-_]psr BIOS has a broken GetPowerStatus call
* [no-]realmode[-_]power[-_]off switch to real mode before
* powering off
* [no-]debug log some debugging messages
* [no-]power[-_]off power off on shutdown
* [no-]smp Use apm even on an SMP box
* bounce[-_]interval=<n> number of ticks to ignore suspend
* bounces
* idle[-_]threshold=<n> System idle percentage above which to
* make APM BIOS idle calls. Set it to
* 100 to disable.
* idle[-_]period=<n> Period (in 1/100s of a second) over
* which the idle percentage is
* calculated.
*/
PS. I'm pretty sure that you can find a more sophisticated solution than disabling the whole ACPI.