diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2011-10-30 10:16:34 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-10-30 10:16:41 -0400 |
commit | 75a1c61b434759bf8f2c0118151713b010b44705 (patch) | |
tree | 2fc9367c5120deccac85ab524bcc111ca9e049c1 /drivers/s390 | |
parent | 017ec18360c9894d11f1a2ba5d69f7786732e07a (diff) |
[S390] cio: add message for timeouts on internal I/O
Print a message in case we do not receive an IRQ in time (for internal
I/O). Also print the ID of the last used channel path, since it is
possible that not the device itself but this specific path might have
a defect.
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/cio/ccwreq.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/s390/cio/ccwreq.c b/drivers/s390/cio/ccwreq.c index d15f8b4d78b..5156264d0c7 100644 --- a/drivers/s390/cio/ccwreq.c +++ b/drivers/s390/cio/ccwreq.c | |||
@@ -1,10 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * Handling of internal CCW device requests. | 2 | * Handling of internal CCW device requests. |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 2009 | 4 | * Copyright IBM Corp. 2009, 2011 |
5 | * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | 5 | * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #define KMSG_COMPONENT "cio" | ||
9 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | ||
10 | |||
8 | #include <linux/types.h> | 11 | #include <linux/types.h> |
9 | #include <linux/err.h> | 12 | #include <linux/err.h> |
10 | #include <asm/ccwdev.h> | 13 | #include <asm/ccwdev.h> |
@@ -323,7 +326,21 @@ void ccw_request_timeout(struct ccw_device *cdev) | |||
323 | { | 326 | { |
324 | struct subchannel *sch = to_subchannel(cdev->dev.parent); | 327 | struct subchannel *sch = to_subchannel(cdev->dev.parent); |
325 | struct ccw_request *req = &cdev->private->req; | 328 | struct ccw_request *req = &cdev->private->req; |
326 | int rc; | 329 | int rc = -ENODEV, chp; |
330 | |||
331 | if (cio_update_schib(sch)) | ||
332 | goto err; | ||
333 | |||
334 | for (chp = 0; chp < 8; chp++) { | ||
335 | if ((0x80 >> chp) & sch->schib.pmcw.lpum) | ||
336 | pr_warning("%s: No interrupt was received within %lus " | ||
337 | "(CS=%02x, DS=%02x, CHPID=%x.%02x)\n", | ||
338 | dev_name(&cdev->dev), req->timeout / HZ, | ||
339 | scsw_cstat(&sch->schib.scsw), | ||
340 | scsw_dstat(&sch->schib.scsw), | ||
341 | sch->schid.cssid, | ||
342 | sch->schib.pmcw.chpid[chp]); | ||
343 | } | ||
327 | 344 | ||
328 | if (!ccwreq_next_path(cdev)) { | 345 | if (!ccwreq_next_path(cdev)) { |
329 | /* set the final return code for this request */ | 346 | /* set the final return code for this request */ |
@@ -342,7 +359,7 @@ err: | |||
342 | * ccw_request_notoper - notoper handler for I/O request procedure | 359 | * ccw_request_notoper - notoper handler for I/O request procedure |
343 | * @cdev: ccw device | 360 | * @cdev: ccw device |
344 | * | 361 | * |
345 | * Handle timeout during I/O request procedure. | 362 | * Handle notoper during I/O request procedure. |
346 | */ | 363 | */ |
347 | void ccw_request_notoper(struct ccw_device *cdev) | 364 | void ccw_request_notoper(struct ccw_device *cdev) |
348 | { | 365 | { |