summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usbdi.c
diff options
context:
space:
mode:
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 bbd5f93..9b9fafd 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);
OpenPOWER on IntegriCloud