|
@@ -20,12 +20,12 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
|
|
|
int ccode;
|
|
|
__u8 lpm;
|
|
|
unsigned long flags;
|
|
|
+ int ret;
|
|
|
|
|
|
sch = private->sch;
|
|
|
|
|
|
spin_lock_irqsave(sch->lock, flags);
|
|
|
private->state = VFIO_CCW_STATE_BUSY;
|
|
|
- spin_unlock_irqrestore(sch->lock, flags);
|
|
|
|
|
|
orb = cp_get_orb(&private->cp, (u32)(addr_t)sch, sch->lpm);
|
|
|
|
|
@@ -38,10 +38,12 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
|
|
|
* Initialize device status information
|
|
|
*/
|
|
|
sch->schib.scsw.cmd.actl |= SCSW_ACTL_START_PEND;
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
+ break;
|
|
|
case 1: /* Status pending */
|
|
|
case 2: /* Busy */
|
|
|
- return -EBUSY;
|
|
|
+ ret = -EBUSY;
|
|
|
+ break;
|
|
|
case 3: /* Device/path not operational */
|
|
|
{
|
|
|
lpm = orb->cmd.lpm;
|
|
@@ -51,13 +53,16 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
|
|
|
sch->lpm = 0;
|
|
|
|
|
|
if (cio_update_schib(sch))
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- return sch->lpm ? -EACCES : -ENODEV;
|
|
|
+ ret = -ENODEV;
|
|
|
+ else
|
|
|
+ ret = sch->lpm ? -EACCES : -ENODEV;
|
|
|
+ break;
|
|
|
}
|
|
|
default:
|
|
|
- return ccode;
|
|
|
+ ret = ccode;
|
|
|
}
|
|
|
+ spin_unlock_irqrestore(sch->lock, flags);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void fsm_notoper(struct vfio_ccw_private *private,
|