diff options
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
| -rw-r--r-- | drivers/s390/cio/device_fsm.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 52c233fa2b12..1b853513c891 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
| @@ -496,8 +496,26 @@ static void ccw_device_reset_path_events(struct ccw_device *cdev) | |||
| 496 | cdev->private->pgid_reset_mask = 0; | 496 | cdev->private->pgid_reset_mask = 0; |
| 497 | } | 497 | } |
| 498 | 498 | ||
| 499 | void | 499 | static void create_fake_irb(struct irb *irb, int type) |
| 500 | ccw_device_verify_done(struct ccw_device *cdev, int err) | 500 | { |
| 501 | memset(irb, 0, sizeof(*irb)); | ||
| 502 | if (type == FAKE_CMD_IRB) { | ||
| 503 | struct cmd_scsw *scsw = &irb->scsw.cmd; | ||
| 504 | scsw->cc = 1; | ||
| 505 | scsw->fctl = SCSW_FCTL_START_FUNC; | ||
| 506 | scsw->actl = SCSW_ACTL_START_PEND; | ||
| 507 | scsw->stctl = SCSW_STCTL_STATUS_PEND; | ||
| 508 | } else if (type == FAKE_TM_IRB) { | ||
| 509 | struct tm_scsw *scsw = &irb->scsw.tm; | ||
| 510 | scsw->x = 1; | ||
| 511 | scsw->cc = 1; | ||
| 512 | scsw->fctl = SCSW_FCTL_START_FUNC; | ||
| 513 | scsw->actl = SCSW_ACTL_START_PEND; | ||
| 514 | scsw->stctl = SCSW_STCTL_STATUS_PEND; | ||
| 515 | } | ||
| 516 | } | ||
| 517 | |||
| 518 | void ccw_device_verify_done(struct ccw_device *cdev, int err) | ||
| 501 | { | 519 | { |
| 502 | struct subchannel *sch; | 520 | struct subchannel *sch; |
| 503 | 521 | ||
| @@ -520,12 +538,8 @@ callback: | |||
| 520 | ccw_device_done(cdev, DEV_STATE_ONLINE); | 538 | ccw_device_done(cdev, DEV_STATE_ONLINE); |
| 521 | /* Deliver fake irb to device driver, if needed. */ | 539 | /* Deliver fake irb to device driver, if needed. */ |
| 522 | if (cdev->private->flags.fake_irb) { | 540 | if (cdev->private->flags.fake_irb) { |
| 523 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | 541 | create_fake_irb(&cdev->private->irb, |
| 524 | cdev->private->irb.scsw.cmd.cc = 1; | 542 | cdev->private->flags.fake_irb); |
| 525 | cdev->private->irb.scsw.cmd.fctl = SCSW_FCTL_START_FUNC; | ||
| 526 | cdev->private->irb.scsw.cmd.actl = SCSW_ACTL_START_PEND; | ||
| 527 | cdev->private->irb.scsw.cmd.stctl = | ||
| 528 | SCSW_STCTL_STATUS_PEND; | ||
| 529 | cdev->private->flags.fake_irb = 0; | 543 | cdev->private->flags.fake_irb = 0; |
| 530 | if (cdev->handler) | 544 | if (cdev->handler) |
| 531 | cdev->handler(cdev, cdev->private->intparm, | 545 | cdev->handler(cdev, cdev->private->intparm, |
