dev_set_drvdata(&sch->dev, private);
 
-       spin_lock_irq(sch->lock);
-       sch->isc = VFIO_CCW_ISC;
-       ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch);
-       spin_unlock_irq(sch->lock);
-       if (ret)
+       vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_OPEN);
+       if (private->state == VFIO_CCW_STATE_NOT_OPER)
                goto out_free;
 
-       private->state = VFIO_CCW_STATE_STANDBY;
-
        ret = mdev_register_device(&sch->dev, &vfio_ccw_mdev_driver);
        if (ret)
                goto out_disable;
 
 
 #include <linux/vfio.h>
 
+#include <asm/isc.h>
+
 #include "ioasm.h"
 #include "vfio_ccw_private.h"
 
                complete(private->completion);
 }
 
+static void fsm_open(struct vfio_ccw_private *private,
+                    enum vfio_ccw_event event)
+{
+       struct subchannel *sch = private->sch;
+       int ret;
+
+       spin_lock_irq(sch->lock);
+       sch->isc = VFIO_CCW_ISC;
+       ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch);
+       if (!ret)
+               private->state = VFIO_CCW_STATE_STANDBY;
+       spin_unlock_irq(sch->lock);
+}
+
 /*
  * Device statemachine
  */
                [VFIO_CCW_EVENT_IO_REQ]         = fsm_io_error,
                [VFIO_CCW_EVENT_ASYNC_REQ]      = fsm_async_error,
                [VFIO_CCW_EVENT_INTERRUPT]      = fsm_disabled_irq,
+               [VFIO_CCW_EVENT_OPEN]           = fsm_open,
        },
        [VFIO_CCW_STATE_STANDBY] = {
                [VFIO_CCW_EVENT_NOT_OPER]       = fsm_notoper,
                [VFIO_CCW_EVENT_IO_REQ]         = fsm_io_error,
                [VFIO_CCW_EVENT_ASYNC_REQ]      = fsm_async_error,
                [VFIO_CCW_EVENT_INTERRUPT]      = fsm_irq,
+               [VFIO_CCW_EVENT_OPEN]           = fsm_notoper,
        },
        [VFIO_CCW_STATE_IDLE] = {
                [VFIO_CCW_EVENT_NOT_OPER]       = fsm_notoper,
                [VFIO_CCW_EVENT_IO_REQ]         = fsm_io_request,
                [VFIO_CCW_EVENT_ASYNC_REQ]      = fsm_async_request,
                [VFIO_CCW_EVENT_INTERRUPT]      = fsm_irq,
+               [VFIO_CCW_EVENT_OPEN]           = fsm_notoper,
        },
        [VFIO_CCW_STATE_CP_PROCESSING] = {
                [VFIO_CCW_EVENT_NOT_OPER]       = fsm_notoper,
                [VFIO_CCW_EVENT_IO_REQ]         = fsm_io_retry,
                [VFIO_CCW_EVENT_ASYNC_REQ]      = fsm_async_retry,
                [VFIO_CCW_EVENT_INTERRUPT]      = fsm_irq,
+               [VFIO_CCW_EVENT_OPEN]           = fsm_notoper,
        },
        [VFIO_CCW_STATE_CP_PENDING] = {
                [VFIO_CCW_EVENT_NOT_OPER]       = fsm_notoper,
                [VFIO_CCW_EVENT_IO_REQ]         = fsm_io_busy,
                [VFIO_CCW_EVENT_ASYNC_REQ]      = fsm_async_request,
                [VFIO_CCW_EVENT_INTERRUPT]      = fsm_irq,
+               [VFIO_CCW_EVENT_OPEN]           = fsm_notoper,
        },
 };