1/******************************************************************************
2 * Copyright (C) 2010 Spectra Logic Corporation
3 * Copyright (C) 2008 Doug Rabson
4 * Copyright (C) 2005 Rusty Russell, IBM Corporation
5 * Copyright (C) 2005 Mike Wray, Hewlett-Packard
6 * Copyright (C) 2005 XenSource Ltd
7 *
8 * This file may be distributed separately from the Linux kernel, or
9 * incorporated into other software packages, subject to the following license:
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this source file (the "Software"), to deal in the Software without
13 * restriction, including without limitation the rights to use, copy, modify,
14 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
15 * and to permit persons to whom the Software is furnished to do so, subject to
16 * the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
27 * IN THE SOFTWARE.
28 */
29
30/**
31 * \file xenbusb.c
32 *
33 * \brief Shared support functions for managing the NewBus buses that contain
34 *        Xen front and back end device instances.
35 *
36 * The NewBus implementation of XenBus attaches a xenbusb_front and xenbusb_back
37 * child bus to the xenstore device.  This strategy allows the small differences
38 * in the handling of XenBus operations for front and back devices to be handled
39 * as overrides in xenbusb_front/back.c.  Front and back specific device
40 * classes are also provided so device drivers can register for the devices they
41 * can handle without the need to filter within their probe routines.  The
42 * net result is a device hierarchy that might look like this:
43 *
44 * xenstore0/
45 *           xenbusb_front0/
46 *                         xn0
47 *                         xbd0
48 *                         xbd1
49 *           xenbusb_back0/
50 *                        xbbd0
51 *                        xnb0
52 *                        xnb1
53 */
54#include <sys/cdefs.h>
55__FBSDID("$FreeBSD$");
56
57#include <sys/param.h>
58#include <sys/bus.h>
59#include <sys/kernel.h>
60#include <sys/lock.h>
61#include <sys/malloc.h>
62#include <sys/module.h>
63#include <sys/sbuf.h>
64#include <sys/sysctl.h>
65#include <sys/syslog.h>
66#include <sys/systm.h>
67#include <sys/sx.h>
68#include <sys/taskqueue.h>
69
70#include <machine/xen/xen-os.h>
71#include <machine/stdarg.h>
72
73#include <xen/gnttab.h>
74#include <xen/xenstore/xenstorevar.h>
75#include <xen/xenbus/xenbusb.h>
76#include <xen/xenbus/xenbusvar.h>
77
78/*------------------------- Private Functions --------------------------------*/
79/**
80 * \brief Deallocate XenBus device instance variables.
81 *
82 * \param ivars  The instance variable block to free.
83 */
84static void
85xenbusb_free_child_ivars(struct xenbus_device_ivars *ivars)
86{
87	if (ivars->xd_otherend_watch.node != NULL) {
88		xs_unregister_watch(&ivars->xd_otherend_watch);
89		free(ivars->xd_otherend_watch.node, M_XENBUS);
90		ivars->xd_otherend_watch.node = NULL;
91	}
92
93	if (ivars->xd_local_watch.node != NULL) {
94		xs_unregister_watch(&ivars->xd_local_watch);
95		ivars->xd_local_watch.node = NULL;
96	}
97
98	if (ivars->xd_node != NULL) {
99		free(ivars->xd_node, M_XENBUS);
100		ivars->xd_node = NULL;
101	}
102	ivars->xd_node_len = 0;
103
104	if (ivars->xd_type != NULL) {
105		free(ivars->xd_type, M_XENBUS);
106		ivars->xd_type = NULL;
107	}
108
109	if (ivars->xd_otherend_path != NULL) {
110		free(ivars->xd_otherend_path, M_XENBUS);
111		ivars->xd_otherend_path = NULL;
112	}
113	ivars->xd_otherend_path_len = 0;
114
115	free(ivars, M_XENBUS);
116}
117
118/**
119 * XenBus watch callback registered against the "state" XenStore
120 * node of the other-end of a split device connection.
121 *
122 * This callback is invoked whenever the state of a device instance's
123 * peer changes.
124 *
125 * \param watch      The xs_watch object used to register this callback
126 *                   function.
127 * \param vec        An array of pointers to NUL terminated strings containing
128 *                   watch event data.  The vector should be indexed via the
129 *                   xs_watch_type enum in xs_wire.h.
130 * \param vec_size   The number of elements in vec.
131 */
132static void
133xenbusb_otherend_watch_cb(struct xs_watch *watch, const char **vec,
134    unsigned int vec_size __unused)
135{
136	struct xenbus_device_ivars *ivars;
137	device_t child;
138	device_t bus;
139	const char *path;
140	enum xenbus_state newstate;
141
142	ivars = (struct xenbus_device_ivars *)watch->callback_data;
143	child = ivars->xd_dev;
144	bus = device_get_parent(child);
145
146	path = vec[XS_WATCH_PATH];
147	if (ivars->xd_otherend_path == NULL
148	 || strncmp(ivars->xd_otherend_path, path, ivars->xd_otherend_path_len))
149		return;
150
151	newstate = xenbus_read_driver_state(ivars->xd_otherend_path);
152	XENBUSB_OTHEREND_CHANGED(bus, child, newstate);
153}
154
155/**
156 * XenBus watch callback registered against the XenStore sub-tree
157 * represnting the local half of a split device connection.
158 *
159 * This callback is invoked whenever any XenStore data in the subtree
160 * is modified, either by us or another privledged domain.
161 *
162 * \param watch      The xs_watch object used to register this callback
163 *                   function.
164 * \param vec        An array of pointers to NUL terminated strings containing
165 *                   watch event data.  The vector should be indexed via the
166 *                   xs_watch_type enum in xs_wire.h.
167 * \param vec_size   The number of elements in vec.
168 *
169 */
170static void
171xenbusb_local_watch_cb(struct xs_watch *watch, const char **vec,
172    unsigned int vec_size __unused)
173{
174	struct xenbus_device_ivars *ivars;
175	device_t child;
176	device_t bus;
177	const char *path;
178
179	ivars = (struct xenbus_device_ivars *)watch->callback_data;
180	child = ivars->xd_dev;
181	bus = device_get_parent(child);
182
183	path = vec[XS_WATCH_PATH];
184	if (ivars->xd_node == NULL
185	 || strncmp(ivars->xd_node, path, ivars->xd_node_len))
186		return;
187
188	XENBUSB_LOCALEND_CHANGED(bus, child, &path[ivars->xd_node_len]);
189}
190
191/**
192 * Search our internal record of configured devices (not the XenStore)
193 * to determine if the XenBus device indicated by \a node is known to
194 * the system.
195 *
196 * \param dev   The XenBus bus instance to search for device children.
197 * \param node  The XenStore node path for the device to find.
198 *
199 * \return  The device_t of the found device if any, or NULL.
200 *
201 * \note device_t is a pointer type, so it can be compared against
202 *       NULL for validity.
203 */
204static device_t
205xenbusb_device_exists(device_t dev, const char *node)
206{
207	device_t *kids;
208	device_t result;
209	struct xenbus_device_ivars *ivars;
210	int i, count;
211
212	if (device_get_children(dev, &kids, &count))
213		return (FALSE);
214
215	result = NULL;
216	for (i = 0; i < count; i++) {
217		ivars = device_get_ivars(kids[i]);
218		if (!strcmp(ivars->xd_node, node)) {
219			result = kids[i];
220			break;
221		}
222	}
223	free(kids, M_TEMP);
224
225	return (result);
226}
227
228static void
229xenbusb_delete_child(device_t dev, device_t child)
230{
231	struct xenbus_device_ivars *ivars;
232
233	ivars = device_get_ivars(child);
234
235	/*
236	 * We no longer care about the otherend of the
237	 * connection.  Cancel the watches now so that we
238	 * don't try to handle an event for a partially
239	 * detached child.
240	 */
241	if (ivars->xd_otherend_watch.node != NULL)
242		xs_unregister_watch(&ivars->xd_otherend_watch);
243	if (ivars->xd_local_watch.node != NULL)
244		xs_unregister_watch(&ivars->xd_local_watch);
245
246	device_delete_child(dev, child);
247	xenbusb_free_child_ivars(ivars);
248}
249
250/**
251 * \param dev    The NewBus device representing this XenBus bus.
252 * \param child	 The NewBus device representing a child of dev%'s XenBus bus.
253 */
254static void
255xenbusb_verify_device(device_t dev, device_t child)
256{
257	if (xs_exists(XST_NIL, xenbus_get_node(child), "") == 0) {
258		/*
259		 * Device tree has been removed from Xenbus.
260		 * Tear down the device.
261		 */
262		xenbusb_delete_child(dev, child);
263	}
264}
265
266/**
267 * \brief Enumerate the devices on a XenBus bus and register them with
268 *        the NewBus device tree.
269 *
270 * xenbusb_enumerate_bus() will create entries (in state DS_NOTPRESENT)
271 * for nodes that appear in the XenStore, but will not invoke probe/attach
272 * operations on drivers.  Probe/Attach processing must be separately
273 * performed via an invocation of xenbusb_probe_children().  This is usually
274 * done via the xbs_probe_children task.
275 *
276 * \param xbs  XenBus Bus device softc of the owner of the bus to enumerate.
277 *
278 * \return  On success, 0. Otherwise an errno value indicating the
279 *          type of failure.
280 */
281static int
282xenbusb_enumerate_bus(struct xenbusb_softc *xbs)
283{
284	const char **types;
285	u_int type_idx;
286	u_int type_count;
287	int error;
288
289	error = xs_directory(XST_NIL, xbs->xbs_node, "", &type_count, &types);
290	if (error)
291		return (error);
292
293	for (type_idx = 0; type_idx < type_count; type_idx++)
294		XENBUSB_ENUMERATE_TYPE(xbs->xbs_dev, types[type_idx]);
295
296	free(types, M_XENSTORE);
297
298	return (0);
299}
300
301/**
302 * Handler for all generic XenBus device systcl nodes.
303 */
304static int
305xenbusb_device_sysctl_handler(SYSCTL_HANDLER_ARGS)
306{
307	device_t dev;
308        const char *value;
309
310	dev = (device_t)arg1;
311        switch (arg2) {
312	case XENBUS_IVAR_NODE:
313		value = xenbus_get_node(dev);
314		break;
315	case XENBUS_IVAR_TYPE:
316		value = xenbus_get_type(dev);
317		break;
318	case XENBUS_IVAR_STATE:
319		value = xenbus_strstate(xenbus_get_state(dev));
320		break;
321	case XENBUS_IVAR_OTHEREND_ID:
322		return (sysctl_handle_int(oidp, NULL,
323					  xenbus_get_otherend_id(dev),
324					  req));
325		/* NOTREACHED */
326	case XENBUS_IVAR_OTHEREND_PATH:
327		value = xenbus_get_otherend_path(dev);
328                break;
329	default:
330		return (EINVAL);
331	}
332	return (SYSCTL_OUT_STR(req, value));
333}
334
335/**
336 * Create read-only systcl nodes for xenbusb device ivar data.
337 *
338 * \param dev  The XenBus device instance to register with sysctl.
339 */
340static void
341xenbusb_device_sysctl_init(device_t dev)
342{
343	struct sysctl_ctx_list *ctx;
344	struct sysctl_oid      *tree;
345
346	ctx  = device_get_sysctl_ctx(dev);
347	tree = device_get_sysctl_tree(dev);
348
349        SYSCTL_ADD_PROC(ctx,
350			SYSCTL_CHILDREN(tree),
351			OID_AUTO,
352			"xenstore_path",
353			CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
354			dev,
355			XENBUS_IVAR_NODE,
356			xenbusb_device_sysctl_handler,
357			"A",
358			"XenStore path to device");
359
360        SYSCTL_ADD_PROC(ctx,
361			SYSCTL_CHILDREN(tree),
362			OID_AUTO,
363			"xenbus_dev_type",
364			CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
365			dev,
366			XENBUS_IVAR_TYPE,
367			xenbusb_device_sysctl_handler,
368			"A",
369			"XenBus device type");
370
371        SYSCTL_ADD_PROC(ctx,
372			SYSCTL_CHILDREN(tree),
373			OID_AUTO,
374			"xenbus_connection_state",
375			CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
376			dev,
377			XENBUS_IVAR_STATE,
378			xenbusb_device_sysctl_handler,
379			"A",
380			"XenBus state of peer connection");
381
382        SYSCTL_ADD_PROC(ctx,
383			SYSCTL_CHILDREN(tree),
384			OID_AUTO,
385			"xenbus_peer_domid",
386			CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
387			dev,
388			XENBUS_IVAR_OTHEREND_ID,
389			xenbusb_device_sysctl_handler,
390			"I",
391			"Xen domain ID of peer");
392
393        SYSCTL_ADD_PROC(ctx,
394			SYSCTL_CHILDREN(tree),
395			OID_AUTO,
396			"xenstore_peer_path",
397			CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
398			dev,
399			XENBUS_IVAR_OTHEREND_PATH,
400			xenbusb_device_sysctl_handler,
401			"A",
402			"XenStore path to peer device");
403}
404
405/**
406 * \brief Decrement the number of XenBus child devices in the
407 *        connecting state by one and release the xbs_attch_ch
408 *        interrupt configuration hook if the connecting count
409 *        drops to zero.
410 *
411 * \param xbs  XenBus Bus device softc of the owner of the bus to enumerate.
412 */
413static void
414xenbusb_release_confighook(struct xenbusb_softc *xbs)
415{
416	mtx_lock(&xbs->xbs_lock);
417	KASSERT(xbs->xbs_connecting_children > 0,
418		("Connecting device count error\n"));
419	xbs->xbs_connecting_children--;
420	if (xbs->xbs_connecting_children == 0
421	 && (xbs->xbs_flags & XBS_ATTACH_CH_ACTIVE) != 0) {
422		xbs->xbs_flags &= ~XBS_ATTACH_CH_ACTIVE;
423		mtx_unlock(&xbs->xbs_lock);
424		config_intrhook_disestablish(&xbs->xbs_attach_ch);
425	} else {
426		mtx_unlock(&xbs->xbs_lock);
427	}
428}
429
430/**
431 * \brief Verify the existance of attached device instances and perform
432 *        probe/attach processing for newly arrived devices.
433 *
434 * \param dev  The NewBus device representing this XenBus bus.
435 *
436 * \return  On success, 0. Otherwise an errno value indicating the
437 *          type of failure.
438 */
439static int
440xenbusb_probe_children(device_t dev)
441{
442	device_t *kids;
443	struct xenbus_device_ivars *ivars;
444	int i, count, error;
445
446	if (device_get_children(dev, &kids, &count) == 0) {
447		for (i = 0; i < count; i++) {
448			if (device_get_state(kids[i]) != DS_NOTPRESENT) {
449				/*
450				 * We already know about this one.
451				 * Make sure it's still here.
452				 */
453				xenbusb_verify_device(dev, kids[i]);
454				continue;
455			}
456
457			error = device_probe_and_attach(kids[i]);
458			if (error == ENXIO) {
459				struct xenbusb_softc *xbs;
460
461				/*
462				 * We don't have a PV driver for this device.
463				 * However, an emulated device we do support
464				 * may share this backend.  Hide the node from
465				 * XenBus until the next rescan, but leave it's
466				 * state unchanged so we don't inadvertently
467				 * prevent attachment of any emulated device.
468				 */
469				xenbusb_delete_child(dev, kids[i]);
470
471				/*
472				 * Since the XenStore state of this device
473				 * still indicates a pending attach, manually
474				 * release it's hold on the boot process.
475				 */
476				xbs = device_get_softc(dev);
477				xenbusb_release_confighook(xbs);
478
479				continue;
480			} else if (error) {
481				/*
482				 * Transition device to the closed state
483				 * so the world knows that attachment will
484				 * not occur.
485				 */
486				xenbus_set_state(kids[i], XenbusStateClosed);
487
488				/*
489				 * Remove our record of this device.
490				 * So long as it remains in the closed
491				 * state in the XenStore, we will not find
492				 * it again.  The state will only change
493				 * if the control domain actively reconfigures
494				 * this device.
495				 */
496				xenbusb_delete_child(dev, kids[i]);
497
498				continue;
499			}
500			/*
501			 * Augment default newbus provided dynamic sysctl
502			 * variables with the standard ivar contents of
503			 * XenBus devices.
504			 */
505			xenbusb_device_sysctl_init(kids[i]);
506
507			/*
508			 * Now that we have a driver managing this device
509			 * that can receive otherend state change events,
510			 * hook up a watch for them.
511			 */
512			ivars = device_get_ivars(kids[i]);
513			xs_register_watch(&ivars->xd_otherend_watch);
514			xs_register_watch(&ivars->xd_local_watch);
515		}
516		free(kids, M_TEMP);
517	}
518
519	return (0);
520}
521
522/**
523 * \brief Task callback function to perform XenBus probe operations
524 *        from a known safe context.
525 *
526 * \param arg      The NewBus device_t representing the bus instance to
527 *                 on which to perform probe processing.
528 * \param pending  The number of times this task was queued before it could
529 *                 be run.
530 */
531static void
532xenbusb_probe_children_cb(void *arg, int pending __unused)
533{
534	device_t dev = (device_t)arg;
535
536	/*
537	 * Hold Giant until the Giant free newbus changes are committed.
538	 */
539	mtx_lock(&Giant);
540	xenbusb_probe_children(dev);
541	mtx_unlock(&Giant);
542}
543
544/**
545 * \brief XenStore watch callback for the root node of the XenStore
546 *        subtree representing a XenBus.
547 *
548 * This callback performs, or delegates to the xbs_probe_children task,
549 * all processing necessary to handle dynmaic device arrival and departure
550 * events from a XenBus.
551 *
552 * \param watch  The XenStore watch object associated with this callback.
553 * \param vec    The XenStore watch event data.
554 * \param len	 The number of fields in the event data stream.
555 */
556static void
557xenbusb_devices_changed(struct xs_watch *watch, const char **vec,
558			unsigned int len)
559{
560	struct xenbusb_softc *xbs;
561	device_t dev;
562	char *node;
563	char *type;
564	char *id;
565	char *p;
566	u_int component;
567
568	xbs = (struct xenbusb_softc *)watch->callback_data;
569	dev = xbs->xbs_dev;
570
571	if (len <= XS_WATCH_PATH) {
572		device_printf(dev, "xenbusb_devices_changed: "
573			      "Short Event Data.\n");
574		return;
575	}
576
577	node = strdup(vec[XS_WATCH_PATH], M_XENBUS);
578	p = strchr(node, '/');
579	if (p == NULL)
580		goto out;
581	*p = 0;
582	type = p + 1;
583
584	p = strchr(type, '/');
585	if (p == NULL)
586		goto out;
587	*p++ = 0;
588
589	/*
590	 * Extract the device ID.  A device ID has one or more path
591	 * components separated by the '/' character.
592	 *
593	 * e.g. "<frontend vm id>/<frontend dev id>" for backend devices.
594	 */
595	id = p;
596	for (component = 0; component < xbs->xbs_id_components; component++) {
597		p = strchr(p, '/');
598		if (p == NULL)
599			break;
600		p++;
601	}
602	if (p != NULL)
603		*p = 0;
604
605	if (*id != 0 && component >= xbs->xbs_id_components - 1) {
606		xenbusb_add_device(xbs->xbs_dev, type, id);
607		taskqueue_enqueue(taskqueue_thread, &xbs->xbs_probe_children);
608	}
609out:
610	free(node, M_XENBUS);
611}
612
613/**
614 * \brief Interrupt configuration hook callback associated with xbs_attch_ch.
615 *
616 * Since interrupts are always functional at the time of XenBus configuration,
617 * there is nothing to be done when the callback occurs.  This hook is only
618 * registered to hold up boot processing while XenBus devices come online.
619 *
620 * \param arg  Unused configuration hook callback argument.
621 */
622static void
623xenbusb_nop_confighook_cb(void *arg __unused)
624{
625}
626
627/*--------------------------- Public Functions -------------------------------*/
628/*--------- API comments for these methods can be found in xenbusb.h ---------*/
629void
630xenbusb_identify(driver_t *driver __unused, device_t parent)
631{
632	/*
633	 * A single instance of each bus type for which we have a driver
634	 * is always present in a system operating under Xen.
635	 */
636	BUS_ADD_CHILD(parent, 0, driver->name, 0);
637}
638
639int
640xenbusb_add_device(device_t dev, const char *type, const char *id)
641{
642	struct xenbusb_softc *xbs;
643	struct sbuf *devpath_sbuf;
644	char *devpath;
645	struct xenbus_device_ivars *ivars;
646	int error;
647
648	xbs = device_get_softc(dev);
649	devpath_sbuf = sbuf_new_auto();
650	sbuf_printf(devpath_sbuf, "%s/%s/%s", xbs->xbs_node, type, id);
651	sbuf_finish(devpath_sbuf);
652	devpath = sbuf_data(devpath_sbuf);
653
654	ivars = malloc(sizeof(*ivars), M_XENBUS, M_ZERO|M_WAITOK);
655	error = ENXIO;
656
657	if (xs_exists(XST_NIL, devpath, "") != 0) {
658		device_t child;
659		enum xenbus_state state;
660		char *statepath;
661
662		child = xenbusb_device_exists(dev, devpath);
663		if (child != NULL) {
664			/*
665			 * We are already tracking this node
666			 */
667			error = 0;
668			goto out;
669		}
670
671		state = xenbus_read_driver_state(devpath);
672		if (state != XenbusStateInitialising) {
673			/*
674			 * Device is not new, so ignore it. This can
675			 * happen if a device is going away after
676			 * switching to Closed.
677			 */
678			printf("xenbusb_add_device: Device %s ignored. "
679			       "State %d\n", devpath, state);
680			error = 0;
681			goto out;
682		}
683
684		sx_init(&ivars->xd_lock, "xdlock");
685		ivars->xd_flags = XDF_CONNECTING;
686		ivars->xd_node = strdup(devpath, M_XENBUS);
687		ivars->xd_node_len = strlen(devpath);
688		ivars->xd_type  = strdup(type, M_XENBUS);
689		ivars->xd_state = XenbusStateInitialising;
690
691		error = XENBUSB_GET_OTHEREND_NODE(dev, ivars);
692		if (error) {
693			printf("xenbus_update_device: %s no otherend id\n",
694			    devpath);
695			goto out;
696		}
697
698		statepath = malloc(ivars->xd_otherend_path_len
699		    + strlen("/state") + 1, M_XENBUS, M_WAITOK);
700		sprintf(statepath, "%s/state", ivars->xd_otherend_path);
701		ivars->xd_otherend_watch.node = statepath;
702		ivars->xd_otherend_watch.callback = xenbusb_otherend_watch_cb;
703		ivars->xd_otherend_watch.callback_data = (uintptr_t)ivars;
704		/*
705		 * Other end state node watch, limit to one pending event
706		 * to prevent frontends from queuing too many events that
707		 * could cause resource starvation.
708		 */
709		ivars->xd_otherend_watch.max_pending = 1;
710
711		ivars->xd_local_watch.node = ivars->xd_node;
712		ivars->xd_local_watch.callback = xenbusb_local_watch_cb;
713		ivars->xd_local_watch.callback_data = (uintptr_t)ivars;
714		/*
715		 * Watch our local path, only writable by us or a privileged
716		 * domain, no need to limit.
717		 */
718		ivars->xd_local_watch.max_pending = 0;
719
720		mtx_lock(&xbs->xbs_lock);
721		xbs->xbs_connecting_children++;
722		mtx_unlock(&xbs->xbs_lock);
723
724		child = device_add_child(dev, NULL, -1);
725		ivars->xd_dev = child;
726		device_set_ivars(child, ivars);
727	}
728
729out:
730	sbuf_delete(devpath_sbuf);
731	if (error != 0)
732		xenbusb_free_child_ivars(ivars);
733
734	return (error);
735}
736
737int
738xenbusb_attach(device_t dev, char *bus_node, u_int id_components)
739{
740	struct xenbusb_softc *xbs;
741
742	xbs = device_get_softc(dev);
743	mtx_init(&xbs->xbs_lock, "xenbusb softc lock", NULL, MTX_DEF);
744	xbs->xbs_node = bus_node;
745	xbs->xbs_id_components = id_components;
746	xbs->xbs_dev = dev;
747
748	/*
749	 * Since XenBus buses are attached to the XenStore, and
750	 * the XenStore does not probe children until after interrupt
751	 * services are available, this config hook is used solely
752	 * to ensure that the remainder of the boot process (e.g.
753	 * mount root) is deferred until child devices are adequately
754	 * probed.  We unblock the boot process as soon as the
755	 * connecting child count in our softc goes to 0.
756	 */
757	xbs->xbs_attach_ch.ich_func = xenbusb_nop_confighook_cb;
758	xbs->xbs_attach_ch.ich_arg = dev;
759	config_intrhook_establish(&xbs->xbs_attach_ch);
760	xbs->xbs_flags |= XBS_ATTACH_CH_ACTIVE;
761	xbs->xbs_connecting_children = 1;
762
763	/*
764	 * The subtree for this bus type may not yet exist
765	 * causing initial enumeration to fail.  We still
766	 * want to return success from our attach though
767	 * so that we are ready to handle devices for this
768	 * bus when they are dynamically attached to us
769	 * by a Xen management action.
770	 */
771	(void)xenbusb_enumerate_bus(xbs);
772	xenbusb_probe_children(dev);
773
774	xbs->xbs_device_watch.node = bus_node;
775	xbs->xbs_device_watch.callback = xenbusb_devices_changed;
776	xbs->xbs_device_watch.callback_data = (uintptr_t)xbs;
777	/*
778	 * Allow for unlimited pending watches, as those are local paths
779	 * either controlled by the guest or only writable by privileged
780	 * domains.
781	 */
782	xbs->xbs_device_watch.max_pending = 0;
783
784	TASK_INIT(&xbs->xbs_probe_children, 0, xenbusb_probe_children_cb, dev);
785
786	xs_register_watch(&xbs->xbs_device_watch);
787
788	xenbusb_release_confighook(xbs);
789
790	return (0);
791}
792
793int
794xenbusb_resume(device_t dev)
795{
796	device_t *kids;
797	struct xenbus_device_ivars *ivars;
798	int i, count, error;
799	char *statepath;
800
801	/*
802	 * We must re-examine each device and find the new path for
803	 * its backend.
804	 */
805	if (device_get_children(dev, &kids, &count) == 0) {
806		for (i = 0; i < count; i++) {
807			if (device_get_state(kids[i]) == DS_NOTPRESENT)
808				continue;
809
810			if (xen_suspend_cancelled) {
811				DEVICE_RESUME(kids[i]);
812				continue;
813			}
814
815			ivars = device_get_ivars(kids[i]);
816
817			xs_unregister_watch(&ivars->xd_otherend_watch);
818			xenbus_set_state(kids[i], XenbusStateInitialising);
819
820			/*
821			 * Find the new backend details and
822			 * re-register our watch.
823			 */
824			error = XENBUSB_GET_OTHEREND_NODE(dev, ivars);
825			if (error)
826				return (error);
827
828			statepath = malloc(ivars->xd_otherend_path_len
829			    + strlen("/state") + 1, M_XENBUS, M_WAITOK);
830			sprintf(statepath, "%s/state", ivars->xd_otherend_path);
831
832			free(ivars->xd_otherend_watch.node, M_XENBUS);
833			ivars->xd_otherend_watch.node = statepath;
834
835			DEVICE_RESUME(kids[i]);
836
837			xs_register_watch(&ivars->xd_otherend_watch);
838#if 0
839			/*
840			 * Can't do this yet since we are running in
841			 * the xenwatch thread and if we sleep here,
842			 * we will stop delivering watch notifications
843			 * and the device will never come back online.
844			 */
845			sx_xlock(&ivars->xd_lock);
846			while (ivars->xd_state != XenbusStateClosed
847			    && ivars->xd_state != XenbusStateConnected)
848				sx_sleep(&ivars->xd_state, &ivars->xd_lock,
849				    0, "xdresume", 0);
850			sx_xunlock(&ivars->xd_lock);
851#endif
852		}
853		free(kids, M_TEMP);
854	}
855
856	return (0);
857}
858
859int
860xenbusb_print_child(device_t dev, device_t child)
861{
862	struct xenbus_device_ivars *ivars = device_get_ivars(child);
863	int	retval = 0;
864
865	retval += bus_print_child_header(dev, child);
866	retval += printf(" at %s", ivars->xd_node);
867	retval += bus_print_child_footer(dev, child);
868
869	return (retval);
870}
871
872int
873xenbusb_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
874{
875	struct xenbus_device_ivars *ivars = device_get_ivars(child);
876
877	switch (index) {
878	case XENBUS_IVAR_NODE:
879		*result = (uintptr_t) ivars->xd_node;
880		return (0);
881
882	case XENBUS_IVAR_TYPE:
883		*result = (uintptr_t) ivars->xd_type;
884		return (0);
885
886	case XENBUS_IVAR_STATE:
887		*result = (uintptr_t) ivars->xd_state;
888		return (0);
889
890	case XENBUS_IVAR_OTHEREND_ID:
891		*result = (uintptr_t) ivars->xd_otherend_id;
892		return (0);
893
894	case XENBUS_IVAR_OTHEREND_PATH:
895		*result = (uintptr_t) ivars->xd_otherend_path;
896		return (0);
897	}
898
899	return (ENOENT);
900}
901
902int
903xenbusb_write_ivar(device_t dev, device_t child, int index, uintptr_t value)
904{
905	struct xenbus_device_ivars *ivars = device_get_ivars(child);
906	enum xenbus_state newstate;
907	int currstate;
908
909	switch (index) {
910	case XENBUS_IVAR_STATE:
911	{
912		int error;
913
914		newstate = (enum xenbus_state)value;
915		sx_xlock(&ivars->xd_lock);
916		if (ivars->xd_state == newstate) {
917			error = 0;
918			goto out;
919		}
920
921		error = xs_scanf(XST_NIL, ivars->xd_node, "state",
922		    NULL, "%d", &currstate);
923		if (error)
924			goto out;
925
926		do {
927			error = xs_printf(XST_NIL, ivars->xd_node, "state",
928			    "%d", newstate);
929		} while (error == EAGAIN);
930		if (error) {
931			/*
932			 * Avoid looping through xenbus_dev_fatal()
933			 * which calls xenbus_write_ivar to set the
934			 * state to closing.
935			 */
936			if (newstate != XenbusStateClosing)
937				xenbus_dev_fatal(dev, error,
938						 "writing new state");
939			goto out;
940		}
941		ivars->xd_state = newstate;
942
943		if ((ivars->xd_flags & XDF_CONNECTING) != 0
944		 && (newstate == XenbusStateClosed
945		  || newstate == XenbusStateConnected)) {
946			struct xenbusb_softc *xbs;
947
948			ivars->xd_flags &= ~XDF_CONNECTING;
949			xbs = device_get_softc(dev);
950			xenbusb_release_confighook(xbs);
951		}
952
953		wakeup(&ivars->xd_state);
954	out:
955		sx_xunlock(&ivars->xd_lock);
956		return (error);
957	}
958
959	case XENBUS_IVAR_NODE:
960	case XENBUS_IVAR_TYPE:
961	case XENBUS_IVAR_OTHEREND_ID:
962	case XENBUS_IVAR_OTHEREND_PATH:
963		/*
964		 * These variables are read-only.
965		 */
966		return (EINVAL);
967	}
968
969	return (ENOENT);
970}
971
972void
973xenbusb_otherend_changed(device_t bus, device_t child, enum xenbus_state state)
974{
975	XENBUS_OTHEREND_CHANGED(child, state);
976}
977
978void
979xenbusb_localend_changed(device_t bus, device_t child, const char *path)
980{
981
982	if (strcmp(path, "/state") != 0) {
983		struct xenbus_device_ivars *ivars;
984
985		ivars = device_get_ivars(child);
986		sx_xlock(&ivars->xd_lock);
987		ivars->xd_state = xenbus_read_driver_state(ivars->xd_node);
988		sx_xunlock(&ivars->xd_lock);
989	}
990	XENBUS_LOCALEND_CHANGED(child, path);
991}
992