[go: nahoru, domu]

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