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