Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Jun 2016 10:43:31 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r302272 - stable/10/lib/libusb
Message-ID:  <201606291043.u5TAhVvL061237@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Wed Jun 29 10:43:31 2016
New Revision: 302272
URL: https://svnweb.freebsd.org/changeset/base/302272

Log:
  MFC r301842:
  Implement code to stop all USB endpoints before executing a USB device
  reset command, alternate setting command or set configuration
  command. Else LibUSB v1.0 will not re-open the endpoints which the
  kernel closes and the USB application might wait infinitely for
  transfers to complete.

Modified:
  stable/10/lib/libusb/libusb10.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libusb/libusb10.c
==============================================================================
--- stable/10/lib/libusb/libusb10.c	Wed Jun 29 10:40:34 2016	(r302271)
+++ stable/10/lib/libusb/libusb10.c	Wed Jun 29 10:43:31 2016	(r302272)
@@ -51,6 +51,8 @@
 #include "libusb.h"
 #include "libusb10.h"
 
+#define	LIBUSB_NUM_SW_ENDPOINTS	(16 * 4)
+
 static pthread_mutex_t default_context_lock = PTHREAD_MUTEX_INITIALIZER;
 struct libusb_context *usbi_default_context = NULL;
 
@@ -442,7 +444,7 @@ libusb_open(libusb_device *dev, libusb_d
 	if (dev == NULL)
 		return (LIBUSB_ERROR_INVALID_PARAM);
 
-	err = libusb20_dev_open(pdev, 16 * 4 /* number of endpoints */ );
+	err = libusb20_dev_open(pdev, LIBUSB_NUM_SW_ENDPOINTS);
 	if (err) {
 		libusb_unref_device(dev);
 		return (LIBUSB_ERROR_NO_MEM);
@@ -1489,7 +1491,17 @@ libusb_cancel_transfer(struct libusb_tra
 UNEXPORTED void
 libusb10_cancel_all_transfer(libusb_device *dev)
 {
-	/* TODO */
+	struct libusb20_device *pdev = dev->os_priv;
+	unsigned x;
+
+	for (x = 0; x != LIBUSB_NUM_SW_ENDPOINTS; x++) {
+		struct libusb20_transfer *xfer;
+
+		xfer = libusb20_tr_get_pointer(pdev, x);
+		if (xfer == NULL)
+			continue;
+		libusb20_tr_close(xfer);
+	}
 }
 
 uint16_t



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