summaryrefslogtreecommitdiffstats
path: root/lib/libusb
diff options
context:
space:
mode:
authorsjg <sjg@FreeBSD.org>2014-04-27 08:13:43 +0000
committersjg <sjg@FreeBSD.org>2014-04-27 08:13:43 +0000
commit0c7e03a54c8e7ddc9c3fe710f83d9ca53173692e (patch)
treeb92e741b68057a24e381faa9809f32030d65574c /lib/libusb
parentc244fcbcaa61dc2a15995e7dbdf3ae8107bc2111 (diff)
parent69c3e6933b6946c49fe99b19986f018d71621980 (diff)
downloadFreeBSD-src-0c7e03a54c8e7ddc9c3fe710f83d9ca53173692e.zip
FreeBSD-src-0c7e03a54c8e7ddc9c3fe710f83d9ca53173692e.tar.gz
Merge head
Diffstat (limited to 'lib/libusb')
-rw-r--r--lib/libusb/Makefile2
-rw-r--r--lib/libusb/libusb.335
-rw-r--r--lib/libusb/libusb.h15
-rw-r--r--lib/libusb/libusb01.c2
-rw-r--r--lib/libusb/libusb10.c13
-rw-r--r--lib/libusb/libusb10_io.c38
6 files changed, 87 insertions, 18 deletions
diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile
index 99bdfc2..92c0843 100644
--- a/lib/libusb/Makefile
+++ b/lib/libusb/Makefile
@@ -130,6 +130,8 @@ MLINKS += libusb.3 libusb_event_handler_active.3
MLINKS += libusb.3 libusb_lock_event_waiters.3
MLINKS += libusb.3 libusb_unlock_event_waiters.3
MLINKS += libusb.3 libusb_wait_for_event.3
+MLINKS += libusb.3 libusb_handle_events_timeout_completed.3
+MLINKS += libusb.3 libusb_handle_events_completed.3
MLINKS += libusb.3 libusb_handle_events_timeout.3
MLINKS += libusb.3 libusb_handle_events.3
MLINKS += libusb.3 libusb_handle_events_locked.3
diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3
index b50981c..785c8c4 100644
--- a/lib/libusb/libusb.3
+++ b/lib/libusb/libusb.3
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 7, 2013
+.Dd January 5, 2014
.Dt LIBUSB 3
.Os
.Sh NAME
@@ -485,11 +485,40 @@ transfer completes or another thread stops event handling, and 1 if the
timeout expired.
.Pp
.Ft int
+.Fn libusb_handle_events_timeout_completed "libusb_context *ctx" "struct timeval *tv" "int *completed"
+Handle any pending events by checking if timeouts have expired and by
+checking the set of file descriptors for activity.
+If the
+.Fa completed
+argument is not equal to NULL, this function will
+loop until a transfer completion callback sets the variable pointed to
+by the
+.Fa completed
+argument to non-zero.
+If the
+.Fa tv
+argument is not equal to NULL, this function will return
+LIBUSB_ERROR_TIMEOUT after the given timeout.
+Returns 0 on success, or a LIBUSB_ERROR code on failure or timeout.
+.Pp
+.Ft int
+.Fn libusb_handle_events_completed "libusb_context *ctx" "int *completed"
+Handle any pending events by checking the set of file descriptors for activity.
+If the
+.Fa completed
+argument is not equal to NULL, this function will
+loop until a transfer completion callback sets the variable pointed to
+by the
+.Fa completed
+argument to non-zero.
+Returns 0 on success, or a LIBUSB_ERROR code on failure.
+.Pp
+.Ft int
.Fn libusb_handle_events_timeout "libusb_context *ctx" "struct timeval *tv"
Handle any pending events by checking if timeouts have expired and by
checking the set of file descriptors for activity.
Returns 0 on success, or a
-LIBUSB_ERROR code on failure.
+LIBUSB_ERROR code on failure or timeout.
.Pp
.Ft int
.Fn libusb_handle_events "libusb_context *ctx"
@@ -508,7 +537,7 @@ Must be called with the event lock held.
Determine the next internal timeout that libusb needs to handle.
Returns 0
if there are no pending timeouts, 1 if a timeout was returned, or a LIBUSB_ERROR
-code on failure.
+code on failure or timeout.
.Pp
.Ft void
.Fn libusb_set_pollfd_notifiers "libusb_context *ctx" "libusb_pollfd_added_cb added_cb" "libusb_pollfd_removed_cb remove_cb" "void *user_data"
diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h
index b14990e..4857f5b 100644
--- a/lib/libusb/libusb.h
+++ b/lib/libusb/libusb.h
@@ -192,6 +192,19 @@ enum libusb_transfer_flags {
LIBUSB_TRANSFER_FREE_TRANSFER = 1 << 2,
};
+enum libusb_log_level {
+ LIBUSB_LOG_LEVEL_NONE = 0,
+ LIBUSB_LOG_LEVEL_ERROR,
+ LIBUSB_LOG_LEVEL_WARNING,
+ LIBUSB_LOG_LEVEL_INFO,
+ LIBUSB_LOG_LEVEL_DEBUG
+};
+
+/* XXX */
+/* libusb_set_debug should take parameters from libusb_log_level
+ * above according to
+ * http://libusb.sourceforge.net/api-1.0/group__lib.html
+ */
enum libusb_debug_level {
LIBUSB_DEBUG_NO=0,
LIBUSB_DEBUG_FUNCTION=1,
@@ -438,6 +451,8 @@ int libusb_event_handler_active(libusb_context * ctx);
void libusb_lock_event_waiters(libusb_context * ctx);
void libusb_unlock_event_waiters(libusb_context * ctx);
int libusb_wait_for_event(libusb_context * ctx, struct timeval *tv);
+int libusb_handle_events_timeout_completed(libusb_context * ctx, struct timeval *tv, int *completed);
+int libusb_handle_events_completed(libusb_context * ctx, int *completed);
int libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv);
int libusb_handle_events(libusb_context * ctx);
int libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv);
diff --git a/lib/libusb/libusb01.c b/lib/libusb/libusb01.c
index 30a1430..91ae6e2 100644
--- a/lib/libusb/libusb01.c
+++ b/lib/libusb/libusb01.c
@@ -127,6 +127,8 @@ usb_get_transfer_by_ep_no(usb_dev_handle * dev, uint8_t ep_no)
bufsize = 256;
} else if (speed == LIBUSB20_SPEED_FULL) {
bufsize = 4096;
+ } else if (speed == LIBUSB20_SPEED_SUPER) {
+ bufsize = 65536;
} else {
bufsize = 16384;
}
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 79a570e..e8f9314 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -611,7 +611,6 @@ int
libusb_claim_interface(struct libusb20_device *pdev, int interface_number)
{
libusb_device *dev;
- int err = 0;
dev = libusb_get_device(pdev);
if (dev == NULL)
@@ -621,13 +620,10 @@ libusb_claim_interface(struct libusb20_device *pdev, int interface_number)
return (LIBUSB_ERROR_INVALID_PARAM);
CTX_LOCK(dev->ctx);
- if (dev->claimed_interfaces & (1 << interface_number))
- err = LIBUSB_ERROR_BUSY;
-
- if (!err)
- dev->claimed_interfaces |= (1 << interface_number);
+ dev->claimed_interfaces |= (1 << interface_number);
CTX_UNLOCK(dev->ctx);
- return (err);
+
+ return (0);
}
int
@@ -939,6 +935,9 @@ libusb10_get_buffsize(struct libusb20_device *pdev, libusb_transfer *xfer)
case LIBUSB20_SPEED_FULL:
ret = 4096;
break;
+ case LIBUSB20_SPEED_SUPER:
+ ret = 65536;
+ break;
default:
ret = 16384;
break;
diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c
index 9aa31c4..e27bbba 100644
--- a/lib/libusb/libusb10_io.c
+++ b/lib/libusb/libusb10_io.c
@@ -336,29 +336,50 @@ libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)
}
int
-libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
+libusb_handle_events_timeout_completed(libusb_context *ctx,
+ struct timeval *tv, int *completed)
{
- int err;
+ int err = 0;
ctx = GET_CONTEXT(ctx);
- DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout enter");
+ DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout_completed enter");
libusb_lock_events(ctx);
- err = libusb_handle_events_locked(ctx, tv);
+ while (1) {
+ if (completed != NULL) {
+ if (*completed != 0 || err != 0)
+ break;
+ }
+ err = libusb_handle_events_locked(ctx, tv);
+ if (completed == NULL)
+ break;
+ }
libusb_unlock_events(ctx);
- DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout leave");
+ DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout_completed exit");
return (err);
}
int
+libusb_handle_events_completed(libusb_context *ctx, int *completed)
+{
+ return (libusb_handle_events_timeout_completed(ctx, NULL, completed));
+}
+
+int
+libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
+{
+ return (libusb_handle_events_timeout_completed(ctx, tv, NULL));
+}
+
+int
libusb_handle_events(libusb_context *ctx)
{
- return (libusb_handle_events_timeout(ctx, NULL));
+ return (libusb_handle_events_timeout_completed(ctx, NULL, NULL));
}
int
@@ -371,8 +392,9 @@ libusb_handle_events_locked(libusb_context *ctx, struct timeval *tv)
if (libusb_event_handling_ok(ctx)) {
err = libusb10_handle_events_sub(ctx, tv);
} else {
- libusb_wait_for_event(ctx, tv);
- err = 0;
+ err = libusb_wait_for_event(ctx, tv);
+ if (err != 0)
+ err = LIBUSB_ERROR_TIMEOUT;
}
return (err);
}
OpenPOWER on IntegriCloud