Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=48657d223d403af676696d313b421368f5e2208a
Commit:     48657d223d403af676696d313b421368f5e2208a
Parent:     a2fd64d6aaf498756f700eb1d07818efee046733
Author:     Michael Holzheu <[EMAIL PROTECTED]>
AuthorDate: Sat Jan 26 14:11:17 2008 +0100
Committer:  Martin Schwidefsky <[EMAIL PROTECTED]>
CommitDate: Sat Jan 26 14:11:24 2008 +0100

    [S390] Use diag308 subcodes 3 and 6 for reboot and dump when possible.
    
    This patch fixes a problem with the following scenario:
     1. Linux booted from DASD "A"
     2. Reboot from DASD "B" using "/sys/firmware/reipl/ccw/device"
     3. Reboot DASD "B"
    Without this patch in step 3 on newer s390 systems under LPAR instead of
    DASD "B", DASD "A" will be booted. The reason is that in step 2 we use CCW
    reipl and in step 3 we use DIAG308 (subcode 3) reipl. DIAG308 does not
    notice the CCW reipl and still thinks that it has to reboot DASD "A".
    Before applying this fix, ensure to have MCF RJ9967101E or z9 GA3 base 
driver
    installed.
    
    Signed-off-by: Michael Holzheu <[EMAIL PROTECTED]>
    Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>
---
 arch/s390/kernel/ipl.c |   14 ++++++++------
 include/asm-s390/ipl.h |    4 ++++
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index 14bdde9..db28cca 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -595,7 +595,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 +661,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 +745,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 +754,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;
@@ -876,7 +876,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;
diff --git a/include/asm-s390/ipl.h b/include/asm-s390/ipl.h
index d0dcc9c..c1b2e50 100644
--- a/include/asm-s390/ipl.h
+++ b/include/asm-s390/ipl.h
@@ -143,6 +143,10 @@ enum diag308_opt {
        DIAG308_IPL_OPT_DUMP    = 0x20,
 };
 
+enum diag308_flags {
+       DIAG308_FLAGS_LP_VALID  = 0x80,
+};
+
 enum diag308_rc {
        DIAG308_RC_OK   = 1,
 };
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to