aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-11-23 07:14:33 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-11-23 07:14:33 +0000
commit5c3c739758bab8439be9c20cb99483d0a822abaf (patch)
tree4572bb0f8e13caeadfb4967b6362bd24a9b6fa1f /extras
parent41c532e4e5016d0e6aea5bc79a6a62d293eb5e15 (diff)
downloadxen-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')
-rw-r--r--extras/mini-os/pcifront.c19
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);