usb4bsd: Pull up libusb and usbcontrol to FreeBSD current's.
authorSascha Wildner <saw@online.de>
Sun, 14 Oct 2012 12:18:21 +0000 (14:18 +0200)
committerSascha Wildner <saw@online.de>
Sun, 14 Oct 2012 12:18:21 +0000 (14:18 +0200)
I stopped before their recent streams commit.

22 files changed:
lib/Makefile
lib/libusb/Makefile
lib/libusb/libusb.3
lib/libusb/libusb.h
lib/libusb/libusb01.c
lib/libusb/libusb10.c
lib/libusb/libusb10.h
lib/libusb/libusb10_desc.c
lib/libusb/libusb10_io.c
lib/libusb/libusb20.3
lib/libusb/libusb20.c
lib/libusb/libusb20.h
lib/libusb/libusb20_desc.c
lib/libusb/libusb20_desc.h
lib/libusb/libusb20_int.h
lib/libusb/libusb20_ugen20.c
lib/libusb/usb.h
usr.sbin/usbconfig/Makefile
usr.sbin/usbconfig/dump.c
usr.sbin/usbconfig/dump.h
usr.sbin/usbconfig/usbconfig.8
usr.sbin/usbconfig/usbconfig.c

index b812092..9407d90 100644 (file)
@@ -120,7 +120,6 @@ _libnetgraph=       libnetgraph
 _libusb=       libusb
 _libusbhid=    libu4bhid
 .else
-_libusb=       
 _libusbhid=    libusbhid
 .endif
 
index 8d78619..84a9a40 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $FreeBSD$
+# $FreeBSD: src/lib/libusb/Makefile,v 1.18 2012/06/12 07:28:25 hselasky Exp $
 #
 # Makefile for the FreeBSD specific LibUSB 2.0
 #
@@ -18,6 +18,9 @@ NOGCCERROR=
 
 WARNS?=                2
 
+DPADD=         ${LIBPTHREAD}
+LDADD=         -lpthread
+
 MLINKS+=       libusb.3 usb.3
 
 # libusb 0.1 compat
@@ -48,6 +51,7 @@ MLINKS += libusb.3 libusb_get_bus_number.3
 MLINKS += libusb.3 libusb_get_device_address.3
 MLINKS += libusb.3 libusb_get_device_speed.3
 MLINKS += libusb.3 libusb_get_max_packet_size.3
+MLINKS += libusb.3 libusb_get_max_iso_packet_size.3
 MLINKS += libusb.3 libusb_ref_device.3
 MLINKS += libusb.3 libusb_unref_device.3
 MLINKS += libusb.3 libusb_open.3
@@ -69,10 +73,11 @@ MLINKS += libusb.3 libusb_detach_kernel_driver.3
 MLINKS += libusb.3 libusb_detach_kernel_driver_np.3
 MLINKS += libusb.3 libusb_attach_kernel_driver.3
 MLINKS += libusb.3 libusb_get_device_descriptor.3
-MLINKS += libusb.3 libsub_get_active_config_descriptor.3
+MLINKS += libusb.3 libusb_get_active_config_descriptor.3
 MLINKS += libusb.3 libusb_get_config_descriptor.3
 MLINKS += libusb.3 libusb_get_config_descriptor_by_value.3
 MLINKS += libusb.3 libusb_free_config_descriptor.3
+MLINKS += libusb.3 libusb_get_string_descriptor.3
 MLINKS += libusb.3 libusb_get_string_descriptor_ascii.3
 MLINKS += libusb.3 libusb_parse_ss_endpoint_comp.3
 MLINKS += libusb.3 libusb_free_ss_endpoint_comp.3
index 4e4dd10..4babc2d 100644 (file)
@@ -24,9 +24,9 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD$
+.\" $FreeBSD: src/lib/libusb/libusb.3,v 1.27 2012/05/11 20:06:46 gjb Exp $
 .\"
-.Dd November 9, 2011
+.Dd October 14, 2012
 .Dt LIBUSB 3
 .Os
 .Sh NAME
@@ -43,7 +43,6 @@ The
 library contains interfaces for directly managing a usb device.
 The current implementation supports v1.0 of the libusb API.
 .Sh LIBRARY INITIALISATION / DEINITIALISATION
-.Pp
 .Ft int
 .Fn libusb_init libusb_context **ctx
 This function initialises libusb.
@@ -101,12 +100,12 @@ counter decremented once.
 .Ft uint8_t
 .Fn libusb_get_bus_number "libusb_device *dev"
 Returns the number of the bus contained by the device
-.Fa dev.
+.Fa dev .
 .Pp
 .Ft uint8_t
 .Fn libusb_get_device_address "libusb_device *dev"
 Returns the device_address contained by the device
-.Fa dev.
+.Fa dev .
 .Pp
 .Ft enum libusb_speed
 .Fn libusb_get_device_speed "libusb_device *dev"
@@ -119,15 +118,21 @@ LIBUSB_SPEED_UNKNOWN is returned in case of unknown wire speed.
 Returns the wMaxPacketSize value on success, LIBUSB_ERROR_NOT_FOUND if the
 endpoint does not exist and LIBUSB_ERROR_OTHERS on other failure.
 .Pp
+.Ft int
+.Fn libusb_get_max_iso_packet_size "libusb_device *dev" "unsigned char endpoint"
+Returns the packet size multiplied by the packet multiplier on success,
+LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist and
+LIBUSB_ERROR_OTHERS on other failure.
+.Pp
 .Ft libusb_device *
 .Fn libusb_ref_device "libusb_device *dev"
 Increment the reference counter of the device
-.Fa dev.
+.Fa dev .
 .Pp
 .Ft void
 .Fn libusb_unref_device "libusb_device *dev"
 Decrement the reference counter of the device
-.Fa dev.
+.Fa dev .
 .Pp
 .Ft int
 .Fn libusb_open "libusb_device *dev" "libusb_device_handle **devh"
@@ -142,7 +147,7 @@ disconnected and a LIBUSB_ERROR code on other errors.
 A convenience function to open a device by vendor and product IDs
 .Fa vid
 and
-.Fa pid.
+.Fa pid .
 Returns NULL on error.
 .Pp
 .Ft void
@@ -156,7 +161,7 @@ Returns NULL on error.
 .Pp
 .Ft int
 .Fn libusb_get_configuration "libusb_device_handle *devh" "int *config"
-Returns the bConfiguration value of the current configuration.
+Returns the value of the current configuration.
 Returns 0
 on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected
 and a LIBUSB_ERROR code on error.
@@ -166,7 +171,7 @@ and a LIBUSB_ERROR code on error.
 Set the active configuration to
 .Fa config
 for the device contained by
-.Fa devh.
+.Fa devh .
 This function returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested
 configuration does not exist, LIBUSB_ERROR_BUSY if the interfaces are currently
 claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a
@@ -175,7 +180,7 @@ LIBUSB_ERROR code on failure.
 .Ft int
 .Fn libusb_claim_interface "libusb_device_handle *devh" "int interface_number"
 Claim an interface in a given libusb_handle
-.Fa devh.
+.Fa devh .
 This is a non-blocking function.
 It returns 0 on success, LIBUSB_ERROR_NOT_FOUND
 if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or
@@ -270,19 +275,17 @@ LIBUSB_ERROR_NO_DEVICE
 if the device has been disconnected, LIBUSB_ERROR_BUSY if the driver cannot be
 attached because the interface is claimed by a program or driver and a
 LIBUSB_ERROR code on failure.
-.Pp
 .Sh USB DESCRIPTORS
-.Pp
 .Ft int
 .Fn libusb_get_device_descriptor "libusb_device *dev" "libusb_device_descriptor *desc"
 Get the USB device descriptor for the device
-.Fa dev.
+.Fa dev .
 This is a non-blocking function.
 Returns 0 on success and a LIBUSB_ERROR code on
 failure.
 .Pp
 .Ft int
-.Fn libsub_get_active_config_descriptor "libusb_device *dev" "struct libusb_config_descriptor **config"
+.Fn libusb_get_active_config_descriptor "libusb_device *dev" "struct libusb_config_descriptor **config"
 Get the USB configuration descriptor for the active configuration.
 Returns 0 on
 success, LIBUSB_ERROR_NOT_FOUND if the device is in
@@ -311,6 +314,12 @@ LIBUSB_ERROR code on failure.
 Free a configuration descriptor.
 .Pp
 .Ft int
+.Fn libusb_get_string_descriptor "libusb_device_handle *devh" "uint8_t desc_idx" "uint16_t langid" "unsigned char *data" "int length"
+Retrieve a string descriptor in raw format.
+Returns the number of bytes actually transferred on success
+or a negative LIBUSB_ERROR code on failure.
+.Pp
+.Ft int
 .Fn libusb_get_string_descriptor_ascii "libusb_device_handle *devh" "uint8_t desc_idx" "unsigned char *data" "int length"
 Retrieve a string descriptor in C style ASCII.
 Returns the positive number of bytes in the resulting ASCII string
@@ -321,11 +330,11 @@ on success and a LIBUSB_ERROR code on failure.
 This function parses the USB 3.0 endpoint companion descriptor in host endian format pointed to by
 .Fa buf
 and having a length of
-.Fa len.
+.Fa len .
 Typically these arguments are the extra and extra_length fields of the
 endpoint descriptor.
 On success the pointer to resulting descriptor is stored at the location given by
-.Fa ep_comp.
+.Fa ep_comp .
 Returns zero on success and a LIBUSB_ERROR code on failure.
 On success the parsed USB 3.0 endpoint companion descriptor must be
 freed using the libusb_free_ss_endpoint_comp function.
@@ -339,9 +348,9 @@ This function is NULL safe and frees a parsed USB 3.0 endpoint companion descrip
 This function parses a Binary Object Store, BOS, descriptor into host endian format pointed to by
 .Fa buf
 and having a length of
-.Fa len.
+.Fa len .
 On success the pointer to resulting descriptor is stored at the location given by
-.Fa bos.
+.Fa bos .
 Returns zero on success and a LIBUSB_ERROR code on failure.
 On success the parsed BOS descriptor must be freed using the
 libusb_free_bos_descriptor function.
@@ -349,9 +358,7 @@ libusb_free_bos_descriptor function.
 .Ft void
 .Fn libusb_free_bos_descriptor "libusb_bos_descriptor *bos"
 This function is NULL safe and frees a parsed BOS descriptor.
-.Pp
 .Sh USB ASYNCHRONOUS I/O
-.Pp
 .Ft struct libusb_transfer *
 .Fn libusb_alloc_transfer "int iso_packets"
 Allocate a transfer with the number of isochronous packet descriptors
@@ -374,9 +381,7 @@ LIBUSB_ERROR code on other failure.
 .Fn libusb_cancel_transfer "struct libusb_transfer *tr"
 This function asynchronously cancels a transfer.
 Returns 0 on success and a LIBUSB_ERROR code on failure.
-.Pp
 .Sh USB SYNCHRONOUS I/O
-.Pp
 .Ft int
 .Fn libusb_control_transfer "libusb_device_handle *devh" "uint8_t bmRequestType" "uint8_t bRequest" "uint16_t wValue" "uint16_t wIndex" "unsigned char *data" "uint16_t wLength" "unsigned int timeout"
 Perform a USB control transfer.
@@ -411,9 +416,7 @@ if the transfer timed out, LIBUSB_ERROR_PIPE if the control request was not
 supported, LIBUSB_ERROR_OVERFLOW if the device offered more data,
 LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and
 a LIBUSB_ERROR code on other failure.
-.Pp
 .Sh USB EVENTS
-.Pp
 .Ft int
 .Fn libusb_try_lock_events "libusb_context *ctx"
 Try to acquire the event handling lock.
@@ -429,7 +432,7 @@ This function is blocking.
 Release the event handling lock.
 This will wake up any thread blocked
 on
-.B libusb_wait_for_event() .
+.Fn libusb_wait_for_event .
 .Pp
 .Ft int
 .Fn libusb_event_handling_ok "libusb_context *ctx"
@@ -483,7 +486,7 @@ on success and a LIBUSB_ERROR code on failure.
 .Pp
 .Ft int
 .Fn libusb_handle_events_locked "libusb_context *ctx" "struct timeval *tv"
-Handle any pending events by polling file desciptors, without checking if
+Handle any pending events by polling file descriptors, without checking if
 another thread is already doing so.
 Must be called with the event lock held.
 .Pp
@@ -506,7 +509,6 @@ Retrive a list of file descriptors that should be polled by your main loop as
 libusb event sources.
 Returns a NULL-terminated list on success or NULL on failure.
 .Sh LIBUSB VERSION 0.1 COMPATIBILITY
-.Pp
 The library is also compliant with LibUSB version 0.1.12.
 .Pp
 .Fn usb_open
index 5a4d2df..0705588 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb.h,v 1.21 2012/05/07 14:07:13 hselasky Exp $ */
 /*-
  * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
  *
@@ -340,7 +340,7 @@ typedef void (*libusb_transfer_cb_fn) (struct libusb_transfer *transfer);
 typedef struct libusb_transfer {
        libusb_device_handle *dev_handle;
        uint8_t flags;
-       uint32_t endpoint;
+       uint8_t endpoint;
        uint8_t type;
        uint32_t timeout;
        enum libusb_transfer_status status;
@@ -349,7 +349,6 @@ typedef struct libusb_transfer {
        libusb_transfer_cb_fn callback;
        void   *user_data;
        uint8_t *buffer;
-       void *os_priv;
        int     num_iso_packets;
        struct libusb_iso_packet_descriptor iso_packet_desc[0];
 }      libusb_transfer __aligned(sizeof(void *));
@@ -371,6 +370,7 @@ uint8_t     libusb_get_device_address(libusb_device * dev);
 enum libusb_speed libusb_get_device_speed(libusb_device * dev);
 int    libusb_clear_halt(libusb_device_handle *devh, uint8_t endpoint);
 int    libusb_get_max_packet_size(libusb_device * dev, uint8_t endpoint);
+int    libusb_get_max_iso_packet_size(libusb_device * dev, uint8_t endpoint);
 libusb_device *libusb_ref_device(libusb_device * dev);
 void   libusb_unref_device(libusb_device * dev);
 int    libusb_open(libusb_device * dev, libusb_device_handle ** devh);
@@ -398,6 +398,7 @@ int libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_confi
 int    libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config);
 int    libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config);
 void   libusb_free_config_descriptor(struct libusb_config_descriptor *config);
+int    libusb_get_string_descriptor(libusb_device_handle * devh, uint8_t desc_index, uint16_t langid, unsigned char *data, int length);
 int    libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length);
 int    libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length);
 int    libusb_parse_ss_endpoint_comp(const void *buf, int len, struct libusb_ss_endpoint_companion_descriptor **ep_comp);
index 17edb0e..9312198 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb01.c,v 1.2 2011/07/16 08:29:12 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
index 0be318a..5434d13 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb10.c,v 1.25 2012/06/12 07:28:25 hselasky Exp $ */
 /*-
  * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
  * Copyright (c) 2009 Hans Petter Selasky. All rights reserved.
@@ -92,6 +92,7 @@ int
 libusb_init(libusb_context **context)
 {
        struct libusb_context *ctx;
+       pthread_condattr_t attr;
        char *debug;
        int ret;
 
@@ -110,8 +111,28 @@ libusb_init(libusb_context **context)
        TAILQ_INIT(&ctx->pollfds);
        TAILQ_INIT(&ctx->tr_done);
 
-       pthread_mutex_init(&ctx->ctx_lock, NULL);
-       pthread_cond_init(&ctx->ctx_cond, NULL);
+       if (pthread_mutex_init(&ctx->ctx_lock, NULL) != 0) {
+               free(ctx);
+               return (LIBUSB_ERROR_NO_MEM);
+       }
+       if (pthread_condattr_init(&attr) != 0) {
+               pthread_mutex_destroy(&ctx->ctx_lock);
+               free(ctx);
+               return (LIBUSB_ERROR_NO_MEM);
+       }
+       if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) != 0) {
+               pthread_mutex_destroy(&ctx->ctx_lock);
+               pthread_condattr_destroy(&attr);
+               free(ctx);
+               return (LIBUSB_ERROR_OTHER);
+       }
+       if (pthread_cond_init(&ctx->ctx_cond, &attr) != 0) {
+               pthread_mutex_destroy(&ctx->ctx_lock);
+               pthread_condattr_destroy(&attr);
+               free(ctx);
+               return (LIBUSB_ERROR_NO_MEM);
+       }
+       pthread_condattr_destroy(&attr);
 
        ctx->ctx_handler = NO_THREAD;
 
@@ -331,6 +352,30 @@ out:
        return (ret);
 }
 
+int
+libusb_get_max_iso_packet_size(libusb_device *dev, uint8_t endpoint)
+{
+       int multiplier;
+       int ret;
+
+       ret = libusb_get_max_packet_size(dev, endpoint);
+
+       switch (libusb20_dev_get_speed(dev->os_priv)) {
+       case LIBUSB20_SPEED_LOW:
+       case LIBUSB20_SPEED_FULL:
+               break;
+       default:
+               if (ret > -1) {
+                       multiplier = (1 + ((ret >> 11) & 3));
+                       if (multiplier > 3)
+                               multiplier = 3;
+                       ret = (ret & 0x7FF) * multiplier;
+               }
+               break;
+       }
+       return (ret);
+}
+
 libusb_device *
 libusb_ref_device(libusb_device *dev)
 {
@@ -627,17 +672,17 @@ libusb_set_interface_alt_setting(struct libusb20_device *pdev,
 
 static struct libusb20_transfer *
 libusb10_get_transfer(struct libusb20_device *pdev,
-    uint8_t endpoint, uint8_t index)
+    uint8_t endpoint, uint8_t xfer_index)
 {
-       index &= 1;                     /* double buffering */
+       xfer_index &= 1;        /* double buffering */
 
-       index |= (endpoint & LIBUSB20_ENDPOINT_ADDRESS_MASK) * 4;
+       xfer_index |= (endpoint & LIBUSB20_ENDPOINT_ADDRESS_MASK) * 4;
 
        if (endpoint & LIBUSB20_ENDPOINT_DIR_MASK) {
                /* this is an IN endpoint */
-               index |= 2;
+               xfer_index |= 2;
        }
-       return (libusb20_tr_get_pointer(pdev, index));
+       return (libusb20_tr_get_pointer(pdev, xfer_index));
 }
 
 int
@@ -1298,7 +1343,7 @@ libusb_submit_transfer(struct libusb_transfer *uxfer)
        struct libusb20_transfer *pxfer1;
        struct libusb_super_transfer *sxfer;
        struct libusb_device *dev;
-       uint32_t endpoint;
+       uint8_t endpoint;
        int err;
 
        if (uxfer == NULL)
@@ -1309,9 +1354,6 @@ libusb_submit_transfer(struct libusb_transfer *uxfer)
 
        endpoint = uxfer->endpoint;
 
-       if (endpoint > 255)
-               return (LIBUSB_ERROR_INVALID_PARAM);
-
        dev = libusb_get_device(uxfer->dev_handle);
 
        DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_submit_transfer enter");
@@ -1361,7 +1403,7 @@ libusb_cancel_transfer(struct libusb_transfer *uxfer)
        struct libusb20_transfer *pxfer1;
        struct libusb_super_transfer *sxfer;
        struct libusb_device *dev;
-       uint32_t endpoint;
+       uint8_t endpoint;
        int retval;
 
        if (uxfer == NULL)
@@ -1373,9 +1415,6 @@ libusb_cancel_transfer(struct libusb_transfer *uxfer)
 
        endpoint = uxfer->endpoint;
 
-       if (endpoint > 255)
-               return (LIBUSB_ERROR_INVALID_PARAM);
-
        dev = libusb_get_device(uxfer->dev_handle);
 
        DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_cancel_transfer enter");
index d2a2bd7..722da45 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb10.h,v 1.4 2009/11/20 08:57:25 thompsa Exp $ */
 /*-
  * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
  *
index 6d5822e..bcf4510 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb10_desc.c,v 1.11 2012/05/07 14:07:13 hselasky Exp $ */
 /*-
  * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
  *
@@ -293,6 +293,25 @@ libusb_free_config_descriptor(struct libusb_config_descriptor *config)
        free(config);
 }
 
+int
+libusb_get_string_descriptor(libusb_device_handle *pdev,
+    uint8_t desc_index, uint16_t langid, unsigned char *data,
+    int length)
+{
+       if (pdev == NULL || data == NULL || length < 1)
+               return (LIBUSB_ERROR_INVALID_PARAM);
+
+       if (length > 65535)
+               length = 65535;
+
+       /* put some default data into the destination buffer */
+       data[0] = 0;
+
+       return (libusb_control_transfer(pdev, LIBUSB_ENDPOINT_IN,
+           LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | desc_index,
+           langid, data, length, 1000));
+}
+
 int
 libusb_get_string_descriptor_ascii(libusb_device_handle *pdev,
     uint8_t desc_index, unsigned char *data, int length)
@@ -390,8 +409,8 @@ libusb_parse_bos_descriptor(const void *buf, int len,
     struct libusb_bos_descriptor **bos)
 {
        struct libusb_bos_descriptor *ptr;
-       struct libusb_usb_2_0_device_capability_descriptor *dcap_20;
-       struct libusb_ss_usb_device_capability_descriptor *ss_cap;
+       struct libusb_usb_2_0_device_capability_descriptor *dcap_20 = NULL;
+       struct libusb_ss_usb_device_capability_descriptor *ss_cap = NULL;
 
        if (buf == NULL || bos == NULL || len < 1)
                return (LIBUSB_ERROR_INVALID_PARAM);
@@ -438,7 +457,7 @@ libusb_parse_bos_descriptor(const void *buf, int len,
                    dtype == LIBUSB_DT_DEVICE_CAPABILITY) {
                        switch (((const uint8_t *)buf)[2]) {
                        case LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY:
-                               if (ptr->usb_2_0_ext_cap != NULL)
+                               if (ptr->usb_2_0_ext_cap != NULL || dcap_20 == NULL)
                                        break;
                                if (dlen < LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY_SIZE)
                                        break;
@@ -455,7 +474,7 @@ libusb_parse_bos_descriptor(const void *buf, int len,
                                break;
 
                        case LIBUSB_SS_USB_DEVICE_CAPABILITY:
-                               if (ptr->ss_usb_cap != NULL)
+                               if (ptr->ss_usb_cap != NULL || ss_cap == NULL)
                                        break;
                                if (dlen < LIBUSB_SS_USB_DEVICE_CAPABILITY_SIZE)
                                        break;
index 380e312..30995e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb10_io.c,v 1.11 2012/06/12 07:28:25 hselasky Exp $ */
 /*-
  * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
  *
@@ -307,12 +307,16 @@ libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)
                    &ctx->ctx_lock);
                return (0);
        }
-       err = clock_gettime(CLOCK_REALTIME, &ts);
+       err = clock_gettime(CLOCK_MONOTONIC, &ts);
        if (err < 0)
                return (LIBUSB_ERROR_OTHER);
 
-       ts.tv_sec = tv->tv_sec;
-       ts.tv_nsec = tv->tv_usec * 1000;
+       /*
+        * The "tv" arguments points to a relative time structure and
+        * not an absolute time structure.
+        */
+       ts.tv_sec += tv->tv_sec;
+       ts.tv_nsec += tv->tv_usec * 1000;
        if (ts.tv_nsec >= 1000000000) {
                ts.tv_nsec -= 1000000000;
                ts.tv_sec++;
@@ -481,7 +485,7 @@ libusb10_do_transfer(libusb_device_handle *devh,
 {
        libusb_context *ctx;
        struct libusb_transfer *xfer;
-       volatile int complet;
+       int done;
        int ret;
 
        if (devh == NULL)
@@ -502,15 +506,15 @@ libusb10_do_transfer(libusb_device_handle *devh,
        xfer->timeout = timeout;
        xfer->buffer = data;
        xfer->length = length;
-       xfer->user_data = (void *)&complet;
+       xfer->user_data = (void *)&done;
        xfer->callback = libusb10_do_transfer_cb;
-       complet = 0;
+       done = 0;
 
        if ((ret = libusb_submit_transfer(xfer)) < 0) {
                libusb_free_transfer(xfer);
                return (ret);
        }
-       while (complet == 0) {
+       while (done == 0) {
                if ((ret = libusb_handle_events(ctx)) < 0) {
                        libusb_cancel_transfer(xfer);
                        usleep(1000);   /* nice it */
@@ -581,7 +585,7 @@ libusb_interrupt_transfer(libusb_device_handle *devh,
 }
 
 uint8_t *
-libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index)
+libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t off)
 {
        uint8_t *ptr;
        uint32_t n;
@@ -589,35 +593,35 @@ libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index)
        if (transfer->num_iso_packets < 0)
                return (NULL);
 
-       if (index >= (uint32_t)transfer->num_iso_packets)
+       if (off >= (uint32_t)transfer->num_iso_packets)
                return (NULL);
 
        ptr = transfer->buffer;
        if (ptr == NULL)
                return (NULL);
 
-       for (n = 0; n != index; n++) {
+       for (n = 0; n != off; n++) {
                ptr += transfer->iso_packet_desc[n].length;
        }
        return (ptr);
 }
 
 uint8_t *
-libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index)
+libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t off)
 {
        uint8_t *ptr;
 
        if (transfer->num_iso_packets < 0)
                return (NULL);
 
-       if (index >= (uint32_t)transfer->num_iso_packets)
+       if (off >= (uint32_t)transfer->num_iso_packets)
                return (NULL);
 
        ptr = transfer->buffer;
        if (ptr == NULL)
                return (NULL);
 
-       ptr += transfer->iso_packet_desc[0].length * index;
+       ptr += transfer->iso_packet_desc[0].length * off;
 
        return (ptr);
 }
index bd167b2..47f72d9 100644 (file)
@@ -24,9 +24,9 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD$
+.\" $FreeBSD: src/lib/libusb/libusb20.3,v 1.17 2012/08/13 18:10:52 hselasky Exp $
 .\"
-.Dd October 14, 2010
+.Dd October 14, 2012
 .Dt LIBUSB20 3
 .Os
 .Sh NAME
@@ -235,7 +235,6 @@ applications should consider using
 .
 .Sh USB TRANSFER OPERATIONS
 .
-.Pp
 .
 .Fn libusb20_tr_close
 will release all kernel resources associated with an USB
@@ -332,7 +331,7 @@ packets are avoided for proxy buffers.
 .Pp
 .
 .Fn libusb20_tr_get_max_total_length
-function will return the maximum value for the data length sum of all USB
+will return the maximum value for the data length sum of all USB
 frames associated with an USB transfer.
 In case of control transfers the value returned does not include the
 length of the SETUP packet, 8 bytes, which is part of frame zero.
@@ -402,7 +401,7 @@ The callback type is defined by libusb20_tr_callback_t.
 .
 .Fn libusb20_tr_set_flags
 is used to set various USB flags for the given USB transfer.
-.Bl -tag
+.Bl -tag -width "LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK"
 .It LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK
 Report a short frame as error.
 .It LIBUSB20_TRANSFER_MULTI_SHORT_NOT_OK
@@ -534,7 +533,6 @@ with an USB transfer.
 .
 .Sh USB DEVICE OPERATIONS
 .
-.Pp
 .
 .Fn libusb20_dev_get_backend_name
 returns a zero terminated string describing the backend used.
@@ -542,7 +540,7 @@ returns a zero terminated string describing the backend used.
 .Pp
 .
 .Fn libusb20_dev_get_info
-retrieves the BSD specific usb_device_info structure into the memory location given by 
+retrieves the BSD specific usb_device_info structure into the memory location given by
 .Fa pinfo .
 The USB device given by
 .Fa pdev
@@ -711,13 +709,14 @@ This function returns zero if the device is still connected else a LIBUSB20_ERRO
 sets the power mode of the USB device.
 .
 Valid power modes:
-.Bl -tag
+.Bl -tag -width "LIBUSB20_POWER_OFF"
 .It LIBUSB20_POWER_OFF
 .It LIBUSB20_POWER_ON
 .It LIBUSB20_POWER_SAVE
 .It LIBUSB20_POWER_SUSPEND
 .It LIBUSB20_POWER_RESUME
 .El
+.Pp
 .
 This function returns zero on success else a LIBUSB20_ERROR value is
 returned.
@@ -795,7 +794,7 @@ Valid bus numbers start at zero.
 returns the current operation mode of the USB entity.
 .
 Valid return values are:
-.Bl -tag
+.Bl -tag -width "LIBUSB20_MODE_DEVICE"
 .It LIBUSB20_MODE_HOST
 .It LIBUSB20_MODE_DEVICE
 .El
@@ -805,7 +804,7 @@ Valid return values are:
 .Fn libusb20_dev_get_speed
 returns the current speed of the given USB device.
 .
-.Bl -tag
+.Bl -tag -width "LIBUSB20_SPEED_VARIABLE"
 .It LIBUSB20_SPEED_UNKNOWN
 .It LIBUSB20_SPEED_LOW
 .It LIBUSB20_SPEED_FULL
@@ -817,7 +816,7 @@ returns the current speed of the given USB device.
 .Pp
 .
 .Fn libusb20_dev_get_config_index
-This function returns the currently select config index for the given
+returns the currently selected config index for the given
 USB device.
 .
 .Pp
@@ -834,7 +833,7 @@ will set the debug level for the given USB device.
 .Pp
 .
 .Fn libusb20_dev_wait_process
-function will wait until a pending USB transfer has completed on
+will wait until a pending USB transfer has completed on
 the given USB device.
 .
 A timeout value can be specified which is passed on to the
@@ -868,7 +867,7 @@ returned.
 .Pp
 .
 .Fn libusb20_be_get_dev_quirk
-This function will return the device quirk according to
+will return the device quirk according to
 .Fa index
 into the libusb20_quirk structure pointed to by
 .Fa pq .
@@ -950,7 +949,7 @@ Dequeued USB devices will not be freed when the backend is freed.
 .Pp
 .
 .Fn libusb20_be_enqueue_device
-This function will enqueue the given USB device pointer in the backend USB device list.
+will enqueue the given USB device pointer in the backend USB device list.
 .
 Enqueued USB devices will get freed when the backend is freed.
 .
@@ -1000,7 +999,6 @@ The buffer pointer cannot be NULL.
 .
 .
 .Sh USB DEBUGGING
-.Pp
 .Ft const char *
 .Fn libusb20_strerror "int code"
 Get the ASCII representation of the error given by the
index 2aa3825..0cadca2 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20.c,v 1.15 2012/04/20 14:29:45 hselasky Exp $ */
 /*-
  * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved.
  *
@@ -948,9 +948,8 @@ libusb20_dev_get_config_index(struct libusb20_device *pdev)
        }
 
        error = pdev->methods->get_config_index(pdev, &cfg_index);
-       if (error) {
-               cfg_index = 0 - 1;      /* current config index */
-       }
+       if (error)
+               cfg_index = 0xFF;       /* current config index */
        if (do_close) {
                if (libusb20_dev_close(pdev)) {
                        /* ignore */
index e4359fc..a04c1e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20.h,v 1.11 2011/09/19 08:52:06 hselasky Exp $ */
 /*-
  * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved.
  * Copyright (c) 2007-2008 Daniel Drake.  All rights reserved.
index 0781067..ff2bb6f 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20_desc.c,v 1.6 2012/04/20 14:29:45 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
@@ -69,7 +69,7 @@ libusb20_parse_config_desc(const void *config_desc)
        uint16_t niface_no_alt;
        uint16_t niface;
        uint16_t nendpoint;
-       uint8_t iface_no;
+       uint16_t iface_no;
 
        ptr = config_desc;
        if (ptr[1] != LIBUSB20_DT_CONFIG) {
@@ -82,7 +82,7 @@ libusb20_parse_config_desc(const void *config_desc)
        niface_no_alt = 0;
        nendpoint = 0;
        niface = 0;
-       iface_no = 0 - 1;
+       iface_no = 0xFFFF;
        ptr = NULL;
 
        /* get "wTotalLength" and setup "pcdesc" */
@@ -155,7 +155,7 @@ libusb20_parse_config_desc(const void *config_desc)
 
        /* reset states */
        niface = 0;
-       iface_no = 0 - 1;
+       iface_no = 0xFFFF;
        ptr = NULL;
        lub_interface--;
        lub_endpoint--;
@@ -450,7 +450,7 @@ libusb20_me_encode(void *ptr, uint16_t len, const void *pd)
                                                 * and should be
                                                 * correct:
                                                 */
-                                               ps->len = 0 - 1;
+                                               ps->len = 0xFFFF;
                                        }
                                        src_len = libusb20_me_get_1(pd, 0);
                                        src_ptr = LIBUSB20_ADD_BYTES(ps->ptr, 1);
@@ -465,7 +465,7 @@ libusb20_me_encode(void *ptr, uint16_t len, const void *pd)
                                case LIBUSB20_ME_IS_DECODED:
                                        /* reserve 3 length bytes */
                                        src_len = libusb20_me_encode(NULL,
-                                           0 - 1 - 3, ps->ptr);
+                                           0xFFFF - 3, ps->ptr);
                                        src_ptr = NULL;
                                        break;
 
@@ -476,7 +476,7 @@ libusb20_me_encode(void *ptr, uint16_t len, const void *pd)
                                }
 
                                if (src_len > 0xFE) {
-                                       if (src_len > (uint16_t)(0 - 1 - 3))
+                                       if (src_len > (0xFFFF - 3))
                                                /* overflow */
                                                goto done;
 
@@ -516,7 +516,7 @@ libusb20_me_encode(void *ptr, uint16_t len, const void *pd)
                                                uint16_t dummy;
 
                                                dummy = libusb20_me_encode(buf,
-                                                   0 - 1 - 3, ps->ptr);
+                                                   0xFFFF - 3, ps->ptr);
                                        } else {
                                                bcopy(src_ptr, buf, src_len);
                                        }
index a069ee9..11d18e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20_desc.h,v 1.2 2011/11/09 19:03:26 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  * Copyright (c) 2007-2008 Daniel Drake.  All rights reserved.
index bef4d02..3807b26 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20_int.h,v 1.8 2011/06/24 11:14:09 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
index 3702717..bbb99e3 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/libusb20_ugen20.c,v 1.13 2012/04/20 14:29:45 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
@@ -104,7 +104,7 @@ ugen20_path_convert_one(const char **pp)
                temp += (*ptr - '0');
                if (temp >= 1000000) {
                        /* catch overflow early */
-                       return (0 - 1);
+                       return (0xFFFFFFFF);
                }
                ptr++;
        }
index dc3959e..75b9a44 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/lib/libusb/usb.h,v 1.5 2011/07/16 08:29:12 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
index 0aa51fa..40c800e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $FreeBSD$
+# $FreeBSD: src/usr.sbin/usbconfig/Makefile,v 1.3 2010/01/09 18:59:03 antoine Exp $
 #
 PROG=  usbconfig
 MAN=   usbconfig.8
index 7ee89da..0f188f1 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/usr.sbin/usbconfig/dump.c,v 1.7 2011/02/26 09:28:52 hselasky Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
index 581684a..c0ef239 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/usr.sbin/usbconfig/dump.h,v 1.4 2010/01/07 00:50:45 thompsa Exp $ */
 /*-
  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
index ae69737..a853716 100644 (file)
@@ -1,4 +1,4 @@
-.\" $FreeBSD$
+.\" $FreeBSD: src/usr.sbin/usbconfig/usbconfig.8,v 1.5 2010/11/10 23:45:44 n_hibma Exp $
 .\"
 .\" Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved.
 .\"
index a1fa694..3ce886c 100644 (file)
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: src/usr.sbin/usbconfig/usbconfig.c,v 1.11 2010/10/24 13:48:11 hselasky Exp $ */
 /*-
  * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved.
  *