Author: hselasky
Date: Wed Jun 26 11:28:08 2019
New Revision: 349409
URL: https://svnweb.freebsd.org/changeset/base/349409

Log:
  Fix support for LIBUSB_HOTPLUG_ENUMERATE in libusb. Currently all
  devices are enumerated regardless of of the LIBUSB_HOTPLUG_ENUMERATE
  flag. Make sure when the flag is not specified no arrival events are
  generated for currently enumerated devices.
  
  MFC after:    3 days
  Sponsored by: Mellanox Technologies

Modified:
  head/lib/libusb/libusb10.h
  head/lib/libusb/libusb10_hotplug.c

Modified: head/lib/libusb/libusb10.h
==============================================================================
--- head/lib/libusb/libusb10.h  Wed Jun 26 07:38:31 2019        (r349408)
+++ head/lib/libusb/libusb10.h  Wed Jun 26 11:28:08 2019        (r349409)
@@ -89,6 +89,8 @@ struct libusb_hotplug_callback_handle_struct {
        void *user_data;
 };
 
+TAILQ_HEAD(libusb_device_head, libusb_device);
+
 struct libusb_context {
        int     debug;
        int     debug_fixed;
@@ -106,7 +108,7 @@ struct libusb_context {
        TAILQ_HEAD(, libusb_super_pollfd) pollfds;
        TAILQ_HEAD(, libusb_super_transfer) tr_done;
        TAILQ_HEAD(, libusb_hotplug_callback_handle_struct) hotplug_cbh;
-       TAILQ_HEAD(, libusb_device) hotplug_devs;
+       struct libusb_device_head hotplug_devs;
 
        struct libusb_super_pollfd ctx_poll;
 

Modified: head/lib/libusb/libusb10_hotplug.c
==============================================================================
--- head/lib/libusb/libusb10_hotplug.c  Wed Jun 26 07:38:31 2019        
(r349408)
+++ head/lib/libusb/libusb10_hotplug.c  Wed Jun 26 11:28:08 2019        
(r349409)
@@ -85,20 +85,35 @@ libusb_hotplug_filter(libusb_context *ctx, libusb_hotp
        return (pcbh->fn(ctx, dev, event, pcbh->user_data));
 }
 
+static int
+libusb_hotplug_enumerate(libusb_context *ctx, struct libusb_device_head *phead)
+{
+       libusb_device **ppdev;
+       ssize_t count;
+       ssize_t x;
+
+       count = libusb_get_device_list(ctx, &ppdev);
+       if (count < 0)
+               return (-1);
+
+       for (x = 0; x != count; x++)
+               TAILQ_INSERT_TAIL(phead, ppdev[x], hotplug_entry);
+
+       libusb_free_device_list(ppdev, 0);
+       return (0);
+}
+
 static void *
 libusb_hotplug_scan(void *arg)
 {
-       TAILQ_HEAD(, libusb_device) hotplug_devs;
+       struct libusb_device_head hotplug_devs;
        libusb_hotplug_callback_handle acbh;
        libusb_hotplug_callback_handle bcbh;
        libusb_context *ctx = arg;
-       libusb_device **ppdev;
        libusb_device *temp;
        libusb_device *adev;
        libusb_device *bdev;
        unsigned do_loop = 1;
-       ssize_t count;
-       ssize_t x;
 
        while (do_loop) {
                usleep(4000000);
@@ -108,14 +123,8 @@ libusb_hotplug_scan(void *arg)
                TAILQ_INIT(&hotplug_devs);
 
                if (ctx->hotplug_handler != NO_THREAD) {
-                       count = libusb_get_device_list(ctx, &ppdev);
-                       if (count < 0)
+                       if (libusb_hotplug_enumerate(ctx, &hotplug_devs) < 0)
                                continue;
-                       for (x = 0; x != count; x++) {
-                               TAILQ_INSERT_TAIL(&hotplug_devs, ppdev[x],
-                                   hotplug_entry);
-                       }
-                       libusb_free_device_list(ppdev, 0);
                } else {
                        do_loop = 0;
                }
@@ -201,6 +210,8 @@ int libusb_hotplug_register_callback(libusb_context *c
        handle->devclass = dev_class;
        handle->fn = cb_fn;
        handle->user_data = user_data;
+
+       libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
 
        if (flags & LIBUSB_HOTPLUG_ENUMERATE) {
                TAILQ_FOREACH(adev, &ctx->hotplug_devs, hotplug_entry) {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to