1 /* 2 * drivers/s390/cio/device.c 3 * bus driver for ccw devices 4 * 5 * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, 6 * IBM Corporation 7 * Author(s): Arnd Bergmann (arndb@de.ibm.com) 8 * Cornelia Huck (cornelia.huck@de.ibm.com) 9 * Martin Schwidefsky (schwidefsky@de.ibm.com) 10 */ 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/spinlock.h> 14 #include <linux/errno.h> 15 #include <linux/err.h> 16 #include <linux/slab.h> 17 #include <linux/list.h> 18 #include <linux/device.h> 19 #include <linux/workqueue.h> 20 21 #include <asm/ccwdev.h> 22 #include <asm/cio.h> 23 #include <asm/param.h> /* HZ */ 24 25 #include "cio.h" 26 #include "cio_debug.h" 27 #include "css.h" 28 #include "device.h" 29 #include "ioasm.h" 30 31 /******************* bus type handling ***********************/ 32 33 /* The Linux driver model distinguishes between a bus type and 34 * the bus itself. Of course we only have one channel 35 * subsystem driver and one channel system per machine, but 36 * we still use the abstraction. T.R. says it's a good idea. */ 37 static int 38 ccw_bus_match (struct device * dev, struct device_driver * drv) 39 { 40 struct ccw_device *cdev = to_ccwdev(dev); 41 struct ccw_driver *cdrv = to_ccwdrv(drv); 42 const struct ccw_device_id *ids = cdrv->ids, *found; 43 44 if (!ids) 45 return 0; 46 47 found = ccw_device_id_match(ids, &cdev->id); 48 if (!found) 49 return 0; 50 51 cdev->id.driver_info = found->driver_info; 52 53 return 1; 54 } 55 56 /* Store modalias string delimited by prefix/suffix string into buffer with 57 * specified size. Return length of resulting string (excluding trailing '\0') 58 * even if string doesn't fit buffer (snprintf semantics). */ 59 static int snprint_alias(char *buf, size_t size, const char *prefix, 60 struct ccw_device_id *id, const char *suffix) 61 { 62 int len; 63 64 len = snprintf(buf, size, "%sccw:t%04Xm%02X", prefix, id->cu_type, 65 id->cu_model); 66 if (len > size) 67 return len; 68 buf += len; 69 size -= len; 70 71 if (id->dev_type != 0) 72 len += snprintf(buf, size, "dt%04Xdm%02X%s", id->dev_type, 73 id->dev_model, suffix); 74 else 75 len += snprintf(buf, size, "dtdm%s", suffix); 76 77 return len; 78 } 79 80 /* Set up environment variables for ccw device uevent. Return 0 on success, 81 * non-zero otherwise. */ 82 static int ccw_uevent(struct device *dev, char **envp, int num_envp, 83 char *buffer, int buffer_size) 84 { 85 struct ccw_device *cdev = to_ccwdev(dev); 86 struct ccw_device_id *id = &(cdev->id); 87 int i = 0; 88 int len; 89 90 /* CU_TYPE= */ 91 len = snprintf(buffer, buffer_size, "CU_TYPE=%04X", id->cu_type) + 1; 92 if (len > buffer_size || i >= num_envp) 93 return -ENOMEM; 94 envp[i++] = buffer; 95 buffer += len; 96 buffer_size -= len; 97 98 /* CU_MODEL= */ 99 len = snprintf(buffer, buffer_size, "CU_MODEL=%02X", id->cu_model) + 1; 100 if (len > buffer_size || i >= num_envp) 101 return -ENOMEM; 102 envp[i++] = buffer; 103 buffer += len; 104 buffer_size -= len; 105 106 /* The next two can be zero, that's ok for us */ 107 /* DEV_TYPE= */ 108 len = snprintf(buffer, buffer_size, "DEV_TYPE=%04X", id->dev_type) + 1; 109 if (len > buffer_size || i >= num_envp) 110 return -ENOMEM; 111 envp[i++] = buffer; 112 buffer += len; 113 buffer_size -= len; 114 115 /* DEV_MODEL= */ 116 len = snprintf(buffer, buffer_size, "DEV_MODEL=%02X", 117 (unsigned char) id->dev_model) + 1; 118 if (len > buffer_size || i >= num_envp) 119 return -ENOMEM; 120 envp[i++] = buffer; 121 buffer += len; 122 buffer_size -= len; 123 124 /* MODALIAS= */ 125 len = snprint_alias(buffer, buffer_size, "MODALIAS=", id, "") + 1; 126 if (len > buffer_size || i >= num_envp) 127 return -ENOMEM; 128 envp[i++] = buffer; 129 buffer += len; 130 buffer_size -= len; 131 132 envp[i] = NULL; 133 134 return 0; 135 } 136 137 struct bus_type ccw_bus_type; 138 139 static int io_subchannel_probe (struct subchannel *); 140 static int io_subchannel_remove (struct subchannel *); 141 static int io_subchannel_notify(struct device *, int); 142 static void io_subchannel_verify(struct device *); 143 static void io_subchannel_ioterm(struct device *); 144 static void io_subchannel_shutdown(struct subchannel *); 145 146 struct css_driver io_subchannel_driver = { 147 .subchannel_type = SUBCHANNEL_TYPE_IO, 148 .drv = { 149 .name = "io_subchannel", 150 .bus = &css_bus_type, 151 }, 152 .irq = io_subchannel_irq, 153 .notify = io_subchannel_notify, 154 .verify = io_subchannel_verify, 155 .termination = io_subchannel_ioterm, 156 .probe = io_subchannel_probe, 157 .remove = io_subchannel_remove, 158 .shutdown = io_subchannel_shutdown, 159 }; 160 161 struct workqueue_struct *ccw_device_work; 162 struct workqueue_struct *ccw_device_notify_work; 163 wait_queue_head_t ccw_device_init_wq; 164 atomic_t ccw_device_init_count; 165 166 static int __init 167 init_ccw_bus_type (void) 168 { 169 int ret; 170 171 init_waitqueue_head(&ccw_device_init_wq); 172 atomic_set(&ccw_device_init_count, 0); 173 174 ccw_device_work = create_singlethread_workqueue("cio"); 175 if (!ccw_device_work) 176 return -ENOMEM; /* FIXME: better errno ? */ 177 ccw_device_notify_work = create_singlethread_workqueue("cio_notify"); 178 if (!ccw_device_notify_work) { 179 ret = -ENOMEM; /* FIXME: better errno ? */ 180 goto out_err; 181 } 182 slow_path_wq = create_singlethread_workqueue("kslowcrw"); 183 if (!slow_path_wq) { 184 ret = -ENOMEM; /* FIXME: better errno ? */ 185 goto out_err; 186 } 187 if ((ret = bus_register (&ccw_bus_type))) 188 goto out_err; 189 190 if ((ret = driver_register(&io_subchannel_driver.drv))) 191 goto out_err; 192 193 wait_event(ccw_device_init_wq, 194 atomic_read(&ccw_device_init_count) == 0); 195 flush_workqueue(ccw_device_work); 196 return 0; 197 out_err: 198 if (ccw_device_work) 199 destroy_workqueue(ccw_device_work); 200 if (ccw_device_notify_work) 201 destroy_workqueue(ccw_device_notify_work); 202 if (slow_path_wq) 203 destroy_workqueue(slow_path_wq); 204 return ret; 205 } 206 207 static void __exit 208 cleanup_ccw_bus_type (void) 209 { 210 driver_unregister(&io_subchannel_driver.drv); 211 bus_unregister(&ccw_bus_type); 212 destroy_workqueue(ccw_device_notify_work); 213 destroy_workqueue(ccw_device_work); 214 } 215 216 subsys_initcall(init_ccw_bus_type); 217 module_exit(cleanup_ccw_bus_type); 218 219 /************************ device handling **************************/ 220 221 /* 222 * A ccw_device has some interfaces in sysfs in addition to the 223 * standard ones. 224 * The following entries are designed to export the information which 225 * resided in 2.4 in /proc/subchannels. Subchannel and device number 226 * are obvious, so they don't have an entry :) 227 * TODO: Split chpids and pimpampom up? Where is "in use" in the tree? 228 */ 229 static ssize_t 230 chpids_show (struct device * dev, struct device_attribute *attr, char * buf) 231 { 232 struct subchannel *sch = to_subchannel(dev); 233 struct ssd_info *ssd = &sch->ssd_info; 234 ssize_t ret = 0; 235 int chp; 236 237 for (chp = 0; chp < 8; chp++) 238 ret += sprintf (buf+ret, "%02x ", ssd->chpid[chp]); 239 ret += sprintf (buf+ret, "\n"); 240 return min((ssize_t)PAGE_SIZE, ret); 241 } 242 243 static ssize_t 244 pimpampom_show (struct device * dev, struct device_attribute *attr, char * buf) 245 { 246 struct subchannel *sch = to_subchannel(dev); 247 struct pmcw *pmcw = &sch->schib.pmcw; 248 249 return sprintf (buf, "%02x %02x %02x\n", 250 pmcw->pim, pmcw->pam, pmcw->pom); 251 } 252 253 static ssize_t 254 devtype_show (struct device *dev, struct device_attribute *attr, char *buf) 255 { 256 struct ccw_device *cdev = to_ccwdev(dev); 257 struct ccw_device_id *id = &(cdev->id); 258 259 if (id->dev_type != 0) 260 return sprintf(buf, "%04x/%02x\n", 261 id->dev_type, id->dev_model); 262 else 263 return sprintf(buf, "n/a\n"); 264 } 265 266 static ssize_t 267 cutype_show (struct device *dev, struct device_attribute *attr, char *buf) 268 { 269 struct ccw_device *cdev = to_ccwdev(dev); 270 struct ccw_device_id *id = &(cdev->id); 271 272 return sprintf(buf, "%04x/%02x\n", 273 id->cu_type, id->cu_model); 274 } 275 276 static ssize_t 277 modalias_show (struct device *dev, struct device_attribute *attr, char *buf) 278 { 279 struct ccw_device *cdev = to_ccwdev(dev); 280 struct ccw_device_id *id = &(cdev->id); 281 int len; 282 283 len = snprint_alias(buf, PAGE_SIZE, "", id, "\n") + 1; 284 285 return len > PAGE_SIZE ? PAGE_SIZE : len; 286 } 287 288 static ssize_t 289 online_show (struct device *dev, struct device_attribute *attr, char *buf) 290 { 291 struct ccw_device *cdev = to_ccwdev(dev); 292 293 return sprintf(buf, cdev->online ? "1\n" : "0\n"); 294 } 295 296 int ccw_device_is_orphan(struct ccw_device *cdev) 297 { 298 return sch_is_pseudo_sch(to_subchannel(cdev->dev.parent)); 299 } 300 301 static void ccw_device_unregister(struct work_struct *work) 302 { 303 struct ccw_device_private *priv; 304 struct ccw_device *cdev; 305 306 priv = container_of(work, struct ccw_device_private, kick_work); 307 cdev = priv->cdev; 308 if (test_and_clear_bit(1, &cdev->private->registered)) 309 device_unregister(&cdev->dev); 310 put_device(&cdev->dev); 311 } 312 313 static void 314 ccw_device_remove_disconnected(struct ccw_device *cdev) 315 { 316 struct subchannel *sch; 317 unsigned long flags; 318 /* 319 * Forced offline in disconnected state means 320 * 'throw away device'. 321 */ 322 if (ccw_device_is_orphan(cdev)) { 323 /* Deregister ccw device. */ 324 spin_lock_irqsave(cdev->ccwlock, flags); 325 cdev->private->state = DEV_STATE_NOT_OPER; 326 spin_unlock_irqrestore(cdev->ccwlock, flags); 327 if (get_device(&cdev->dev)) { 328 PREPARE_WORK(&cdev->private->kick_work, 329 ccw_device_unregister); 330 queue_work(ccw_device_work, &cdev->private->kick_work); 331 } 332 return ; 333 } 334 sch = to_subchannel(cdev->dev.parent); 335 css_sch_device_unregister(sch); 336 /* Reset intparm to zeroes. */ 337 sch->schib.pmcw.intparm = 0; 338 cio_modify(sch); 339 put_device(&sch->dev); 340 } 341 342 int 343 ccw_device_set_offline(struct ccw_device *cdev) 344 { 345 int ret; 346 347 if (!cdev) 348 return -ENODEV; 349 if (!cdev->online || !cdev->drv) 350 return -EINVAL; 351 352 if (cdev->drv->set_offline) { 353 ret = cdev->drv->set_offline(cdev); 354 if (ret != 0) 355 return ret; 356 } 357 cdev->online = 0; 358 spin_lock_irq(cdev->ccwlock); 359 ret = ccw_device_offline(cdev); 360 if (ret == -ENODEV) { 361 if (cdev->private->state != DEV_STATE_NOT_OPER) { 362 cdev->private->state = DEV_STATE_OFFLINE; 363 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); 364 } 365 spin_unlock_irq(cdev->ccwlock); 366 return ret; 367 } 368 spin_unlock_irq(cdev->ccwlock); 369 if (ret == 0) 370 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); 371 else { 372 pr_debug("ccw_device_offline returned %d, device %s\n", 373 ret, cdev->dev.bus_id); 374 cdev->online = 1; 375 } 376 return ret; 377 } 378 379 int 380 ccw_device_set_online(struct ccw_device *cdev) 381 { 382 int ret; 383 384 if (!cdev) 385 return -ENODEV; 386 if (cdev->online || !cdev->drv) 387 return -EINVAL; 388 389 spin_lock_irq(cdev->ccwlock); 390 ret = ccw_device_online(cdev); 391 spin_unlock_irq(cdev->ccwlock); 392 if (ret == 0) 393 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); 394 else { 395 pr_debug("ccw_device_online returned %d, device %s\n", 396 ret, cdev->dev.bus_id); 397 return ret; 398 } 399 if (cdev->private->state != DEV_STATE_ONLINE) 400 return -ENODEV; 401 if (!cdev->drv->set_online || cdev->drv->set_online(cdev) == 0) { 402 cdev->online = 1; 403 return 0; 404 } 405 spin_lock_irq(cdev->ccwlock); 406 ret = ccw_device_offline(cdev); 407 spin_unlock_irq(cdev->ccwlock); 408 if (ret == 0) 409 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); 410 else 411 pr_debug("ccw_device_offline returned %d, device %s\n", 412 ret, cdev->dev.bus_id); 413 return (ret == 0) ? -ENODEV : ret; 414 } 415 416 static ssize_t 417 online_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) 418 { 419 struct ccw_device *cdev = to_ccwdev(dev); 420 int i, force, ret; 421 char *tmp; 422 423 if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) 424 return -EAGAIN; 425 426 if (cdev->drv && !try_module_get(cdev->drv->owner)) { 427 atomic_set(&cdev->private->onoff, 0); 428 return -EINVAL; 429 } 430 if (!strncmp(buf, "force\n", count)) { 431 force = 1; 432 i = 1; 433 } else { 434 force = 0; 435 i = simple_strtoul(buf, &tmp, 16); 436 } 437 if (i == 1) { 438 /* Do device recognition, if needed. */ 439 if (cdev->id.cu_type == 0) { 440 ret = ccw_device_recognition(cdev); 441 if (ret) { 442 printk(KERN_WARNING"Couldn't start recognition " 443 "for device %s (ret=%d)\n", 444 cdev->dev.bus_id, ret); 445 goto out; 446 } 447 wait_event(cdev->private->wait_q, 448 cdev->private->flags.recog_done); 449 } 450 if (cdev->drv && cdev->drv->set_online) 451 ccw_device_set_online(cdev); 452 } else if (i == 0) { 453 if (cdev->private->state == DEV_STATE_DISCONNECTED) 454 ccw_device_remove_disconnected(cdev); 455 else if (cdev->drv && cdev->drv->set_offline) 456 ccw_device_set_offline(cdev); 457 } 458 if (force && cdev->private->state == DEV_STATE_BOXED) { 459 ret = ccw_device_stlck(cdev); 460 if (ret) { 461 printk(KERN_WARNING"ccw_device_stlck for device %s " 462 "returned %d!\n", cdev->dev.bus_id, ret); 463 goto out; 464 } 465 /* Do device recognition, if needed. */ 466 if (cdev->id.cu_type == 0) { 467 cdev->private->state = DEV_STATE_NOT_OPER; 468 ret = ccw_device_recognition(cdev); 469 if (ret) { 470 printk(KERN_WARNING"Couldn't start recognition " 471 "for device %s (ret=%d)\n", 472 cdev->dev.bus_id, ret); 473 goto out; 474 } 475 wait_event(cdev->private->wait_q, 476 cdev->private->flags.recog_done); 477 } 478 if (cdev->drv && cdev->drv->set_online) 479 ccw_device_set_online(cdev); 480 } 481 out: 482 if (cdev->drv) 483 module_put(cdev->drv->owner); 484 atomic_set(&cdev->private->onoff, 0); 485 return count; 486 } 487 488 static ssize_t 489 available_show (struct device *dev, struct device_attribute *attr, char *buf) 490 { 491 struct ccw_device *cdev = to_ccwdev(dev); 492 struct subchannel *sch; 493 494 if (ccw_device_is_orphan(cdev)) 495 return sprintf(buf, "no device\n"); 496 switch (cdev->private->state) { 497 case DEV_STATE_BOXED: 498 return sprintf(buf, "boxed\n"); 499 case DEV_STATE_DISCONNECTED: 500 case DEV_STATE_DISCONNECTED_SENSE_ID: 501 case DEV_STATE_NOT_OPER: 502 sch = to_subchannel(dev->parent); 503 if (!sch->lpm) 504 return sprintf(buf, "no path\n"); 505 else 506 return sprintf(buf, "no device\n"); 507 default: 508 /* All other states considered fine. */ 509 return sprintf(buf, "good\n"); 510 } 511 } 512 513 static DEVICE_ATTR(chpids, 0444, chpids_show, NULL); 514 static DEVICE_ATTR(pimpampom, 0444, pimpampom_show, NULL); 515 static DEVICE_ATTR(devtype, 0444, devtype_show, NULL); 516 static DEVICE_ATTR(cutype, 0444, cutype_show, NULL); 517 static DEVICE_ATTR(modalias, 0444, modalias_show, NULL); 518 static DEVICE_ATTR(online, 0644, online_show, online_store); 519 extern struct device_attribute dev_attr_cmb_enable; 520 static DEVICE_ATTR(availability, 0444, available_show, NULL); 521 522 static struct attribute * subch_attrs[] = { 523 &dev_attr_chpids.attr, 524 &dev_attr_pimpampom.attr, 525 NULL, 526 }; 527 528 static struct attribute_group subch_attr_group = { 529 .attrs = subch_attrs, 530 }; 531 532 struct attribute_group *subch_attr_groups[] = { 533 &subch_attr_group, 534 NULL, 535 }; 536 537 static struct attribute * ccwdev_attrs[] = { 538 &dev_attr_devtype.attr, 539 &dev_attr_cutype.attr, 540 &dev_attr_modalias.attr, 541 &dev_attr_online.attr, 542 &dev_attr_cmb_enable.attr, 543 &dev_attr_availability.attr, 544 NULL, 545 }; 546 547 static struct attribute_group ccwdev_attr_group = { 548 .attrs = ccwdev_attrs, 549 }; 550 551 static int 552 device_add_files (struct device *dev) 553 { 554 return sysfs_create_group(&dev->kobj, &ccwdev_attr_group); 555 } 556 557 static void 558 device_remove_files(struct device *dev) 559 { 560 sysfs_remove_group(&dev->kobj, &ccwdev_attr_group); 561 } 562 563 /* this is a simple abstraction for device_register that sets the 564 * correct bus type and adds the bus specific files */ 565 static int ccw_device_register(struct ccw_device *cdev) 566 { 567 struct device *dev = &cdev->dev; 568 int ret; 569 570 dev->bus = &ccw_bus_type; 571 572 if ((ret = device_add(dev))) 573 return ret; 574 575 set_bit(1, &cdev->private->registered); 576 if ((ret = device_add_files(dev))) { 577 if (test_and_clear_bit(1, &cdev->private->registered)) 578 device_del(dev); 579 } 580 return ret; 581 } 582 583 struct match_data { 584 struct ccw_dev_id dev_id; 585 struct ccw_device * sibling; 586 }; 587 588 static int 589 match_devno(struct device * dev, void * data) 590 { 591 struct match_data * d = data; 592 struct ccw_device * cdev; 593 594 cdev = to_ccwdev(dev); 595 if ((cdev->private->state == DEV_STATE_DISCONNECTED) && 596 !ccw_device_is_orphan(cdev) && 597 ccw_dev_id_is_equal(&cdev->private->dev_id, &d->dev_id) && 598 (cdev != d->sibling)) 599 return 1; 600 return 0; 601 } 602 603 static struct ccw_device * get_disc_ccwdev_by_dev_id(struct ccw_dev_id *dev_id, 604 struct ccw_device *sibling) 605 { 606 struct device *dev; 607 struct match_data data; 608 609 data.dev_id = *dev_id; 610 data.sibling = sibling; 611 dev = bus_find_device(&ccw_bus_type, NULL, &data, match_devno); 612 613 return dev ? to_ccwdev(dev) : NULL; 614 } 615 616 static int match_orphan(struct device *dev, void *data) 617 { 618 struct ccw_dev_id *dev_id; 619 struct ccw_device *cdev; 620 621 dev_id = data; 622 cdev = to_ccwdev(dev); 623 return ccw_dev_id_is_equal(&cdev->private->dev_id, dev_id); 624 } 625 626 static struct ccw_device * 627 get_orphaned_ccwdev_by_dev_id(struct channel_subsystem *css, 628 struct ccw_dev_id *dev_id) 629 { 630 struct device *dev; 631 632 dev = device_find_child(&css->pseudo_subchannel->dev, dev_id, 633 match_orphan); 634 635 return dev ? to_ccwdev(dev) : NULL; 636 } 637 638 static void 639 ccw_device_add_changed(struct work_struct *work) 640 { 641 struct ccw_device_private *priv; 642 struct ccw_device *cdev; 643 644 priv = container_of(work, struct ccw_device_private, kick_work); 645 cdev = priv->cdev; 646 if (device_add(&cdev->dev)) { 647 put_device(&cdev->dev); 648 return; 649 } 650 set_bit(1, &cdev->private->registered); 651 if (device_add_files(&cdev->dev)) { 652 if (test_and_clear_bit(1, &cdev->private->registered)) 653 device_unregister(&cdev->dev); 654 } 655 } 656 657 void ccw_device_do_unreg_rereg(struct work_struct *work) 658 { 659 struct ccw_device_private *priv; 660 struct ccw_device *cdev; 661 struct subchannel *sch; 662 663 priv = container_of(work, struct ccw_device_private, kick_work); 664 cdev = priv->cdev; 665 sch = to_subchannel(cdev->dev.parent); 666 667 device_remove_files(&cdev->dev); 668 if (test_and_clear_bit(1, &cdev->private->registered)) 669 device_del(&cdev->dev); 670 PREPARE_WORK(&cdev->private->kick_work, 671 ccw_device_add_changed); 672 queue_work(ccw_device_work, &cdev->private->kick_work); 673 } 674 675 static void 676 ccw_device_release(struct device *dev) 677 { 678 struct ccw_device *cdev; 679 680 cdev = to_ccwdev(dev); 681 kfree(cdev->private); 682 kfree(cdev); 683 } 684 685 static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch) 686 { 687 struct ccw_device *cdev; 688 689 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); 690 if (cdev) { 691 cdev->private = kzalloc(sizeof(struct ccw_device_private), 692 GFP_KERNEL | GFP_DMA); 693 if (cdev->private) 694 return cdev; 695 } 696 kfree(cdev); 697 return ERR_PTR(-ENOMEM); 698 } 699 700 static int io_subchannel_initialize_dev(struct subchannel *sch, 701 struct ccw_device *cdev) 702 { 703 cdev->private->cdev = cdev; 704 atomic_set(&cdev->private->onoff, 0); 705 cdev->dev.parent = &sch->dev; 706 cdev->dev.release = ccw_device_release; 707 INIT_LIST_HEAD(&cdev->private->kick_work.entry); 708 /* Do first half of device_register. */ 709 device_initialize(&cdev->dev); 710 if (!get_device(&sch->dev)) { 711 if (cdev->dev.release) 712 cdev->dev.release(&cdev->dev); 713 return -ENODEV; 714 } 715 return 0; 716 } 717 718 static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch) 719 { 720 struct ccw_device *cdev; 721 int ret; 722 723 cdev = io_subchannel_allocate_dev(sch); 724 if (!IS_ERR(cdev)) { 725 ret = io_subchannel_initialize_dev(sch, cdev); 726 if (ret) { 727 kfree(cdev); 728 cdev = ERR_PTR(ret); 729 } 730 } 731 return cdev; 732 } 733 734 static int io_subchannel_recog(struct ccw_device *, struct subchannel *); 735 736 static void sch_attach_device(struct subchannel *sch, 737 struct ccw_device *cdev) 738 { 739 spin_lock_irq(sch->lock); 740 sch->dev.driver_data = cdev; 741 cdev->private->schid = sch->schid; 742 cdev->ccwlock = sch->lock; 743 device_trigger_reprobe(sch); 744 spin_unlock_irq(sch->lock); 745 } 746 747 static void sch_attach_disconnected_device(struct subchannel *sch, 748 struct ccw_device *cdev) 749 { 750 struct subchannel *other_sch; 751 int ret; 752 753 other_sch = to_subchannel(get_device(cdev->dev.parent)); 754 ret = device_move(&cdev->dev, &sch->dev); 755 if (ret) { 756 CIO_MSG_EVENT(2, "Moving disconnected device 0.%x.%04x failed " 757 "(ret=%d)!\n", cdev->private->dev_id.ssid, 758 cdev->private->dev_id.devno, ret); 759 put_device(&other_sch->dev); 760 return; 761 } 762 other_sch->dev.driver_data = NULL; 763 /* No need to keep a subchannel without ccw device around. */ 764 css_sch_device_unregister(other_sch); 765 put_device(&other_sch->dev); 766 sch_attach_device(sch, cdev); 767 } 768 769 static void sch_attach_orphaned_device(struct subchannel *sch, 770 struct ccw_device *cdev) 771 { 772 int ret; 773 774 /* Try to move the ccw device to its new subchannel. */ 775 ret = device_move(&cdev->dev, &sch->dev); 776 if (ret) { 777 CIO_MSG_EVENT(0, "Moving device 0.%x.%04x from orphanage " 778 "failed (ret=%d)!\n", 779 cdev->private->dev_id.ssid, 780 cdev->private->dev_id.devno, ret); 781 return; 782 } 783 sch_attach_device(sch, cdev); 784 } 785 786 static void sch_create_and_recog_new_device(struct subchannel *sch) 787 { 788 struct ccw_device *cdev; 789 790 /* Need to allocate a new ccw device. */ 791 cdev = io_subchannel_create_ccwdev(sch); 792 if (IS_ERR(cdev)) { 793 /* OK, we did everything we could... */ 794 css_sch_device_unregister(sch); 795 return; 796 } 797 spin_lock_irq(sch->lock); 798 sch->dev.driver_data = cdev; 799 spin_unlock_irq(sch->lock); 800 /* Start recognition for the new ccw device. */ 801 if (io_subchannel_recog(cdev, sch)) { 802 spin_lock_irq(sch->lock); 803 sch->dev.driver_data = NULL; 804 spin_unlock_irq(sch->lock); 805 if (cdev->dev.release) 806 cdev->dev.release(&cdev->dev); 807 css_sch_device_unregister(sch); 808 } 809 } 810 811 812 void ccw_device_move_to_orphanage(struct work_struct *work) 813 { 814 struct ccw_device_private *priv; 815 struct ccw_device *cdev; 816 struct ccw_device *replacing_cdev; 817 struct subchannel *sch; 818 int ret; 819 struct channel_subsystem *css; 820 struct ccw_dev_id dev_id; 821 822 priv = container_of(work, struct ccw_device_private, kick_work); 823 cdev = priv->cdev; 824 sch = to_subchannel(cdev->dev.parent); 825 css = to_css(sch->dev.parent); 826 dev_id.devno = sch->schib.pmcw.dev; 827 dev_id.ssid = sch->schid.ssid; 828 829 /* 830 * Move the orphaned ccw device to the orphanage so the replacing 831 * ccw device can take its place on the subchannel. 832 */ 833 ret = device_move(&cdev->dev, &css->pseudo_subchannel->dev); 834 if (ret) { 835 CIO_MSG_EVENT(0, "Moving device 0.%x.%04x to orphanage failed " 836 "(ret=%d)!\n", cdev->private->dev_id.ssid, 837 cdev->private->dev_id.devno, ret); 838 return; 839 } 840 cdev->ccwlock = css->pseudo_subchannel->lock; 841 /* 842 * Search for the replacing ccw device 843 * - among the disconnected devices 844 * - in the orphanage 845 */ 846 replacing_cdev = get_disc_ccwdev_by_dev_id(&dev_id, cdev); 847 if (replacing_cdev) { 848 sch_attach_disconnected_device(sch, replacing_cdev); 849 return; 850 } 851 replacing_cdev = get_orphaned_ccwdev_by_dev_id(css, &dev_id); 852 if (replacing_cdev) { 853 sch_attach_orphaned_device(sch, replacing_cdev); 854 return; 855 } 856 sch_create_and_recog_new_device(sch); 857 } 858 859 /* 860 * Register recognized device. 861 */ 862 static void 863 io_subchannel_register(struct work_struct *work) 864 { 865 struct ccw_device_private *priv; 866 struct ccw_device *cdev; 867 struct subchannel *sch; 868 int ret; 869 unsigned long flags; 870 871 priv = container_of(work, struct ccw_device_private, kick_work); 872 cdev = priv->cdev; 873 sch = to_subchannel(cdev->dev.parent); 874 875 /* 876 * io_subchannel_register() will also be called after device 877 * recognition has been done for a boxed device (which will already 878 * be registered). We need to reprobe since we may now have sense id 879 * information. 880 */ 881 if (klist_node_attached(&cdev->dev.knode_parent)) { 882 if (!cdev->drv) { 883 ret = device_reprobe(&cdev->dev); 884 if (ret) 885 /* We can't do much here. */ 886 dev_info(&cdev->dev, "device_reprobe() returned" 887 " %d\n", ret); 888 } 889 goto out; 890 } 891 /* make it known to the system */ 892 ret = ccw_device_register(cdev); 893 if (ret) { 894 printk (KERN_WARNING "%s: could not register %s\n", 895 __func__, cdev->dev.bus_id); 896 put_device(&cdev->dev); 897 spin_lock_irqsave(sch->lock, flags); 898 sch->dev.driver_data = NULL; 899 spin_unlock_irqrestore(sch->lock, flags); 900 kfree (cdev->private); 901 kfree (cdev); 902 put_device(&sch->dev); 903 if (atomic_dec_and_test(&ccw_device_init_count)) 904 wake_up(&ccw_device_init_wq); 905 return; 906 } 907 put_device(&cdev->dev); 908 out: 909 cdev->private->flags.recog_done = 1; 910 put_device(&sch->dev); 911 wake_up(&cdev->private->wait_q); 912 if (atomic_dec_and_test(&ccw_device_init_count)) 913 wake_up(&ccw_device_init_wq); 914 } 915 916 void 917 ccw_device_call_sch_unregister(struct work_struct *work) 918 { 919 struct ccw_device_private *priv; 920 struct ccw_device *cdev; 921 struct subchannel *sch; 922 923 priv = container_of(work, struct ccw_device_private, kick_work); 924 cdev = priv->cdev; 925 sch = to_subchannel(cdev->dev.parent); 926 css_sch_device_unregister(sch); 927 /* Reset intparm to zeroes. */ 928 sch->schib.pmcw.intparm = 0; 929 cio_modify(sch); 930 put_device(&cdev->dev); 931 put_device(&sch->dev); 932 } 933 934 /* 935 * subchannel recognition done. Called from the state machine. 936 */ 937 void 938 io_subchannel_recog_done(struct ccw_device *cdev) 939 { 940 struct subchannel *sch; 941 942 if (css_init_done == 0) { 943 cdev->private->flags.recog_done = 1; 944 return; 945 } 946 switch (cdev->private->state) { 947 case DEV_STATE_NOT_OPER: 948 cdev->private->flags.recog_done = 1; 949 /* Remove device found not operational. */ 950 if (!get_device(&cdev->dev)) 951 break; 952 sch = to_subchannel(cdev->dev.parent); 953 PREPARE_WORK(&cdev->private->kick_work, 954 ccw_device_call_sch_unregister); 955 queue_work(slow_path_wq, &cdev->private->kick_work); 956 if (atomic_dec_and_test(&ccw_device_init_count)) 957 wake_up(&ccw_device_init_wq); 958 break; 959 case DEV_STATE_BOXED: 960 /* Device did not respond in time. */ 961 case DEV_STATE_OFFLINE: 962 /* 963 * We can't register the device in interrupt context so 964 * we schedule a work item. 965 */ 966 if (!get_device(&cdev->dev)) 967 break; 968 PREPARE_WORK(&cdev->private->kick_work, 969 io_subchannel_register); 970 queue_work(slow_path_wq, &cdev->private->kick_work); 971 break; 972 } 973 } 974 975 static int 976 io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) 977 { 978 int rc; 979 struct ccw_device_private *priv; 980 981 sch->dev.driver_data = cdev; 982 sch->driver = &io_subchannel_driver; 983 cdev->ccwlock = sch->lock; 984 985 /* Init private data. */ 986 priv = cdev->private; 987 priv->dev_id.devno = sch->schib.pmcw.dev; 988 priv->dev_id.ssid = sch->schid.ssid; 989 priv->schid = sch->schid; 990 priv->state = DEV_STATE_NOT_OPER; 991 INIT_LIST_HEAD(&priv->cmb_list); 992 init_waitqueue_head(&priv->wait_q); 993 init_timer(&priv->timer); 994 995 /* Set an initial name for the device. */ 996 snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", 997 sch->schid.ssid, sch->schib.pmcw.dev); 998 999 /* Increase counter of devices currently in recognition. */ 1000 atomic_inc(&ccw_device_init_count); 1001 1002 /* Start async. device sensing. */ 1003 spin_lock_irq(sch->lock); 1004 rc = ccw_device_recognition(cdev); 1005 spin_unlock_irq(sch->lock); 1006 if (rc) { 1007 if (atomic_dec_and_test(&ccw_device_init_count)) 1008 wake_up(&ccw_device_init_wq); 1009 } 1010 return rc; 1011 } 1012 1013 static void ccw_device_move_to_sch(struct work_struct *work) 1014 { 1015 struct ccw_device_private *priv; 1016 int rc; 1017 struct subchannel *sch; 1018 struct ccw_device *cdev; 1019 struct subchannel *former_parent; 1020 1021 priv = container_of(work, struct ccw_device_private, kick_work); 1022 sch = priv->sch; 1023 cdev = priv->cdev; 1024 former_parent = ccw_device_is_orphan(cdev) ? 1025 NULL : to_subchannel(get_device(cdev->dev.parent)); 1026 mutex_lock(&sch->reg_mutex); 1027 /* Try to move the ccw device to its new subchannel. */ 1028 rc = device_move(&cdev->dev, &sch->dev); 1029 mutex_unlock(&sch->reg_mutex); 1030 if (rc) { 1031 CIO_MSG_EVENT(2, "Moving device 0.%x.%04x to subchannel " 1032 "0.%x.%04x failed (ret=%d)!\n", 1033 cdev->private->dev_id.ssid, 1034 cdev->private->dev_id.devno, sch->schid.ssid, 1035 sch->schid.sch_no, rc); 1036 css_sch_device_unregister(sch); 1037 goto out; 1038 } 1039 if (former_parent) { 1040 spin_lock_irq(former_parent->lock); 1041 former_parent->dev.driver_data = NULL; 1042 spin_unlock_irq(former_parent->lock); 1043 css_sch_device_unregister(former_parent); 1044 /* Reset intparm to zeroes. */ 1045 former_parent->schib.pmcw.intparm = 0; 1046 cio_modify(former_parent); 1047 } 1048 sch_attach_device(sch, cdev); 1049 out: 1050 if (former_parent) 1051 put_device(&former_parent->dev); 1052 put_device(&cdev->dev); 1053 } 1054 1055 static int 1056 io_subchannel_probe (struct subchannel *sch) 1057 { 1058 struct ccw_device *cdev; 1059 int rc; 1060 unsigned long flags; 1061 struct ccw_dev_id dev_id; 1062 1063 if (sch->dev.driver_data) { 1064 /* 1065 * This subchannel already has an associated ccw_device. 1066 * Register it and exit. This happens for all early 1067 * device, e.g. the console. 1068 */ 1069 cdev = sch->dev.driver_data; 1070 device_initialize(&cdev->dev); 1071 ccw_device_register(cdev); 1072 /* 1073 * Check if the device is already online. If it is 1074 * the reference count needs to be corrected 1075 * (see ccw_device_online and css_init_done for the 1076 * ugly details). 1077 */ 1078 if (cdev->private->state != DEV_STATE_NOT_OPER && 1079 cdev->private->state != DEV_STATE_OFFLINE && 1080 cdev->private->state != DEV_STATE_BOXED) 1081 get_device(&cdev->dev); 1082 return 0; 1083 } 1084 /* 1085 * First check if a fitting device may be found amongst the 1086 * disconnected devices or in the orphanage. 1087 */ 1088 dev_id.devno = sch->schib.pmcw.dev; 1089 dev_id.ssid = sch->schid.ssid; 1090 cdev = get_disc_ccwdev_by_dev_id(&dev_id, NULL); 1091 if (!cdev) 1092 cdev = get_orphaned_ccwdev_by_dev_id(to_css(sch->dev.parent), 1093 &dev_id); 1094 if (cdev) { 1095 /* 1096 * Schedule moving the device until when we have a registered 1097 * subchannel to move to and succeed the probe. We can 1098 * unregister later again, when the probe is through. 1099 */ 1100 cdev->private->sch = sch; 1101 PREPARE_WORK(&cdev->private->kick_work, 1102 ccw_device_move_to_sch); 1103 queue_work(slow_path_wq, &cdev->private->kick_work); 1104 return 0; 1105 } 1106 cdev = io_subchannel_create_ccwdev(sch); 1107 if (IS_ERR(cdev)) 1108 return PTR_ERR(cdev); 1109 1110 rc = io_subchannel_recog(cdev, sch); 1111 if (rc) { 1112 spin_lock_irqsave(sch->lock, flags); 1113 sch->dev.driver_data = NULL; 1114 spin_unlock_irqrestore(sch->lock, flags); 1115 if (cdev->dev.release) 1116 cdev->dev.release(&cdev->dev); 1117 } 1118 1119 return rc; 1120 } 1121 1122 static int 1123 io_subchannel_remove (struct subchannel *sch) 1124 { 1125 struct ccw_device *cdev; 1126 unsigned long flags; 1127 1128 if (!sch->dev.driver_data) 1129 return 0; 1130 cdev = sch->dev.driver_data; 1131 /* Set ccw device to not operational and drop reference. */ 1132 spin_lock_irqsave(cdev->ccwlock, flags); 1133 sch->dev.driver_data = NULL; 1134 cdev->private->state = DEV_STATE_NOT_OPER; 1135 spin_unlock_irqrestore(cdev->ccwlock, flags); 1136 /* 1137 * Put unregistration on workqueue to avoid livelocks on the css bus 1138 * semaphore. 1139 */ 1140 if (get_device(&cdev->dev)) { 1141 PREPARE_WORK(&cdev->private->kick_work, 1142 ccw_device_unregister); 1143 queue_work(ccw_device_work, &cdev->private->kick_work); 1144 } 1145 return 0; 1146 } 1147 1148 static int 1149 io_subchannel_notify(struct device *dev, int event) 1150 { 1151 struct ccw_device *cdev; 1152 1153 cdev = dev->driver_data; 1154 if (!cdev) 1155 return 0; 1156 if (!cdev->drv) 1157 return 0; 1158 if (!cdev->online) 1159 return 0; 1160 return cdev->drv->notify ? cdev->drv->notify(cdev, event) : 0; 1161 } 1162 1163 static void 1164 io_subchannel_verify(struct device *dev) 1165 { 1166 struct ccw_device *cdev; 1167 1168 cdev = dev->driver_data; 1169 if (cdev) 1170 dev_fsm_event(cdev, DEV_EVENT_VERIFY); 1171 } 1172 1173 static void 1174 io_subchannel_ioterm(struct device *dev) 1175 { 1176 struct ccw_device *cdev; 1177 1178 cdev = dev->driver_data; 1179 if (!cdev) 1180 return; 1181 /* Internal I/O will be retried by the interrupt handler. */ 1182 if (cdev->private->flags.intretry) 1183 return; 1184 cdev->private->state = DEV_STATE_CLEAR_VERIFY; 1185 if (cdev->handler) 1186 cdev->handler(cdev, cdev->private->intparm, 1187 ERR_PTR(-EIO)); 1188 } 1189 1190 static void 1191 io_subchannel_shutdown(struct subchannel *sch) 1192 { 1193 struct ccw_device *cdev; 1194 int ret; 1195 1196 cdev = sch->dev.driver_data; 1197 1198 if (cio_is_console(sch->schid)) 1199 return; 1200 if (!sch->schib.pmcw.ena) 1201 /* Nothing to do. */ 1202 return; 1203 ret = cio_disable_subchannel(sch); 1204 if (ret != -EBUSY) 1205 /* Subchannel is disabled, we're done. */ 1206 return; 1207 cdev->private->state = DEV_STATE_QUIESCE; 1208 if (cdev->handler) 1209 cdev->handler(cdev, cdev->private->intparm, 1210 ERR_PTR(-EIO)); 1211 ret = ccw_device_cancel_halt_clear(cdev); 1212 if (ret == -EBUSY) { 1213 ccw_device_set_timeout(cdev, HZ/10); 1214 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); 1215 } 1216 cio_disable_subchannel(sch); 1217 } 1218 1219 #ifdef CONFIG_CCW_CONSOLE 1220 static struct ccw_device console_cdev; 1221 static struct ccw_device_private console_private; 1222 static int console_cdev_in_use; 1223 1224 static DEFINE_SPINLOCK(ccw_console_lock); 1225 1226 spinlock_t * cio_get_console_lock(void) 1227 { 1228 return &ccw_console_lock; 1229 } 1230 1231 static int 1232 ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch) 1233 { 1234 int rc; 1235 1236 /* Initialize the ccw_device structure. */ 1237 cdev->dev.parent= &sch->dev; 1238 rc = io_subchannel_recog(cdev, sch); 1239 if (rc) 1240 return rc; 1241 1242 /* Now wait for the async. recognition to come to an end. */ 1243 spin_lock_irq(cdev->ccwlock); 1244 while (!dev_fsm_final_state(cdev)) 1245 wait_cons_dev(); 1246 rc = -EIO; 1247 if (cdev->private->state != DEV_STATE_OFFLINE) 1248 goto out_unlock; 1249 ccw_device_online(cdev); 1250 while (!dev_fsm_final_state(cdev)) 1251 wait_cons_dev(); 1252 if (cdev->private->state != DEV_STATE_ONLINE) 1253 goto out_unlock; 1254 rc = 0; 1255 out_unlock: 1256 spin_unlock_irq(cdev->ccwlock); 1257 return 0; 1258 } 1259 1260 struct ccw_device * 1261 ccw_device_probe_console(void) 1262 { 1263 struct subchannel *sch; 1264 int ret; 1265 1266 if (xchg(&console_cdev_in_use, 1) != 0) 1267 return ERR_PTR(-EBUSY); 1268 sch = cio_probe_console(); 1269 if (IS_ERR(sch)) { 1270 console_cdev_in_use = 0; 1271 return (void *) sch; 1272 } 1273 memset(&console_cdev, 0, sizeof(struct ccw_device)); 1274 memset(&console_private, 0, sizeof(struct ccw_device_private)); 1275 console_cdev.private = &console_private; 1276 console_private.cdev = &console_cdev; 1277 ret = ccw_device_console_enable(&console_cdev, sch); 1278 if (ret) { 1279 cio_release_console(); 1280 console_cdev_in_use = 0; 1281 return ERR_PTR(ret); 1282 } 1283 console_cdev.online = 1; 1284 return &console_cdev; 1285 } 1286 #endif 1287 1288 /* 1289 * get ccw_device matching the busid, but only if owned by cdrv 1290 */ 1291 static int 1292 __ccwdev_check_busid(struct device *dev, void *id) 1293 { 1294 char *bus_id; 1295 1296 bus_id = id; 1297 1298 return (strncmp(bus_id, dev->bus_id, BUS_ID_SIZE) == 0); 1299 } 1300 1301 1302 struct ccw_device * 1303 get_ccwdev_by_busid(struct ccw_driver *cdrv, const char *bus_id) 1304 { 1305 struct device *dev; 1306 struct device_driver *drv; 1307 1308 drv = get_driver(&cdrv->driver); 1309 if (!drv) 1310 return NULL; 1311 1312 dev = driver_find_device(drv, NULL, (void *)bus_id, 1313 __ccwdev_check_busid); 1314 put_driver(drv); 1315 1316 return dev ? to_ccwdev(dev) : NULL; 1317 } 1318 1319 /************************** device driver handling ************************/ 1320 1321 /* This is the implementation of the ccw_driver class. The probe, remove 1322 * and release methods are initially very similar to the device_driver 1323 * implementations, with the difference that they have ccw_device 1324 * arguments. 1325 * 1326 * A ccw driver also contains the information that is needed for 1327 * device matching. 1328 */ 1329 static int 1330 ccw_device_probe (struct device *dev) 1331 { 1332 struct ccw_device *cdev = to_ccwdev(dev); 1333 struct ccw_driver *cdrv = to_ccwdrv(dev->driver); 1334 int ret; 1335 1336 cdev->drv = cdrv; /* to let the driver call _set_online */ 1337 1338 ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; 1339 1340 if (ret) { 1341 cdev->drv = NULL; 1342 return ret; 1343 } 1344 1345 return 0; 1346 } 1347 1348 static int 1349 ccw_device_remove (struct device *dev) 1350 { 1351 struct ccw_device *cdev = to_ccwdev(dev); 1352 struct ccw_driver *cdrv = cdev->drv; 1353 int ret; 1354 1355 pr_debug("removing device %s\n", cdev->dev.bus_id); 1356 if (cdrv->remove) 1357 cdrv->remove(cdev); 1358 if (cdev->online) { 1359 cdev->online = 0; 1360 spin_lock_irq(cdev->ccwlock); 1361 ret = ccw_device_offline(cdev); 1362 spin_unlock_irq(cdev->ccwlock); 1363 if (ret == 0) 1364 wait_event(cdev->private->wait_q, 1365 dev_fsm_final_state(cdev)); 1366 else 1367 //FIXME: we can't fail! 1368 pr_debug("ccw_device_offline returned %d, device %s\n", 1369 ret, cdev->dev.bus_id); 1370 } 1371 ccw_device_set_timeout(cdev, 0); 1372 cdev->drv = NULL; 1373 return 0; 1374 } 1375 1376 struct bus_type ccw_bus_type = { 1377 .name = "ccw", 1378 .match = ccw_bus_match, 1379 .uevent = ccw_uevent, 1380 .probe = ccw_device_probe, 1381 .remove = ccw_device_remove, 1382 }; 1383 1384 int 1385 ccw_driver_register (struct ccw_driver *cdriver) 1386 { 1387 struct device_driver *drv = &cdriver->driver; 1388 1389 drv->bus = &ccw_bus_type; 1390 drv->name = cdriver->name; 1391 1392 return driver_register(drv); 1393 } 1394 1395 void 1396 ccw_driver_unregister (struct ccw_driver *cdriver) 1397 { 1398 driver_unregister(&cdriver->driver); 1399 } 1400 1401 /* Helper func for qdio. */ 1402 struct subchannel_id 1403 ccw_device_get_subchannel_id(struct ccw_device *cdev) 1404 { 1405 struct subchannel *sch; 1406 1407 sch = to_subchannel(cdev->dev.parent); 1408 return sch->schid; 1409 } 1410 1411 MODULE_LICENSE("GPL"); 1412 EXPORT_SYMBOL(ccw_device_set_online); 1413 EXPORT_SYMBOL(ccw_device_set_offline); 1414 EXPORT_SYMBOL(ccw_driver_register); 1415 EXPORT_SYMBOL(ccw_driver_unregister); 1416 EXPORT_SYMBOL(get_ccwdev_by_busid); 1417 EXPORT_SYMBOL(ccw_bus_type); 1418 EXPORT_SYMBOL(ccw_device_work); 1419 EXPORT_SYMBOL(ccw_device_notify_work); 1420 EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id); 1421