diff options
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 49ec562d7f60..7d0dd72635eb 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -336,8 +336,11 @@ ccw_device_oper_notify(void *data) | |||
336 | if (!ret) | 336 | if (!ret) |
337 | /* Driver doesn't want device back. */ | 337 | /* Driver doesn't want device back. */ |
338 | ccw_device_do_unreg_rereg((void *)cdev); | 338 | ccw_device_do_unreg_rereg((void *)cdev); |
339 | else | 339 | else { |
340 | /* Reenable channel measurements, if needed. */ | ||
341 | cmf_reenable(cdev); | ||
340 | wake_up(&cdev->private->wait_q); | 342 | wake_up(&cdev->private->wait_q); |
343 | } | ||
341 | } | 344 | } |
342 | 345 | ||
343 | /* | 346 | /* |
@@ -861,6 +864,8 @@ ccw_device_clear_verify(struct ccw_device *cdev, enum dev_event dev_event) | |||
861 | irb = (struct irb *) __LC_IRB; | 864 | irb = (struct irb *) __LC_IRB; |
862 | /* Accumulate status. We don't do basic sense. */ | 865 | /* Accumulate status. We don't do basic sense. */ |
863 | ccw_device_accumulate_irb(cdev, irb); | 866 | ccw_device_accumulate_irb(cdev, irb); |
867 | /* Remember to clear irb to avoid residuals. */ | ||
868 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | ||
864 | /* Try to start delayed device verification. */ | 869 | /* Try to start delayed device verification. */ |
865 | ccw_device_online_verify(cdev, 0); | 870 | ccw_device_online_verify(cdev, 0); |
866 | /* Note: Don't call handler for cio initiated clear! */ | 871 | /* Note: Don't call handler for cio initiated clear! */ |
@@ -1093,6 +1098,13 @@ ccw_device_change_cmfstate(struct ccw_device *cdev, enum dev_event dev_event) | |||
1093 | dev_fsm_event(cdev, dev_event); | 1098 | dev_fsm_event(cdev, dev_event); |
1094 | } | 1099 | } |
1095 | 1100 | ||
1101 | static void ccw_device_update_cmfblock(struct ccw_device *cdev, | ||
1102 | enum dev_event dev_event) | ||
1103 | { | ||
1104 | cmf_retry_copy_block(cdev); | ||
1105 | cdev->private->state = DEV_STATE_ONLINE; | ||
1106 | dev_fsm_event(cdev, dev_event); | ||
1107 | } | ||
1096 | 1108 | ||
1097 | static void | 1109 | static void |
1098 | ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event) | 1110 | ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event) |
@@ -1247,6 +1259,12 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = { | |||
1247 | [DEV_EVENT_TIMEOUT] = ccw_device_change_cmfstate, | 1259 | [DEV_EVENT_TIMEOUT] = ccw_device_change_cmfstate, |
1248 | [DEV_EVENT_VERIFY] = ccw_device_change_cmfstate, | 1260 | [DEV_EVENT_VERIFY] = ccw_device_change_cmfstate, |
1249 | }, | 1261 | }, |
1262 | [DEV_STATE_CMFUPDATE] = { | ||
1263 | [DEV_EVENT_NOTOPER] = ccw_device_update_cmfblock, | ||
1264 | [DEV_EVENT_INTERRUPT] = ccw_device_update_cmfblock, | ||
1265 | [DEV_EVENT_TIMEOUT] = ccw_device_update_cmfblock, | ||
1266 | [DEV_EVENT_VERIFY] = ccw_device_update_cmfblock, | ||
1267 | }, | ||
1250 | }; | 1268 | }; |
1251 | 1269 | ||
1252 | /* | 1270 | /* |