aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2020-02-03 11:17:34 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2020-02-03 11:17:34 +0000
commit354bc7e49b35960a032f8bc00a9feaef153a1bc7 (patch)
tree75dc034509be198893428c28bf48d4f06db13000
parent94d1b9a04ae20fd905b14208a1842bbedd1aacfb (diff)
MFC r349409 and r349410:
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. Sponsored by: Mellanox Technologies
Notes
svn path=/stable/9/; revision=357440
-rw-r--r--lib/libusb/libusb10.h4
-rw-r--r--lib/libusb/libusb10_hotplug.c35
2 files changed, 26 insertions, 13 deletions
diff --git a/lib/libusb/libusb10.h b/lib/libusb/libusb10.h
index fa5c6b625a44..b29d381ee091 100644
--- a/lib/libusb/libusb10.h
+++ b/lib/libusb/libusb10.h
@@ -85,6 +85,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;
@@ -102,7 +104,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;
diff --git a/lib/libusb/libusb10_hotplug.c b/lib/libusb/libusb10_hotplug.c
index 162cf2bbb5af..96e3bf9a12ca 100644
--- a/lib/libusb/libusb10_hotplug.c
+++ b/lib/libusb/libusb10_hotplug.c
@@ -1,6 +1,6 @@
/* $FreeBSD$ */
/*-
- * Copyright (c) 2016 Hans Petter Selasky. All rights reserved.
+ * Copyright (c) 2016-2019 Hans Petter Selasky. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -85,20 +85,35 @@ libusb_hotplug_filter(libusb_context *ctx, libusb_hotplug_callback_handle pcbh,
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;
}
@@ -191,6 +200,8 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
HOTPLUG_LOCK(ctx);
if (ctx->hotplug_handler == NO_THREAD) {
+ libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
+
if (pthread_create(&ctx->hotplug_handler, NULL,
&libusb_hotplug_scan, ctx) != 0)
ctx->hotplug_handler = NO_THREAD;