The branch main has been updated by hselasky:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=6847ea50196f1a685be408a24f01cb8d407da19c

commit 6847ea50196f1a685be408a24f01cb8d407da19c
Author:     Hans Petter Selasky <hsela...@freebsd.org>
AuthorDate: 2021-06-11 15:06:10 +0000
Commit:     Hans Petter Selasky <hsela...@freebsd.org>
CommitDate: 2021-06-11 15:06:44 +0000

    Improve handling of USB device re-open in the LibUSB v1.x API.
    
    Make sure the "device_is_gone" flag is cleared after every successful open,
    so that the "device_is_gone" flag doesn't persist forever.
    
    Found by:       sergii.dmyt...@3mdeb.com
    PR:             256296
    MFC after:      1 week
    Sponsored by:   Mellanox Technologies // NVIDIA Networking
---
 lib/libusb/libusb10.c    |  9 +++++++++
 lib/libusb/libusb10_io.c | 12 ++++++++++--
 lib/libusb/libusb20.c    |  5 +++++
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 1c45b87d8f0b..ffe0cf3f366a 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -529,6 +529,15 @@ libusb_open(libusb_device *dev, libusb_device_handle 
**devh)
                libusb_unref_device(dev);
                return (LIBUSB_ERROR_NO_MEM);
        }
+
+       /*
+        * Clear the device gone flag, in case the device was opened
+        * after a re-attach, to allow new transaction:
+        */
+       CTX_LOCK(ctx);
+       dev->device_is_gone = 0;
+       CTX_UNLOCK(ctx);
+
        libusb10_add_pollfd(ctx, &dev->dev_poll, pdev, 
libusb20_dev_get_fd(pdev), POLLIN |
            POLLOUT | POLLRDNORM | POLLWRNORM);
 
diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c
index 53f5b040436d..0e32fc31c8e0 100644
--- a/lib/libusb/libusb10_io.c
+++ b/lib/libusb/libusb10_io.c
@@ -165,8 +165,16 @@ libusb10_handle_events_sub(struct libusb_context *ctx, 
struct timeval *tv)
                                err = libusb20_dev_process(ppdev[i]);
 
                                if (err) {
-                                       /* set device is gone */
-                                       dev->device_is_gone = 1;
+                                       /*
+                                        * When the device is opened
+                                        * set the "device_is_gone"
+                                        * flag. This prevents the
+                                        * client from submitting new
+                                        * USB transfers to a detached
+                                        * device.
+                                        */
+                                       if (ppdev[i]->is_opened)
+                                               dev->device_is_gone = 1;
 
                                        /* remove USB device from polling loop 
*/
                                        libusb10_remove_pollfd(dev->ctx, 
&dev->dev_poll);
diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
index 6c2bf721bea9..4323552b83ad 100644
--- a/lib/libusb/libusb20.c
+++ b/lib/libusb/libusb20.c
@@ -608,6 +608,11 @@ libusb20_dev_close(struct libusb20_device *pdev)
 
        pdev->is_opened = 0;
 
+       /*
+        * Make sure libusb20_tr_get_pointer() fails:
+        */
+       pdev->nTransfer = 0;
+
        /* 
         * The following variable is only used by the libusb v0.1
         * compat layer:
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to