From owner-p4-projects@FreeBSD.ORG Thu Jul 2 13:14:01 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 250ED10656A3; Thu, 2 Jul 2009 13:14:01 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BC1ED1065697 for ; Thu, 2 Jul 2009 13:14:00 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A90AC8FC1E for ; Thu, 2 Jul 2009 13:14:00 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n62DE0x5097249 for ; Thu, 2 Jul 2009 13:14:00 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n62DE0jB097247 for perforce@freebsd.org; Thu, 2 Jul 2009 13:14:00 GMT (envelope-from syl@FreeBSD.org) Date: Thu, 2 Jul 2009 13:14:00 GMT Message-Id: <200907021314.n62DE0jB097247@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to syl@FreeBSD.org using -f From: Sylvestre Gallon To: Perforce Change Reviews Cc: Subject: PERFORCE change 165541 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Jul 2009 13:14:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=165541 Change 165541 by syl@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) ====