diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2009-03-31 13:16:05 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2009-03-31 13:17:06 -0400 |
commit | 47593bfa1056d306fde067b28dd8617009be4121 (patch) | |
tree | 3bbad2e48bb773ac4b6f8e0efb4214c75cede7f5 /drivers/s390/cio/device_fsm.c | |
parent | c4621a62649a56f155a96dfc5de479be226f0768 (diff) |
[S390] cio: introduce notifier for boxed state
If a ccw device did not respond in time during internal io, we set it
into boxed state. With this patch we have the following behaviour:
* the ccw driver will get a notification if the device was online and
goes into the boxed state
* if the device was disconnected and got boxed nothing special is to be
done (it will be handled in reprobing later)
* if the device got boxed while initial sensing it will be unregistered
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index ccd72f95765f..e46049261561 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -256,14 +256,12 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
256 | old_lpm = 0; | 256 | old_lpm = 0; |
257 | if (sch->lpm != old_lpm) | 257 | if (sch->lpm != old_lpm) |
258 | __recover_lost_chpids(sch, old_lpm); | 258 | __recover_lost_chpids(sch, old_lpm); |
259 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { | 259 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID && |
260 | if (state == DEV_STATE_NOT_OPER) { | 260 | (state == DEV_STATE_NOT_OPER || state == DEV_STATE_BOXED)) { |
261 | cdev->private->flags.recog_done = 1; | 261 | cdev->private->flags.recog_done = 1; |
262 | cdev->private->state = DEV_STATE_DISCONNECTED; | 262 | cdev->private->state = DEV_STATE_DISCONNECTED; |
263 | wake_up(&cdev->private->wait_q); | 263 | wake_up(&cdev->private->wait_q); |
264 | return; | 264 | return; |
265 | } | ||
266 | /* Boxed devices don't need extra treatment. */ | ||
267 | } | 265 | } |
268 | notify = 0; | 266 | notify = 0; |
269 | same_dev = 0; /* Keep the compiler quiet... */ | 267 | same_dev = 0; /* Keep the compiler quiet... */ |
@@ -275,7 +273,7 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
275 | sch->schid.ssid, sch->schid.sch_no); | 273 | sch->schid.ssid, sch->schid.sch_no); |
276 | break; | 274 | break; |
277 | case DEV_STATE_OFFLINE: | 275 | case DEV_STATE_OFFLINE: |
278 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { | 276 | if (cdev->online) { |
279 | same_dev = ccw_device_handle_oper(cdev); | 277 | same_dev = ccw_device_handle_oper(cdev); |
280 | notify = 1; | 278 | notify = 1; |
281 | } | 279 | } |
@@ -308,6 +306,12 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
308 | " subchannel 0.%x.%04x\n", | 306 | " subchannel 0.%x.%04x\n", |
309 | cdev->private->dev_id.devno, | 307 | cdev->private->dev_id.devno, |
310 | sch->schid.ssid, sch->schid.sch_no); | 308 | sch->schid.ssid, sch->schid.sch_no); |
309 | if (cdev->id.cu_type != 0) { /* device was recognized before */ | ||
310 | cdev->private->flags.recog_done = 1; | ||
311 | cdev->private->state = DEV_STATE_BOXED; | ||
312 | wake_up(&cdev->private->wait_q); | ||
313 | return; | ||
314 | } | ||
311 | break; | 315 | break; |
312 | } | 316 | } |
313 | cdev->private->state = state; | 317 | cdev->private->state = state; |
@@ -390,10 +394,13 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
390 | 394 | ||
391 | cdev->private->state = state; | 395 | cdev->private->state = state; |
392 | 396 | ||
393 | 397 | if (state == DEV_STATE_BOXED) { | |
394 | if (state == DEV_STATE_BOXED) | ||
395 | CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n", | 398 | CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n", |
396 | cdev->private->dev_id.devno, sch->schid.sch_no); | 399 | cdev->private->dev_id.devno, sch->schid.sch_no); |
400 | if (cdev->online && !ccw_device_notify(cdev, CIO_BOXED)) | ||
401 | ccw_device_schedule_sch_unregister(cdev); | ||
402 | cdev->private->flags.donotify = 0; | ||
403 | } | ||
397 | 404 | ||
398 | if (cdev->private->flags.donotify) { | 405 | if (cdev->private->flags.donotify) { |
399 | cdev->private->flags.donotify = 0; | 406 | cdev->private->flags.donotify = 0; |