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