extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data);
 extern int rtas_online_cpus_mask(cpumask_var_t cpus);
 extern int rtas_offline_cpus_mask(cpumask_var_t cpus);
-extern int rtas_ibm_suspend_me(struct rtas_args *);
+extern int rtas_ibm_suspend_me(u64 handle, int *vasi_return);
 
 struct rtc_time;
 extern unsigned long rtas_get_boot_time(void);
 
 }
 EXPORT_SYMBOL(rtas_offline_cpus_mask);
 
-int rtas_ibm_suspend_me(struct rtas_args *args)
+int rtas_ibm_suspend_me(u64 handle, int *vasi_return)
 {
        long state;
        long rc;
                return -ENOSYS;
 
        /* Make sure the state is valid */
-       rc = plpar_hcall(H_VASI_STATE, retbuf,
-                        ((u64)args->args[0] << 32) | args->args[1]);
+       rc = plpar_hcall(H_VASI_STATE, retbuf, handle);
 
        state = retbuf[0];
 
                printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc);
                return rc;
        } else if (state == H_VASI_ENABLED) {
-               args->args[args->nargs] = RTAS_NOT_SUSPENDABLE;
+               *vasi_return = RTAS_NOT_SUSPENDABLE;
                return 0;
        } else if (state != H_VASI_SUSPENDING) {
                printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned state %ld\n",
                       state);
-               args->args[args->nargs] = -1;
+               *vasi_return = -1;
                return 0;
        }
 
        return atomic_read(&data.error);
 }
 #else /* CONFIG_PPC_PSERIES */
-int rtas_ibm_suspend_me(struct rtas_args *args)
+int rtas_ibm_suspend_me(u64 handle, int *vasi_return)
 {
        return -ENOSYS;
 }
 
        /* Need to handle ibm,suspend_me call specially */
        if (token == ibm_suspend_me_token) {
-               rc = rtas_ibm_suspend_me(&args);
+
+               /*
+                * rtas_ibm_suspend_me assumes args are in cpu endian, or at least the
+                * hcall within it requires it.
+                */
+               int vasi_rc = 0;
+               u64 handle = ((u64)be32_to_cpu(args.args[0]) << 32)
+                             | be32_to_cpu(args.args[1]);
+               rc = rtas_ibm_suspend_me(handle, &vasi_rc);
+               args.rets[0] = cpu_to_be32(vasi_rc);
                if (rc)
                        return rc;
                goto copy_return;
 
 static ssize_t migrate_store(struct class *class, struct class_attribute *attr,
                             const char *buf, size_t count)
 {
-       struct rtas_args args;
        u64 streamid;
        int rc;
+       int vasi_rc = 0;
 
        rc = kstrtou64(buf, 0, &streamid);
        if (rc)
                return rc;
 
-       memset(&args, 0, sizeof(args));
-       args.token = rtas_token("ibm,suspend-me");
-       args.nargs = 2;
-       args.nret = 1;
-
-       args.args[0] = streamid >> 32 ;
-       args.args[1] = streamid & 0xffffffff;
-       args.rets = &args.args[args.nargs];
-
        do {
-               args.rets[0] = 0;
-               rc = rtas_ibm_suspend_me(&args);
-               if (!rc && args.rets[0] == RTAS_NOT_SUSPENDABLE)
+               rc = rtas_ibm_suspend_me(streamid, &vasi_rc);
+               if (!rc && vasi_rc == RTAS_NOT_SUSPENDABLE)
                        ssleep(1);
-       } while (!rc && args.rets[0] == RTAS_NOT_SUSPENDABLE);
+       } while (!rc && vasi_rc == RTAS_NOT_SUSPENDABLE);
 
        if (rc)
                return rc;
-       else if (args.rets[0])
-               return args.rets[0];
+       if (vasi_rc)
+               return vasi_rc;
 
        post_mobility_fixup();
        return count;