Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=14ff56bbb3422cc465a12e81f5e1b5f06168aeda
Commit:     14ff56bbb3422cc465a12e81f5e1b5f06168aeda
Parent:     661ca0da3e1fa60c9e56f995fd83772ffa9ffe90
Author:     Sebastian Ott <[EMAIL PROTECTED]>
AuthorDate: Sat Jan 26 14:10:37 2008 +0100
Committer:  Martin Schwidefsky <[EMAIL PROTECTED]>
CommitDate: Sat Jan 26 14:10:55 2008 +0100

    [S390] cio: Dump ccw device information in case of timeout.
    
    Information about a ccw device will be dumped in
    case of a ccw timeout. This can be enabled with
    the kernel parameter ccw_timeout_log.
    
    Signed-off-by: Sebastian Ott <[EMAIL PROTECTED]>
    Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>
---
 Documentation/kernel-parameters.txt |    3 ++
 Documentation/s390/CommonIO         |    5 +++
 drivers/s390/cio/device_fsm.c       |   50 +++++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/Documentation/kernel-parameters.txt 
b/Documentation/kernel-parameters.txt
index d29b6d9..880f882 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -370,6 +370,9 @@ and is between 256 and 4096 characters. It is defined in 
the file
                        configured.  Potentially dangerous and should only be
                        used if you are entirely sure of the consequences.
 
+       ccw_timeout_log [S390]
+                       See Documentation/s390/CommonIO for details.
+
        checkreqprot    [SELINUX] Set initial checkreqprot flag value.
                        Format: { "0" | "1" }
                        See security/selinux/Kconfig help text.
diff --git a/Documentation/s390/CommonIO b/Documentation/s390/CommonIO
index 86320aa..8fbc0a8 100644
--- a/Documentation/s390/CommonIO
+++ b/Documentation/s390/CommonIO
@@ -4,6 +4,11 @@ S/390 common I/O-Layer - command line parameters, procfs and 
debugfs entries
 Command line parameters
 -----------------------
 
+* ccw_timeout_log
+
+  Enable logging of debug information in case of ccw device timeouts.
+
+
 * cio_msg = yes | no
   
   Determines whether information on found devices and sensed device 
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index bfad421..31c0f78 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -25,6 +25,8 @@
 #include "ioasm.h"
 #include "chp.h"
 
+static int timeout_log_enabled;
+
 int
 device_is_online(struct subchannel *sch)
 {
@@ -82,6 +84,52 @@ int device_trigger_verify(struct subchannel *sch)
        return 0;
 }
 
+static int __init ccw_timeout_log_setup(char *unused)
+{
+       timeout_log_enabled = 1;
+       return 1;
+}
+
+__setup("ccw_timeout_log", ccw_timeout_log_setup);
+
+static void ccw_timeout_log(struct ccw_device *cdev)
+{
+       struct schib schib;
+       struct subchannel *sch;
+       int cc;
+
+       sch = to_subchannel(cdev->dev.parent);
+       cc = stsch(sch->schid, &schib);
+
+       printk(KERN_WARNING "cio: ccw device timeout occurred at %llx, "
+              "device information:\n", get_clock());
+       printk(KERN_WARNING "cio: orb:\n");
+       print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
+                      &sch->orb, sizeof(sch->orb), 0);
+       printk(KERN_WARNING "cio: ccw device bus id: %s\n", cdev->dev.bus_id);
+       printk(KERN_WARNING "cio: subchannel bus id: %s\n", sch->dev.bus_id);
+       printk(KERN_WARNING "cio: subchannel lpm: %02x, opm: %02x, "
+              "vpm: %02x\n", sch->lpm, sch->opm, sch->vpm);
+
+       if ((void *)(addr_t)sch->orb.cpa == &sch->sense_ccw ||
+           (void *)(addr_t)sch->orb.cpa == cdev->private->iccws)
+               printk(KERN_WARNING "cio: last channel program (intern):\n");
+       else
+               printk(KERN_WARNING "cio: last channel program:\n");
+
+       print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
+                      (void *)(addr_t)sch->orb.cpa, sizeof(struct ccw1), 0);
+       printk(KERN_WARNING "cio: ccw device state: %d\n",
+              cdev->private->state);
+       printk(KERN_WARNING "cio: store subchannel returned: cc=%d\n", cc);
+       printk(KERN_WARNING "cio: schib:\n");
+       print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
+                      &schib, sizeof(schib), 0);
+       printk(KERN_WARNING "cio: ccw device flags:\n");
+       print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
+                      &cdev->private->flags, sizeof(cdev->private->flags), 0);
+}
+
 /*
  * Timeout function. It just triggers a DEV_EVENT_TIMEOUT.
  */
@@ -92,6 +140,8 @@ ccw_device_timeout(unsigned long data)
 
        cdev = (struct ccw_device *) data;
        spin_lock_irq(cdev->ccwlock);
+       if (timeout_log_enabled)
+               ccw_timeout_log(cdev);
        dev_fsm_event(cdev, DEV_EVENT_TIMEOUT);
        spin_unlock_irq(cdev->ccwlock);
 }
-
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