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