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