patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / s390 / cio / device_fsm.c
index 3d5c0a5..508f1a7 100644 (file)
@@ -152,14 +152,15 @@ ccw_device_handle_oper(struct ccw_device *cdev)
        /*
         * Check if cu type and device type still match. If
         * not, it is certainly another device and we have to
-        * de- and re-register.
+        * de- and re-register. Also check here for non-matching devno.
         */
        if (cdev->id.cu_type != cdev->private->senseid.cu_type ||
            cdev->id.cu_model != cdev->private->senseid.cu_model ||
            cdev->id.dev_type != cdev->private->senseid.dev_type ||
-           cdev->id.dev_model != cdev->private->senseid.dev_model) {
+           cdev->id.dev_model != cdev->private->senseid.dev_model ||
+           cdev->private->devno != sch->schib.pmcw.dev) {
                PREPARE_WORK(&cdev->private->kick_work,
-                            ccw_device_do_unreg_rereg, (void *)&cdev->dev);
+                            ccw_device_do_unreg_rereg, (void *)cdev);
                queue_work(ccw_device_work, &cdev->private->kick_work);
                return;
        }
@@ -295,7 +296,7 @@ ccw_device_oper_notify(void *data)
                sch->driver->notify(&sch->dev, CIO_OPER) : 0;
        if (!ret)
                /* Driver doesn't want device back. */
-               ccw_device_do_unreg_rereg((void *)&cdev->dev);
+               ccw_device_do_unreg_rereg((void *)cdev);
        else
                wake_up(&cdev->private->wait_q);
 }
@@ -457,25 +458,13 @@ ccw_device_nopath_notify(void *data)
        }
 }
 
-void
-device_call_nopath_notify(struct subchannel *sch)
-{
-       struct ccw_device *cdev;
-
-       if (!sch->dev.driver_data)
-               return;
-       cdev = sch->dev.driver_data;
-       PREPARE_WORK(&cdev->private->kick_work,
-                    ccw_device_nopath_notify, (void *)cdev);
-       queue_work(ccw_device_notify_work, &cdev->private->kick_work);
-}
-
-
 void
 ccw_device_verify_done(struct ccw_device *cdev, int err)
 {
        cdev->private->flags.doverify = 0;
        switch (err) {
+       case -EOPNOTSUPP: /* path grouping not supported, just set online. */
+               cdev->private->options.pgroup = 0;
        case 0:
                ccw_device_done(cdev, DEV_STATE_ONLINE);
                break;
@@ -1082,103 +1071,103 @@ ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event)
  * device statemachine
  */
 fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = {
-       [DEV_STATE_NOT_OPER] {
-               [DEV_EVENT_NOTOPER]     ccw_device_nop,
-               [DEV_EVENT_INTERRUPT]   ccw_device_bug,
-               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_NOT_OPER] {
+               [DEV_EVENT_NOTOPER]     ccw_device_nop,
+               [DEV_EVENT_INTERRUPT]   ccw_device_bug,
+               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_SENSE_PGID] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_sense_pgid_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_SENSE_PGID] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_sense_pgid_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_SENSE_ID] {
-               [DEV_EVENT_NOTOPER]     ccw_device_recog_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_sense_id_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_recog_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_SENSE_ID] {
+               [DEV_EVENT_NOTOPER]     ccw_device_recog_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_sense_id_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_recog_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_OFFLINE] {
-               [DEV_EVENT_NOTOPER]     ccw_device_offline_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_offline_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_OFFLINE] {
+               [DEV_EVENT_NOTOPER]     ccw_device_offline_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_offline_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_VERIFY] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_verify_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_VERIFY] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_verify_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_ONLINE] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_online_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_online_verify,
+       [DEV_STATE_ONLINE] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_online_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_online_verify,
        },
-       [DEV_STATE_W4SENSE] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_w4sense,
-               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
-               [DEV_EVENT_VERIFY]      ccw_device_online_verify,
+       [DEV_STATE_W4SENSE] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_w4sense,
+               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
+               [DEV_EVENT_VERIFY]      ccw_device_online_verify,
        },
-       [DEV_STATE_DISBAND_PGID] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_disband_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_DISBAND_PGID] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_disband_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_onoff_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_BOXED] {
-               [DEV_EVENT_NOTOPER]     ccw_device_offline_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_stlck_done,
-               [DEV_EVENT_TIMEOUT]     ccw_device_stlck_done,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_BOXED] {
+               [DEV_EVENT_NOTOPER]     ccw_device_offline_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_stlck_done,
+               [DEV_EVENT_TIMEOUT]     ccw_device_stlck_done,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
        /* states to wait for i/o completion before doing something */
-       [DEV_STATE_CLEAR_VERIFY] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_clear_verify,
-               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_CLEAR_VERIFY] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_clear_verify,
+               [DEV_EVENT_TIMEOUT]     ccw_device_nop,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_TIMEOUT_KILL] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_killing_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_killing_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop, //FIXME
+       [DEV_STATE_TIMEOUT_KILL] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_killing_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_killing_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop, //FIXME
        },
-       [DEV_STATE_WAIT4IO] {
-               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_wait4io_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_wait4io_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_wait4io_verify,
+       [DEV_STATE_WAIT4IO] {
+               [DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_wait4io_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_wait4io_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_wait4io_verify,
        },
-       [DEV_STATE_QUIESCE] {
-               [DEV_EVENT_NOTOPER]     ccw_device_quiesce_done,
-               [DEV_EVENT_INTERRUPT]   ccw_device_quiesce_done,
-               [DEV_EVENT_TIMEOUT]     ccw_device_quiesce_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_QUIESCE] {
+               [DEV_EVENT_NOTOPER]     ccw_device_quiesce_done,
+               [DEV_EVENT_INTERRUPT]   ccw_device_quiesce_done,
+               [DEV_EVENT_TIMEOUT]     ccw_device_quiesce_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
        /* special states for devices gone not operational */
-       [DEV_STATE_DISCONNECTED] {
-               [DEV_EVENT_NOTOPER]     ccw_device_nop,
-               [DEV_EVENT_INTERRUPT]   ccw_device_start_id,
-               [DEV_EVENT_TIMEOUT]     ccw_device_bug,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_DISCONNECTED] {
+               [DEV_EVENT_NOTOPER]     ccw_device_nop,
+               [DEV_EVENT_INTERRUPT]   ccw_device_start_id,
+               [DEV_EVENT_TIMEOUT]     ccw_device_bug,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_DISCONNECTED_SENSE_ID] {
-               [DEV_EVENT_NOTOPER]     ccw_device_recog_notoper,
-               [DEV_EVENT_INTERRUPT]   ccw_device_sense_id_irq,
-               [DEV_EVENT_TIMEOUT]     ccw_device_recog_timeout,
-               [DEV_EVENT_VERIFY]      ccw_device_nop,
+       [DEV_STATE_DISCONNECTED_SENSE_ID] {
+               [DEV_EVENT_NOTOPER]     ccw_device_recog_notoper,
+               [DEV_EVENT_INTERRUPT]   ccw_device_sense_id_irq,
+               [DEV_EVENT_TIMEOUT]     ccw_device_recog_timeout,
+               [DEV_EVENT_VERIFY]      ccw_device_nop,
        },
-       [DEV_STATE_CMFCHANGE] {
-               [DEV_EVENT_NOTOPER]     ccw_device_change_cmfstate,
-               [DEV_EVENT_INTERRUPT]   ccw_device_change_cmfstate,
-               [DEV_EVENT_TIMEOUT]     ccw_device_change_cmfstate,
-               [DEV_EVENT_VERIFY]      ccw_device_change_cmfstate,
+       [DEV_STATE_CMFCHANGE] {
+               [DEV_EVENT_NOTOPER]     ccw_device_change_cmfstate,
+               [DEV_EVENT_INTERRUPT]   ccw_device_change_cmfstate,
+               [DEV_EVENT_TIMEOUT]     ccw_device_change_cmfstate,
+               [DEV_EVENT_VERIFY]      ccw_device_change_cmfstate,
        },
 };