]> err.no Git - linux-2.6/blobdiff - arch/s390/kernel/ipl.c
Merge branch 'agp-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[linux-2.6] / arch / s390 / kernel / ipl.c
index d73aff63725f4a53960c3ae51adc96a49d459957..60acdc266db177fab528d5cedea72829a1cbe939 100644 (file)
@@ -439,7 +439,7 @@ static void ipl_run(struct shutdown_trigger *trigger)
                reipl_ccw_dev(&ipl_info.data.ccw.dev_id);
 }
 
-static int ipl_init(void)
+static int __init ipl_init(void)
 {
        int rc;
 
@@ -471,8 +471,11 @@ out:
        return 0;
 }
 
-static struct shutdown_action ipl_action = {SHUTDOWN_ACTION_IPL_STR, ipl_run,
-                                           ipl_init};
+static struct shutdown_action __refdata ipl_action = {
+       .name   = SHUTDOWN_ACTION_IPL_STR,
+       .fn     = ipl_run,
+       .init   = ipl_init,
+};
 
 /*
  * reipl shutdown action: Reboot Linux on shutdown.
@@ -595,7 +598,9 @@ static int reipl_set_type(enum ipl_type type)
 
        switch(type) {
        case IPL_TYPE_CCW:
-               if (MACHINE_IS_VM)
+               if (diag308_set_works)
+                       reipl_method = REIPL_METHOD_CCW_DIAG;
+               else if (MACHINE_IS_VM)
                        reipl_method = REIPL_METHOD_CCW_VM;
                else
                        reipl_method = REIPL_METHOD_CCW_CIO;
@@ -659,8 +664,6 @@ void reipl_run(struct shutdown_trigger *trigger)
        switch (reipl_method) {
        case REIPL_METHOD_CCW_CIO:
                devid.devno = reipl_block_ccw->ipl_info.ccw.devno;
-               if (ipl_info.type == IPL_TYPE_CCW && devid.devno == ipl_devno)
-                       diag308(DIAG308_IPL, NULL);
                devid.ssid  = 0;
                reipl_ccw_dev(&devid);
                break;
@@ -745,6 +748,7 @@ static int __init reipl_ccw_init(void)
        reipl_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION;
        reipl_block_ccw->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN;
        reipl_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW;
+       reipl_block_ccw->hdr.flags = DIAG308_FLAGS_LP_VALID;
        /* check if read scp info worked and set loadparm */
        if (sclp_ipl_info.is_valid)
                memcpy(reipl_block_ccw->ipl_info.ccw.load_param,
@@ -753,8 +757,7 @@ static int __init reipl_ccw_init(void)
                /* read scp info failed: set empty loadparm (EBCDIC blanks) */
                memset(reipl_block_ccw->ipl_info.ccw.load_param, 0x40,
                       LOADPARM_LEN);
-       /* FIXME: check for diag308_set_works when enabling diag ccw reipl */
-       if (!MACHINE_IS_VM)
+       if (!MACHINE_IS_VM && !diag308_set_works)
                sys_reipl_ccw_loadparm_attr.attr.mode = S_IRUGO;
        if (ipl_info.type == IPL_TYPE_CCW)
                reipl_block_ccw->ipl_info.ccw.devno = ipl_devno;
@@ -792,7 +795,7 @@ static int __init reipl_fcp_init(void)
        return 0;
 }
 
-static int reipl_init(void)
+static int __init reipl_init(void)
 {
        int rc;
 
@@ -819,8 +822,11 @@ static int reipl_init(void)
        return 0;
 }
 
-static struct shutdown_action reipl_action = {SHUTDOWN_ACTION_REIPL_STR,
-                                             reipl_run, reipl_init};
+static struct shutdown_action __refdata reipl_action = {
+       .name   = SHUTDOWN_ACTION_REIPL_STR,
+       .fn     = reipl_run,
+       .init   = reipl_init,
+};
 
 /*
  * dump shutdown action: Dump Linux on shutdown.
@@ -876,7 +882,9 @@ static int dump_set_type(enum dump_type type)
                return -EINVAL;
        switch (type) {
        case DUMP_TYPE_CCW:
-               if (MACHINE_IS_VM)
+               if (diag308_set_works)
+                       dump_method = DUMP_METHOD_CCW_DIAG;
+               else if (MACHINE_IS_VM)
                        dump_method = DUMP_METHOD_CCW_VM;
                else
                        dump_method = DUMP_METHOD_CCW_CIO;
@@ -996,7 +1004,7 @@ static int __init dump_fcp_init(void)
        return 0;
 }
 
-static int dump_init(void)
+static int __init dump_init(void)
 {
        int rc;
 
@@ -1018,8 +1026,11 @@ static int dump_init(void)
        return 0;
 }
 
-static struct shutdown_action dump_action = {SHUTDOWN_ACTION_DUMP_STR,
-                                            dump_run, dump_init};
+static struct shutdown_action __refdata dump_action = {
+       .name   = SHUTDOWN_ACTION_DUMP_STR,
+       .fn     = dump_run,
+       .init   = dump_init,
+};
 
 /*
  * vmcmd shutdown action: Trigger vm command on shutdown.
@@ -1096,8 +1107,12 @@ static struct shutdown_action vmcmd_action = {SHUTDOWN_ACTION_VMCMD_STR,
 
 static void stop_run(struct shutdown_trigger *trigger)
 {
-       signal_processor(smp_processor_id(), sigp_stop_and_store_status);
-       for (;;);
+       if (strcmp(trigger->name, ON_PANIC_STR) == 0)
+               disabled_wait((unsigned long) __builtin_return_address(0));
+       else {
+               signal_processor(smp_processor_id(), sigp_stop);
+               for (;;);
+       }
 }
 
 static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR,
@@ -1283,6 +1298,7 @@ static void __init shutdown_actions_init(void)
 static int __init s390_ipl_init(void)
 {
        reipl_probe();
+       sclp_get_ipl_info(&sclp_ipl_info);
        shutdown_actions_init();
        shutdown_triggers_init();
        return 0;