linux/drivers/s390/cio/device_fsm.c
<<
>>
Prefs
   1/*
   2 * drivers/s390/cio/device_fsm.c
   3 * finite state machine for device handling
   4 *
   5 *    Copyright IBM Corp. 2002,2008
   6 *    Author(s): Cornelia Huck (cornelia.huck@de.ibm.com)
   7 *               Martin Schwidefsky (schwidefsky@de.ibm.com)
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/init.h>
  12#include <linux/jiffies.h>
  13#include <linux/string.h>
  14
  15#include <asm/ccwdev.h>
  16#include <asm/cio.h>
  17#include <asm/chpid.h>
  18
  19#include "cio.h"
  20#include "cio_debug.h"
  21#include "css.h"
  22#include "device.h"
  23#include "chsc.h"
  24#include "ioasm.h"
  25#include "chp.h"
  26
  27static int timeout_log_enabled;
  28
  29static int __init ccw_timeout_log_setup(char *unused)
  30{
  31        timeout_log_enabled = 1;
  32        return 1;
  33}
  34
  35__setup("ccw_timeout_log", ccw_timeout_log_setup);
  36
  37static void ccw_timeout_log(struct ccw_device *cdev)
  38{
  39        struct schib schib;
  40        struct subchannel *sch;
  41        struct io_subchannel_private *private;
  42        union orb *orb;
  43        int cc;
  44
  45        sch = to_subchannel(cdev->dev.parent);
  46        private = to_io_private(sch);
  47        orb = &private->orb;
  48        cc = stsch_err(sch->schid, &schib);
  49
  50        printk(KERN_WARNING "cio: ccw device timeout occurred at %llx, "
  51               "device information:\n", get_clock());
  52        printk(KERN_WARNING "cio: orb:\n");
  53        print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
  54                       orb, sizeof(*orb), 0);
  55        printk(KERN_WARNING "cio: ccw device bus id: %s\n",
  56               dev_name(&cdev->dev));
  57        printk(KERN_WARNING "cio: subchannel bus id: %s\n",
  58               dev_name(&sch->dev));
  59        printk(KERN_WARNING "cio: subchannel lpm: %02x, opm: %02x, "
  60               "vpm: %02x\n", sch->lpm, sch->opm, sch->vpm);
  61
  62        if (orb->tm.b) {
  63                printk(KERN_WARNING "cio: orb indicates transport mode\n");
  64                printk(KERN_WARNING "cio: last tcw:\n");
  65                print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
  66                               (void *)(addr_t)orb->tm.tcw,
  67                               sizeof(struct tcw), 0);
  68        } else {
  69                printk(KERN_WARNING "cio: orb indicates command mode\n");
  70                if ((void *)(addr_t)orb->cmd.cpa == &private->sense_ccw ||
  71                    (void *)(addr_t)orb->cmd.cpa == cdev->private->iccws)
  72                        printk(KERN_WARNING "cio: last channel program "
  73                               "(intern):\n");
  74                else
  75                        printk(KERN_WARNING "cio: last channel program:\n");
  76
  77                print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
  78                               (void *)(addr_t)orb->cmd.cpa,
  79                               sizeof(struct ccw1), 0);
  80        }
  81        printk(KERN_WARNING "cio: ccw device state: %d\n",
  82               cdev->private->state);
  83        printk(KERN_WARNING "cio: store subchannel returned: cc=%d\n", cc);
  84        printk(KERN_WARNING "cio: schib:\n");
  85        print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
  86                       &schib, sizeof(schib), 0);
  87        printk(KERN_WARNING "cio: ccw device flags:\n");
  88        print_hex_dump(KERN_WARNING, "cio:  ", DUMP_PREFIX_NONE, 16, 1,
  89                       &cdev->private->flags, sizeof(cdev->private->flags), 0);
  90}
  91
  92/*
  93 * Timeout function. It just triggers a DEV_EVENT_TIMEOUT.
  94 */
  95static void
  96ccw_device_timeout(unsigned long data)
  97{
  98        struct ccw_device *cdev;
  99
 100        cdev = (struct ccw_device *) data;
 101        spin_lock_irq(cdev->ccwlock);
 102        if (timeout_log_enabled)
 103                ccw_timeout_log(cdev);
 104        dev_fsm_event(cdev, DEV_EVENT_TIMEOUT);
 105        spin_unlock_irq(cdev->ccwlock);
 106}
 107
 108/*
 109 * Set timeout
 110 */
 111void
 112ccw_device_set_timeout(struct ccw_device *cdev, int expires)
 113{
 114        if (expires == 0) {
 115                del_timer(&cdev->private->timer);
 116                return;
 117        }
 118        if (timer_pending(&cdev->private->timer)) {
 119                if (mod_timer(&cdev->private->timer, jiffies + expires))
 120                        return;
 121        }
 122        cdev->private->timer.function = ccw_device_timeout;
 123        cdev->private->timer.data = (unsigned long) cdev;
 124        cdev->private->timer.expires = jiffies + expires;
 125        add_timer(&cdev->private->timer);
 126}
 127
 128/*
 129 * Cancel running i/o. This is called repeatedly since halt/clear are
 130 * asynchronous operations. We do one try with cio_cancel, two tries
 131 * with cio_halt, 255 tries with cio_clear. If everythings fails panic.
 132 * Returns 0 if device now idle, -ENODEV for device not operational and
 133 * -EBUSY if an interrupt is expected (either from halt/clear or from a
 134 * status pending).
 135 */
 136int
 137ccw_device_cancel_halt_clear(struct ccw_device *cdev)
 138{
 139        struct subchannel *sch;
 140        int ret;
 141
 142        sch = to_subchannel(cdev->dev.parent);
 143        if (cio_update_schib(sch))
 144                return -ENODEV; 
 145        if (!sch->schib.pmcw.ena)
 146                /* Not operational -> done. */
 147                return 0;
 148        /* Stage 1: cancel io. */
 149        if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_HALT_PEND) &&
 150            !(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) {
 151                if (!scsw_is_tm(&sch->schib.scsw)) {
 152                        ret = cio_cancel(sch);
 153                        if (ret != -EINVAL)
 154                                return ret;
 155                }
 156                /* cancel io unsuccessful or not applicable (transport mode).
 157                 * Continue with asynchronous instructions. */
 158                cdev->private->iretry = 3;      /* 3 halt retries. */
 159        }
 160        if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) {
 161                /* Stage 2: halt io. */
 162                if (cdev->private->iretry) {
 163                        cdev->private->iretry--;
 164                        ret = cio_halt(sch);
 165                        if (ret != -EBUSY)
 166                                return (ret == 0) ? -EBUSY : ret;
 167                }
 168                /* halt io unsuccessful. */
 169                cdev->private->iretry = 255;    /* 255 clear retries. */
 170        }
 171        /* Stage 3: clear io. */
 172        if (cdev->private->iretry) {
 173                cdev->private->iretry--;
 174                ret = cio_clear (sch);
 175                return (ret == 0) ? -EBUSY : ret;
 176        }
 177        /* Function was unsuccessful */
 178        CIO_MSG_EVENT(0, "0.%x.%04x: could not stop I/O\n",
 179                      cdev->private->dev_id.ssid, cdev->private->dev_id.devno);
 180        return -EIO;
 181}
 182
 183void ccw_device_update_sense_data(struct ccw_device *cdev)
 184{
 185        memset(&cdev->id, 0, sizeof(cdev->id));
 186        cdev->id.cu_type   = cdev->private->senseid.cu_type;
 187        cdev->id.cu_model  = cdev->private->senseid.cu_model;
 188        cdev->id.dev_type  = cdev->private->senseid.dev_type;
 189        cdev->id.dev_model = cdev->private->senseid.dev_model;
 190}
 191
 192int ccw_device_test_sense_data(struct ccw_device *cdev)
 193{
 194        return cdev->id.cu_type == cdev->private->senseid.cu_type &&
 195                cdev->id.cu_model == cdev->private->senseid.cu_model &&
 196                cdev->id.dev_type == cdev->private->senseid.dev_type &&
 197                cdev->id.dev_model == cdev->private->senseid.dev_model;
 198}
 199
 200/*
 201 * The machine won't give us any notification by machine check if a chpid has
 202 * been varied online on the SE so we have to find out by magic (i. e. driving
 203 * the channel subsystem to device selection and updating our path masks).
 204 */
 205static void
 206__recover_lost_chpids(struct subchannel *sch, int old_lpm)
 207{
 208        int mask, i;
 209        struct chp_id chpid;
 210
 211        chp_id_init(&chpid);
 212        for (i = 0; i<8; i++) {
 213                mask = 0x80 >> i;
 214                if (!(sch->lpm & mask))
 215                        continue;
 216                if (old_lpm & mask)
 217                        continue;
 218                chpid.id = sch->schib.pmcw.chpid[i];
 219                if (!chp_is_registered(chpid))
 220                        css_schedule_eval_all();
 221        }
 222}
 223
 224/*
 225 * Stop device recognition.
 226 */
 227static void
 228ccw_device_recog_done(struct ccw_device *cdev, int state)
 229{
 230        struct subchannel *sch;
 231        int old_lpm;
 232
 233        sch = to_subchannel(cdev->dev.parent);
 234
 235        if (cio_disable_subchannel(sch))
 236                state = DEV_STATE_NOT_OPER;
 237        /*
 238         * Now that we tried recognition, we have performed device selection
 239         * through ssch() and the path information is up to date.
 240         */
 241        old_lpm = sch->lpm;
 242
 243        /* Check since device may again have become not operational. */
 244        if (cio_update_schib(sch))
 245                state = DEV_STATE_NOT_OPER;
 246        else
 247                sch->lpm = sch->schib.pmcw.pam & sch->opm;
 248
 249        if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID)
 250                /* Force reprobe on all chpids. */
 251                old_lpm = 0;
 252        if (sch->lpm != old_lpm)
 253                __recover_lost_chpids(sch, old_lpm);
 254        if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID &&
 255            (state == DEV_STATE_NOT_OPER || state == DEV_STATE_BOXED)) {
 256                cdev->private->flags.recog_done = 1;
 257                cdev->private->state = DEV_STATE_DISCONNECTED;
 258                wake_up(&cdev->private->wait_q);
 259                return;
 260        }
 261        if (cdev->private->flags.resuming) {
 262                cdev->private->state = state;
 263                cdev->private->flags.recog_done = 1;
 264                wake_up(&cdev->private->wait_q);
 265                return;
 266        }
 267        switch (state) {
 268        case DEV_STATE_NOT_OPER:
 269                break;
 270        case DEV_STATE_OFFLINE:
 271                if (!cdev->online) {
 272                        ccw_device_update_sense_data(cdev);
 273                        break;
 274                }
 275                cdev->private->state = DEV_STATE_OFFLINE;
 276                cdev->private->flags.recog_done = 1;
 277                if (ccw_device_test_sense_data(cdev)) {
 278                        cdev->private->flags.donotify = 1;
 279                        ccw_device_online(cdev);
 280                        wake_up(&cdev->private->wait_q);
 281                } else {
 282                        ccw_device_update_sense_data(cdev);
 283                        ccw_device_sched_todo(cdev, CDEV_TODO_REBIND);
 284                }
 285                return;
 286        case DEV_STATE_BOXED:
 287                if (cdev->id.cu_type != 0) { /* device was recognized before */
 288                        cdev->private->flags.recog_done = 1;
 289                        cdev->private->state = DEV_STATE_BOXED;
 290                        wake_up(&cdev->private->wait_q);
 291                        return;
 292                }
 293                break;
 294        }
 295        cdev->private->state = state;
 296        io_subchannel_recog_done(cdev);
 297        wake_up(&cdev->private->wait_q);
 298}
 299
 300/*
 301 * Function called from device_id.c after sense id has completed.
 302 */
 303void
 304ccw_device_sense_id_done(struct ccw_device *cdev, int err)
 305{
 306        switch (err) {
 307        case 0:
 308                ccw_device_recog_done(cdev, DEV_STATE_OFFLINE);
 309                break;
 310        case -ETIME:            /* Sense id stopped by timeout. */
 311                ccw_device_recog_done(cdev, DEV_STATE_BOXED);
 312                break;
 313        default:
 314                ccw_device_recog_done(cdev, DEV_STATE_NOT_OPER);
 315                break;
 316        }
 317}
 318
 319/**
 320  * ccw_device_notify() - inform the device's driver about an event
 321  * @cdev: device for which an event occurred
 322  * @event: event that occurred
 323  *
 324  * Returns:
 325  *   -%EINVAL if the device is offline or has no driver.
 326  *   -%EOPNOTSUPP if the device's driver has no notifier registered.
 327  *   %NOTIFY_OK if the driver wants to keep the device.
 328  *   %NOTIFY_BAD if the driver doesn't want to keep the device.
 329  */
 330int ccw_device_notify(struct ccw_device *cdev, int event)
 331{
 332        int ret = -EINVAL;
 333
 334        if (!cdev->drv)
 335                goto out;
 336        if (!cdev->online)
 337                goto out;
 338        CIO_MSG_EVENT(2, "notify called for 0.%x.%04x, event=%d\n",
 339                      cdev->private->dev_id.ssid, cdev->private->dev_id.devno,
 340                      event);
 341        if (!cdev->drv->notify) {
 342                ret = -EOPNOTSUPP;
 343                goto out;
 344        }
 345        if (cdev->drv->notify(cdev, event))
 346                ret = NOTIFY_OK;
 347        else
 348                ret = NOTIFY_BAD;
 349out:
 350        return ret;
 351}
 352
 353static void ccw_device_oper_notify(struct ccw_device *cdev)
 354{
 355        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 356
 357        if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_OK) {
 358                /* Reenable channel measurements, if needed. */
 359                ccw_device_sched_todo(cdev, CDEV_TODO_ENABLE_CMF);
 360                /* Save indication for new paths. */
 361                cdev->private->path_new_mask = sch->vpm;
 362                return;
 363        }
 364        /* Driver doesn't want device back. */
 365        ccw_device_set_notoper(cdev);
 366        ccw_device_sched_todo(cdev, CDEV_TODO_REBIND);
 367}
 368
 369/*
 370 * Finished with online/offline processing.
 371 */
 372static void
 373ccw_device_done(struct ccw_device *cdev, int state)
 374{
 375        struct subchannel *sch;
 376
 377        sch = to_subchannel(cdev->dev.parent);
 378
 379        ccw_device_set_timeout(cdev, 0);
 380
 381        if (state != DEV_STATE_ONLINE)
 382                cio_disable_subchannel(sch);
 383
 384        /* Reset device status. */
 385        memset(&cdev->private->irb, 0, sizeof(struct irb));
 386
 387        cdev->private->state = state;
 388
 389        switch (state) {
 390        case DEV_STATE_BOXED:
 391                CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n",
 392                              cdev->private->dev_id.devno, sch->schid.sch_no);
 393                if (cdev->online &&
 394                    ccw_device_notify(cdev, CIO_BOXED) != NOTIFY_OK)
 395                        ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
 396                cdev->private->flags.donotify = 0;
 397                break;
 398        case DEV_STATE_NOT_OPER:
 399                CIO_MSG_EVENT(0, "Device %04x gone on subchannel %04x\n",
 400                              cdev->private->dev_id.devno, sch->schid.sch_no);
 401                if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
 402                        ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
 403                else
 404                        ccw_device_set_disconnected(cdev);
 405                cdev->private->flags.donotify = 0;
 406                break;
 407        case DEV_STATE_DISCONNECTED:
 408                CIO_MSG_EVENT(0, "Disconnected device %04x on subchannel "
 409                              "%04x\n", cdev->private->dev_id.devno,
 410                              sch->schid.sch_no);
 411                if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) {
 412                        cdev->private->state = DEV_STATE_NOT_OPER;
 413                        ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
 414                } else
 415                        ccw_device_set_disconnected(cdev);
 416                cdev->private->flags.donotify = 0;
 417                break;
 418        default:
 419                break;
 420        }
 421
 422        if (cdev->private->flags.donotify) {
 423                cdev->private->flags.donotify = 0;
 424                ccw_device_oper_notify(cdev);
 425        }
 426        wake_up(&cdev->private->wait_q);
 427}
 428
 429/*
 430 * Start device recognition.
 431 */
 432void ccw_device_recognition(struct ccw_device *cdev)
 433{
 434        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 435
 436        /*
 437         * We used to start here with a sense pgid to find out whether a device
 438         * is locked by someone else. Unfortunately, the sense pgid command
 439         * code has other meanings on devices predating the path grouping
 440         * algorithm, so we start with sense id and box the device after an
 441         * timeout (or if sense pgid during path verification detects the device
 442         * is locked, as may happen on newer devices).
 443         */
 444        cdev->private->flags.recog_done = 0;
 445        cdev->private->state = DEV_STATE_SENSE_ID;
 446        if (cio_enable_subchannel(sch, (u32) (addr_t) sch)) {
 447                ccw_device_recog_done(cdev, DEV_STATE_NOT_OPER);
 448                return;
 449        }
 450        ccw_device_sense_id_start(cdev);
 451}
 452
 453/*
 454 * Handle events for states that use the ccw request infrastructure.
 455 */
 456static void ccw_device_request_event(struct ccw_device *cdev, enum dev_event e)
 457{
 458        switch (e) {
 459        case DEV_EVENT_NOTOPER:
 460                ccw_request_notoper(cdev);
 461                break;
 462        case DEV_EVENT_INTERRUPT:
 463                ccw_request_handler(cdev);
 464                break;
 465        case DEV_EVENT_TIMEOUT:
 466                ccw_request_timeout(cdev);
 467                break;
 468        default:
 469                break;
 470        }
 471}
 472
 473static void ccw_device_report_path_events(struct ccw_device *cdev)
 474{
 475        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 476        int path_event[8];
 477        int chp, mask;
 478
 479        for (chp = 0, mask = 0x80; chp < 8; chp++, mask >>= 1) {
 480                path_event[chp] = PE_NONE;
 481                if (mask & cdev->private->path_gone_mask & ~(sch->vpm))
 482                        path_event[chp] |= PE_PATH_GONE;
 483                if (mask & cdev->private->path_new_mask & sch->vpm)
 484                        path_event[chp] |= PE_PATH_AVAILABLE;
 485                if (mask & cdev->private->pgid_reset_mask & sch->vpm)
 486                        path_event[chp] |= PE_PATHGROUP_ESTABLISHED;
 487        }
 488        if (cdev->online && cdev->drv->path_event)
 489                cdev->drv->path_event(cdev, path_event);
 490}
 491
 492static void ccw_device_reset_path_events(struct ccw_device *cdev)
 493{
 494        cdev->private->path_gone_mask = 0;
 495        cdev->private->path_new_mask = 0;
 496        cdev->private->pgid_reset_mask = 0;
 497}
 498
 499void
 500ccw_device_verify_done(struct ccw_device *cdev, int err)
 501{
 502        struct subchannel *sch;
 503
 504        sch = to_subchannel(cdev->dev.parent);
 505        /* Update schib - pom may have changed. */
 506        if (cio_update_schib(sch)) {
 507                err = -ENODEV;
 508                goto callback;
 509        }
 510        /* Update lpm with verified path mask. */
 511        sch->lpm = sch->vpm;
 512        /* Repeat path verification? */
 513        if (cdev->private->flags.doverify) {
 514                ccw_device_verify_start(cdev);
 515                return;
 516        }
 517callback:
 518        switch (err) {
 519        case 0:
 520                ccw_device_done(cdev, DEV_STATE_ONLINE);
 521                /* Deliver fake irb to device driver, if needed. */
 522                if (cdev->private->flags.fake_irb) {
 523                        memset(&cdev->private->irb, 0, sizeof(struct irb));
 524                        cdev->private->irb.scsw.cmd.cc = 1;
 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;
 530                        if (cdev->handler)
 531                                cdev->handler(cdev, cdev->private->intparm,
 532                                              &cdev->private->irb);
 533                        memset(&cdev->private->irb, 0, sizeof(struct irb));
 534                }
 535                ccw_device_report_path_events(cdev);
 536                break;
 537        case -ETIME:
 538        case -EUSERS:
 539                /* Reset oper notify indication after verify error. */
 540                cdev->private->flags.donotify = 0;
 541                ccw_device_done(cdev, DEV_STATE_BOXED);
 542                break;
 543        case -EACCES:
 544                /* Reset oper notify indication after verify error. */
 545                cdev->private->flags.donotify = 0;
 546                ccw_device_done(cdev, DEV_STATE_DISCONNECTED);
 547                break;
 548        default:
 549                /* Reset oper notify indication after verify error. */
 550                cdev->private->flags.donotify = 0;
 551                ccw_device_done(cdev, DEV_STATE_NOT_OPER);
 552                break;
 553        }
 554        ccw_device_reset_path_events(cdev);
 555}
 556
 557/*
 558 * Get device online.
 559 */
 560int
 561ccw_device_online(struct ccw_device *cdev)
 562{
 563        struct subchannel *sch;
 564        int ret;
 565
 566        if ((cdev->private->state != DEV_STATE_OFFLINE) &&
 567            (cdev->private->state != DEV_STATE_BOXED))
 568                return -EINVAL;
 569        sch = to_subchannel(cdev->dev.parent);
 570        ret = cio_enable_subchannel(sch, (u32)(addr_t)sch);
 571        if (ret != 0) {
 572                /* Couldn't enable the subchannel for i/o. Sick device. */
 573                if (ret == -ENODEV)
 574                        dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
 575                return ret;
 576        }
 577        /* Start initial path verification. */
 578        cdev->private->state = DEV_STATE_VERIFY;
 579        ccw_device_verify_start(cdev);
 580        return 0;
 581}
 582
 583void
 584ccw_device_disband_done(struct ccw_device *cdev, int err)
 585{
 586        switch (err) {
 587        case 0:
 588                ccw_device_done(cdev, DEV_STATE_OFFLINE);
 589                break;
 590        case -ETIME:
 591                ccw_device_done(cdev, DEV_STATE_BOXED);
 592                break;
 593        default:
 594                cdev->private->flags.donotify = 0;
 595                ccw_device_done(cdev, DEV_STATE_NOT_OPER);
 596                break;
 597        }
 598}
 599
 600/*
 601 * Shutdown device.
 602 */
 603int
 604ccw_device_offline(struct ccw_device *cdev)
 605{
 606        struct subchannel *sch;
 607
 608        /* Allow ccw_device_offline while disconnected. */
 609        if (cdev->private->state == DEV_STATE_DISCONNECTED ||
 610            cdev->private->state == DEV_STATE_NOT_OPER) {
 611                cdev->private->flags.donotify = 0;
 612                ccw_device_done(cdev, DEV_STATE_NOT_OPER);
 613                return 0;
 614        }
 615        if (cdev->private->state == DEV_STATE_BOXED) {
 616                ccw_device_done(cdev, DEV_STATE_BOXED);
 617                return 0;
 618        }
 619        if (ccw_device_is_orphan(cdev)) {
 620                ccw_device_done(cdev, DEV_STATE_OFFLINE);
 621                return 0;
 622        }
 623        sch = to_subchannel(cdev->dev.parent);
 624        if (cio_update_schib(sch))
 625                return -ENODEV;
 626        if (scsw_actl(&sch->schib.scsw) != 0)
 627                return -EBUSY;
 628        if (cdev->private->state != DEV_STATE_ONLINE)
 629                return -EINVAL;
 630        /* Are we doing path grouping? */
 631        if (!cdev->private->flags.pgroup) {
 632                /* No, set state offline immediately. */
 633                ccw_device_done(cdev, DEV_STATE_OFFLINE);
 634                return 0;
 635        }
 636        /* Start Set Path Group commands. */
 637        cdev->private->state = DEV_STATE_DISBAND_PGID;
 638        ccw_device_disband_start(cdev);
 639        return 0;
 640}
 641
 642/*
 643 * Handle not operational event in non-special state.
 644 */
 645static void ccw_device_generic_notoper(struct ccw_device *cdev,
 646                                       enum dev_event dev_event)
 647{
 648        if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
 649                ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
 650        else
 651                ccw_device_set_disconnected(cdev);
 652}
 653
 654/*
 655 * Handle path verification event in offline state.
 656 */
 657static void ccw_device_offline_verify(struct ccw_device *cdev,
 658                                      enum dev_event dev_event)
 659{
 660        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 661
 662        css_schedule_eval(sch->schid);
 663}
 664
 665/*
 666 * Handle path verification event.
 667 */
 668static void
 669ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event)
 670{
 671        struct subchannel *sch;
 672
 673        if (cdev->private->state == DEV_STATE_W4SENSE) {
 674                cdev->private->flags.doverify = 1;
 675                return;
 676        }
 677        sch = to_subchannel(cdev->dev.parent);
 678        /*
 679         * Since we might not just be coming from an interrupt from the
 680         * subchannel we have to update the schib.
 681         */
 682        if (cio_update_schib(sch)) {
 683                ccw_device_verify_done(cdev, -ENODEV);
 684                return;
 685        }
 686
 687        if (scsw_actl(&sch->schib.scsw) != 0 ||
 688            (scsw_stctl(&sch->schib.scsw) & SCSW_STCTL_STATUS_PEND) ||
 689            (scsw_stctl(&cdev->private->irb.scsw) & SCSW_STCTL_STATUS_PEND)) {
 690                /*
 691                 * No final status yet or final status not yet delivered
 692                 * to the device driver. Can't do path verification now,
 693                 * delay until final status was delivered.
 694                 */
 695                cdev->private->flags.doverify = 1;
 696                return;
 697        }
 698        /* Device is idle, we can do the path verification. */
 699        cdev->private->state = DEV_STATE_VERIFY;
 700        ccw_device_verify_start(cdev);
 701}
 702
 703/*
 704 * Handle path verification event in boxed state.
 705 */
 706static void ccw_device_boxed_verify(struct ccw_device *cdev,
 707                                    enum dev_event dev_event)
 708{
 709        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 710
 711        if (cdev->online) {
 712                if (cio_enable_subchannel(sch, (u32) (addr_t) sch))
 713                        ccw_device_done(cdev, DEV_STATE_NOT_OPER);
 714                else
 715                        ccw_device_online_verify(cdev, dev_event);
 716        } else
 717                css_schedule_eval(sch->schid);
 718}
 719
 720/*
 721 * Got an interrupt for a normal io (state online).
 722 */
 723static void
 724ccw_device_irq(struct ccw_device *cdev, enum dev_event dev_event)
 725{
 726        struct irb *irb;
 727        int is_cmd;
 728
 729        irb = (struct irb *)&S390_lowcore.irb;
 730        is_cmd = !scsw_is_tm(&irb->scsw);
 731        /* Check for unsolicited interrupt. */
 732        if (!scsw_is_solicited(&irb->scsw)) {
 733                if (is_cmd && (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) &&
 734                    !irb->esw.esw0.erw.cons) {
 735                        /* Unit check but no sense data. Need basic sense. */
 736                        if (ccw_device_do_sense(cdev, irb) != 0)
 737                                goto call_handler_unsol;
 738                        memcpy(&cdev->private->irb, irb, sizeof(struct irb));
 739                        cdev->private->state = DEV_STATE_W4SENSE;
 740                        cdev->private->intparm = 0;
 741                        return;
 742                }
 743call_handler_unsol:
 744                if (cdev->handler)
 745                        cdev->handler (cdev, 0, irb);
 746                if (cdev->private->flags.doverify)
 747                        ccw_device_online_verify(cdev, 0);
 748                return;
 749        }
 750        /* Accumulate status and find out if a basic sense is needed. */
 751        ccw_device_accumulate_irb(cdev, irb);
 752        if (is_cmd && cdev->private->flags.dosense) {
 753                if (ccw_device_do_sense(cdev, irb) == 0) {
 754                        cdev->private->state = DEV_STATE_W4SENSE;
 755                }
 756                return;
 757        }
 758        /* Call the handler. */
 759        if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify)
 760                /* Start delayed path verification. */
 761                ccw_device_online_verify(cdev, 0);
 762}
 763
 764/*
 765 * Got an timeout in online state.
 766 */
 767static void
 768ccw_device_online_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 769{
 770        int ret;
 771
 772        ccw_device_set_timeout(cdev, 0);
 773        cdev->private->iretry = 255;
 774        ret = ccw_device_cancel_halt_clear(cdev);
 775        if (ret == -EBUSY) {
 776                ccw_device_set_timeout(cdev, 3*HZ);
 777                cdev->private->state = DEV_STATE_TIMEOUT_KILL;
 778                return;
 779        }
 780        if (ret)
 781                dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
 782        else if (cdev->handler)
 783                cdev->handler(cdev, cdev->private->intparm,
 784                              ERR_PTR(-ETIMEDOUT));
 785}
 786
 787/*
 788 * Got an interrupt for a basic sense.
 789 */
 790static void
 791ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
 792{
 793        struct irb *irb;
 794
 795        irb = (struct irb *)&S390_lowcore.irb;
 796        /* Check for unsolicited interrupt. */
 797        if (scsw_stctl(&irb->scsw) ==
 798            (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) {
 799                if (scsw_cc(&irb->scsw) == 1)
 800                        /* Basic sense hasn't started. Try again. */
 801                        ccw_device_do_sense(cdev, irb);
 802                else {
 803                        CIO_MSG_EVENT(0, "0.%x.%04x: unsolicited "
 804                                      "interrupt during w4sense...\n",
 805                                      cdev->private->dev_id.ssid,
 806                                      cdev->private->dev_id.devno);
 807                        if (cdev->handler)
 808                                cdev->handler (cdev, 0, irb);
 809                }
 810                return;
 811        }
 812        /*
 813         * Check if a halt or clear has been issued in the meanwhile. If yes,
 814         * only deliver the halt/clear interrupt to the device driver as if it
 815         * had killed the original request.
 816         */
 817        if (scsw_fctl(&irb->scsw) &
 818            (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) {
 819                cdev->private->flags.dosense = 0;
 820                memset(&cdev->private->irb, 0, sizeof(struct irb));
 821                ccw_device_accumulate_irb(cdev, irb);
 822                goto call_handler;
 823        }
 824        /* Add basic sense info to irb. */
 825        ccw_device_accumulate_basic_sense(cdev, irb);
 826        if (cdev->private->flags.dosense) {
 827                /* Another basic sense is needed. */
 828                ccw_device_do_sense(cdev, irb);
 829                return;
 830        }
 831call_handler:
 832        cdev->private->state = DEV_STATE_ONLINE;
 833        /* In case sensing interfered with setting the device online */
 834        wake_up(&cdev->private->wait_q);
 835        /* Call the handler. */
 836        if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify)
 837                /* Start delayed path verification. */
 838                ccw_device_online_verify(cdev, 0);
 839}
 840
 841static void
 842ccw_device_killing_irq(struct ccw_device *cdev, enum dev_event dev_event)
 843{
 844        ccw_device_set_timeout(cdev, 0);
 845        /* Start delayed path verification. */
 846        ccw_device_online_verify(cdev, 0);
 847        /* OK, i/o is dead now. Call interrupt handler. */
 848        if (cdev->handler)
 849                cdev->handler(cdev, cdev->private->intparm,
 850                              ERR_PTR(-EIO));
 851}
 852
 853static void
 854ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 855{
 856        int ret;
 857
 858        ret = ccw_device_cancel_halt_clear(cdev);
 859        if (ret == -EBUSY) {
 860                ccw_device_set_timeout(cdev, 3*HZ);
 861                return;
 862        }
 863        /* Start delayed path verification. */
 864        ccw_device_online_verify(cdev, 0);
 865        if (cdev->handler)
 866                cdev->handler(cdev, cdev->private->intparm,
 867                              ERR_PTR(-EIO));
 868}
 869
 870void ccw_device_kill_io(struct ccw_device *cdev)
 871{
 872        int ret;
 873
 874        cdev->private->iretry = 255;
 875        ret = ccw_device_cancel_halt_clear(cdev);
 876        if (ret == -EBUSY) {
 877                ccw_device_set_timeout(cdev, 3*HZ);
 878                cdev->private->state = DEV_STATE_TIMEOUT_KILL;
 879                return;
 880        }
 881        /* Start delayed path verification. */
 882        ccw_device_online_verify(cdev, 0);
 883        if (cdev->handler)
 884                cdev->handler(cdev, cdev->private->intparm,
 885                              ERR_PTR(-EIO));
 886}
 887
 888static void
 889ccw_device_delay_verify(struct ccw_device *cdev, enum dev_event dev_event)
 890{
 891        /* Start verification after current task finished. */
 892        cdev->private->flags.doverify = 1;
 893}
 894
 895static void
 896ccw_device_start_id(struct ccw_device *cdev, enum dev_event dev_event)
 897{
 898        struct subchannel *sch;
 899
 900        sch = to_subchannel(cdev->dev.parent);
 901        if (cio_enable_subchannel(sch, (u32)(addr_t)sch) != 0)
 902                /* Couldn't enable the subchannel for i/o. Sick device. */
 903                return;
 904        cdev->private->state = DEV_STATE_DISCONNECTED_SENSE_ID;
 905        ccw_device_sense_id_start(cdev);
 906}
 907
 908void ccw_device_trigger_reprobe(struct ccw_device *cdev)
 909{
 910        struct subchannel *sch;
 911
 912        if (cdev->private->state != DEV_STATE_DISCONNECTED)
 913                return;
 914
 915        sch = to_subchannel(cdev->dev.parent);
 916        /* Update some values. */
 917        if (cio_update_schib(sch))
 918                return;
 919        /*
 920         * The pim, pam, pom values may not be accurate, but they are the best
 921         * we have before performing device selection :/
 922         */
 923        sch->lpm = sch->schib.pmcw.pam & sch->opm;
 924        /*
 925         * Use the initial configuration since we can't be shure that the old
 926         * paths are valid.
 927         */
 928        io_subchannel_init_config(sch);
 929        if (cio_commit_config(sch))
 930                return;
 931
 932        /* We should also udate ssd info, but this has to wait. */
 933        /* Check if this is another device which appeared on the same sch. */
 934        if (sch->schib.pmcw.dev != cdev->private->dev_id.devno)
 935                css_schedule_eval(sch->schid);
 936        else
 937                ccw_device_start_id(cdev, 0);
 938}
 939
 940static void ccw_device_disabled_irq(struct ccw_device *cdev,
 941                                    enum dev_event dev_event)
 942{
 943        struct subchannel *sch;
 944
 945        sch = to_subchannel(cdev->dev.parent);
 946        /*
 947         * An interrupt in a disabled state means a previous disable was not
 948         * successful - should not happen, but we try to disable again.
 949         */
 950        cio_disable_subchannel(sch);
 951}
 952
 953static void
 954ccw_device_change_cmfstate(struct ccw_device *cdev, enum dev_event dev_event)
 955{
 956        retry_set_schib(cdev);
 957        cdev->private->state = DEV_STATE_ONLINE;
 958        dev_fsm_event(cdev, dev_event);
 959}
 960
 961static void ccw_device_update_cmfblock(struct ccw_device *cdev,
 962                                       enum dev_event dev_event)
 963{
 964        cmf_retry_copy_block(cdev);
 965        cdev->private->state = DEV_STATE_ONLINE;
 966        dev_fsm_event(cdev, dev_event);
 967}
 968
 969static void
 970ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event)
 971{
 972        ccw_device_set_timeout(cdev, 0);
 973        cdev->private->state = DEV_STATE_NOT_OPER;
 974        wake_up(&cdev->private->wait_q);
 975}
 976
 977static void
 978ccw_device_quiesce_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 979{
 980        int ret;
 981
 982        ret = ccw_device_cancel_halt_clear(cdev);
 983        if (ret == -EBUSY) {
 984                ccw_device_set_timeout(cdev, HZ/10);
 985        } else {
 986                cdev->private->state = DEV_STATE_NOT_OPER;
 987                wake_up(&cdev->private->wait_q);
 988        }
 989}
 990
 991/*
 992 * No operation action. This is used e.g. to ignore a timeout event in
 993 * state offline.
 994 */
 995static void
 996ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event)
 997{
 998}
 999
1000/*
1001 * device statemachine
1002 */
1003fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = {
1004        [DEV_STATE_NOT_OPER] = {
1005                [DEV_EVENT_NOTOPER]     = ccw_device_nop,
1006                [DEV_EVENT_INTERRUPT]   = ccw_device_disabled_irq,
1007                [DEV_EVENT_TIMEOUT]     = ccw_device_nop,
1008                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1009        },
1010        [DEV_STATE_SENSE_PGID] = {
1011                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1012                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1013                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1014                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1015        },
1016        [DEV_STATE_SENSE_ID] = {
1017                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1018                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1019                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1020                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1021        },
1022        [DEV_STATE_OFFLINE] = {
1023                [DEV_EVENT_NOTOPER]     = ccw_device_generic_notoper,
1024                [DEV_EVENT_INTERRUPT]   = ccw_device_disabled_irq,
1025                [DEV_EVENT_TIMEOUT]     = ccw_device_nop,
1026                [DEV_EVENT_VERIFY]      = ccw_device_offline_verify,
1027        },
1028        [DEV_STATE_VERIFY] = {
1029                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1030                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1031                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1032                [DEV_EVENT_VERIFY]      = ccw_device_delay_verify,
1033        },
1034        [DEV_STATE_ONLINE] = {
1035                [DEV_EVENT_NOTOPER]     = ccw_device_generic_notoper,
1036                [DEV_EVENT_INTERRUPT]   = ccw_device_irq,
1037                [DEV_EVENT_TIMEOUT]     = ccw_device_online_timeout,
1038                [DEV_EVENT_VERIFY]      = ccw_device_online_verify,
1039        },
1040        [DEV_STATE_W4SENSE] = {
1041                [DEV_EVENT_NOTOPER]     = ccw_device_generic_notoper,
1042                [DEV_EVENT_INTERRUPT]   = ccw_device_w4sense,
1043                [DEV_EVENT_TIMEOUT]     = ccw_device_nop,
1044                [DEV_EVENT_VERIFY]      = ccw_device_online_verify,
1045        },
1046        [DEV_STATE_DISBAND_PGID] = {
1047                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1048                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1049                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1050                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1051        },
1052        [DEV_STATE_BOXED] = {
1053                [DEV_EVENT_NOTOPER]     = ccw_device_generic_notoper,
1054                [DEV_EVENT_INTERRUPT]   = ccw_device_nop,
1055                [DEV_EVENT_TIMEOUT]     = ccw_device_nop,
1056                [DEV_EVENT_VERIFY]      = ccw_device_boxed_verify,
1057        },
1058        /* states to wait for i/o completion before doing something */
1059        [DEV_STATE_TIMEOUT_KILL] = {
1060                [DEV_EVENT_NOTOPER]     = ccw_device_generic_notoper,
1061                [DEV_EVENT_INTERRUPT]   = ccw_device_killing_irq,
1062                [DEV_EVENT_TIMEOUT]     = ccw_device_killing_timeout,
1063                [DEV_EVENT_VERIFY]      = ccw_device_nop, //FIXME
1064        },
1065        [DEV_STATE_QUIESCE] = {
1066                [DEV_EVENT_NOTOPER]     = ccw_device_quiesce_done,
1067                [DEV_EVENT_INTERRUPT]   = ccw_device_quiesce_done,
1068                [DEV_EVENT_TIMEOUT]     = ccw_device_quiesce_timeout,
1069                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1070        },
1071        /* special states for devices gone not operational */
1072        [DEV_STATE_DISCONNECTED] = {
1073                [DEV_EVENT_NOTOPER]     = ccw_device_nop,
1074                [DEV_EVENT_INTERRUPT]   = ccw_device_start_id,
1075                [DEV_EVENT_TIMEOUT]     = ccw_device_nop,
1076                [DEV_EVENT_VERIFY]      = ccw_device_start_id,
1077        },
1078        [DEV_STATE_DISCONNECTED_SENSE_ID] = {
1079                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1080                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1081                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1082                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1083        },
1084        [DEV_STATE_CMFCHANGE] = {
1085                [DEV_EVENT_NOTOPER]     = ccw_device_change_cmfstate,
1086                [DEV_EVENT_INTERRUPT]   = ccw_device_change_cmfstate,
1087                [DEV_EVENT_TIMEOUT]     = ccw_device_change_cmfstate,
1088                [DEV_EVENT_VERIFY]      = ccw_device_change_cmfstate,
1089        },
1090        [DEV_STATE_CMFUPDATE] = {
1091                [DEV_EVENT_NOTOPER]     = ccw_device_update_cmfblock,
1092                [DEV_EVENT_INTERRUPT]   = ccw_device_update_cmfblock,
1093                [DEV_EVENT_TIMEOUT]     = ccw_device_update_cmfblock,
1094                [DEV_EVENT_VERIFY]      = ccw_device_update_cmfblock,
1095        },
1096        [DEV_STATE_STEAL_LOCK] = {
1097                [DEV_EVENT_NOTOPER]     = ccw_device_request_event,
1098                [DEV_EVENT_INTERRUPT]   = ccw_device_request_event,
1099                [DEV_EVENT_TIMEOUT]     = ccw_device_request_event,
1100                [DEV_EVENT_VERIFY]      = ccw_device_nop,
1101        },
1102};
1103
1104EXPORT_SYMBOL_GPL(ccw_device_set_timeout);
1105