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