aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/rtas.c
diff options
context:
space:
mode:
authorDave C Boutcher <boutcher@cs.umn.edu>2006-06-12 20:49:20 -0400
committerPaul Mackerras <paulus@samba.org>2006-06-15 05:31:27 -0400
commit368a6ba5d188552aea2a668301a259164c9f355e (patch)
treed22916e2870618b2b4ff26588df8f66a5928ac64 /arch/powerpc/kernel/rtas.c
parent0e4aa9c2009187fff1c999fe0aaa134c1a84f48a (diff)
[POWERPC] check firmware state before suspending
Currently the kernel blindly halts all the processors and calls the ibm,suspend-me rtas call. If the firmware is not in the correct state, we then re-start all the processors and return. It is much smarter to first check the firmware state, and only if it is waiting, call the ibm,suspend-me call. Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/rtas.c')
-rw-r--r--arch/powerpc/kernel/rtas.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 13496f319855..fd15e3e3bb33 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -593,9 +593,31 @@ out:
593static int rtas_ibm_suspend_me(struct rtas_args *args) 593static int rtas_ibm_suspend_me(struct rtas_args *args)
594{ 594{
595 int i; 595 int i;
596 long state;
597 long rc;
598 unsigned long dummy;
596 599
597 struct rtas_suspend_me_data data; 600 struct rtas_suspend_me_data data;
598 601
602 /* Make sure the state is valid */
603 rc = plpar_hcall(H_VASI_STATE,
604 ((u64)args->args[0] << 32) | args->args[1],
605 0, 0, 0,
606 &state, &dummy, &dummy);
607
608 if (rc) {
609 printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc);
610 return rc;
611 } else if (state == H_VASI_ENABLED) {
612 args->args[args->nargs] = RTAS_NOT_SUSPENDABLE;
613 return 0;
614 } else if (state != H_VASI_SUSPENDING) {
615 printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned state %ld\n",
616 state);
617 args->args[args->nargs] = -1;
618 return 0;
619 }
620
599 data.waiting = 1; 621 data.waiting = 1;
600 data.args = args; 622 data.args = args;
601 623