diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-11-23 07:14:33 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-11-23 07:14:33 +0000 |
commit | 5c3c739758bab8439be9c20cb99483d0a822abaf (patch) | |
tree | 4572bb0f8e13caeadfb4967b6362bd24a9b6fa1f /extras/mini-os/pcifront.c | |
parent | 41c532e4e5016d0e6aea5bc79a6a62d293eb5e15 (diff) | |
download | xen-5c3c739758bab8439be9c20cb99483d0a822abaf.tar.gz xen-5c3c739758bab8439be9c20cb99483d0a822abaf.tar.bz2 xen-5c3c739758bab8439be9c20cb99483d0a822abaf.zip |
pcifront: fix multiple initialization bug
Now that we have pcifront_watches to dynamically initialize pcifront
we don't need a call to init_pcifront in pcilib and pcifront_scan
anymore; we should just wait for the frontend to connect to the
backend instead.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/pcifront.c')
-rw-r--r-- | extras/mini-os/pcifront.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c index ed402a8a19..718abf1d73 100644 --- a/extras/mini-os/pcifront.c +++ b/extras/mini-os/pcifront.c @@ -276,15 +276,24 @@ void pcifront_scan(struct pcifront_dev *dev, void (*func)(unsigned int domain, u { char *path; int i, n, len; - char *s, *msg; + char *s, *msg = NULL, *err = NULL; unsigned int domain, bus, slot, fun; if (!dev) dev = pcidev; - if (!dev) - dev = init_pcifront(NULL); - if (!dev) - return; + if (!dev) { + xenbus_event_queue events = NULL; + char *fe_state = "device/pci/0/state"; + xenbus_watch_path_token(XBT_NIL, fe_state, fe_state, &events); + while ((err = xenbus_read(XBT_NIL, fe_state, &msg)) != NULL || msg[0] != '4') { + free(msg); + free(err); + printk("pcifront_scan: waiting for pcifront to become ready\n"); + xenbus_wait_for_watch(&events); + } + xenbus_unwatch_path_token(XBT_NIL, fe_state, fe_state); + dev = pcidev; + } len = strlen(dev->backend) + 1 + 5 + 10 + 1; path = (char *) malloc(len); |