PERFORCE change 165541 for review

Sylvestre Gallon syl at FreeBSD.org
Thu Jul 2 13:14:02 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165541

Change 165541 by syl at syl_pablo on 2009/07/02 13:13:34

	Add a a queue that contains a list of opened endpoints for a
	device handle.

Affected files ...

.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#15 edit
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#54 edit
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#21 edit

Differences ...

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#15 (text+ko) ====

@@ -200,6 +200,13 @@
 	uint8_t flags;
 };
 
+struct usb_ep_tr {
+	TAILQ_ENTRY(usb_ep_tr) list;
+	uint8_t addr;
+	uint8_t idx;
+	uint8_t flags;
+	void *os_priv;
+};
 /* libusb structures */
 
 typedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data);
@@ -259,6 +266,7 @@
 	TAILQ_ENTRY(libusb_device_handle) list;
 	struct libusb_device *dev;
 	void   *os_priv;
+	TAILQ_HEAD(ep_list, usb_ep_tr) ep_list; 
 }	libusb_device_handle;
 
 typedef struct libusb_device_descriptor {

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#54 (text+ko) ====

@@ -381,6 +381,7 @@
 	memset(hdl, 0, sizeof(*hdl));
 	pthread_mutex_init(&hdl->lock, NULL);
 
+	TAILQ_INIT(&hdl->ep_list);
 	hdl->dev = libusb_ref_device(dev);
 	hdl->claimed_interfaces = 0;
 	hdl->os_priv = dev->os_priv;
@@ -460,6 +461,7 @@
 {
 	libusb_context *ctx;
 	struct libusb20_device *pdev;
+	struct usb_ep_tr *eptr;
 	unsigned char dummy = 1;
 	int err;
 
@@ -486,6 +488,13 @@
 		usb_remove_pollfd(ctx, libusb20_dev_get_fd(pdev));
 		libusb20_dev_close(pdev);
 		libusb_unref_device(devh->dev);
+		TAILQ_FOREACH(eptr, &devh->ep_list, list) {
+			TAILQ_REMOVE(&devh->ep_list, eptr, list);
+			libusb20_tr_close(((libusb20_transfer *)eptr->os_priv)[0]);
+			if (eptr->flags)
+				libusb20_tr_close(((libusb20_transfer *)eptr->os_priv)[1]);
+			free((libusb20_transfer *)eptr->os_priv);
+		}
 		free(devh);
 
 		pthread_mutex_lock(&ctx->pollfd_modify_lock);
@@ -503,6 +512,13 @@
 	usb_remove_pollfd(ctx, libusb20_dev_get_fd(pdev));
 	libusb20_dev_close(pdev);
 	libusb_unref_device(devh->dev);
+	TAILQ_FOREACH(eptr, &devh->ep_list, list) {
+		TAILQ_REMOVE(&devh->ep_list, eptr, list);
+		libusb20_tr_close(((libusb20_transfer *)eptr->os_priv)[0]);
+		if (eptr->flags)
+			libusb20_tr_close(((libusb20_transfer *)eptr->os_priv)[1]);
+		free((libusb20_transfer *)eptr->os_priv);
+	}
 	free(devh);
 
 	pthread_mutex_lock(&ctx->pollfd_modify_lock);
@@ -1004,9 +1020,11 @@
 	struct usb_transfer *usb_backend;
 	struct usb_transfer *usb_node;
 	struct libusb20_device *pdev;
-	struct libusb_context *ctx;
+	struct usb_ep_tr *eptr;
 	struct timespec cur_ts;
 	struct timeval *cur_tv;
+	libusb_device_handle *devh;
+	libusb_context *ctx;
 	int maxframe;
 	int buffsize;
 	int num_frame;
@@ -1023,6 +1041,7 @@
 
 	ctx = xfer->dev_handle->dev->ctx;
 	pdev = xfer->dev_handle->os_priv;
+	devh = xfer->dev_handle;
 
 	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_submit_transfer enter");
 
@@ -1069,10 +1088,9 @@
 out:
 	pthread_mutex_unlock(&ctx->flying_transfers_lock);
 
-	usb20_xfer[0] = libusb20_tr_get_pointer(pdev, 
-	    ((xfer->endpoint / 0x40) | (xfer->endpoint * 4)) % (16 * 4));
-	usb20_xfer[1] = libusb20_tr_get_pointer(pdev,
-	    (((xfer->endpoint / 0x40) | (xfer->endpoint * 4)) % (16 * 4)) + 1);
+	ep_idx = (xfer->endpoints / 0x40) | (xfer->endpoints *4) % (16 * 4);
+	usb20_xfer[0] = libusb20_tr_get_pointer(pdev, ep_idx);
+	usb20_xfer[1] = libusb20_tr_get_pointer(pdev, ep_idx + 1);
 	
 	if (usb20_xfer[0] == NULL)
 		return (LIBUSB_ERROR_OTHER);
@@ -1084,18 +1102,31 @@
 	buffsize = libusb_get_buffsize(pdev, xfer);
 	maxframe = libusb_get_maxframe(pdev, xfer);
 	
-	ret = libusb20_tr_open(usb20_xfer[0], buffsize, 
-	    maxframe, xfer->endpoint);
-	if (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
-		ret |= libusb20_tr_open(usb20_xfer[1], buffsize,
-		    maxframe, xfer->endpoint);
+	ret = 0;
+	TAILQ_FOREACH(eptr, &devh->ep_list, list) {
+		if (xfer->endpoint == eptr->addr)
+			ret++;
+	}
+	if (ret == 0) {
+		eptr = malloc(sizeof(usb_ep_tr));
+		eptr.addr = xfer->endpoint;
+		eptr.idx = ep_idx;
+		eptr.os_priv = usb20_xfer;
+		eptr.flags = (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)?1:0; 
+		TAILQ_INSERT_HEAD(&devh->ep_list, eptr, list);
+		ret = libusb20_tr_open(usb20_xfer[0], buffsize, 
+	    		maxframe, xfer->endpoint);
+		if (xfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
+			ret |= libusb20_tr_open(usb20_xfer[1], buffsize,
+		    	maxframe, xfer->endpoint);
        
-	if (ret != 0) {
-		pthread_mutex_unlock(&libusb20_lock);
-		pthread_mutex_lock(&ctx->flying_transfers_lock);
-		TAILQ_REMOVE(&ctx->flying_transfers, usb_backend, list);
-		pthread_mutex_unlock(&ctx->flying_transfers_lock);
-		return (LIBUSB_ERROR_OTHER);
+		if (ret != 0) {
+			pthread_mutex_unlock(&libusb20_lock);
+			pthread_mutex_lock(&ctx->flying_transfers_lock);
+			TAILQ_REMOVE(&ctx->flying_transfers, usb_backend, list);
+			pthread_mutex_unlock(&ctx->flying_transfers_lock);
+			return (LIBUSB_ERROR_OTHER);
+		}
 	}
 
 	libusb20_tr_set_priv_sc0(usb20_xfer[0], xfer);

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#21 (text+ko) ====



More information about the p4-projects mailing list