linux/drivers/s390/cio/device.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-1.0+
   2/*
   3 *  bus driver for ccw devices
   4 *
   5 *    Copyright IBM Corp. 2002, 2008
   6 *    Author(s): Arnd Bergmann (arndb@de.ibm.com)
   7 *               Cornelia Huck (cornelia.huck@de.ibm.com)
   8 *               Martin Schwidefsky (schwidefsky@de.ibm.com)
   9 */
  10
  11#define KMSG_COMPONENT "cio"
  12#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  13
  14#include <linux/export.h>
  15#include <linux/init.h>
  16#include <linux/spinlock.h>
  17#include <linux/errno.h>
  18#include <linux/err.h>
  19#include <linux/slab.h>
  20#include <linux/list.h>
  21#include <linux/device.h>
  22#include <linux/workqueue.h>
  23#include <linux/delay.h>
  24#include <linux/timer.h>
  25#include <linux/kernel_stat.h>
  26#include <linux/sched/signal.h>
  27
  28#include <asm/ccwdev.h>
  29#include <asm/cio.h>
  30#include <asm/param.h>          /* HZ */
  31#include <asm/cmb.h>
  32#include <asm/isc.h>
  33
  34#include "chp.h"
  35#include "cio.h"
  36#include "cio_debug.h"
  37#include "css.h"
  38#include "device.h"
  39#include "ioasm.h"
  40#include "io_sch.h"
  41#include "blacklist.h"
  42#include "chsc.h"
  43
  44static struct timer_list recovery_timer;
  45static DEFINE_SPINLOCK(recovery_lock);
  46static int recovery_phase;
  47static const unsigned long recovery_delay[] = { 3, 30, 300 };
  48
  49static atomic_t ccw_device_init_count = ATOMIC_INIT(0);
  50static DECLARE_WAIT_QUEUE_HEAD(ccw_device_init_wq);
  51static struct bus_type ccw_bus_type;
  52
  53/******************* bus type handling ***********************/
  54
  55/* The Linux driver model distinguishes between a bus type and
  56 * the bus itself. Of course we only have one channel
  57 * subsystem driver and one channel system per machine, but
  58 * we still use the abstraction. T.R. says it's a good idea. */
  59static int
  60ccw_bus_match (struct device * dev, struct device_driver * drv)
  61{
  62        struct ccw_device *cdev = to_ccwdev(dev);
  63        struct ccw_driver *cdrv = to_ccwdrv(drv);
  64        const struct ccw_device_id *ids = cdrv->ids, *found;
  65
  66        if (!ids)
  67                return 0;
  68
  69        found = ccw_device_id_match(ids, &cdev->id);
  70        if (!found)
  71                return 0;
  72
  73        cdev->id.driver_info = found->driver_info;
  74
  75        return 1;
  76}
  77
  78/* Store modalias string delimited by prefix/suffix string into buffer with
  79 * specified size. Return length of resulting string (excluding trailing '\0')
  80 * even if string doesn't fit buffer (snprintf semantics). */
  81static int snprint_alias(char *buf, size_t size,
  82                         struct ccw_device_id *id, const char *suffix)
  83{
  84        int len;
  85
  86        len = snprintf(buf, size, "ccw:t%04Xm%02X", id->cu_type, id->cu_model);
  87        if (len > size)
  88                return len;
  89        buf += len;
  90        size -= len;
  91
  92        if (id->dev_type != 0)
  93                len += snprintf(buf, size, "dt%04Xdm%02X%s", id->dev_type,
  94                                id->dev_model, suffix);
  95        else
  96                len += snprintf(buf, size, "dtdm%s", suffix);
  97
  98        return len;
  99}
 100
 101/* Set up environment variables for ccw device uevent. Return 0 on success,
 102 * non-zero otherwise. */
 103static int ccw_uevent(struct device *dev, struct kobj_uevent_env *env)
 104{
 105        struct ccw_device *cdev = to_ccwdev(dev);
 106        struct ccw_device_id *id = &(cdev->id);
 107        int ret;
 108        char modalias_buf[30];
 109
 110        /* CU_TYPE= */
 111        ret = add_uevent_var(env, "CU_TYPE=%04X", id->cu_type);
 112        if (ret)
 113                return ret;
 114
 115        /* CU_MODEL= */
 116        ret = add_uevent_var(env, "CU_MODEL=%02X", id->cu_model);
 117        if (ret)
 118                return ret;
 119
 120        /* The next two can be zero, that's ok for us */
 121        /* DEV_TYPE= */
 122        ret = add_uevent_var(env, "DEV_TYPE=%04X", id->dev_type);
 123        if (ret)
 124                return ret;
 125
 126        /* DEV_MODEL= */
 127        ret = add_uevent_var(env, "DEV_MODEL=%02X", id->dev_model);
 128        if (ret)
 129                return ret;
 130
 131        /* MODALIAS=  */
 132        snprint_alias(modalias_buf, sizeof(modalias_buf), id, "");
 133        ret = add_uevent_var(env, "MODALIAS=%s", modalias_buf);
 134        return ret;
 135}
 136
 137static void io_subchannel_irq(struct subchannel *);
 138static int io_subchannel_probe(struct subchannel *);
 139static int io_subchannel_remove(struct subchannel *);
 140static void io_subchannel_shutdown(struct subchannel *);
 141static int io_subchannel_sch_event(struct subchannel *, int);
 142static int io_subchannel_chp_event(struct subchannel *, struct chp_link *,
 143                                   int);
 144static void recovery_func(struct timer_list *unused);
 145
 146static struct css_device_id io_subchannel_ids[] = {
 147        { .match_flags = 0x1, .type = SUBCHANNEL_TYPE_IO, },
 148        { /* end of list */ },
 149};
 150
 151static int io_subchannel_prepare(struct subchannel *sch)
 152{
 153        struct ccw_device *cdev;
 154        /*
 155         * Don't allow suspend while a ccw device registration
 156         * is still outstanding.
 157         */
 158        cdev = sch_get_cdev(sch);
 159        if (cdev && !device_is_registered(&cdev->dev))
 160                return -EAGAIN;
 161        return 0;
 162}
 163
 164static int io_subchannel_settle(void)
 165{
 166        int ret;
 167
 168        ret = wait_event_interruptible(ccw_device_init_wq,
 169                                atomic_read(&ccw_device_init_count) == 0);
 170        if (ret)
 171                return -EINTR;
 172        flush_workqueue(cio_work_q);
 173        return 0;
 174}
 175
 176static struct css_driver io_subchannel_driver = {
 177        .drv = {
 178                .owner = THIS_MODULE,
 179                .name = "io_subchannel",
 180        },
 181        .subchannel_type = io_subchannel_ids,
 182        .irq = io_subchannel_irq,
 183        .sch_event = io_subchannel_sch_event,
 184        .chp_event = io_subchannel_chp_event,
 185        .probe = io_subchannel_probe,
 186        .remove = io_subchannel_remove,
 187        .shutdown = io_subchannel_shutdown,
 188        .prepare = io_subchannel_prepare,
 189        .settle = io_subchannel_settle,
 190};
 191
 192int __init io_subchannel_init(void)
 193{
 194        int ret;
 195
 196        timer_setup(&recovery_timer, recovery_func, 0);
 197        ret = bus_register(&ccw_bus_type);
 198        if (ret)
 199                return ret;
 200        ret = css_driver_register(&io_subchannel_driver);
 201        if (ret)
 202                bus_unregister(&ccw_bus_type);
 203
 204        return ret;
 205}
 206
 207
 208/************************ device handling **************************/
 209
 210static ssize_t
 211devtype_show (struct device *dev, struct device_attribute *attr, char *buf)
 212{
 213        struct ccw_device *cdev = to_ccwdev(dev);
 214        struct ccw_device_id *id = &(cdev->id);
 215
 216        if (id->dev_type != 0)
 217                return sprintf(buf, "%04x/%02x\n",
 218                                id->dev_type, id->dev_model);
 219        else
 220                return sprintf(buf, "n/a\n");
 221}
 222
 223static ssize_t
 224cutype_show (struct device *dev, struct device_attribute *attr, char *buf)
 225{
 226        struct ccw_device *cdev = to_ccwdev(dev);
 227        struct ccw_device_id *id = &(cdev->id);
 228
 229        return sprintf(buf, "%04x/%02x\n",
 230                       id->cu_type, id->cu_model);
 231}
 232
 233static ssize_t
 234modalias_show (struct device *dev, struct device_attribute *attr, char *buf)
 235{
 236        struct ccw_device *cdev = to_ccwdev(dev);
 237        struct ccw_device_id *id = &(cdev->id);
 238        int len;
 239
 240        len = snprint_alias(buf, PAGE_SIZE, id, "\n");
 241
 242        return len > PAGE_SIZE ? PAGE_SIZE : len;
 243}
 244
 245static ssize_t
 246online_show (struct device *dev, struct device_attribute *attr, char *buf)
 247{
 248        struct ccw_device *cdev = to_ccwdev(dev);
 249
 250        return sprintf(buf, cdev->online ? "1\n" : "0\n");
 251}
 252
 253int ccw_device_is_orphan(struct ccw_device *cdev)
 254{
 255        return sch_is_pseudo_sch(to_subchannel(cdev->dev.parent));
 256}
 257
 258static void ccw_device_unregister(struct ccw_device *cdev)
 259{
 260        if (device_is_registered(&cdev->dev)) {
 261                /* Undo device_add(). */
 262                device_del(&cdev->dev);
 263        }
 264        if (cdev->private->flags.initialized) {
 265                cdev->private->flags.initialized = 0;
 266                /* Release reference from device_initialize(). */
 267                put_device(&cdev->dev);
 268        }
 269}
 270
 271static void io_subchannel_quiesce(struct subchannel *);
 272
 273/**
 274 * ccw_device_set_offline() - disable a ccw device for I/O
 275 * @cdev: target ccw device
 276 *
 277 * This function calls the driver's set_offline() function for @cdev, if
 278 * given, and then disables @cdev.
 279 * Returns:
 280 *   %0 on success and a negative error value on failure.
 281 * Context:
 282 *  enabled, ccw device lock not held
 283 */
 284int ccw_device_set_offline(struct ccw_device *cdev)
 285{
 286        struct subchannel *sch;
 287        int ret, state;
 288
 289        if (!cdev)
 290                return -ENODEV;
 291        if (!cdev->online || !cdev->drv)
 292                return -EINVAL;
 293
 294        if (cdev->drv->set_offline) {
 295                ret = cdev->drv->set_offline(cdev);
 296                if (ret != 0)
 297                        return ret;
 298        }
 299        spin_lock_irq(cdev->ccwlock);
 300        sch = to_subchannel(cdev->dev.parent);
 301        cdev->online = 0;
 302        /* Wait until a final state or DISCONNECTED is reached */
 303        while (!dev_fsm_final_state(cdev) &&
 304               cdev->private->state != DEV_STATE_DISCONNECTED) {
 305                spin_unlock_irq(cdev->ccwlock);
 306                wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
 307                           cdev->private->state == DEV_STATE_DISCONNECTED));
 308                spin_lock_irq(cdev->ccwlock);
 309        }
 310        do {
 311                ret = ccw_device_offline(cdev);
 312                if (!ret)
 313                        break;
 314                CIO_MSG_EVENT(0, "ccw_device_offline returned %d, device "
 315                              "0.%x.%04x\n", ret, cdev->private->dev_id.ssid,
 316                              cdev->private->dev_id.devno);
 317                if (ret != -EBUSY)
 318                        goto error;
 319                state = cdev->private->state;
 320                spin_unlock_irq(cdev->ccwlock);
 321                io_subchannel_quiesce(sch);
 322                spin_lock_irq(cdev->ccwlock);
 323                cdev->private->state = state;
 324        } while (ret == -EBUSY);
 325        spin_unlock_irq(cdev->ccwlock);
 326        wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
 327                   cdev->private->state == DEV_STATE_DISCONNECTED));
 328        /* Inform the user if set offline failed. */
 329        if (cdev->private->state == DEV_STATE_BOXED) {
 330                pr_warn("%s: The device entered boxed state while being set offline\n",
 331                        dev_name(&cdev->dev));
 332        } else if (cdev->private->state == DEV_STATE_NOT_OPER) {
 333                pr_warn("%s: The device stopped operating while being set offline\n",
 334                        dev_name(&cdev->dev));
 335        }
 336        /* Give up reference from ccw_device_set_online(). */
 337        put_device(&cdev->dev);
 338        return 0;
 339
 340error:
 341        cdev->private->state = DEV_STATE_OFFLINE;
 342        dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
 343        spin_unlock_irq(cdev->ccwlock);
 344        /* Give up reference from ccw_device_set_online(). */
 345        put_device(&cdev->dev);
 346        return -ENODEV;
 347}
 348
 349/**
 350 * ccw_device_set_online() - enable a ccw device for I/O
 351 * @cdev: target ccw device
 352 *
 353 * This function first enables @cdev and then calls the driver's set_online()
 354 * function for @cdev, if given. If set_online() returns an error, @cdev is
 355 * disabled again.
 356 * Returns:
 357 *   %0 on success and a negative error value on failure.
 358 * Context:
 359 *  enabled, ccw device lock not held
 360 */
 361int ccw_device_set_online(struct ccw_device *cdev)
 362{
 363        int ret;
 364        int ret2;
 365
 366        if (!cdev)
 367                return -ENODEV;
 368        if (cdev->online || !cdev->drv)
 369                return -EINVAL;
 370        /* Hold on to an extra reference while device is online. */
 371        if (!get_device(&cdev->dev))
 372                return -ENODEV;
 373
 374        spin_lock_irq(cdev->ccwlock);
 375        ret = ccw_device_online(cdev);
 376        spin_unlock_irq(cdev->ccwlock);
 377        if (ret == 0)
 378                wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
 379        else {
 380                CIO_MSG_EVENT(0, "ccw_device_online returned %d, "
 381                              "device 0.%x.%04x\n",
 382                              ret, cdev->private->dev_id.ssid,
 383                              cdev->private->dev_id.devno);
 384                /* Give up online reference since onlining failed. */
 385                put_device(&cdev->dev);
 386                return ret;
 387        }
 388        spin_lock_irq(cdev->ccwlock);
 389        /* Check if online processing was successful */
 390        if ((cdev->private->state != DEV_STATE_ONLINE) &&
 391            (cdev->private->state != DEV_STATE_W4SENSE)) {
 392                spin_unlock_irq(cdev->ccwlock);
 393                /* Inform the user that set online failed. */
 394                if (cdev->private->state == DEV_STATE_BOXED) {
 395                        pr_warn("%s: Setting the device online failed because it is boxed\n",
 396                                dev_name(&cdev->dev));
 397                } else if (cdev->private->state == DEV_STATE_NOT_OPER) {
 398                        pr_warn("%s: Setting the device online failed because it is not operational\n",
 399                                dev_name(&cdev->dev));
 400                }
 401                /* Give up online reference since onlining failed. */
 402                put_device(&cdev->dev);
 403                return -ENODEV;
 404        }
 405        spin_unlock_irq(cdev->ccwlock);
 406        if (cdev->drv->set_online)
 407                ret = cdev->drv->set_online(cdev);
 408        if (ret)
 409                goto rollback;
 410
 411        spin_lock_irq(cdev->ccwlock);
 412        cdev->online = 1;
 413        spin_unlock_irq(cdev->ccwlock);
 414        return 0;
 415
 416rollback:
 417        spin_lock_irq(cdev->ccwlock);
 418        /* Wait until a final state or DISCONNECTED is reached */
 419        while (!dev_fsm_final_state(cdev) &&
 420               cdev->private->state != DEV_STATE_DISCONNECTED) {
 421                spin_unlock_irq(cdev->ccwlock);
 422                wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
 423                           cdev->private->state == DEV_STATE_DISCONNECTED));
 424                spin_lock_irq(cdev->ccwlock);
 425        }
 426        ret2 = ccw_device_offline(cdev);
 427        if (ret2)
 428                goto error;
 429        spin_unlock_irq(cdev->ccwlock);
 430        wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
 431                   cdev->private->state == DEV_STATE_DISCONNECTED));
 432        /* Give up online reference since onlining failed. */
 433        put_device(&cdev->dev);
 434        return ret;
 435
 436error:
 437        CIO_MSG_EVENT(0, "rollback ccw_device_offline returned %d, "
 438                      "device 0.%x.%04x\n",
 439                      ret2, cdev->private->dev_id.ssid,
 440                      cdev->private->dev_id.devno);
 441        cdev->private->state = DEV_STATE_OFFLINE;
 442        spin_unlock_irq(cdev->ccwlock);
 443        /* Give up online reference since onlining failed. */
 444        put_device(&cdev->dev);
 445        return ret;
 446}
 447
 448static int online_store_handle_offline(struct ccw_device *cdev)
 449{
 450        if (cdev->private->state == DEV_STATE_DISCONNECTED) {
 451                spin_lock_irq(cdev->ccwlock);
 452                ccw_device_sched_todo(cdev, CDEV_TODO_UNREG_EVAL);
 453                spin_unlock_irq(cdev->ccwlock);
 454                return 0;
 455        }
 456        if (cdev->drv && cdev->drv->set_offline)
 457                return ccw_device_set_offline(cdev);
 458        return -EINVAL;
 459}
 460
 461static int online_store_recog_and_online(struct ccw_device *cdev)
 462{
 463        /* Do device recognition, if needed. */
 464        if (cdev->private->state == DEV_STATE_BOXED) {
 465                spin_lock_irq(cdev->ccwlock);
 466                ccw_device_recognition(cdev);
 467                spin_unlock_irq(cdev->ccwlock);
 468                wait_event(cdev->private->wait_q,
 469                           cdev->private->flags.recog_done);
 470                if (cdev->private->state != DEV_STATE_OFFLINE)
 471                        /* recognition failed */
 472                        return -EAGAIN;
 473        }
 474        if (cdev->drv && cdev->drv->set_online)
 475                return ccw_device_set_online(cdev);
 476        return -EINVAL;
 477}
 478
 479static int online_store_handle_online(struct ccw_device *cdev, int force)
 480{
 481        int ret;
 482
 483        ret = online_store_recog_and_online(cdev);
 484        if (ret && !force)
 485                return ret;
 486        if (force && cdev->private->state == DEV_STATE_BOXED) {
 487                ret = ccw_device_stlck(cdev);
 488                if (ret)
 489                        return ret;
 490                if (cdev->id.cu_type == 0)
 491                        cdev->private->state = DEV_STATE_NOT_OPER;
 492                ret = online_store_recog_and_online(cdev);
 493                if (ret)
 494                        return ret;
 495        }
 496        return 0;
 497}
 498
 499static ssize_t online_store (struct device *dev, struct device_attribute *attr,
 500                             const char *buf, size_t count)
 501{
 502        struct ccw_device *cdev = to_ccwdev(dev);
 503        int force, ret;
 504        unsigned long i;
 505
 506        /* Prevent conflict between multiple on-/offline processing requests. */
 507        if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0)
 508                return -EAGAIN;
 509        /* Prevent conflict between internal I/Os and on-/offline processing. */
 510        if (!dev_fsm_final_state(cdev) &&
 511            cdev->private->state != DEV_STATE_DISCONNECTED) {
 512                ret = -EAGAIN;
 513                goto out;
 514        }
 515        /* Prevent conflict between pending work and on-/offline processing.*/
 516        if (work_pending(&cdev->private->todo_work)) {
 517                ret = -EAGAIN;
 518                goto out;
 519        }
 520        if (!strncmp(buf, "force\n", count)) {
 521                force = 1;
 522                i = 1;
 523                ret = 0;
 524        } else {
 525                force = 0;
 526                ret = kstrtoul(buf, 16, &i);
 527        }
 528        if (ret)
 529                goto out;
 530
 531        device_lock(dev);
 532        switch (i) {
 533        case 0:
 534                ret = online_store_handle_offline(cdev);
 535                break;
 536        case 1:
 537                ret = online_store_handle_online(cdev, force);
 538                break;
 539        default:
 540                ret = -EINVAL;
 541        }
 542        device_unlock(dev);
 543
 544out:
 545        atomic_set(&cdev->private->onoff, 0);
 546        return (ret < 0) ? ret : count;
 547}
 548
 549static ssize_t
 550available_show (struct device *dev, struct device_attribute *attr, char *buf)
 551{
 552        struct ccw_device *cdev = to_ccwdev(dev);
 553        struct subchannel *sch;
 554
 555        if (ccw_device_is_orphan(cdev))
 556                return sprintf(buf, "no device\n");
 557        switch (cdev->private->state) {
 558        case DEV_STATE_BOXED:
 559                return sprintf(buf, "boxed\n");
 560        case DEV_STATE_DISCONNECTED:
 561        case DEV_STATE_DISCONNECTED_SENSE_ID:
 562        case DEV_STATE_NOT_OPER:
 563                sch = to_subchannel(dev->parent);
 564                if (!sch->lpm)
 565                        return sprintf(buf, "no path\n");
 566                else
 567                        return sprintf(buf, "no device\n");
 568        default:
 569                /* All other states considered fine. */
 570                return sprintf(buf, "good\n");
 571        }
 572}
 573
 574static ssize_t
 575initiate_logging(struct device *dev, struct device_attribute *attr,
 576                 const char *buf, size_t count)
 577{
 578        struct subchannel *sch = to_subchannel(dev);
 579        int rc;
 580
 581        rc = chsc_siosl(sch->schid);
 582        if (rc < 0) {
 583                pr_warn("Logging for subchannel 0.%x.%04x failed with errno=%d\n",
 584                        sch->schid.ssid, sch->schid.sch_no, rc);
 585                return rc;
 586        }
 587        pr_notice("Logging for subchannel 0.%x.%04x was triggered\n",
 588                  sch->schid.ssid, sch->schid.sch_no);
 589        return count;
 590}
 591
 592static ssize_t vpm_show(struct device *dev, struct device_attribute *attr,
 593                        char *buf)
 594{
 595        struct subchannel *sch = to_subchannel(dev);
 596
 597        return sprintf(buf, "%02x\n", sch->vpm);
 598}
 599
 600static DEVICE_ATTR_RO(devtype);
 601static DEVICE_ATTR_RO(cutype);
 602static DEVICE_ATTR_RO(modalias);
 603static DEVICE_ATTR_RW(online);
 604static DEVICE_ATTR(availability, 0444, available_show, NULL);
 605static DEVICE_ATTR(logging, 0200, NULL, initiate_logging);
 606static DEVICE_ATTR_RO(vpm);
 607
 608static struct attribute *io_subchannel_attrs[] = {
 609        &dev_attr_logging.attr,
 610        &dev_attr_vpm.attr,
 611        NULL,
 612};
 613
 614static const struct attribute_group io_subchannel_attr_group = {
 615        .attrs = io_subchannel_attrs,
 616};
 617
 618static struct attribute * ccwdev_attrs[] = {
 619        &dev_attr_devtype.attr,
 620        &dev_attr_cutype.attr,
 621        &dev_attr_modalias.attr,
 622        &dev_attr_online.attr,
 623        &dev_attr_cmb_enable.attr,
 624        &dev_attr_availability.attr,
 625        NULL,
 626};
 627
 628static const struct attribute_group ccwdev_attr_group = {
 629        .attrs = ccwdev_attrs,
 630};
 631
 632static const struct attribute_group *ccwdev_attr_groups[] = {
 633        &ccwdev_attr_group,
 634        NULL,
 635};
 636
 637static int ccw_device_add(struct ccw_device *cdev)
 638{
 639        struct device *dev = &cdev->dev;
 640
 641        dev->bus = &ccw_bus_type;
 642        return device_add(dev);
 643}
 644
 645static int match_dev_id(struct device *dev, void *data)
 646{
 647        struct ccw_device *cdev = to_ccwdev(dev);
 648        struct ccw_dev_id *dev_id = data;
 649
 650        return ccw_dev_id_is_equal(&cdev->private->dev_id, dev_id);
 651}
 652
 653/**
 654 * get_ccwdev_by_dev_id() - obtain device from a ccw device id
 655 * @dev_id: id of the device to be searched
 656 *
 657 * This function searches all devices attached to the ccw bus for a device
 658 * matching @dev_id.
 659 * Returns:
 660 *  If a device is found its reference count is increased and returned;
 661 *  else %NULL is returned.
 662 */
 663struct ccw_device *get_ccwdev_by_dev_id(struct ccw_dev_id *dev_id)
 664{
 665        struct device *dev;
 666
 667        dev = bus_find_device(&ccw_bus_type, NULL, dev_id, match_dev_id);
 668
 669        return dev ? to_ccwdev(dev) : NULL;
 670}
 671EXPORT_SYMBOL_GPL(get_ccwdev_by_dev_id);
 672
 673static void ccw_device_do_unbind_bind(struct ccw_device *cdev)
 674{
 675        int ret;
 676
 677        if (device_is_registered(&cdev->dev)) {
 678                device_release_driver(&cdev->dev);
 679                ret = device_attach(&cdev->dev);
 680                WARN_ON(ret == -ENODEV);
 681        }
 682}
 683
 684static void
 685ccw_device_release(struct device *dev)
 686{
 687        struct ccw_device *cdev;
 688
 689        cdev = to_ccwdev(dev);
 690        /* Release reference of parent subchannel. */
 691        put_device(cdev->dev.parent);
 692        kfree(cdev->private);
 693        kfree(cdev);
 694}
 695
 696static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch)
 697{
 698        struct ccw_device *cdev;
 699
 700        cdev  = kzalloc(sizeof(*cdev), GFP_KERNEL);
 701        if (cdev) {
 702                cdev->private = kzalloc(sizeof(struct ccw_device_private),
 703                                        GFP_KERNEL | GFP_DMA);
 704                if (cdev->private)
 705                        return cdev;
 706        }
 707        kfree(cdev);
 708        return ERR_PTR(-ENOMEM);
 709}
 710
 711static void ccw_device_todo(struct work_struct *work);
 712
 713static int io_subchannel_initialize_dev(struct subchannel *sch,
 714                                        struct ccw_device *cdev)
 715{
 716        struct ccw_device_private *priv = cdev->private;
 717        int ret;
 718
 719        priv->cdev = cdev;
 720        priv->int_class = IRQIO_CIO;
 721        priv->state = DEV_STATE_NOT_OPER;
 722        priv->dev_id.devno = sch->schib.pmcw.dev;
 723        priv->dev_id.ssid = sch->schid.ssid;
 724
 725        INIT_WORK(&priv->todo_work, ccw_device_todo);
 726        INIT_LIST_HEAD(&priv->cmb_list);
 727        init_waitqueue_head(&priv->wait_q);
 728        timer_setup(&priv->timer, ccw_device_timeout, 0);
 729
 730        atomic_set(&priv->onoff, 0);
 731        cdev->ccwlock = sch->lock;
 732        cdev->dev.parent = &sch->dev;
 733        cdev->dev.release = ccw_device_release;
 734        cdev->dev.groups = ccwdev_attr_groups;
 735        /* Do first half of device_register. */
 736        device_initialize(&cdev->dev);
 737        ret = dev_set_name(&cdev->dev, "0.%x.%04x", cdev->private->dev_id.ssid,
 738                           cdev->private->dev_id.devno);
 739        if (ret)
 740                goto out_put;
 741        if (!get_device(&sch->dev)) {
 742                ret = -ENODEV;
 743                goto out_put;
 744        }
 745        priv->flags.initialized = 1;
 746        spin_lock_irq(sch->lock);
 747        sch_set_cdev(sch, cdev);
 748        spin_unlock_irq(sch->lock);
 749        return 0;
 750
 751out_put:
 752        /* Release reference from device_initialize(). */
 753        put_device(&cdev->dev);
 754        return ret;
 755}
 756
 757static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch)
 758{
 759        struct ccw_device *cdev;
 760        int ret;
 761
 762        cdev = io_subchannel_allocate_dev(sch);
 763        if (!IS_ERR(cdev)) {
 764                ret = io_subchannel_initialize_dev(sch, cdev);
 765                if (ret)
 766                        cdev = ERR_PTR(ret);
 767        }
 768        return cdev;
 769}
 770
 771static void io_subchannel_recog(struct ccw_device *, struct subchannel *);
 772
 773static void sch_create_and_recog_new_device(struct subchannel *sch)
 774{
 775        struct ccw_device *cdev;
 776
 777        /* Need to allocate a new ccw device. */
 778        cdev = io_subchannel_create_ccwdev(sch);
 779        if (IS_ERR(cdev)) {
 780                /* OK, we did everything we could... */
 781                css_sch_device_unregister(sch);
 782                return;
 783        }
 784        /* Start recognition for the new ccw device. */
 785        io_subchannel_recog(cdev, sch);
 786}
 787
 788/*
 789 * Register recognized device.
 790 */
 791static void io_subchannel_register(struct ccw_device *cdev)
 792{
 793        struct subchannel *sch;
 794        int ret, adjust_init_count = 1;
 795        unsigned long flags;
 796
 797        sch = to_subchannel(cdev->dev.parent);
 798        /*
 799         * Check if subchannel is still registered. It may have become
 800         * unregistered if a machine check hit us after finishing
 801         * device recognition but before the register work could be
 802         * queued.
 803         */
 804        if (!device_is_registered(&sch->dev))
 805                goto out_err;
 806        css_update_ssd_info(sch);
 807        /*
 808         * io_subchannel_register() will also be called after device
 809         * recognition has been done for a boxed device (which will already
 810         * be registered). We need to reprobe since we may now have sense id
 811         * information.
 812         */
 813        if (device_is_registered(&cdev->dev)) {
 814                if (!cdev->drv) {
 815                        ret = device_reprobe(&cdev->dev);
 816                        if (ret)
 817                                /* We can't do much here. */
 818                                CIO_MSG_EVENT(0, "device_reprobe() returned"
 819                                              " %d for 0.%x.%04x\n", ret,
 820                                              cdev->private->dev_id.ssid,
 821                                              cdev->private->dev_id.devno);
 822                }
 823                adjust_init_count = 0;
 824                goto out;
 825        }
 826        /*
 827         * Now we know this subchannel will stay, we can throw
 828         * our delayed uevent.
 829         */
 830        dev_set_uevent_suppress(&sch->dev, 0);
 831        kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
 832        /* make it known to the system */
 833        ret = ccw_device_add(cdev);
 834        if (ret) {
 835                CIO_MSG_EVENT(0, "Could not register ccw dev 0.%x.%04x: %d\n",
 836                              cdev->private->dev_id.ssid,
 837                              cdev->private->dev_id.devno, ret);
 838                spin_lock_irqsave(sch->lock, flags);
 839                sch_set_cdev(sch, NULL);
 840                spin_unlock_irqrestore(sch->lock, flags);
 841                /* Release initial device reference. */
 842                put_device(&cdev->dev);
 843                goto out_err;
 844        }
 845out:
 846        cdev->private->flags.recog_done = 1;
 847        wake_up(&cdev->private->wait_q);
 848out_err:
 849        if (adjust_init_count && atomic_dec_and_test(&ccw_device_init_count))
 850                wake_up(&ccw_device_init_wq);
 851}
 852
 853static void ccw_device_call_sch_unregister(struct ccw_device *cdev)
 854{
 855        struct subchannel *sch;
 856
 857        /* Get subchannel reference for local processing. */
 858        if (!get_device(cdev->dev.parent))
 859                return;
 860        sch = to_subchannel(cdev->dev.parent);
 861        css_sch_device_unregister(sch);
 862        /* Release subchannel reference for local processing. */
 863        put_device(&sch->dev);
 864}
 865
 866/*
 867 * subchannel recognition done. Called from the state machine.
 868 */
 869void
 870io_subchannel_recog_done(struct ccw_device *cdev)
 871{
 872        if (css_init_done == 0) {
 873                cdev->private->flags.recog_done = 1;
 874                return;
 875        }
 876        switch (cdev->private->state) {
 877        case DEV_STATE_BOXED:
 878                /* Device did not respond in time. */
 879        case DEV_STATE_NOT_OPER:
 880                cdev->private->flags.recog_done = 1;
 881                /* Remove device found not operational. */
 882                ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
 883                if (atomic_dec_and_test(&ccw_device_init_count))
 884                        wake_up(&ccw_device_init_wq);
 885                break;
 886        case DEV_STATE_OFFLINE:
 887                /* 
 888                 * We can't register the device in interrupt context so
 889                 * we schedule a work item.
 890                 */
 891                ccw_device_sched_todo(cdev, CDEV_TODO_REGISTER);
 892                break;
 893        }
 894}
 895
 896static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
 897{
 898        /* Increase counter of devices currently in recognition. */
 899        atomic_inc(&ccw_device_init_count);
 900
 901        /* Start async. device sensing. */
 902        spin_lock_irq(sch->lock);
 903        ccw_device_recognition(cdev);
 904        spin_unlock_irq(sch->lock);
 905}
 906
 907static int ccw_device_move_to_sch(struct ccw_device *cdev,
 908                                  struct subchannel *sch)
 909{
 910        struct subchannel *old_sch;
 911        int rc, old_enabled = 0;
 912
 913        old_sch = to_subchannel(cdev->dev.parent);
 914        /* Obtain child reference for new parent. */
 915        if (!get_device(&sch->dev))
 916                return -ENODEV;
 917
 918        if (!sch_is_pseudo_sch(old_sch)) {
 919                spin_lock_irq(old_sch->lock);
 920                old_enabled = old_sch->schib.pmcw.ena;
 921                rc = 0;
 922                if (old_enabled)
 923                        rc = cio_disable_subchannel(old_sch);
 924                spin_unlock_irq(old_sch->lock);
 925                if (rc == -EBUSY) {
 926                        /* Release child reference for new parent. */
 927                        put_device(&sch->dev);
 928                        return rc;
 929                }
 930        }
 931
 932        mutex_lock(&sch->reg_mutex);
 933        rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV);
 934        mutex_unlock(&sch->reg_mutex);
 935        if (rc) {
 936                CIO_MSG_EVENT(0, "device_move(0.%x.%04x,0.%x.%04x)=%d\n",
 937                              cdev->private->dev_id.ssid,
 938                              cdev->private->dev_id.devno, sch->schid.ssid,
 939                              sch->schib.pmcw.dev, rc);
 940                if (old_enabled) {
 941                        /* Try to reenable the old subchannel. */
 942                        spin_lock_irq(old_sch->lock);
 943                        cio_enable_subchannel(old_sch, (u32)(addr_t)old_sch);
 944                        spin_unlock_irq(old_sch->lock);
 945                }
 946                /* Release child reference for new parent. */
 947                put_device(&sch->dev);
 948                return rc;
 949        }
 950        /* Clean up old subchannel. */
 951        if (!sch_is_pseudo_sch(old_sch)) {
 952                spin_lock_irq(old_sch->lock);
 953                sch_set_cdev(old_sch, NULL);
 954                spin_unlock_irq(old_sch->lock);
 955                css_schedule_eval(old_sch->schid);
 956        }
 957        /* Release child reference for old parent. */
 958        put_device(&old_sch->dev);
 959        /* Initialize new subchannel. */
 960        spin_lock_irq(sch->lock);
 961        cdev->ccwlock = sch->lock;
 962        if (!sch_is_pseudo_sch(sch))
 963                sch_set_cdev(sch, cdev);
 964        spin_unlock_irq(sch->lock);
 965        if (!sch_is_pseudo_sch(sch))
 966                css_update_ssd_info(sch);
 967        return 0;
 968}
 969
 970static int ccw_device_move_to_orph(struct ccw_device *cdev)
 971{
 972        struct subchannel *sch = to_subchannel(cdev->dev.parent);
 973        struct channel_subsystem *css = to_css(sch->dev.parent);
 974
 975        return ccw_device_move_to_sch(cdev, css->pseudo_subchannel);
 976}
 977
 978static void io_subchannel_irq(struct subchannel *sch)
 979{
 980        struct ccw_device *cdev;
 981
 982        cdev = sch_get_cdev(sch);
 983
 984        CIO_TRACE_EVENT(6, "IRQ");
 985        CIO_TRACE_EVENT(6, dev_name(&sch->dev));
 986        if (cdev)
 987                dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
 988        else
 989                inc_irq_stat(IRQIO_CIO);
 990}
 991
 992void io_subchannel_init_config(struct subchannel *sch)
 993{
 994        memset(&sch->config, 0, sizeof(sch->config));
 995        sch->config.csense = 1;
 996}
 997
 998static void io_subchannel_init_fields(struct subchannel *sch)
 999{
1000        if (cio_is_console(sch->schid))
1001                sch->opm = 0xff;
1002        else
1003                sch->opm = chp_get_sch_opm(sch);
1004        sch->lpm = sch->schib.pmcw.pam & sch->opm;
1005        sch->isc = cio_is_console(sch->schid) ? CONSOLE_ISC : IO_SCH_ISC;
1006
1007        CIO_MSG_EVENT(6, "Detected device %04x on subchannel 0.%x.%04X"
1008                      " - PIM = %02X, PAM = %02X, POM = %02X\n",
1009                      sch->schib.pmcw.dev, sch->schid.ssid,
1010                      sch->schid.sch_no, sch->schib.pmcw.pim,
1011                      sch->schib.pmcw.pam, sch->schib.pmcw.pom);
1012
1013        io_subchannel_init_config(sch);
1014}
1015
1016/*
1017 * Note: We always return 0 so that we bind to the device even on error.
1018 * This is needed so that our remove function is called on unregister.
1019 */
1020static int io_subchannel_probe(struct subchannel *sch)
1021{
1022        struct io_subchannel_private *io_priv;
1023        struct ccw_device *cdev;
1024        int rc;
1025
1026        if (cio_is_console(sch->schid)) {
1027                rc = sysfs_create_group(&sch->dev.kobj,
1028                                        &io_subchannel_attr_group);
1029                if (rc)
1030                        CIO_MSG_EVENT(0, "Failed to create io subchannel "
1031                                      "attributes for subchannel "
1032                                      "0.%x.%04x (rc=%d)\n",
1033                                      sch->schid.ssid, sch->schid.sch_no, rc);
1034                /*
1035                 * The console subchannel already has an associated ccw_device.
1036                 * Throw the delayed uevent for the subchannel, register
1037                 * the ccw_device and exit.
1038                 */
1039                dev_set_uevent_suppress(&sch->dev, 0);
1040                kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
1041                cdev = sch_get_cdev(sch);
1042                rc = ccw_device_add(cdev);
1043                if (rc) {
1044                        /* Release online reference. */
1045                        put_device(&cdev->dev);
1046                        goto out_schedule;
1047                }
1048                if (atomic_dec_and_test(&ccw_device_init_count))
1049                        wake_up(&ccw_device_init_wq);
1050                return 0;
1051        }
1052        io_subchannel_init_fields(sch);
1053        rc = cio_commit_config(sch);
1054        if (rc)
1055                goto out_schedule;
1056        rc = sysfs_create_group(&sch->dev.kobj,
1057                                &io_subchannel_attr_group);
1058        if (rc)
1059                goto out_schedule;
1060        /* Allocate I/O subchannel private data. */
1061        io_priv = kzalloc(sizeof(*io_priv), GFP_KERNEL | GFP_DMA);
1062        if (!io_priv)
1063                goto out_schedule;
1064
1065        set_io_private(sch, io_priv);
1066        css_schedule_eval(sch->schid);
1067        return 0;
1068
1069out_schedule:
1070        spin_lock_irq(sch->lock);
1071        css_sched_sch_todo(sch, SCH_TODO_UNREG);
1072        spin_unlock_irq(sch->lock);
1073        return 0;
1074}
1075
1076static int io_subchannel_remove(struct subchannel *sch)
1077{
1078        struct io_subchannel_private *io_priv = to_io_private(sch);
1079        struct ccw_device *cdev;
1080
1081        cdev = sch_get_cdev(sch);
1082        if (!cdev)
1083                goto out_free;
1084
1085        ccw_device_unregister(cdev);
1086        spin_lock_irq(sch->lock);
1087        sch_set_cdev(sch, NULL);
1088        set_io_private(sch, NULL);
1089        spin_unlock_irq(sch->lock);
1090out_free:
1091        kfree(io_priv);
1092        sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group);
1093        return 0;
1094}
1095
1096static void io_subchannel_verify(struct subchannel *sch)
1097{
1098        struct ccw_device *cdev;
1099
1100        cdev = sch_get_cdev(sch);
1101        if (cdev)
1102                dev_fsm_event(cdev, DEV_EVENT_VERIFY);
1103}
1104
1105static void io_subchannel_terminate_path(struct subchannel *sch, u8 mask)
1106{
1107        struct ccw_device *cdev;
1108
1109        cdev = sch_get_cdev(sch);
1110        if (!cdev)
1111                return;
1112        if (cio_update_schib(sch))
1113                goto err;
1114        /* Check for I/O on path. */
1115        if (scsw_actl(&sch->schib.scsw) == 0 || sch->schib.pmcw.lpum != mask)
1116                goto out;
1117        if (cdev->private->state == DEV_STATE_ONLINE) {
1118                ccw_device_kill_io(cdev);
1119                goto out;
1120        }
1121        if (cio_clear(sch))
1122                goto err;
1123out:
1124        /* Trigger path verification. */
1125        dev_fsm_event(cdev, DEV_EVENT_VERIFY);
1126        return;
1127
1128err:
1129        dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
1130}
1131
1132static int io_subchannel_chp_event(struct subchannel *sch,
1133                                   struct chp_link *link, int event)
1134{
1135        struct ccw_device *cdev = sch_get_cdev(sch);
1136        int mask;
1137
1138        mask = chp_ssd_get_mask(&sch->ssd_info, link);
1139        if (!mask)
1140                return 0;
1141        switch (event) {
1142        case CHP_VARY_OFF:
1143                sch->opm &= ~mask;
1144                sch->lpm &= ~mask;
1145                if (cdev)
1146                        cdev->private->path_gone_mask |= mask;
1147                io_subchannel_terminate_path(sch, mask);
1148                break;
1149        case CHP_VARY_ON:
1150                sch->opm |= mask;
1151                sch->lpm |= mask;
1152                if (cdev)
1153                        cdev->private->path_new_mask |= mask;
1154                io_subchannel_verify(sch);
1155                break;
1156        case CHP_OFFLINE:
1157                if (cio_update_schib(sch))
1158                        return -ENODEV;
1159                if (cdev)
1160                        cdev->private->path_gone_mask |= mask;
1161                io_subchannel_terminate_path(sch, mask);
1162                break;
1163        case CHP_ONLINE:
1164                if (cio_update_schib(sch))
1165                        return -ENODEV;
1166                sch->lpm |= mask & sch->opm;
1167                if (cdev)
1168                        cdev->private->path_new_mask |= mask;
1169                io_subchannel_verify(sch);
1170                break;
1171        }
1172        return 0;
1173}
1174
1175static void io_subchannel_quiesce(struct subchannel *sch)
1176{
1177        struct ccw_device *cdev;
1178        int ret;
1179
1180        spin_lock_irq(sch->lock);
1181        cdev = sch_get_cdev(sch);
1182        if (cio_is_console(sch->schid))
1183                goto out_unlock;
1184        if (!sch->schib.pmcw.ena)
1185                goto out_unlock;
1186        ret = cio_disable_subchannel(sch);
1187        if (ret != -EBUSY)
1188                goto out_unlock;
1189        if (cdev->handler)
1190                cdev->handler(cdev, cdev->private->intparm, ERR_PTR(-EIO));
1191        while (ret == -EBUSY) {
1192                cdev->private->state = DEV_STATE_QUIESCE;
1193                cdev->private->iretry = 255;
1194                ret = ccw_device_cancel_halt_clear(cdev);
1195                if (ret == -EBUSY) {
1196                        ccw_device_set_timeout(cdev, HZ/10);
1197                        spin_unlock_irq(sch->lock);
1198                        wait_event(cdev->private->wait_q,
1199                                   cdev->private->state != DEV_STATE_QUIESCE);
1200                        spin_lock_irq(sch->lock);
1201                }
1202                ret = cio_disable_subchannel(sch);
1203        }
1204out_unlock:
1205        spin_unlock_irq(sch->lock);
1206}
1207
1208static void io_subchannel_shutdown(struct subchannel *sch)
1209{
1210        io_subchannel_quiesce(sch);
1211}
1212
1213static int device_is_disconnected(struct ccw_device *cdev)
1214{
1215        if (!cdev)
1216                return 0;
1217        return (cdev->private->state == DEV_STATE_DISCONNECTED ||
1218                cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID);
1219}
1220
1221static int recovery_check(struct device *dev, void *data)
1222{
1223        struct ccw_device *cdev = to_ccwdev(dev);
1224        struct subchannel *sch;
1225        int *redo = data;
1226
1227        spin_lock_irq(cdev->ccwlock);
1228        switch (cdev->private->state) {
1229        case DEV_STATE_ONLINE:
1230                sch = to_subchannel(cdev->dev.parent);
1231                if ((sch->schib.pmcw.pam & sch->opm) == sch->vpm)
1232                        break;
1233                /* fall through */
1234        case DEV_STATE_DISCONNECTED:
1235                CIO_MSG_EVENT(3, "recovery: trigger 0.%x.%04x\n",
1236                              cdev->private->dev_id.ssid,
1237                              cdev->private->dev_id.devno);
1238                dev_fsm_event(cdev, DEV_EVENT_VERIFY);
1239                *redo = 1;
1240                break;
1241        case DEV_STATE_DISCONNECTED_SENSE_ID:
1242                *redo = 1;
1243                break;
1244        }
1245        spin_unlock_irq(cdev->ccwlock);
1246
1247        return 0;
1248}
1249
1250static void recovery_work_func(struct work_struct *unused)
1251{
1252        int redo = 0;
1253
1254        bus_for_each_dev(&ccw_bus_type, NULL, &redo, recovery_check);
1255        if (redo) {
1256                spin_lock_irq(&recovery_lock);
1257                if (!timer_pending(&recovery_timer)) {
1258                        if (recovery_phase < ARRAY_SIZE(recovery_delay) - 1)
1259                                recovery_phase++;
1260                        mod_timer(&recovery_timer, jiffies +
1261                                  recovery_delay[recovery_phase] * HZ);
1262                }
1263                spin_unlock_irq(&recovery_lock);
1264        } else
1265                CIO_MSG_EVENT(3, "recovery: end\n");
1266}
1267
1268static DECLARE_WORK(recovery_work, recovery_work_func);
1269
1270static void recovery_func(struct timer_list *unused)
1271{
1272        /*
1273         * We can't do our recovery in softirq context and it's not
1274         * performance critical, so we schedule it.
1275         */
1276        schedule_work(&recovery_work);
1277}
1278
1279void ccw_device_schedule_recovery(void)
1280{
1281        unsigned long flags;
1282
1283        CIO_MSG_EVENT(3, "recovery: schedule\n");
1284        spin_lock_irqsave(&recovery_lock, flags);
1285        if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) {
1286                recovery_phase = 0;
1287                mod_timer(&recovery_timer, jiffies + recovery_delay[0] * HZ);
1288        }
1289        spin_unlock_irqrestore(&recovery_lock, flags);
1290}
1291
1292static int purge_fn(struct device *dev, void *data)
1293{
1294        struct ccw_device *cdev = to_ccwdev(dev);
1295        struct ccw_dev_id *id = &cdev->private->dev_id;
1296
1297        spin_lock_irq(cdev->ccwlock);
1298        if (is_blacklisted(id->ssid, id->devno) &&
1299            (cdev->private->state == DEV_STATE_OFFLINE) &&
1300            (atomic_cmpxchg(&cdev->private->onoff, 0, 1) == 0)) {
1301                CIO_MSG_EVENT(3, "ccw: purging 0.%x.%04x\n", id->ssid,
1302                              id->devno);
1303                ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
1304                atomic_set(&cdev->private->onoff, 0);
1305        }
1306        spin_unlock_irq(cdev->ccwlock);
1307        /* Abort loop in case of pending signal. */
1308        if (signal_pending(current))
1309                return -EINTR;
1310
1311        return 0;
1312}
1313
1314/**
1315 * ccw_purge_blacklisted - purge unused, blacklisted devices
1316 *
1317 * Unregister all ccw devices that are offline and on the blacklist.
1318 */
1319int ccw_purge_blacklisted(void)
1320{
1321        CIO_MSG_EVENT(2, "ccw: purging blacklisted devices\n");
1322        bus_for_each_dev(&ccw_bus_type, NULL, NULL, purge_fn);
1323        return 0;
1324}
1325
1326void ccw_device_set_disconnected(struct ccw_device *cdev)
1327{
1328        if (!cdev)
1329                return;
1330        ccw_device_set_timeout(cdev, 0);
1331        cdev->private->flags.fake_irb = 0;
1332        cdev->private->state = DEV_STATE_DISCONNECTED;
1333        if (cdev->online)
1334                ccw_device_schedule_recovery();
1335}
1336
1337void ccw_device_set_notoper(struct ccw_device *cdev)
1338{
1339        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1340
1341        CIO_TRACE_EVENT(2, "notoper");
1342        CIO_TRACE_EVENT(2, dev_name(&sch->dev));
1343        ccw_device_set_timeout(cdev, 0);
1344        cio_disable_subchannel(sch);
1345        cdev->private->state = DEV_STATE_NOT_OPER;
1346}
1347
1348enum io_sch_action {
1349        IO_SCH_UNREG,
1350        IO_SCH_ORPH_UNREG,
1351        IO_SCH_ATTACH,
1352        IO_SCH_UNREG_ATTACH,
1353        IO_SCH_ORPH_ATTACH,
1354        IO_SCH_REPROBE,
1355        IO_SCH_VERIFY,
1356        IO_SCH_DISC,
1357        IO_SCH_NOP,
1358};
1359
1360static enum io_sch_action sch_get_action(struct subchannel *sch)
1361{
1362        struct ccw_device *cdev;
1363
1364        cdev = sch_get_cdev(sch);
1365        if (cio_update_schib(sch)) {
1366                /* Not operational. */
1367                if (!cdev)
1368                        return IO_SCH_UNREG;
1369                if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
1370                        return IO_SCH_UNREG;
1371                return IO_SCH_ORPH_UNREG;
1372        }
1373        /* Operational. */
1374        if (!cdev)
1375                return IO_SCH_ATTACH;
1376        if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) {
1377                if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
1378                        return IO_SCH_UNREG_ATTACH;
1379                return IO_SCH_ORPH_ATTACH;
1380        }
1381        if ((sch->schib.pmcw.pam & sch->opm) == 0) {
1382                if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK)
1383                        return IO_SCH_UNREG;
1384                return IO_SCH_DISC;
1385        }
1386        if (device_is_disconnected(cdev))
1387                return IO_SCH_REPROBE;
1388        if (cdev->online && !cdev->private->flags.resuming)
1389                return IO_SCH_VERIFY;
1390        if (cdev->private->state == DEV_STATE_NOT_OPER)
1391                return IO_SCH_UNREG_ATTACH;
1392        return IO_SCH_NOP;
1393}
1394
1395/**
1396 * io_subchannel_sch_event - process subchannel event
1397 * @sch: subchannel
1398 * @process: non-zero if function is called in process context
1399 *
1400 * An unspecified event occurred for this subchannel. Adjust data according
1401 * to the current operational state of the subchannel and device. Return
1402 * zero when the event has been handled sufficiently or -EAGAIN when this
1403 * function should be called again in process context.
1404 */
1405static int io_subchannel_sch_event(struct subchannel *sch, int process)
1406{
1407        unsigned long flags;
1408        struct ccw_device *cdev;
1409        struct ccw_dev_id dev_id;
1410        enum io_sch_action action;
1411        int rc = -EAGAIN;
1412
1413        spin_lock_irqsave(sch->lock, flags);
1414        if (!device_is_registered(&sch->dev))
1415                goto out_unlock;
1416        if (work_pending(&sch->todo_work))
1417                goto out_unlock;
1418        cdev = sch_get_cdev(sch);
1419        if (cdev && work_pending(&cdev->private->todo_work))
1420                goto out_unlock;
1421        action = sch_get_action(sch);
1422        CIO_MSG_EVENT(2, "event: sch 0.%x.%04x, process=%d, action=%d\n",
1423                      sch->schid.ssid, sch->schid.sch_no, process,
1424                      action);
1425        /* Perform immediate actions while holding the lock. */
1426        switch (action) {
1427        case IO_SCH_REPROBE:
1428                /* Trigger device recognition. */
1429                ccw_device_trigger_reprobe(cdev);
1430                rc = 0;
1431                goto out_unlock;
1432        case IO_SCH_VERIFY:
1433                /* Trigger path verification. */
1434                io_subchannel_verify(sch);
1435                rc = 0;
1436                goto out_unlock;
1437        case IO_SCH_DISC:
1438                ccw_device_set_disconnected(cdev);
1439                rc = 0;
1440                goto out_unlock;
1441        case IO_SCH_ORPH_UNREG:
1442        case IO_SCH_ORPH_ATTACH:
1443                ccw_device_set_disconnected(cdev);
1444                break;
1445        case IO_SCH_UNREG_ATTACH:
1446        case IO_SCH_UNREG:
1447                if (!cdev)
1448                        break;
1449                if (cdev->private->state == DEV_STATE_SENSE_ID) {
1450                        /*
1451                         * Note: delayed work triggered by this event
1452                         * and repeated calls to sch_event are synchronized
1453                         * by the above check for work_pending(cdev).
1454                         */
1455                        dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
1456                } else
1457                        ccw_device_set_notoper(cdev);
1458                break;
1459        case IO_SCH_NOP:
1460                rc = 0;
1461                goto out_unlock;
1462        default:
1463                break;
1464        }
1465        spin_unlock_irqrestore(sch->lock, flags);
1466        /* All other actions require process context. */
1467        if (!process)
1468                goto out;
1469        /* Handle attached ccw device. */
1470        switch (action) {
1471        case IO_SCH_ORPH_UNREG:
1472        case IO_SCH_ORPH_ATTACH:
1473                /* Move ccw device to orphanage. */
1474                rc = ccw_device_move_to_orph(cdev);
1475                if (rc)
1476                        goto out;
1477                break;
1478        case IO_SCH_UNREG_ATTACH:
1479                spin_lock_irqsave(sch->lock, flags);
1480                if (cdev->private->flags.resuming) {
1481                        /* Device will be handled later. */
1482                        rc = 0;
1483                        goto out_unlock;
1484                }
1485                sch_set_cdev(sch, NULL);
1486                spin_unlock_irqrestore(sch->lock, flags);
1487                /* Unregister ccw device. */
1488                ccw_device_unregister(cdev);
1489                break;
1490        default:
1491                break;
1492        }
1493        /* Handle subchannel. */
1494        switch (action) {
1495        case IO_SCH_ORPH_UNREG:
1496        case IO_SCH_UNREG:
1497                if (!cdev || !cdev->private->flags.resuming)
1498                        css_sch_device_unregister(sch);
1499                break;
1500        case IO_SCH_ORPH_ATTACH:
1501        case IO_SCH_UNREG_ATTACH:
1502        case IO_SCH_ATTACH:
1503                dev_id.ssid = sch->schid.ssid;
1504                dev_id.devno = sch->schib.pmcw.dev;
1505                cdev = get_ccwdev_by_dev_id(&dev_id);
1506                if (!cdev) {
1507                        sch_create_and_recog_new_device(sch);
1508                        break;
1509                }
1510                rc = ccw_device_move_to_sch(cdev, sch);
1511                if (rc) {
1512                        /* Release reference from get_ccwdev_by_dev_id() */
1513                        put_device(&cdev->dev);
1514                        goto out;
1515                }
1516                spin_lock_irqsave(sch->lock, flags);
1517                ccw_device_trigger_reprobe(cdev);
1518                spin_unlock_irqrestore(sch->lock, flags);
1519                /* Release reference from get_ccwdev_by_dev_id() */
1520                put_device(&cdev->dev);
1521                break;
1522        default:
1523                break;
1524        }
1525        return 0;
1526
1527out_unlock:
1528        spin_unlock_irqrestore(sch->lock, flags);
1529out:
1530        return rc;
1531}
1532
1533static void ccw_device_set_int_class(struct ccw_device *cdev)
1534{
1535        struct ccw_driver *cdrv = cdev->drv;
1536
1537        /* Note: we interpret class 0 in this context as an uninitialized
1538         * field since it translates to a non-I/O interrupt class. */
1539        if (cdrv->int_class != 0)
1540                cdev->private->int_class = cdrv->int_class;
1541        else
1542                cdev->private->int_class = IRQIO_CIO;
1543}
1544
1545#ifdef CONFIG_CCW_CONSOLE
1546int __init ccw_device_enable_console(struct ccw_device *cdev)
1547{
1548        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1549        int rc;
1550
1551        if (!cdev->drv || !cdev->handler)
1552                return -EINVAL;
1553
1554        io_subchannel_init_fields(sch);
1555        rc = cio_commit_config(sch);
1556        if (rc)
1557                return rc;
1558        sch->driver = &io_subchannel_driver;
1559        io_subchannel_recog(cdev, sch);
1560        /* Now wait for the async. recognition to come to an end. */
1561        spin_lock_irq(cdev->ccwlock);
1562        while (!dev_fsm_final_state(cdev))
1563                ccw_device_wait_idle(cdev);
1564
1565        /* Hold on to an extra reference while device is online. */
1566        get_device(&cdev->dev);
1567        rc = ccw_device_online(cdev);
1568        if (rc)
1569                goto out_unlock;
1570
1571        while (!dev_fsm_final_state(cdev))
1572                ccw_device_wait_idle(cdev);
1573
1574        if (cdev->private->state == DEV_STATE_ONLINE)
1575                cdev->online = 1;
1576        else
1577                rc = -EIO;
1578out_unlock:
1579        spin_unlock_irq(cdev->ccwlock);
1580        if (rc) /* Give up online reference since onlining failed. */
1581                put_device(&cdev->dev);
1582        return rc;
1583}
1584
1585struct ccw_device * __init ccw_device_create_console(struct ccw_driver *drv)
1586{
1587        struct io_subchannel_private *io_priv;
1588        struct ccw_device *cdev;
1589        struct subchannel *sch;
1590
1591        sch = cio_probe_console();
1592        if (IS_ERR(sch))
1593                return ERR_CAST(sch);
1594
1595        io_priv = kzalloc(sizeof(*io_priv), GFP_KERNEL | GFP_DMA);
1596        if (!io_priv) {
1597                put_device(&sch->dev);
1598                return ERR_PTR(-ENOMEM);
1599        }
1600        set_io_private(sch, io_priv);
1601        cdev = io_subchannel_create_ccwdev(sch);
1602        if (IS_ERR(cdev)) {
1603                put_device(&sch->dev);
1604                kfree(io_priv);
1605                return cdev;
1606        }
1607        cdev->drv = drv;
1608        ccw_device_set_int_class(cdev);
1609        return cdev;
1610}
1611
1612void __init ccw_device_destroy_console(struct ccw_device *cdev)
1613{
1614        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1615        struct io_subchannel_private *io_priv = to_io_private(sch);
1616
1617        set_io_private(sch, NULL);
1618        put_device(&sch->dev);
1619        put_device(&cdev->dev);
1620        kfree(io_priv);
1621}
1622
1623/**
1624 * ccw_device_wait_idle() - busy wait for device to become idle
1625 * @cdev: ccw device
1626 *
1627 * Poll until activity control is zero, that is, no function or data
1628 * transfer is pending/active.
1629 * Called with device lock being held.
1630 */
1631void ccw_device_wait_idle(struct ccw_device *cdev)
1632{
1633        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1634
1635        while (1) {
1636                cio_tsch(sch);
1637                if (sch->schib.scsw.cmd.actl == 0)
1638                        break;
1639                udelay_simple(100);
1640        }
1641}
1642
1643static int ccw_device_pm_restore(struct device *dev);
1644
1645int ccw_device_force_console(struct ccw_device *cdev)
1646{
1647        return ccw_device_pm_restore(&cdev->dev);
1648}
1649EXPORT_SYMBOL_GPL(ccw_device_force_console);
1650#endif
1651
1652/*
1653 * get ccw_device matching the busid, but only if owned by cdrv
1654 */
1655static int
1656__ccwdev_check_busid(struct device *dev, void *id)
1657{
1658        char *bus_id;
1659
1660        bus_id = id;
1661
1662        return (strcmp(bus_id, dev_name(dev)) == 0);
1663}
1664
1665
1666/**
1667 * get_ccwdev_by_busid() - obtain device from a bus id
1668 * @cdrv: driver the device is owned by
1669 * @bus_id: bus id of the device to be searched
1670 *
1671 * This function searches all devices owned by @cdrv for a device with a bus
1672 * id matching @bus_id.
1673 * Returns:
1674 *  If a match is found, its reference count of the found device is increased
1675 *  and it is returned; else %NULL is returned.
1676 */
1677struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv,
1678                                       const char *bus_id)
1679{
1680        struct device *dev;
1681
1682        dev = driver_find_device(&cdrv->driver, NULL, (void *)bus_id,
1683                                 __ccwdev_check_busid);
1684
1685        return dev ? to_ccwdev(dev) : NULL;
1686}
1687
1688/************************** device driver handling ************************/
1689
1690/* This is the implementation of the ccw_driver class. The probe, remove
1691 * and release methods are initially very similar to the device_driver
1692 * implementations, with the difference that they have ccw_device
1693 * arguments.
1694 *
1695 * A ccw driver also contains the information that is needed for
1696 * device matching.
1697 */
1698static int
1699ccw_device_probe (struct device *dev)
1700{
1701        struct ccw_device *cdev = to_ccwdev(dev);
1702        struct ccw_driver *cdrv = to_ccwdrv(dev->driver);
1703        int ret;
1704
1705        cdev->drv = cdrv; /* to let the driver call _set_online */
1706        ccw_device_set_int_class(cdev);
1707        ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
1708        if (ret) {
1709                cdev->drv = NULL;
1710                cdev->private->int_class = IRQIO_CIO;
1711                return ret;
1712        }
1713
1714        return 0;
1715}
1716
1717static int ccw_device_remove(struct device *dev)
1718{
1719        struct ccw_device *cdev = to_ccwdev(dev);
1720        struct ccw_driver *cdrv = cdev->drv;
1721        struct subchannel *sch;
1722        int ret;
1723
1724        if (cdrv->remove)
1725                cdrv->remove(cdev);
1726
1727        spin_lock_irq(cdev->ccwlock);
1728        if (cdev->online) {
1729                cdev->online = 0;
1730                ret = ccw_device_offline(cdev);
1731                spin_unlock_irq(cdev->ccwlock);
1732                if (ret == 0)
1733                        wait_event(cdev->private->wait_q,
1734                                   dev_fsm_final_state(cdev));
1735                else
1736                        CIO_MSG_EVENT(0, "ccw_device_offline returned %d, "
1737                                      "device 0.%x.%04x\n",
1738                                      ret, cdev->private->dev_id.ssid,
1739                                      cdev->private->dev_id.devno);
1740                /* Give up reference obtained in ccw_device_set_online(). */
1741                put_device(&cdev->dev);
1742                spin_lock_irq(cdev->ccwlock);
1743        }
1744        ccw_device_set_timeout(cdev, 0);
1745        cdev->drv = NULL;
1746        cdev->private->int_class = IRQIO_CIO;
1747        sch = to_subchannel(cdev->dev.parent);
1748        spin_unlock_irq(cdev->ccwlock);
1749        io_subchannel_quiesce(sch);
1750        __disable_cmf(cdev);
1751
1752        return 0;
1753}
1754
1755static void ccw_device_shutdown(struct device *dev)
1756{
1757        struct ccw_device *cdev;
1758
1759        cdev = to_ccwdev(dev);
1760        if (cdev->drv && cdev->drv->shutdown)
1761                cdev->drv->shutdown(cdev);
1762        __disable_cmf(cdev);
1763}
1764
1765static int ccw_device_pm_prepare(struct device *dev)
1766{
1767        struct ccw_device *cdev = to_ccwdev(dev);
1768
1769        if (work_pending(&cdev->private->todo_work))
1770                return -EAGAIN;
1771        /* Fail while device is being set online/offline. */
1772        if (atomic_read(&cdev->private->onoff))
1773                return -EAGAIN;
1774
1775        if (cdev->online && cdev->drv && cdev->drv->prepare)
1776                return cdev->drv->prepare(cdev);
1777
1778        return 0;
1779}
1780
1781static void ccw_device_pm_complete(struct device *dev)
1782{
1783        struct ccw_device *cdev = to_ccwdev(dev);
1784
1785        if (cdev->online && cdev->drv && cdev->drv->complete)
1786                cdev->drv->complete(cdev);
1787}
1788
1789static int ccw_device_pm_freeze(struct device *dev)
1790{
1791        struct ccw_device *cdev = to_ccwdev(dev);
1792        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1793        int ret, cm_enabled;
1794
1795        /* Fail suspend while device is in transistional state. */
1796        if (!dev_fsm_final_state(cdev))
1797                return -EAGAIN;
1798        if (!cdev->online)
1799                return 0;
1800        if (cdev->drv && cdev->drv->freeze) {
1801                ret = cdev->drv->freeze(cdev);
1802                if (ret)
1803                        return ret;
1804        }
1805
1806        spin_lock_irq(sch->lock);
1807        cm_enabled = cdev->private->cmb != NULL;
1808        spin_unlock_irq(sch->lock);
1809        if (cm_enabled) {
1810                /* Don't have the css write on memory. */
1811                ret = ccw_set_cmf(cdev, 0);
1812                if (ret)
1813                        return ret;
1814        }
1815        /* From here on, disallow device driver I/O. */
1816        spin_lock_irq(sch->lock);
1817        ret = cio_disable_subchannel(sch);
1818        spin_unlock_irq(sch->lock);
1819
1820        return ret;
1821}
1822
1823static int ccw_device_pm_thaw(struct device *dev)
1824{
1825        struct ccw_device *cdev = to_ccwdev(dev);
1826        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1827        int ret, cm_enabled;
1828
1829        if (!cdev->online)
1830                return 0;
1831
1832        spin_lock_irq(sch->lock);
1833        /* Allow device driver I/O again. */
1834        ret = cio_enable_subchannel(sch, (u32)(addr_t)sch);
1835        cm_enabled = cdev->private->cmb != NULL;
1836        spin_unlock_irq(sch->lock);
1837        if (ret)
1838                return ret;
1839
1840        if (cm_enabled) {
1841                ret = ccw_set_cmf(cdev, 1);
1842                if (ret)
1843                        return ret;
1844        }
1845
1846        if (cdev->drv && cdev->drv->thaw)
1847                ret = cdev->drv->thaw(cdev);
1848
1849        return ret;
1850}
1851
1852static void __ccw_device_pm_restore(struct ccw_device *cdev)
1853{
1854        struct subchannel *sch = to_subchannel(cdev->dev.parent);
1855
1856        spin_lock_irq(sch->lock);
1857        if (cio_is_console(sch->schid)) {
1858                cio_enable_subchannel(sch, (u32)(addr_t)sch);
1859                goto out_unlock;
1860        }
1861        /*
1862         * While we were sleeping, devices may have gone or become
1863         * available again. Kick re-detection.
1864         */
1865        cdev->private->flags.resuming = 1;
1866        cdev->private->path_new_mask = LPM_ANYPATH;
1867        css_sched_sch_todo(sch, SCH_TODO_EVAL);
1868        spin_unlock_irq(sch->lock);
1869        css_wait_for_slow_path();
1870
1871        /* cdev may have been moved to a different subchannel. */
1872        sch = to_subchannel(cdev->dev.parent);
1873        spin_lock_irq(sch->lock);
1874        if (cdev->private->state != DEV_STATE_ONLINE &&
1875            cdev->private->state != DEV_STATE_OFFLINE)
1876                goto out_unlock;
1877
1878        ccw_device_recognition(cdev);
1879        spin_unlock_irq(sch->lock);
1880        wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev) ||
1881                   cdev->private->state == DEV_STATE_DISCONNECTED);
1882        spin_lock_irq(sch->lock);
1883
1884out_unlock:
1885        cdev->private->flags.resuming = 0;
1886        spin_unlock_irq(sch->lock);
1887}
1888
1889static int resume_handle_boxed(struct ccw_device *cdev)
1890{
1891        cdev->private->state = DEV_STATE_BOXED;
1892        if (ccw_device_notify(cdev, CIO_BOXED) == NOTIFY_OK)
1893                return 0;
1894        ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
1895        return -ENODEV;
1896}
1897
1898static int resume_handle_disc(struct ccw_device *cdev)
1899{
1900        cdev->private->state = DEV_STATE_DISCONNECTED;
1901        if (ccw_device_notify(cdev, CIO_GONE) == NOTIFY_OK)
1902                return 0;
1903        ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
1904        return -ENODEV;
1905}
1906
1907static int ccw_device_pm_restore(struct device *dev)
1908{
1909        struct ccw_device *cdev = to_ccwdev(dev);
1910        struct subchannel *sch;
1911        int ret = 0;
1912
1913        __ccw_device_pm_restore(cdev);
1914        sch = to_subchannel(cdev->dev.parent);
1915        spin_lock_irq(sch->lock);
1916        if (cio_is_console(sch->schid))
1917                goto out_restore;
1918
1919        /* check recognition results */
1920        switch (cdev->private->state) {
1921        case DEV_STATE_OFFLINE:
1922        case DEV_STATE_ONLINE:
1923                cdev->private->flags.donotify = 0;
1924                break;
1925        case DEV_STATE_BOXED:
1926                ret = resume_handle_boxed(cdev);
1927                if (ret)
1928                        goto out_unlock;
1929                goto out_restore;
1930        default:
1931                ret = resume_handle_disc(cdev);
1932                if (ret)
1933                        goto out_unlock;
1934                goto out_restore;
1935        }
1936        /* check if the device type has changed */
1937        if (!ccw_device_test_sense_data(cdev)) {
1938                ccw_device_update_sense_data(cdev);
1939                ccw_device_sched_todo(cdev, CDEV_TODO_REBIND);
1940                ret = -ENODEV;
1941                goto out_unlock;
1942        }
1943        if (!cdev->online)
1944                goto out_unlock;
1945
1946        if (ccw_device_online(cdev)) {
1947                ret = resume_handle_disc(cdev);
1948                if (ret)
1949                        goto out_unlock;
1950                goto out_restore;
1951        }
1952        spin_unlock_irq(sch->lock);
1953        wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
1954        spin_lock_irq(sch->lock);
1955
1956        if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_BAD) {
1957                ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
1958                ret = -ENODEV;
1959                goto out_unlock;
1960        }
1961
1962        /* reenable cmf, if needed */
1963        if (cdev->private->cmb) {
1964                spin_unlock_irq(sch->lock);
1965                ret = ccw_set_cmf(cdev, 1);
1966                spin_lock_irq(sch->lock);
1967                if (ret) {
1968                        CIO_MSG_EVENT(2, "resume: cdev 0.%x.%04x: cmf failed "
1969                                      "(rc=%d)\n", cdev->private->dev_id.ssid,
1970                                      cdev->private->dev_id.devno, ret);
1971                        ret = 0;
1972                }
1973        }
1974
1975out_restore:
1976        spin_unlock_irq(sch->lock);
1977        if (cdev->online && cdev->drv && cdev->drv->restore)
1978                ret = cdev->drv->restore(cdev);
1979        return ret;
1980
1981out_unlock:
1982        spin_unlock_irq(sch->lock);
1983        return ret;
1984}
1985
1986static const struct dev_pm_ops ccw_pm_ops = {
1987        .prepare = ccw_device_pm_prepare,
1988        .complete = ccw_device_pm_complete,
1989        .freeze = ccw_device_pm_freeze,
1990        .thaw = ccw_device_pm_thaw,
1991        .restore = ccw_device_pm_restore,
1992};
1993
1994static struct bus_type ccw_bus_type = {
1995        .name   = "ccw",
1996        .match  = ccw_bus_match,
1997        .uevent = ccw_uevent,
1998        .probe  = ccw_device_probe,
1999        .remove = ccw_device_remove,
2000        .shutdown = ccw_device_shutdown,
2001        .pm = &ccw_pm_ops,
2002};
2003
2004/**
2005 * ccw_driver_register() - register a ccw driver
2006 * @cdriver: driver to be registered
2007 *
2008 * This function is mainly a wrapper around driver_register().
2009 * Returns:
2010 *   %0 on success and a negative error value on failure.
2011 */
2012int ccw_driver_register(struct ccw_driver *cdriver)
2013{
2014        struct device_driver *drv = &cdriver->driver;
2015
2016        drv->bus = &ccw_bus_type;
2017
2018        return driver_register(drv);
2019}
2020
2021/**
2022 * ccw_driver_unregister() - deregister a ccw driver
2023 * @cdriver: driver to be deregistered
2024 *
2025 * This function is mainly a wrapper around driver_unregister().
2026 */
2027void ccw_driver_unregister(struct ccw_driver *cdriver)
2028{
2029        driver_unregister(&cdriver->driver);
2030}
2031
2032static void ccw_device_todo(struct work_struct *work)
2033{
2034        struct ccw_device_private *priv;
2035        struct ccw_device *cdev;
2036        struct subchannel *sch;
2037        enum cdev_todo todo;
2038
2039        priv = container_of(work, struct ccw_device_private, todo_work);
2040        cdev = priv->cdev;
2041        sch = to_subchannel(cdev->dev.parent);
2042        /* Find out todo. */
2043        spin_lock_irq(cdev->ccwlock);
2044        todo = priv->todo;
2045        priv->todo = CDEV_TODO_NOTHING;
2046        CIO_MSG_EVENT(4, "cdev_todo: cdev=0.%x.%04x todo=%d\n",
2047                      priv->dev_id.ssid, priv->dev_id.devno, todo);
2048        spin_unlock_irq(cdev->ccwlock);
2049        /* Perform todo. */
2050        switch (todo) {
2051        case CDEV_TODO_ENABLE_CMF:
2052                cmf_reenable(cdev);
2053                break;
2054        case CDEV_TODO_REBIND:
2055                ccw_device_do_unbind_bind(cdev);
2056                break;
2057        case CDEV_TODO_REGISTER:
2058                io_subchannel_register(cdev);
2059                break;
2060        case CDEV_TODO_UNREG_EVAL:
2061                if (!sch_is_pseudo_sch(sch))
2062                        css_schedule_eval(sch->schid);
2063                /* fall-through */
2064        case CDEV_TODO_UNREG:
2065                if (sch_is_pseudo_sch(sch))
2066                        ccw_device_unregister(cdev);
2067                else
2068                        ccw_device_call_sch_unregister(cdev);
2069                break;
2070        default:
2071                break;
2072        }
2073        /* Release workqueue ref. */
2074        put_device(&cdev->dev);
2075}
2076
2077/**
2078 * ccw_device_sched_todo - schedule ccw device operation
2079 * @cdev: ccw device
2080 * @todo: todo
2081 *
2082 * Schedule the operation identified by @todo to be performed on the slow path
2083 * workqueue. Do nothing if another operation with higher priority is already
2084 * scheduled. Needs to be called with ccwdev lock held.
2085 */
2086void ccw_device_sched_todo(struct ccw_device *cdev, enum cdev_todo todo)
2087{
2088        CIO_MSG_EVENT(4, "cdev_todo: sched cdev=0.%x.%04x todo=%d\n",
2089                      cdev->private->dev_id.ssid, cdev->private->dev_id.devno,
2090                      todo);
2091        if (cdev->private->todo >= todo)
2092                return;
2093        cdev->private->todo = todo;
2094        /* Get workqueue ref. */
2095        if (!get_device(&cdev->dev))
2096                return;
2097        if (!queue_work(cio_work_q, &cdev->private->todo_work)) {
2098                /* Already queued, release workqueue ref. */
2099                put_device(&cdev->dev);
2100        }
2101}
2102
2103/**
2104 * ccw_device_siosl() - initiate logging
2105 * @cdev: ccw device
2106 *
2107 * This function is used to invoke model-dependent logging within the channel
2108 * subsystem.
2109 */
2110int ccw_device_siosl(struct ccw_device *cdev)
2111{
2112        struct subchannel *sch = to_subchannel(cdev->dev.parent);
2113
2114        return chsc_siosl(sch->schid);
2115}
2116EXPORT_SYMBOL_GPL(ccw_device_siosl);
2117
2118EXPORT_SYMBOL(ccw_device_set_online);
2119EXPORT_SYMBOL(ccw_device_set_offline);
2120EXPORT_SYMBOL(ccw_driver_register);
2121EXPORT_SYMBOL(ccw_driver_unregister);
2122EXPORT_SYMBOL(get_ccwdev_by_busid);
2123