Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jun 2019 11:28:08 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349409 - head/lib/libusb
Message-ID:  <201906261128.x5QBS8Jx088459@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906261128.x5QBS8Jx088459>