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 52c233fa2b1..1b853513c89 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)  	cdev->private->pgid_reset_mask = 0;  } -void -ccw_device_verify_done(struct ccw_device *cdev, int err) +static void create_fake_irb(struct irb *irb, int type) +{ +	memset(irb, 0, sizeof(*irb)); +	if (type == FAKE_CMD_IRB) { +		struct cmd_scsw *scsw = &irb->scsw.cmd; +		scsw->cc = 1; +		scsw->fctl = SCSW_FCTL_START_FUNC; +		scsw->actl = SCSW_ACTL_START_PEND; +		scsw->stctl = SCSW_STCTL_STATUS_PEND; +	} else if (type == FAKE_TM_IRB) { +		struct tm_scsw *scsw = &irb->scsw.tm; +		scsw->x = 1; +		scsw->cc = 1; +		scsw->fctl = SCSW_FCTL_START_FUNC; +		scsw->actl = SCSW_ACTL_START_PEND; +		scsw->stctl = SCSW_STCTL_STATUS_PEND; +	} +} + +void ccw_device_verify_done(struct ccw_device *cdev, int err)  {  	struct subchannel *sch; @@ -520,12 +538,8 @@ callback:  		ccw_device_done(cdev, DEV_STATE_ONLINE);  		/* Deliver fake irb to device driver, if needed. */  		if (cdev->private->flags.fake_irb) { -			memset(&cdev->private->irb, 0, sizeof(struct irb)); -			cdev->private->irb.scsw.cmd.cc = 1; -			cdev->private->irb.scsw.cmd.fctl = SCSW_FCTL_START_FUNC; -			cdev->private->irb.scsw.cmd.actl = SCSW_ACTL_START_PEND; -			cdev->private->irb.scsw.cmd.stctl = -				SCSW_STCTL_STATUS_PEND; +			create_fake_irb(&cdev->private->irb, +					cdev->private->flags.fake_irb);  			cdev->private->flags.fake_irb = 0;  			if (cdev->handler)  				cdev->handler(cdev, cdev->private->intparm,  |