diff options
| author | Bill Paul <wpaul@FreeBSD.org> | 1999-12-28 02:01:18 +0000 |
|---|---|---|
| committer | Bill Paul <wpaul@FreeBSD.org> | 1999-12-28 02:01:18 +0000 |
| commit | ed63a7aaef029dd4831541f0103619792e883d6f (patch) | |
| tree | 320640f5a6bab5ec22f5419ec1cd7f08eb219bd8 /sys/dev/usb/usbdi.c | |
| parent | f9fe4786efebc8670dbbda2e54af400a131a8df4 (diff) | |
Notes
Diffstat (limited to 'sys/dev/usb/usbdi.c')
| -rw-r--r-- | sys/dev/usb/usbdi.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/dev/usb/usbdi.c b/sys/dev/usb/usbdi.c index bbd5f930f4b0..9b9fafd514b6 100644 --- a/sys/dev/usb/usbdi.c +++ b/sys/dev/usb/usbdi.c @@ -56,12 +56,14 @@ #include <sys/proc.h> #include <machine/bus.h> +#include <machine/clock.h> #include <dev/usb/usb.h> #include <dev/usb/usbdi.h> #include <dev/usb/usbdi_util.h> #include <dev/usb/usbdivar.h> #include <dev/usb/usb_mem.h> +#include <dev/usb/usb_quirks.h> #if defined(__FreeBSD__) #include "usb_if.h" @@ -297,7 +299,18 @@ usbd_transfer(xfer) if (!xfer->done) { if (pipe->device->bus->use_polling) panic("usbd_transfer: not done\n"); - tsleep(xfer, PRIBIO, "usbsyn", 0); + if (pipe->device->quirks->uq_flags & UQ_NO_TSLEEP) { + int i; + for (i = 0; i < xfer->timeout + 1; i++) { + DELAY(1); + pipe->device->bus->methods->do_poll(pipe->device->bus); + if (xfer->done) + break; + } + if (!xfer->done) + pipe->methods->abort(xfer); + } else + tsleep(xfer, PRIBIO, "usbsyn", 0); } splx(s); return (xfer->status); |
