projects/linux·commit f1ee3281

[S390] Add timeouts during sense PGID, path verification and disband PGID.

f1ee3281 · Cornelia Huck <[email protected]> · 2006-10-04 20:02:02 +02:00

While the machine owns us an interrupt in these cases (and we should get
one), reality isn't always like that...

Signed-off-by: Cornelia Huck <[email protected]>
Signed-off-by: Martin Schwidefsky <[email protected]>
Commit
f1ee3281bedbbca70a1f53bc715ea6f27c616052
Parents
b05e3703

Changes

3 files changed · +13 −0

drivers/s390/cio/device_fsm.c

View file
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index dace46f..b676202 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -349,6 +349,8 @@ ccw_device_done(struct ccw_device *cdev, int state)
sch = to_subchannel(cdev->dev.parent);
+ ccw_device_set_timeout(cdev, 0);
+
if (state != DEV_STATE_ONLINE)
cio_disable_subchannel(sch);

drivers/s390/cio/device_ops.c

View file
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c
index 93a897e..e7eeaf1 100644
--- a/drivers/s390/cio/device_ops.c
+++ b/drivers/s390/cio/device_ops.c
@@ -216,6 +216,9 @@ ccw_device_call_handler(struct ccw_device *cdev)
(stctl & SCSW_STCTL_PRIM_STATUS)))
return 0;
+ /* Clear pending timers for device driver initiated I/O. */
+ if (ending_status)
+ ccw_device_set_timeout(cdev, 0);
/*
* Now we are ready to call the device driver interrupt handler.
*/

drivers/s390/cio/device_pgid.c

View file
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c
index 8ca2d07..84917b3 100644
--- a/drivers/s390/cio/device_pgid.c
+++ b/drivers/s390/cio/device_pgid.c
@@ -96,6 +96,9 @@ ccw_device_sense_pgid_start(struct ccw_device *cdev)
{
int ret;
+ /* Set a timeout of 60s */
+ ccw_device_set_timeout(cdev, 60*HZ);
+
cdev->private->state = DEV_STATE_SENSE_PGID;
cdev->private->imask = 0x80;
cdev->private->iretry = 5;
@@ -480,6 +483,8 @@ ccw_device_verify_start(struct ccw_device *cdev)
ccw_device_verify_done(cdev, -ENODEV);
return;
}
+ /* After 60s path verification is considered to have failed. */
+ ccw_device_set_timeout(cdev, 60*HZ);
__ccw_device_verify_start(cdev);
}
@@ -554,6 +559,9 @@ ccw_device_disband_irq(struct ccw_device *cdev, enum dev_event dev_event)
void
ccw_device_disband_start(struct ccw_device *cdev)
{
+ /* After 60s disbanding is considered to have failed. */
+ ccw_device_set_timeout(cdev, 60*HZ);
+
cdev->private->flags.pgid_single = 0;
cdev->private->iretry = 5;
cdev->private->imask = 0x80;