summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakemsr <jakemsr@openbsd.org>2010-12-17 23:14:00 +0000
committerjakemsr <jakemsr@openbsd.org>2010-12-17 23:14:00 +0000
commit6187728efb2a0f5a57d5e220f80aeb5b13e61b44 (patch)
tree71cee7b7a682f15d7c48fa187890893743377508
parent- use nitems() (diff)
downloadwireguard-openbsd-6187728efb2a0f5a57d5e220f80aeb5b13e61b44.tar.xz
wireguard-openbsd-6187728efb2a0f5a57d5e220f80aeb5b13e61b44.zip
don't catch signals in usbd_{bulk,intr}_transfer if a timeout is
set. no other transfer methods catch signals, and it is not possible to restart these transfers reliably.
-rw-r--r--sys/dev/usb/usbdi_util.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/dev/usb/usbdi_util.c b/sys/dev/usb/usbdi_util.c
index d00f777dbba..2954c5e89bf 100644
--- a/sys/dev/usb/usbdi_util.c
+++ b/sys/dev/usb/usbdi_util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdi_util.c,v 1.25 2008/06/26 05:42:19 ray Exp $ */
+/* $OpenBSD: usbdi_util.c,v 1.26 2010/12/17 23:14:00 jakemsr Exp $ */
/* $NetBSD: usbdi_util.c,v 1.40 2002/07/11 21:14:36 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi_util.c,v 1.14 1999/11/17 22:33:50 n_hibma Exp $ */
@@ -426,7 +426,7 @@ usbd_bulk_transfer(usbd_xfer_handle xfer, usbd_pipe_handle pipe,
u_int16_t flags, u_int32_t timeout, void *buf, u_int32_t *size, char *lbl)
{
usbd_status err;
- int s, error;
+ int s, error, pri;
usbd_setup_xfer(xfer, pipe, 0, buf, *size, flags, timeout,
usbd_bulk_transfer_cb);
@@ -437,7 +437,8 @@ usbd_bulk_transfer(usbd_xfer_handle xfer, usbd_pipe_handle pipe,
splx(s);
return (err);
}
- error = tsleep((caddr_t)xfer, PZERO | PCATCH, lbl, 0);
+ pri = timeout == 0 ? (PZERO | PCATCH) : PZERO;
+ error = tsleep((caddr_t)xfer, pri, lbl, 0);
splx(s);
if (error) {
DPRINTF(("usbd_bulk_transfer: tsleep=%d\n", error));
@@ -467,7 +468,7 @@ usbd_intr_transfer(usbd_xfer_handle xfer, usbd_pipe_handle pipe,
u_int16_t flags, u_int32_t timeout, void *buf, u_int32_t *size, char *lbl)
{
usbd_status err;
- int s, error;
+ int s, error, pri;
usbd_setup_xfer(xfer, pipe, 0, buf, *size, flags, timeout,
usbd_intr_transfer_cb);
@@ -478,7 +479,8 @@ usbd_intr_transfer(usbd_xfer_handle xfer, usbd_pipe_handle pipe,
splx(s);
return (err);
}
- error = tsleep(xfer, PZERO | PCATCH, lbl, 0);
+ pri = timeout == 0 ? (PZERO | PCATCH) : PZERO;
+ error = tsleep(xfer, pri, lbl, 0);
splx(s);
if (error) {
DPRINTF(("usbd_intr_transfer: tsleep=%d\n", error));