diff options
| -rw-r--r-- | sys/src/cmd/nusb/usbd/hub.c | 4 | ||||
| -rw-r--r-- | sys/src/cmd/nusb/usbd/usbd.c | 11 |
2 files changed, 11 insertions, 4 deletions
diff --git a/sys/src/cmd/nusb/usbd/hub.c b/sys/src/cmd/nusb/usbd/hub.c index c23ac0da1..29b1c95af 100644 --- a/sys/src/cmd/nusb/usbd/hub.c +++ b/sys/src/cmd/nusb/usbd/hub.c @@ -668,6 +668,10 @@ work(void) fprint(2, "%s: %s: newhub failed: %r\n", argv0, fn); free(fn); } + + if(hubs == nil) + return; + /* * Enumerate (and acknowledge after first enumeration). * Do NOT perform enumeration concurrently for the same diff --git a/sys/src/cmd/nusb/usbd/usbd.c b/sys/src/cmd/nusb/usbd/usbd.c index ef10145c0..2e96df07f 100644 --- a/sys/src/cmd/nusb/usbd/usbd.c +++ b/sys/src/cmd/nusb/usbd/usbd.c @@ -358,18 +358,21 @@ main(int argc, char **argv) initevent(); rfork(RFNOTEG); - switch(rfork(RFPROC|RFMEM)){ + switch(rfork(RFPROC|RFMEM|RFNOWAIT)){ case -1: sysfatal("rfork: %r"); case 0: work(); exits(nil); } if(argc == 0){ - fd = open("/dev/usb", OREAD); - if(fd < 0) + if((fd = open("/dev/usb", OREAD)) < 0){ + rendezvous(work, nil); sysfatal("/dev/usb: %r"); + } nd = dirreadall(fd, &d); close(fd); - if(nd < 2) + if(nd < 2){ + rendezvous(work, nil); sysfatal("/dev/usb: no hubs"); + } for(i = 0; i < nd; i++) if(strcmp(d[i].name, "ctl") != 0) rendezvous(work, smprint("/dev/usb/%s", d[i].name)); |
