summaryrefslogtreecommitdiff
path: root/sys/dev/usb/usbdi.c
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>1999-12-28 02:01:18 +0000
committerBill Paul <wpaul@FreeBSD.org>1999-12-28 02:01:18 +0000
commited63a7aaef029dd4831541f0103619792e883d6f (patch)
tree320640f5a6bab5ec22f5419ec1cd7f08eb219bd8 /sys/dev/usb/usbdi.c
parentf9fe4786efebc8670dbbda2e54af400a131a8df4 (diff)
Notes
Diffstat (limited to 'sys/dev/usb/usbdi.c')
-rw-r--r--sys/dev/usb/usbdi.c15
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);