Lines Matching +full:forced +full:- +full:comms
5 * Copyright (C) 2005 Mike Wray, Hewlett-Packard
60 #include <xen/xen-ops.h>
85 for (; *arr->devicetype != '\0'; arr++) { in match_device()
86 if (!strcmp(arr->devicetype, dev->devicetype)) in match_device()
96 if (!drv->ids) in xenbus_match()
99 return match_device(drv->ids, to_xenbus_device(_dev)) != NULL; in xenbus_match()
106 kfree(dev->otherend); in free_otherend_details()
107 dev->otherend = NULL; in free_otherend_details()
113 if (dev->otherend_watch.node) { in free_otherend_watch()
114 unregister_xenbus_watch(&dev->otherend_watch); in free_otherend_watch()
115 kfree(dev->otherend_watch.node); in free_otherend_watch()
116 dev->otherend_watch.node = NULL; in free_otherend_watch()
123 struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver); in talk_to_otherend()
128 return drv->read_otherend_details(dev); in talk_to_otherend()
136 container_of(dev->dev.bus, struct xen_bus_type, bus); in watch_otherend()
138 return xenbus_watch_pathfmt(dev, &dev->otherend_watch, in watch_otherend()
139 bus->otherend_will_handle, in watch_otherend()
140 bus->otherend_changed, in watch_otherend()
141 "%s/%s", dev->otherend, "state"); in watch_otherend()
148 int err = xenbus_gather(XBT_NIL, xendev->nodename, in xenbus_read_otherend_details()
149 id_node, "%i", &xendev->otherend_id, in xenbus_read_otherend_details()
150 path_node, NULL, &xendev->otherend, in xenbus_read_otherend_details()
155 xendev->nodename); in xenbus_read_otherend_details()
158 if (strlen(xendev->otherend) == 0 || in xenbus_read_otherend_details()
159 !xenbus_exists(XBT_NIL, xendev->otherend, "")) { in xenbus_read_otherend_details()
160 xenbus_dev_fatal(xendev, -ENOENT, in xenbus_read_otherend_details()
163 xendev->nodename); in xenbus_read_otherend_details()
165 return -ENOENT; in xenbus_read_otherend_details()
178 struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver); in xenbus_otherend_changed()
183 if (!dev->otherend || in xenbus_otherend_changed()
184 strncmp(dev->otherend, path, strlen(dev->otherend))) { in xenbus_otherend_changed()
185 dev_dbg(&dev->dev, "Ignoring watch at %s\n", path); in xenbus_otherend_changed()
189 state = xenbus_read_driver_state(dev->otherend); in xenbus_otherend_changed()
191 dev_dbg(&dev->dev, "state is %d, (%s), %s, %s\n", in xenbus_otherend_changed()
192 state, xenbus_strstate(state), dev->otherend_watch.node, path); in xenbus_otherend_changed()
204 if (drv->otherend_changed) in xenbus_otherend_changed()
205 drv->otherend_changed(dev, state); in xenbus_otherend_changed()
212 struct xenbus_driver *drv = to_xenbus_driver(_dev->driver); in xenbus_dev_probe()
216 DPRINTK("%s", dev->nodename); in xenbus_dev_probe()
218 if (!drv->probe) { in xenbus_dev_probe()
219 err = -ENODEV; in xenbus_dev_probe()
223 id = match_device(drv->ids, dev); in xenbus_dev_probe()
225 err = -ENODEV; in xenbus_dev_probe()
231 dev_warn(&dev->dev, "talk_to_otherend on %s failed.\n", in xenbus_dev_probe()
232 dev->nodename); in xenbus_dev_probe()
236 if (!try_module_get(drv->driver.owner)) { in xenbus_dev_probe()
237 dev_warn(&dev->dev, "failed to acquire module reference on '%s'\n", in xenbus_dev_probe()
238 drv->driver.name); in xenbus_dev_probe()
239 err = -ESRCH; in xenbus_dev_probe()
243 down(&dev->reclaim_sem); in xenbus_dev_probe()
244 err = drv->probe(dev, id); in xenbus_dev_probe()
245 up(&dev->reclaim_sem); in xenbus_dev_probe()
251 dev_warn(&dev->dev, "watch_otherend on %s failed.\n", in xenbus_dev_probe()
252 dev->nodename); in xenbus_dev_probe()
258 module_put(drv->driver.owner); in xenbus_dev_probe()
260 xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename); in xenbus_dev_probe()
268 struct xenbus_driver *drv = to_xenbus_driver(_dev->driver); in xenbus_dev_remove()
270 DPRINTK("%s", dev->nodename); in xenbus_dev_remove()
274 if (drv->remove) { in xenbus_dev_remove()
275 down(&dev->reclaim_sem); in xenbus_dev_remove()
276 drv->remove(dev); in xenbus_dev_remove()
277 up(&dev->reclaim_sem); in xenbus_dev_remove()
280 module_put(drv->driver.owner); in xenbus_dev_remove()
285 * If the toolstack has forced the device state to closing then set in xenbus_dev_remove()
287 * Similarly, if the driver does not support re-bind, set the in xenbus_dev_remove()
290 if (!drv->allow_rebind || in xenbus_dev_remove()
291 xenbus_read_driver_state(dev->nodename) == XenbusStateClosing) in xenbus_dev_remove()
302 drv->driver.name = drv->name ? drv->name : drv->ids[0].devicetype; in xenbus_register_driver_common()
303 drv->driver.bus = &bus->bus; in xenbus_register_driver_common()
304 drv->driver.owner = owner; in xenbus_register_driver_common()
305 drv->driver.mod_name = mod_name; in xenbus_register_driver_common()
307 return driver_register(&drv->driver); in xenbus_register_driver_common()
313 driver_unregister(&drv->driver); in xenbus_unregister_driver()
327 if (!strcmp(xendev->nodename, info->nodename)) { in cmp_dev()
328 info->dev = xendev; in cmp_dev()
348 int len = strlen(info->nodename); in cleanup_dev()
350 DPRINTK("%s", info->nodename); in cleanup_dev()
352 /* Match the info->nodename path, or any subdirectory of that path. */ in cleanup_dev()
353 if (strncmp(xendev->nodename, info->nodename, len)) in cleanup_dev()
357 if ((strlen(xendev->nodename) > len) && (xendev->nodename[len] != '/')) in cleanup_dev()
360 info->dev = xendev; in cleanup_dev()
373 device_unregister(&info.dev->dev); in xenbus_cleanup_devices()
374 put_device(&info.dev->dev); in xenbus_cleanup_devices()
388 return sprintf(buf, "%s\n", to_xenbus_device(dev)->nodename); in nodename_show()
395 return sprintf(buf, "%s\n", to_xenbus_device(dev)->devicetype); in devtype_show()
402 return sprintf(buf, "%s:%s\n", dev->bus->name, in modalias_show()
403 to_xenbus_device(dev)->devicetype); in modalias_show()
411 xenbus_strstate(to_xenbus_device(dev)->state)); in state_show()
454 return -ENOMEM; in xenbus_probe_node()
456 xendev->state = XenbusStateInitialising; in xenbus_probe_node()
462 xendev->nodename = tmpstring; in xenbus_probe_node()
466 xendev->devicetype = tmpstring; in xenbus_probe_node()
467 init_completion(&xendev->down); in xenbus_probe_node()
469 xendev->dev.bus = &bus->bus; in xenbus_probe_node()
470 xendev->dev.release = xenbus_dev_release; in xenbus_probe_node()
472 err = bus->get_bus_id(devname, xendev->nodename); in xenbus_probe_node()
476 dev_set_name(&xendev->dev, "%s", devname); in xenbus_probe_node()
477 sema_init(&xendev->reclaim_sem, 1); in xenbus_probe_node()
480 err = device_register(&xendev->dev); in xenbus_probe_node()
482 put_device(&xendev->dev); in xenbus_probe_node()
501 dir = xenbus_directory(XBT_NIL, bus->root, type, &dir_n); in xenbus_probe_device_type()
506 err = bus->probe(bus, type, dir[i]); in xenbus_probe_device_type()
521 dir = xenbus_directory(XBT_NIL, bus->root, "", &dir_n); in xenbus_probe_devices()
554 len--; in strsep_len()
556 return (len == 0) ? i : -ERANGE; in strsep_len()
571 xenbus_cleanup_devices(node, &bus->bus); in xenbus_dev_changed()
578 type[XEN_BUS_ID_SIZE-1] = '\0'; in xenbus_dev_changed()
580 rootlen = strsep_len(node, '/', bus->levels); in xenbus_dev_changed()
587 dev = xenbus_device_find(root, &bus->bus); in xenbus_dev_changed()
591 put_device(&dev->dev); in xenbus_dev_changed()
604 DPRINTK("%s", xdev->nodename); in xenbus_dev_suspend()
606 if (dev->driver == NULL) in xenbus_dev_suspend()
608 drv = to_xenbus_driver(dev->driver); in xenbus_dev_suspend()
609 if (drv->suspend) in xenbus_dev_suspend()
610 err = drv->suspend(xdev); in xenbus_dev_suspend()
624 DPRINTK("%s", xdev->nodename); in xenbus_dev_resume()
626 if (dev->driver == NULL) in xenbus_dev_resume()
628 drv = to_xenbus_driver(dev->driver); in xenbus_dev_resume()
635 xdev->state = XenbusStateInitialising; in xenbus_dev_resume()
637 if (drv->resume) { in xenbus_dev_resume()
638 err = drv->resume(xdev); in xenbus_dev_resume()
672 ret = nb->notifier_call(nb, 0, NULL); in register_xenstore_notifier()
747 * or a xenstore-stubdom to be started, then probe. It will be in xenbus_probe_initcall()
792 int err = -ENOMEM; in xenstored_local_init()
809 if (err == -ENOSYS) in xenstored_local_init()
838 xen_store_evtchn = xen_start_info->store_evtchn; in xenbus_resume_cb()
854 return -ENODEV; in xenbus_init()
864 if (xen_pv_domain() && !xen_start_info->store_evtchn) in xenbus_init()
866 if (xen_pv_domain() && xen_start_info->store_evtchn) in xenbus_init()
877 xen_store_evtchn = xen_start_info->store_evtchn; in xenbus_init()
878 xen_store_gfn = xen_start_info->store_mfn; in xenbus_init()
900 err = -ENOENT; in xenbus_init()
903 /* Avoid truncation on 32-bit. */ in xenbus_init()
908 err = -EINVAL; in xenbus_init()
930 pr_warn("Error initializing xenstore comms: %i\n", err); in xenbus_init()