libusb10.c revision 338788
1/* $FreeBSD: stable/11/lib/libusb/libusb10.c 338788 2018-09-19 07:56:19Z hselasky $ */
2/*-
3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
4 * Copyright (c) 2009 Hans Petter Selasky. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#ifdef LIBUSB_GLOBAL_INCLUDE_FILE
29#include LIBUSB_GLOBAL_INCLUDE_FILE
30#else
31#include <assert.h>
32#include <errno.h>
33#include <poll.h>
34#include <pthread.h>
35#include <stdio.h>
36#include <stdlib.h>
37#include <string.h>
38#include <unistd.h>
39#include <time.h>
40#include <sys/fcntl.h>
41#include <sys/ioctl.h>
42#include <sys/queue.h>
43#include <sys/endian.h>
44#endif
45
46#define	libusb_device_handle libusb20_device
47
48#include "libusb20.h"
49#include "libusb20_desc.h"
50#include "libusb20_int.h"
51#include "libusb.h"
52#include "libusb10.h"
53
54#define	LIBUSB_NUM_SW_ENDPOINTS	(16 * 4)
55
56static pthread_mutex_t default_context_lock = PTHREAD_MUTEX_INITIALIZER;
57struct libusb_context *usbi_default_context = NULL;
58
59/* Prototypes */
60
61static struct libusb20_transfer *libusb10_get_transfer(struct libusb20_device *, uint8_t, uint8_t);
62static int libusb10_get_buffsize(struct libusb20_device *, libusb_transfer *);
63static int libusb10_convert_error(uint8_t status);
64static void libusb10_complete_transfer(struct libusb20_transfer *, struct libusb_super_transfer *, int);
65static void libusb10_isoc_proxy(struct libusb20_transfer *);
66static void libusb10_bulk_intr_proxy(struct libusb20_transfer *);
67static void libusb10_ctrl_proxy(struct libusb20_transfer *);
68static void libusb10_submit_transfer_sub(struct libusb20_device *, uint8_t);
69
70/*  Library initialisation / deinitialisation */
71
72static const struct libusb_version libusb_version = {
73	.major = 1,
74	.minor = 0,
75	.micro = 0,
76	.nano = 2016,
77	.rc = "",
78	.describe = "http://www.freebsd.org"
79};
80
81const struct libusb_version *
82libusb_get_version(void)
83{
84
85	return (&libusb_version);
86}
87
88void
89libusb_set_debug(libusb_context *ctx, int level)
90{
91	ctx = GET_CONTEXT(ctx);
92	if (ctx)
93		ctx->debug = level;
94}
95
96static void
97libusb_set_nonblocking(int f)
98{
99	int flags;
100
101	/*
102	 * We ignore any failures in this function, hence the
103	 * non-blocking flag is not critical to the operation of
104	 * libUSB. We use F_GETFL and F_SETFL to be compatible with
105	 * Linux.
106	 */
107
108	flags = fcntl(f, F_GETFL, NULL);
109	if (flags == -1)
110		return;
111	flags |= O_NONBLOCK;
112	fcntl(f, F_SETFL, flags);
113}
114
115static void
116libusb10_wakeup_event_loop(libusb_context *ctx)
117{
118	uint8_t dummy = 0;
119	int err;
120
121	err = write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
122	if (err < (int)sizeof(dummy)) {
123		/* ignore error, if any */
124		DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "Waking up event loop failed!");
125	}
126}
127
128int
129libusb_init(libusb_context **context)
130{
131	struct libusb_context *ctx;
132	pthread_condattr_t attr;
133	char *debug;
134	int ret;
135
136	ctx = malloc(sizeof(*ctx));
137	if (!ctx)
138		return (LIBUSB_ERROR_INVALID_PARAM);
139
140	memset(ctx, 0, sizeof(*ctx));
141
142	debug = getenv("LIBUSB_DEBUG");
143	if (debug != NULL) {
144		ctx->debug = atoi(debug);
145		if (ctx->debug != 0)
146			ctx->debug_fixed = 1;
147	}
148	TAILQ_INIT(&ctx->pollfds);
149	TAILQ_INIT(&ctx->tr_done);
150	TAILQ_INIT(&ctx->hotplug_cbh);
151	TAILQ_INIT(&ctx->hotplug_devs);
152
153	if (pthread_mutex_init(&ctx->ctx_lock, NULL) != 0) {
154		free(ctx);
155		return (LIBUSB_ERROR_NO_MEM);
156	}
157	if (pthread_mutex_init(&ctx->hotplug_lock, NULL) != 0) {
158		pthread_mutex_destroy(&ctx->ctx_lock);
159		free(ctx);
160		return (LIBUSB_ERROR_NO_MEM);
161	}
162	if (pthread_condattr_init(&attr) != 0) {
163		pthread_mutex_destroy(&ctx->ctx_lock);
164		pthread_mutex_destroy(&ctx->hotplug_lock);
165		free(ctx);
166		return (LIBUSB_ERROR_NO_MEM);
167	}
168	if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) != 0) {
169		pthread_mutex_destroy(&ctx->ctx_lock);
170		pthread_mutex_destroy(&ctx->hotplug_lock);
171		pthread_condattr_destroy(&attr);
172		free(ctx);
173		return (LIBUSB_ERROR_OTHER);
174	}
175	if (pthread_cond_init(&ctx->ctx_cond, &attr) != 0) {
176		pthread_mutex_destroy(&ctx->ctx_lock);
177		pthread_mutex_destroy(&ctx->hotplug_lock);
178		pthread_condattr_destroy(&attr);
179		free(ctx);
180		return (LIBUSB_ERROR_NO_MEM);
181	}
182	pthread_condattr_destroy(&attr);
183
184	ctx->ctx_handler = NO_THREAD;
185	ctx->hotplug_handler = NO_THREAD;
186
187	ret = pipe(ctx->ctrl_pipe);
188	if (ret < 0) {
189		pthread_mutex_destroy(&ctx->ctx_lock);
190		pthread_mutex_destroy(&ctx->hotplug_lock);
191		pthread_cond_destroy(&ctx->ctx_cond);
192		free(ctx);
193		return (LIBUSB_ERROR_OTHER);
194	}
195	/* set non-blocking mode on the control pipe to avoid deadlock */
196	libusb_set_nonblocking(ctx->ctrl_pipe[0]);
197	libusb_set_nonblocking(ctx->ctrl_pipe[1]);
198
199	libusb10_add_pollfd(ctx, &ctx->ctx_poll, NULL, ctx->ctrl_pipe[0], POLLIN);
200
201	pthread_mutex_lock(&default_context_lock);
202	if (usbi_default_context == NULL) {
203		usbi_default_context = ctx;
204	}
205	pthread_mutex_unlock(&default_context_lock);
206
207	if (context)
208		*context = ctx;
209
210	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_init complete");
211
212	return (0);
213}
214
215void
216libusb_exit(libusb_context *ctx)
217{
218	ctx = GET_CONTEXT(ctx);
219
220	if (ctx == NULL)
221		return;
222
223	/* stop hotplug thread, if any */
224
225	if (ctx->hotplug_handler != NO_THREAD) {
226		pthread_t td;
227		void *ptr;
228
229		HOTPLUG_LOCK(ctx);
230		td = ctx->hotplug_handler;
231		ctx->hotplug_handler = NO_THREAD;
232		HOTPLUG_UNLOCK(ctx);
233
234		pthread_join(td, &ptr);
235	}
236
237	/* XXX cleanup devices */
238
239	libusb10_remove_pollfd(ctx, &ctx->ctx_poll);
240	close(ctx->ctrl_pipe[0]);
241	close(ctx->ctrl_pipe[1]);
242	pthread_mutex_destroy(&ctx->ctx_lock);
243	pthread_mutex_destroy(&ctx->hotplug_lock);
244	pthread_cond_destroy(&ctx->ctx_cond);
245
246	pthread_mutex_lock(&default_context_lock);
247	if (ctx == usbi_default_context) {
248		usbi_default_context = NULL;
249	}
250	pthread_mutex_unlock(&default_context_lock);
251
252	free(ctx);
253}
254
255/* Device handling and initialisation. */
256
257ssize_t
258libusb_get_device_list(libusb_context *ctx, libusb_device ***list)
259{
260	struct libusb20_backend *usb_backend;
261	struct libusb20_device *pdev;
262	struct libusb_device *dev;
263	int i;
264
265	ctx = GET_CONTEXT(ctx);
266
267	if (ctx == NULL)
268		return (LIBUSB_ERROR_INVALID_PARAM);
269
270	if (list == NULL)
271		return (LIBUSB_ERROR_INVALID_PARAM);
272
273	usb_backend = libusb20_be_alloc_default();
274	if (usb_backend == NULL)
275		return (LIBUSB_ERROR_NO_MEM);
276
277	/* figure out how many USB devices are present */
278	pdev = NULL;
279	i = 0;
280	while ((pdev = libusb20_be_device_foreach(usb_backend, pdev)))
281		i++;
282
283	/* allocate device pointer list */
284	*list = malloc((i + 1) * sizeof(void *));
285	if (*list == NULL) {
286		libusb20_be_free(usb_backend);
287		return (LIBUSB_ERROR_NO_MEM);
288	}
289	/* create libusb v1.0 compliant devices */
290	i = 0;
291	while ((pdev = libusb20_be_device_foreach(usb_backend, NULL))) {
292
293		dev = malloc(sizeof(*dev));
294		if (dev == NULL) {
295			while (i != 0) {
296				libusb_unref_device((*list)[i - 1]);
297				i--;
298			}
299			free(*list);
300			*list = NULL;
301			libusb20_be_free(usb_backend);
302			return (LIBUSB_ERROR_NO_MEM);
303		}
304		/* get device into libUSB v1.0 list */
305		libusb20_be_dequeue_device(usb_backend, pdev);
306
307		memset(dev, 0, sizeof(*dev));
308
309		/* init transfer queues */
310		TAILQ_INIT(&dev->tr_head);
311
312		/* set context we belong to */
313		dev->ctx = ctx;
314
315		/* link together the two structures */
316		dev->os_priv = pdev;
317		pdev->privLuData = dev;
318
319		(*list)[i] = libusb_ref_device(dev);
320		i++;
321	}
322	(*list)[i] = NULL;
323
324	libusb20_be_free(usb_backend);
325	return (i);
326}
327
328void
329libusb_free_device_list(libusb_device **list, int unref_devices)
330{
331	int i;
332
333	if (list == NULL)
334		return;			/* be NULL safe */
335
336	if (unref_devices) {
337		for (i = 0; list[i] != NULL; i++)
338			libusb_unref_device(list[i]);
339	}
340	free(list);
341}
342
343uint8_t
344libusb_get_bus_number(libusb_device *dev)
345{
346	if (dev == NULL)
347		return (0);		/* should not happen */
348	return (libusb20_dev_get_bus_number(dev->os_priv));
349}
350
351uint8_t
352libusb_get_port_number(libusb_device *dev)
353{
354	if (dev == NULL)
355		return (0);		/* should not happen */
356	return (libusb20_dev_get_parent_port(dev->os_priv));
357}
358
359int
360libusb_get_port_numbers(libusb_device *dev, uint8_t *buf, uint8_t bufsize)
361{
362	return (libusb20_dev_get_port_path(dev->os_priv, buf, bufsize));
363}
364
365int
366libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t *buf,
367    uint8_t bufsize)
368{
369	return (libusb20_dev_get_port_path(dev->os_priv, buf, bufsize));
370}
371
372uint8_t
373libusb_get_device_address(libusb_device *dev)
374{
375	if (dev == NULL)
376		return (0);		/* should not happen */
377	return (libusb20_dev_get_address(dev->os_priv));
378}
379
380enum libusb_speed
381libusb_get_device_speed(libusb_device *dev)
382{
383	if (dev == NULL)
384		return (LIBUSB_SPEED_UNKNOWN);	/* should not happen */
385
386	switch (libusb20_dev_get_speed(dev->os_priv)) {
387	case LIBUSB20_SPEED_LOW:
388		return (LIBUSB_SPEED_LOW);
389	case LIBUSB20_SPEED_FULL:
390		return (LIBUSB_SPEED_FULL);
391	case LIBUSB20_SPEED_HIGH:
392		return (LIBUSB_SPEED_HIGH);
393	case LIBUSB20_SPEED_SUPER:
394		return (LIBUSB_SPEED_SUPER);
395	default:
396		break;
397	}
398	return (LIBUSB_SPEED_UNKNOWN);
399}
400
401int
402libusb_get_max_packet_size(libusb_device *dev, uint8_t endpoint)
403{
404	struct libusb_config_descriptor *pdconf;
405	struct libusb_interface *pinf;
406	struct libusb_interface_descriptor *pdinf;
407	struct libusb_endpoint_descriptor *pdend;
408	int i;
409	int j;
410	int k;
411	int ret;
412
413	if (dev == NULL)
414		return (LIBUSB_ERROR_NO_DEVICE);
415
416	ret = libusb_get_active_config_descriptor(dev, &pdconf);
417	if (ret < 0)
418		return (ret);
419
420	ret = LIBUSB_ERROR_NOT_FOUND;
421	for (i = 0; i < pdconf->bNumInterfaces; i++) {
422		pinf = &pdconf->interface[i];
423		for (j = 0; j < pinf->num_altsetting; j++) {
424			pdinf = &pinf->altsetting[j];
425			for (k = 0; k < pdinf->bNumEndpoints; k++) {
426				pdend = &pdinf->endpoint[k];
427				if (pdend->bEndpointAddress == endpoint) {
428					ret = pdend->wMaxPacketSize;
429					goto out;
430				}
431			}
432		}
433	}
434
435out:
436	libusb_free_config_descriptor(pdconf);
437	return (ret);
438}
439
440int
441libusb_get_max_iso_packet_size(libusb_device *dev, uint8_t endpoint)
442{
443	int multiplier;
444	int ret;
445
446	ret = libusb_get_max_packet_size(dev, endpoint);
447
448	switch (libusb20_dev_get_speed(dev->os_priv)) {
449	case LIBUSB20_SPEED_LOW:
450	case LIBUSB20_SPEED_FULL:
451		break;
452	default:
453		if (ret > -1) {
454			multiplier = (1 + ((ret >> 11) & 3));
455			if (multiplier > 3)
456				multiplier = 3;
457			ret = (ret & 0x7FF) * multiplier;
458		}
459		break;
460	}
461	return (ret);
462}
463
464libusb_device *
465libusb_ref_device(libusb_device *dev)
466{
467	if (dev == NULL)
468		return (NULL);		/* be NULL safe */
469
470	CTX_LOCK(dev->ctx);
471	dev->refcnt++;
472	CTX_UNLOCK(dev->ctx);
473
474	return (dev);
475}
476
477void
478libusb_unref_device(libusb_device *dev)
479{
480	if (dev == NULL)
481		return;			/* be NULL safe */
482
483	CTX_LOCK(dev->ctx);
484	dev->refcnt--;
485	CTX_UNLOCK(dev->ctx);
486
487	if (dev->refcnt == 0) {
488		libusb20_dev_free(dev->os_priv);
489		free(dev);
490	}
491}
492
493int
494libusb_open(libusb_device *dev, libusb_device_handle **devh)
495{
496	libusb_context *ctx = dev->ctx;
497	struct libusb20_device *pdev = dev->os_priv;
498	int err;
499
500	if (devh == NULL)
501		return (LIBUSB_ERROR_INVALID_PARAM);
502
503	/* set default device handle value */
504	*devh = NULL;
505
506	dev = libusb_ref_device(dev);
507	if (dev == NULL)
508		return (LIBUSB_ERROR_INVALID_PARAM);
509
510	err = libusb20_dev_open(pdev, LIBUSB_NUM_SW_ENDPOINTS);
511	if (err) {
512		libusb_unref_device(dev);
513		return (LIBUSB_ERROR_NO_MEM);
514	}
515	libusb10_add_pollfd(ctx, &dev->dev_poll, pdev, libusb20_dev_get_fd(pdev), POLLIN |
516	    POLLOUT | POLLRDNORM | POLLWRNORM);
517
518	/* make sure our event loop detects the new device */
519	libusb10_wakeup_event_loop(ctx);
520
521	*devh = pdev;
522
523	return (0);
524}
525
526libusb_device_handle *
527libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id,
528    uint16_t product_id)
529{
530	struct libusb_device **devs;
531	struct libusb20_device *pdev;
532	struct LIBUSB20_DEVICE_DESC_DECODED *pdesc;
533	int i;
534	int j;
535
536	ctx = GET_CONTEXT(ctx);
537	if (ctx == NULL)
538		return (NULL);		/* be NULL safe */
539
540	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_width_vid_pid enter");
541
542	if ((i = libusb_get_device_list(ctx, &devs)) < 0)
543		return (NULL);
544
545	pdev = NULL;
546	for (j = 0; j < i; j++) {
547		struct libusb20_device *tdev;
548
549		tdev = devs[j]->os_priv;
550		pdesc = libusb20_dev_get_device_desc(tdev);
551		/*
552		 * NOTE: The USB library will automatically swap the
553		 * fields in the device descriptor to be of host
554		 * endian type!
555		 */
556		if (pdesc->idVendor == vendor_id &&
557		    pdesc->idProduct == product_id) {
558			libusb_open(devs[j], &pdev);
559			break;
560		}
561	}
562
563	libusb_free_device_list(devs, 1);
564	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_width_vid_pid leave");
565	return (pdev);
566}
567
568void
569libusb_close(struct libusb20_device *pdev)
570{
571	libusb_context *ctx;
572	struct libusb_device *dev;
573
574	if (pdev == NULL)
575		return;			/* be NULL safe */
576
577	dev = libusb_get_device(pdev);
578	ctx = dev->ctx;
579
580	libusb10_remove_pollfd(ctx, &dev->dev_poll);
581
582	libusb20_dev_close(pdev);
583
584	/* unref will free the "pdev" when the refcount reaches zero */
585	libusb_unref_device(dev);
586
587	/* make sure our event loop detects the closed device */
588	libusb10_wakeup_event_loop(ctx);
589}
590
591libusb_device *
592libusb_get_device(struct libusb20_device *pdev)
593{
594	if (pdev == NULL)
595		return (NULL);
596	return ((libusb_device *)pdev->privLuData);
597}
598
599int
600libusb_get_configuration(struct libusb20_device *pdev, int *config)
601{
602	struct libusb20_config *pconf;
603
604	if (pdev == NULL || config == NULL)
605		return (LIBUSB_ERROR_INVALID_PARAM);
606
607	pconf = libusb20_dev_alloc_config(pdev, libusb20_dev_get_config_index(pdev));
608	if (pconf == NULL)
609		return (LIBUSB_ERROR_NO_MEM);
610
611	*config = pconf->desc.bConfigurationValue;
612
613	free(pconf);
614
615	return (0);
616}
617
618int
619libusb_set_configuration(struct libusb20_device *pdev, int configuration)
620{
621	struct libusb20_config *pconf;
622	struct libusb_device *dev;
623	int err;
624	uint8_t i;
625
626	dev = libusb_get_device(pdev);
627	if (dev == NULL)
628		return (LIBUSB_ERROR_INVALID_PARAM);
629
630	if (configuration < 1) {
631		/* unconfigure */
632		i = 255;
633	} else {
634		for (i = 0; i != 255; i++) {
635			uint8_t found;
636
637			pconf = libusb20_dev_alloc_config(pdev, i);
638			if (pconf == NULL)
639				return (LIBUSB_ERROR_INVALID_PARAM);
640			found = (pconf->desc.bConfigurationValue
641			    == configuration);
642			free(pconf);
643
644			if (found)
645				goto set_config;
646		}
647		return (LIBUSB_ERROR_INVALID_PARAM);
648	}
649
650set_config:
651
652	libusb10_cancel_all_transfer(dev);
653
654	libusb10_remove_pollfd(dev->ctx, &dev->dev_poll);
655
656	err = libusb20_dev_set_config_index(pdev, i);
657
658	libusb10_add_pollfd(dev->ctx, &dev->dev_poll, pdev, libusb20_dev_get_fd(pdev), POLLIN |
659	    POLLOUT | POLLRDNORM | POLLWRNORM);
660
661	return (err ? LIBUSB_ERROR_INVALID_PARAM : 0);
662}
663
664int
665libusb_claim_interface(struct libusb20_device *pdev, int interface_number)
666{
667	libusb_device *dev;
668	int err = 0;
669
670	dev = libusb_get_device(pdev);
671	if (dev == NULL)
672		return (LIBUSB_ERROR_INVALID_PARAM);
673
674	if (interface_number < 0 || interface_number > 31)
675		return (LIBUSB_ERROR_INVALID_PARAM);
676
677	if (pdev->auto_detach != 0) {
678		err = libusb_detach_kernel_driver(pdev, interface_number);
679		if (err != 0)
680			goto done;
681	}
682
683	CTX_LOCK(dev->ctx);
684	dev->claimed_interfaces |= (1 << interface_number);
685	CTX_UNLOCK(dev->ctx);
686done:
687	return (err);
688}
689
690int
691libusb_release_interface(struct libusb20_device *pdev, int interface_number)
692{
693	libusb_device *dev;
694	int err = 0;
695
696	dev = libusb_get_device(pdev);
697	if (dev == NULL)
698		return (LIBUSB_ERROR_INVALID_PARAM);
699
700	if (interface_number < 0 || interface_number > 31)
701		return (LIBUSB_ERROR_INVALID_PARAM);
702
703	if (pdev->auto_detach != 0) {
704		err = libusb_attach_kernel_driver(pdev, interface_number);
705		if (err != 0)
706			goto done;
707	}
708
709	CTX_LOCK(dev->ctx);
710	if (!(dev->claimed_interfaces & (1 << interface_number)))
711		err = LIBUSB_ERROR_NOT_FOUND;
712	else
713		dev->claimed_interfaces &= ~(1 << interface_number);
714	CTX_UNLOCK(dev->ctx);
715done:
716	return (err);
717}
718
719int
720libusb_set_interface_alt_setting(struct libusb20_device *pdev,
721    int interface_number, int alternate_setting)
722{
723	libusb_device *dev;
724	int err = 0;
725
726	dev = libusb_get_device(pdev);
727	if (dev == NULL)
728		return (LIBUSB_ERROR_INVALID_PARAM);
729
730	if (interface_number < 0 || interface_number > 31)
731		return (LIBUSB_ERROR_INVALID_PARAM);
732
733	CTX_LOCK(dev->ctx);
734	if (!(dev->claimed_interfaces & (1 << interface_number)))
735		err = LIBUSB_ERROR_NOT_FOUND;
736	CTX_UNLOCK(dev->ctx);
737
738	if (err)
739		return (err);
740
741	libusb10_cancel_all_transfer(dev);
742
743	libusb10_remove_pollfd(dev->ctx, &dev->dev_poll);
744
745	err = libusb20_dev_set_alt_index(pdev,
746	    interface_number, alternate_setting);
747
748	libusb10_add_pollfd(dev->ctx, &dev->dev_poll,
749	    pdev, libusb20_dev_get_fd(pdev),
750	    POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM);
751
752	return (err ? LIBUSB_ERROR_OTHER : 0);
753}
754
755static struct libusb20_transfer *
756libusb10_get_transfer(struct libusb20_device *pdev,
757    uint8_t endpoint, uint8_t xfer_index)
758{
759	xfer_index &= 1;	/* double buffering */
760
761	xfer_index |= (endpoint & LIBUSB20_ENDPOINT_ADDRESS_MASK) * 4;
762
763	if (endpoint & LIBUSB20_ENDPOINT_DIR_MASK) {
764		/* this is an IN endpoint */
765		xfer_index |= 2;
766	}
767	return (libusb20_tr_get_pointer(pdev, xfer_index));
768}
769
770int
771libusb_clear_halt(struct libusb20_device *pdev, uint8_t endpoint)
772{
773	struct libusb20_transfer *xfer;
774	struct libusb_device *dev;
775	int err;
776
777	xfer = libusb10_get_transfer(pdev, endpoint, 0);
778	if (xfer == NULL)
779		return (LIBUSB_ERROR_INVALID_PARAM);
780
781	dev = libusb_get_device(pdev);
782	if (dev == NULL)
783		return (LIBUSB_ERROR_INVALID_PARAM);
784
785	CTX_LOCK(dev->ctx);
786	err = libusb20_tr_open(xfer, 0, 1, endpoint);
787	CTX_UNLOCK(dev->ctx);
788
789	if (err != 0 && err != LIBUSB20_ERROR_BUSY)
790		return (LIBUSB_ERROR_OTHER);
791
792	libusb20_tr_clear_stall_sync(xfer);
793
794	/* check if we opened the transfer */
795	if (err == 0) {
796		CTX_LOCK(dev->ctx);
797		libusb20_tr_close(xfer);
798		CTX_UNLOCK(dev->ctx);
799	}
800	return (0);			/* success */
801}
802
803int
804libusb_reset_device(struct libusb20_device *pdev)
805{
806	libusb_device *dev;
807	int err;
808
809	dev = libusb_get_device(pdev);
810	if (dev == NULL)
811		return (LIBUSB_ERROR_INVALID_PARAM);
812
813	libusb10_cancel_all_transfer(dev);
814
815	libusb10_remove_pollfd(dev->ctx, &dev->dev_poll);
816
817	err = libusb20_dev_reset(pdev);
818
819	libusb10_add_pollfd(dev->ctx, &dev->dev_poll,
820	    pdev, libusb20_dev_get_fd(pdev),
821	    POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM);
822
823	return (err ? LIBUSB_ERROR_OTHER : 0);
824}
825
826int
827libusb_check_connected(struct libusb20_device *pdev)
828{
829	libusb_device *dev;
830	int err;
831
832	dev = libusb_get_device(pdev);
833	if (dev == NULL)
834		return (LIBUSB_ERROR_INVALID_PARAM);
835
836	err = libusb20_dev_check_connected(pdev);
837
838	return (err ? LIBUSB_ERROR_NO_DEVICE : 0);
839}
840
841int
842libusb_kernel_driver_active(struct libusb20_device *pdev, int interface)
843{
844	if (pdev == NULL)
845		return (LIBUSB_ERROR_INVALID_PARAM);
846
847	if (libusb20_dev_kernel_driver_active(pdev, interface))
848		return (0);		/* no kernel driver is active */
849	else
850		return (1);		/* kernel driver is active */
851}
852
853int
854libusb_get_driver_np(struct libusb20_device *pdev, int interface,
855    char *name, int namelen)
856{
857	return (libusb_get_driver(pdev, interface, name, namelen));
858}
859
860int
861libusb_get_driver(struct libusb20_device *pdev, int interface,
862    char *name, int namelen)
863{
864	char *ptr;
865	int err;
866
867	if (pdev == NULL)
868		return (LIBUSB_ERROR_INVALID_PARAM);
869	if (namelen < 1)
870		return (LIBUSB_ERROR_INVALID_PARAM);
871	if (namelen > 255)
872		namelen = 255;
873
874	err = libusb20_dev_get_iface_desc(
875	    pdev, interface, name, namelen);
876
877	if (err != 0)
878		return (LIBUSB_ERROR_OTHER);
879
880	/* we only want the driver name */
881	ptr = strstr(name, ":");
882	if (ptr != NULL)
883		*ptr = 0;
884
885	return (0);
886}
887
888int
889libusb_detach_kernel_driver_np(struct libusb20_device *pdev, int interface)
890{
891	return (libusb_detach_kernel_driver(pdev, interface));
892}
893
894int
895libusb_detach_kernel_driver(struct libusb20_device *pdev, int interface)
896{
897	int err;
898
899	if (pdev == NULL)
900		return (LIBUSB_ERROR_INVALID_PARAM);
901
902	err = libusb20_dev_detach_kernel_driver(
903	    pdev, interface);
904
905	return (err ? LIBUSB_ERROR_OTHER : 0);
906}
907
908int
909libusb_attach_kernel_driver(struct libusb20_device *pdev, int interface)
910{
911	if (pdev == NULL)
912		return (LIBUSB_ERROR_INVALID_PARAM);
913	/* stub - currently not supported by libusb20 */
914	return (0);
915}
916
917int
918libusb_set_auto_detach_kernel_driver(libusb_device_handle *dev, int enable)
919{
920	dev->auto_detach = (enable ? 1 : 0);
921	return (0);
922}
923
924/* Asynchronous device I/O */
925
926struct libusb_transfer *
927libusb_alloc_transfer(int iso_packets)
928{
929	struct libusb_transfer *uxfer;
930	struct libusb_super_transfer *sxfer;
931	int len;
932
933	len = sizeof(struct libusb_transfer) +
934	    sizeof(struct libusb_super_transfer) +
935	    (iso_packets * sizeof(libusb_iso_packet_descriptor));
936
937	sxfer = malloc(len);
938	if (sxfer == NULL)
939		return (NULL);
940
941	memset(sxfer, 0, len);
942
943	uxfer = (struct libusb_transfer *)(
944	    ((uint8_t *)sxfer) + sizeof(*sxfer));
945
946	/* set default value */
947	uxfer->num_iso_packets = iso_packets;
948
949	return (uxfer);
950}
951
952void
953libusb_free_transfer(struct libusb_transfer *uxfer)
954{
955	struct libusb_super_transfer *sxfer;
956
957	if (uxfer == NULL)
958		return;			/* be NULL safe */
959
960	/* check if we should free the transfer buffer */
961	if (uxfer->flags & LIBUSB_TRANSFER_FREE_BUFFER)
962		free(uxfer->buffer);
963
964	sxfer = (struct libusb_super_transfer *)(
965	    (uint8_t *)uxfer - sizeof(*sxfer));
966
967	free(sxfer);
968}
969
970static uint32_t
971libusb10_get_maxframe(struct libusb20_device *pdev, libusb_transfer *xfer)
972{
973	uint32_t ret;
974
975	switch (xfer->type) {
976	case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
977		ret = 60 | LIBUSB20_MAX_FRAME_PRE_SCALE;	/* 60ms */
978		break;
979	case LIBUSB_TRANSFER_TYPE_CONTROL:
980		ret = 2;
981		break;
982	default:
983		ret = 1;
984		break;
985	}
986	return (ret);
987}
988
989static int
990libusb10_get_buffsize(struct libusb20_device *pdev, libusb_transfer *xfer)
991{
992	int ret;
993	int usb_speed;
994
995	usb_speed = libusb20_dev_get_speed(pdev);
996
997	switch (xfer->type) {
998	case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
999		ret = 0;		/* kernel will auto-select */
1000		break;
1001	case LIBUSB_TRANSFER_TYPE_CONTROL:
1002		ret = 1024;
1003		break;
1004	default:
1005		switch (usb_speed) {
1006		case LIBUSB20_SPEED_LOW:
1007			ret = 256;
1008			break;
1009		case LIBUSB20_SPEED_FULL:
1010			ret = 4096;
1011			break;
1012		case LIBUSB20_SPEED_SUPER:
1013			ret = 65536;
1014			break;
1015		default:
1016			ret = 16384;
1017			break;
1018		}
1019		break;
1020	}
1021	return (ret);
1022}
1023
1024static int
1025libusb10_convert_error(uint8_t status)
1026{
1027	;				/* indent fix */
1028
1029	switch (status) {
1030	case LIBUSB20_TRANSFER_START:
1031	case LIBUSB20_TRANSFER_COMPLETED:
1032		return (LIBUSB_TRANSFER_COMPLETED);
1033	case LIBUSB20_TRANSFER_OVERFLOW:
1034		return (LIBUSB_TRANSFER_OVERFLOW);
1035	case LIBUSB20_TRANSFER_NO_DEVICE:
1036		return (LIBUSB_TRANSFER_NO_DEVICE);
1037	case LIBUSB20_TRANSFER_STALL:
1038		return (LIBUSB_TRANSFER_STALL);
1039	case LIBUSB20_TRANSFER_CANCELLED:
1040		return (LIBUSB_TRANSFER_CANCELLED);
1041	case LIBUSB20_TRANSFER_TIMED_OUT:
1042		return (LIBUSB_TRANSFER_TIMED_OUT);
1043	default:
1044		return (LIBUSB_TRANSFER_ERROR);
1045	}
1046}
1047
1048/* This function must be called locked */
1049
1050static void
1051libusb10_complete_transfer(struct libusb20_transfer *pxfer,
1052    struct libusb_super_transfer *sxfer, int status)
1053{
1054	struct libusb_transfer *uxfer;
1055	struct libusb_device *dev;
1056
1057	uxfer = (struct libusb_transfer *)(
1058	    ((uint8_t *)sxfer) + sizeof(*sxfer));
1059
1060	if (pxfer != NULL)
1061		libusb20_tr_set_priv_sc1(pxfer, NULL);
1062
1063	/* set transfer status */
1064	uxfer->status = status;
1065
1066	/* update super transfer state */
1067	sxfer->state = LIBUSB_SUPER_XFER_ST_NONE;
1068
1069	dev = libusb_get_device(uxfer->dev_handle);
1070
1071	TAILQ_INSERT_TAIL(&dev->ctx->tr_done, sxfer, entry);
1072}
1073
1074/* This function must be called locked */
1075
1076static void
1077libusb10_isoc_proxy(struct libusb20_transfer *pxfer)
1078{
1079	struct libusb_super_transfer *sxfer;
1080	struct libusb_transfer *uxfer;
1081	uint32_t actlen;
1082	uint16_t iso_packets;
1083	uint16_t i;
1084	uint8_t status;
1085
1086	status = libusb20_tr_get_status(pxfer);
1087	sxfer = libusb20_tr_get_priv_sc1(pxfer);
1088	actlen = libusb20_tr_get_actual_length(pxfer);
1089	iso_packets = libusb20_tr_get_max_frames(pxfer);
1090
1091	if (sxfer == NULL)
1092		return; /* cancelled - nothing to do */
1093
1094	uxfer = (struct libusb_transfer *)(
1095	    ((uint8_t *)sxfer) + sizeof(*sxfer));
1096
1097	if (iso_packets > uxfer->num_iso_packets)
1098		iso_packets = uxfer->num_iso_packets;
1099
1100	if (iso_packets == 0)
1101		return; /* nothing to do */
1102
1103	/* make sure that the number of ISOCHRONOUS packets is valid */
1104	uxfer->num_iso_packets = iso_packets;
1105
1106	switch (status) {
1107	case LIBUSB20_TRANSFER_COMPLETED:
1108		/* update actual length */
1109		uxfer->actual_length = actlen;
1110		for (i = 0; i != iso_packets; i++) {
1111			uxfer->iso_packet_desc[i].actual_length =
1112			    libusb20_tr_get_length(pxfer, i);
1113		}
1114		libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED);
1115		break;
1116	case LIBUSB20_TRANSFER_START:
1117		/* setup length(s) */
1118		actlen = 0;
1119		for (i = 0; i != iso_packets; i++) {
1120			libusb20_tr_setup_isoc(pxfer,
1121			    &uxfer->buffer[actlen],
1122			    uxfer->iso_packet_desc[i].length, i);
1123			actlen += uxfer->iso_packet_desc[i].length;
1124		}
1125
1126		/* no remainder */
1127		sxfer->rem_len = 0;
1128
1129		libusb20_tr_set_total_frames(pxfer, iso_packets);
1130		libusb20_tr_submit(pxfer);
1131
1132		/* fork another USB transfer, if any */
1133		libusb10_submit_transfer_sub(libusb20_tr_get_priv_sc0(pxfer), uxfer->endpoint);
1134		break;
1135	default:
1136		libusb10_complete_transfer(pxfer, sxfer, libusb10_convert_error(status));
1137		break;
1138	}
1139}
1140
1141/* This function must be called locked */
1142
1143static void
1144libusb10_bulk_intr_proxy(struct libusb20_transfer *pxfer)
1145{
1146	struct libusb_super_transfer *sxfer;
1147	struct libusb_transfer *uxfer;
1148	uint32_t max_bulk;
1149	uint32_t actlen;
1150	uint8_t status;
1151	uint8_t flags;
1152
1153	status = libusb20_tr_get_status(pxfer);
1154	sxfer = libusb20_tr_get_priv_sc1(pxfer);
1155	max_bulk = libusb20_tr_get_max_total_length(pxfer);
1156	actlen = libusb20_tr_get_actual_length(pxfer);
1157
1158	if (sxfer == NULL)
1159		return;			/* cancelled - nothing to do */
1160
1161	uxfer = (struct libusb_transfer *)(
1162	    ((uint8_t *)sxfer) + sizeof(*sxfer));
1163
1164	flags = uxfer->flags;
1165
1166	switch (status) {
1167	case LIBUSB20_TRANSFER_COMPLETED:
1168
1169		uxfer->actual_length += actlen;
1170
1171		/* check for short packet */
1172		if (sxfer->last_len != actlen) {
1173			if (flags & LIBUSB_TRANSFER_SHORT_NOT_OK) {
1174				libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_ERROR);
1175			} else {
1176				libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED);
1177			}
1178			break;
1179		}
1180		/* check for end of data */
1181		if (sxfer->rem_len == 0) {
1182			libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED);
1183			break;
1184		}
1185		/* FALLTHROUGH */
1186
1187	case LIBUSB20_TRANSFER_START:
1188		if (max_bulk > sxfer->rem_len) {
1189			max_bulk = sxfer->rem_len;
1190		}
1191		/* setup new BULK or INTERRUPT transaction */
1192		libusb20_tr_setup_bulk(pxfer,
1193		    sxfer->curr_data, max_bulk, uxfer->timeout);
1194
1195		/* update counters */
1196		sxfer->last_len = max_bulk;
1197		sxfer->curr_data += max_bulk;
1198		sxfer->rem_len -= max_bulk;
1199
1200		libusb20_tr_submit(pxfer);
1201
1202		/* check if we can fork another USB transfer */
1203		if (sxfer->rem_len == 0)
1204			libusb10_submit_transfer_sub(libusb20_tr_get_priv_sc0(pxfer), uxfer->endpoint);
1205		break;
1206
1207	default:
1208		libusb10_complete_transfer(pxfer, sxfer, libusb10_convert_error(status));
1209		break;
1210	}
1211}
1212
1213/* This function must be called locked */
1214
1215static void
1216libusb10_ctrl_proxy(struct libusb20_transfer *pxfer)
1217{
1218	struct libusb_super_transfer *sxfer;
1219	struct libusb_transfer *uxfer;
1220	uint32_t max_bulk;
1221	uint32_t actlen;
1222	uint8_t status;
1223	uint8_t flags;
1224
1225	status = libusb20_tr_get_status(pxfer);
1226	sxfer = libusb20_tr_get_priv_sc1(pxfer);
1227	max_bulk = libusb20_tr_get_max_total_length(pxfer);
1228	actlen = libusb20_tr_get_actual_length(pxfer);
1229
1230	if (sxfer == NULL)
1231		return;			/* cancelled - nothing to do */
1232
1233	uxfer = (struct libusb_transfer *)(
1234	    ((uint8_t *)sxfer) + sizeof(*sxfer));
1235
1236	flags = uxfer->flags;
1237
1238	switch (status) {
1239	case LIBUSB20_TRANSFER_COMPLETED:
1240
1241		uxfer->actual_length += actlen;
1242
1243		/* subtract length of SETUP packet, if any */
1244		actlen -= libusb20_tr_get_length(pxfer, 0);
1245
1246		/* check for short packet */
1247		if (sxfer->last_len != actlen) {
1248			if (flags & LIBUSB_TRANSFER_SHORT_NOT_OK) {
1249				libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_ERROR);
1250			} else {
1251				libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED);
1252			}
1253			break;
1254		}
1255		/* check for end of data */
1256		if (sxfer->rem_len == 0) {
1257			libusb10_complete_transfer(pxfer, sxfer, LIBUSB_TRANSFER_COMPLETED);
1258			break;
1259		}
1260		/* FALLTHROUGH */
1261
1262	case LIBUSB20_TRANSFER_START:
1263		if (max_bulk > sxfer->rem_len) {
1264			max_bulk = sxfer->rem_len;
1265		}
1266		/* setup new CONTROL transaction */
1267		if (status == LIBUSB20_TRANSFER_COMPLETED) {
1268			/* next fragment - don't send SETUP packet */
1269			libusb20_tr_set_length(pxfer, 0, 0);
1270		} else {
1271			/* first fragment - send SETUP packet */
1272			libusb20_tr_set_length(pxfer, 8, 0);
1273			libusb20_tr_set_buffer(pxfer, uxfer->buffer, 0);
1274		}
1275
1276		if (max_bulk != 0) {
1277			libusb20_tr_set_length(pxfer, max_bulk, 1);
1278			libusb20_tr_set_buffer(pxfer, sxfer->curr_data, 1);
1279			libusb20_tr_set_total_frames(pxfer, 2);
1280		} else {
1281			libusb20_tr_set_total_frames(pxfer, 1);
1282		}
1283
1284		/* update counters */
1285		sxfer->last_len = max_bulk;
1286		sxfer->curr_data += max_bulk;
1287		sxfer->rem_len -= max_bulk;
1288
1289		libusb20_tr_submit(pxfer);
1290
1291		/* check if we can fork another USB transfer */
1292		if (sxfer->rem_len == 0)
1293			libusb10_submit_transfer_sub(libusb20_tr_get_priv_sc0(pxfer), uxfer->endpoint);
1294		break;
1295
1296	default:
1297		libusb10_complete_transfer(pxfer, sxfer, libusb10_convert_error(status));
1298		break;
1299	}
1300}
1301
1302/* The following function must be called locked */
1303
1304static void
1305libusb10_submit_transfer_sub(struct libusb20_device *pdev, uint8_t endpoint)
1306{
1307	struct libusb20_transfer *pxfer0;
1308	struct libusb20_transfer *pxfer1;
1309	struct libusb_super_transfer *sxfer;
1310	struct libusb_transfer *uxfer;
1311	struct libusb_device *dev;
1312	int err;
1313	int buffsize;
1314	int maxframe;
1315	int temp;
1316
1317	dev = libusb_get_device(pdev);
1318
1319	pxfer0 = libusb10_get_transfer(pdev, endpoint, 0);
1320	pxfer1 = libusb10_get_transfer(pdev, endpoint, 1);
1321
1322	if (pxfer0 == NULL || pxfer1 == NULL)
1323		return;			/* shouldn't happen */
1324
1325	temp = 0;
1326	if (libusb20_tr_pending(pxfer0))
1327		temp |= 1;
1328	if (libusb20_tr_pending(pxfer1))
1329		temp |= 2;
1330
1331	switch (temp) {
1332	case 3:
1333		/* wait till one of the transfers complete */
1334		return;
1335	case 2:
1336		sxfer = libusb20_tr_get_priv_sc1(pxfer1);
1337		if (sxfer == NULL)
1338			return;		/* cancelling */
1339		if (sxfer->rem_len)
1340			return;		/* cannot queue another one */
1341		/* swap transfers */
1342		pxfer1 = pxfer0;
1343		break;
1344	case 1:
1345		sxfer = libusb20_tr_get_priv_sc1(pxfer0);
1346		if (sxfer == NULL)
1347			return;		/* cancelling */
1348		if (sxfer->rem_len)
1349			return;		/* cannot queue another one */
1350		/* swap transfers */
1351		pxfer0 = pxfer1;
1352		break;
1353	default:
1354		break;
1355	}
1356
1357	/* find next transfer on same endpoint */
1358	TAILQ_FOREACH(sxfer, &dev->tr_head, entry) {
1359
1360		uxfer = (struct libusb_transfer *)(
1361		    ((uint8_t *)sxfer) + sizeof(*sxfer));
1362
1363		if (uxfer->endpoint == endpoint) {
1364			TAILQ_REMOVE(&dev->tr_head, sxfer, entry);
1365			sxfer->entry.tqe_prev = NULL;
1366			goto found;
1367		}
1368	}
1369	return;				/* success */
1370
1371found:
1372
1373	libusb20_tr_set_priv_sc0(pxfer0, pdev);
1374	libusb20_tr_set_priv_sc1(pxfer0, sxfer);
1375
1376	/* reset super transfer state */
1377	sxfer->rem_len = uxfer->length;
1378	sxfer->curr_data = uxfer->buffer;
1379	uxfer->actual_length = 0;
1380
1381	switch (uxfer->type) {
1382	case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
1383		libusb20_tr_set_callback(pxfer0, libusb10_isoc_proxy);
1384		break;
1385	case LIBUSB_TRANSFER_TYPE_BULK:
1386	case LIBUSB_TRANSFER_TYPE_INTERRUPT:
1387		libusb20_tr_set_callback(pxfer0, libusb10_bulk_intr_proxy);
1388		break;
1389	case LIBUSB_TRANSFER_TYPE_CONTROL:
1390		libusb20_tr_set_callback(pxfer0, libusb10_ctrl_proxy);
1391		if (sxfer->rem_len < 8)
1392			goto failure;
1393
1394		/* remove SETUP packet from data */
1395		sxfer->rem_len -= 8;
1396		sxfer->curr_data += 8;
1397		break;
1398	default:
1399		goto failure;
1400	}
1401
1402	buffsize = libusb10_get_buffsize(pdev, uxfer);
1403	maxframe = libusb10_get_maxframe(pdev, uxfer);
1404
1405	/* make sure the transfer is opened */
1406	err = libusb20_tr_open_stream(pxfer0, buffsize, maxframe,
1407	    endpoint, sxfer->stream_id);
1408	if (err && (err != LIBUSB20_ERROR_BUSY)) {
1409		goto failure;
1410	}
1411	libusb20_tr_start(pxfer0);
1412	return;
1413
1414failure:
1415	libusb10_complete_transfer(pxfer0, sxfer, LIBUSB_TRANSFER_ERROR);
1416	/* make sure our event loop spins the done handler */
1417	libusb10_wakeup_event_loop(dev->ctx);
1418}
1419
1420/* The following function must be called unlocked */
1421
1422int
1423libusb_submit_transfer(struct libusb_transfer *uxfer)
1424{
1425	struct libusb20_transfer *pxfer0;
1426	struct libusb20_transfer *pxfer1;
1427	struct libusb_super_transfer *sxfer;
1428	struct libusb_device *dev;
1429	uint8_t endpoint;
1430	int err;
1431
1432	if (uxfer == NULL)
1433		return (LIBUSB_ERROR_INVALID_PARAM);
1434
1435	if (uxfer->dev_handle == NULL)
1436		return (LIBUSB_ERROR_INVALID_PARAM);
1437
1438	endpoint = uxfer->endpoint;
1439
1440	dev = libusb_get_device(uxfer->dev_handle);
1441
1442	DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_submit_transfer enter");
1443
1444	sxfer = (struct libusb_super_transfer *)(
1445	    (uint8_t *)uxfer - sizeof(*sxfer));
1446
1447	CTX_LOCK(dev->ctx);
1448
1449	pxfer0 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 0);
1450	pxfer1 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 1);
1451
1452	if (pxfer0 == NULL || pxfer1 == NULL) {
1453		err = LIBUSB_ERROR_OTHER;
1454	} else if ((sxfer->entry.tqe_prev != NULL) ||
1455	    (libusb20_tr_get_priv_sc1(pxfer0) == sxfer) ||
1456	    (libusb20_tr_get_priv_sc1(pxfer1) == sxfer)) {
1457		err = LIBUSB_ERROR_BUSY;
1458	} else if (dev->device_is_gone != 0) {
1459		err = LIBUSB_ERROR_NO_DEVICE;
1460	} else {
1461
1462		/* set pending state */
1463		sxfer->state = LIBUSB_SUPER_XFER_ST_PEND;
1464
1465		/* insert transfer into transfer head list */
1466		TAILQ_INSERT_TAIL(&dev->tr_head, sxfer, entry);
1467
1468		/* start work transfers */
1469		libusb10_submit_transfer_sub(
1470		    uxfer->dev_handle, endpoint);
1471
1472		err = 0;		/* success */
1473	}
1474
1475	CTX_UNLOCK(dev->ctx);
1476
1477	DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_submit_transfer leave %d", err);
1478
1479	return (err);
1480}
1481
1482/* Asynchronous transfer cancel */
1483
1484int
1485libusb_cancel_transfer(struct libusb_transfer *uxfer)
1486{
1487	struct libusb20_transfer *pxfer0;
1488	struct libusb20_transfer *pxfer1;
1489	struct libusb_super_transfer *sxfer;
1490	struct libusb_device *dev;
1491	struct libusb_device_handle *devh;
1492	uint8_t endpoint;
1493	int retval;
1494
1495	if (uxfer == NULL)
1496		return (LIBUSB_ERROR_INVALID_PARAM);
1497
1498	/* check if not initialised */
1499	if ((devh = uxfer->dev_handle) == NULL)
1500		return (LIBUSB_ERROR_NOT_FOUND);
1501
1502	endpoint = uxfer->endpoint;
1503
1504	dev = libusb_get_device(devh);
1505
1506	DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_cancel_transfer enter");
1507
1508	sxfer = (struct libusb_super_transfer *)(
1509	    (uint8_t *)uxfer - sizeof(*sxfer));
1510
1511	retval = 0;
1512
1513	CTX_LOCK(dev->ctx);
1514
1515	pxfer0 = libusb10_get_transfer(devh, endpoint, 0);
1516	pxfer1 = libusb10_get_transfer(devh, endpoint, 1);
1517
1518	if (sxfer->state != LIBUSB_SUPER_XFER_ST_PEND) {
1519		/* only update the transfer status */
1520		uxfer->status = LIBUSB_TRANSFER_CANCELLED;
1521		retval = LIBUSB_ERROR_NOT_FOUND;
1522	} else if (sxfer->entry.tqe_prev != NULL) {
1523		/* we are lucky - transfer is on a queue */
1524		TAILQ_REMOVE(&dev->tr_head, sxfer, entry);
1525		sxfer->entry.tqe_prev = NULL;
1526		libusb10_complete_transfer(NULL,
1527		    sxfer, LIBUSB_TRANSFER_CANCELLED);
1528		/* make sure our event loop spins the done handler */
1529		libusb10_wakeup_event_loop(dev->ctx);
1530	} else if (pxfer0 == NULL || pxfer1 == NULL) {
1531		/* not started */
1532		retval = LIBUSB_ERROR_NOT_FOUND;
1533	} else if (libusb20_tr_get_priv_sc1(pxfer0) == sxfer) {
1534		libusb10_complete_transfer(pxfer0,
1535		    sxfer, LIBUSB_TRANSFER_CANCELLED);
1536		if (dev->device_is_gone != 0) {
1537			/* clear transfer pointer */
1538			libusb20_tr_set_priv_sc1(pxfer0, NULL);
1539			/* make sure our event loop spins the done handler */
1540			libusb10_wakeup_event_loop(dev->ctx);
1541		} else {
1542			libusb20_tr_stop(pxfer0);
1543			/* make sure the queue doesn't stall */
1544			libusb10_submit_transfer_sub(devh, endpoint);
1545		}
1546	} else if (libusb20_tr_get_priv_sc1(pxfer1) == sxfer) {
1547		libusb10_complete_transfer(pxfer1,
1548		    sxfer, LIBUSB_TRANSFER_CANCELLED);
1549		/* check if handle is still active */
1550		if (dev->device_is_gone != 0) {
1551			/* clear transfer pointer */
1552			libusb20_tr_set_priv_sc1(pxfer1, NULL);
1553			/* make sure our event loop spins the done handler */
1554			libusb10_wakeup_event_loop(dev->ctx);
1555		} else {
1556			libusb20_tr_stop(pxfer1);
1557			/* make sure the queue doesn't stall */
1558			libusb10_submit_transfer_sub(devh, endpoint);
1559		}
1560	} else {
1561		/* not started */
1562		retval = LIBUSB_ERROR_NOT_FOUND;
1563	}
1564
1565	CTX_UNLOCK(dev->ctx);
1566
1567	DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_cancel_transfer leave");
1568
1569	return (retval);
1570}
1571
1572UNEXPORTED void
1573libusb10_cancel_all_transfer(libusb_device *dev)
1574{
1575	struct libusb20_device *pdev = dev->os_priv;
1576	unsigned x;
1577
1578	for (x = 0; x != LIBUSB_NUM_SW_ENDPOINTS; x++) {
1579		struct libusb20_transfer *xfer;
1580
1581		xfer = libusb20_tr_get_pointer(pdev, x);
1582		if (xfer == NULL)
1583			continue;
1584		libusb20_tr_close(xfer);
1585	}
1586}
1587
1588UNEXPORTED void
1589libusb10_cancel_all_transfer_locked(struct libusb20_device *pdev, struct libusb_device *dev)
1590{
1591	struct libusb_super_transfer *sxfer;
1592	unsigned x;
1593
1594	for (x = 0; x != LIBUSB_NUM_SW_ENDPOINTS; x++) {
1595		struct libusb20_transfer *xfer;
1596
1597		xfer = libusb20_tr_get_pointer(pdev, x);
1598		if (xfer == NULL)
1599			continue;
1600		if (libusb20_tr_pending(xfer) == 0)
1601			continue;
1602		sxfer = libusb20_tr_get_priv_sc1(xfer);
1603		if (sxfer == NULL)
1604			continue;
1605		/* complete pending transfer */
1606		libusb10_complete_transfer(xfer, sxfer, LIBUSB_TRANSFER_ERROR);
1607	}
1608
1609	while ((sxfer = TAILQ_FIRST(&dev->tr_head))) {
1610		TAILQ_REMOVE(&dev->tr_head, sxfer, entry);
1611
1612		/* complete pending transfer */
1613		libusb10_complete_transfer(NULL, sxfer, LIBUSB_TRANSFER_ERROR);
1614	}
1615}
1616
1617uint16_t
1618libusb_cpu_to_le16(uint16_t x)
1619{
1620	return (htole16(x));
1621}
1622
1623uint16_t
1624libusb_le16_to_cpu(uint16_t x)
1625{
1626	return (le16toh(x));
1627}
1628
1629const char *
1630libusb_strerror(int code)
1631{
1632	switch (code) {
1633	case LIBUSB_SUCCESS:
1634		return ("Success");
1635	case LIBUSB_ERROR_IO:
1636		return ("I/O error");
1637	case LIBUSB_ERROR_INVALID_PARAM:
1638		return ("Invalid parameter");
1639	case LIBUSB_ERROR_ACCESS:
1640		return ("Permissions error");
1641	case LIBUSB_ERROR_NO_DEVICE:
1642		return ("No device");
1643	case LIBUSB_ERROR_NOT_FOUND:
1644		return ("Not found");
1645	case LIBUSB_ERROR_BUSY:
1646		return ("Device busy");
1647	case LIBUSB_ERROR_TIMEOUT:
1648		return ("Timeout");
1649	case LIBUSB_ERROR_OVERFLOW:
1650		return ("Overflow");
1651	case LIBUSB_ERROR_PIPE:
1652		return ("Pipe error");
1653	case LIBUSB_ERROR_INTERRUPTED:
1654		return ("Interrupted");
1655	case LIBUSB_ERROR_NO_MEM:
1656		return ("Out of memory");
1657	case LIBUSB_ERROR_NOT_SUPPORTED:
1658		return ("Not supported");
1659	case LIBUSB_ERROR_OTHER:
1660		return ("Other error");
1661	default:
1662		return ("Unknown error");
1663	}
1664}
1665
1666const char *
1667libusb_error_name(int code)
1668{
1669	switch (code) {
1670	case LIBUSB_SUCCESS:
1671		return ("LIBUSB_SUCCESS");
1672	case LIBUSB_ERROR_IO:
1673		return ("LIBUSB_ERROR_IO");
1674	case LIBUSB_ERROR_INVALID_PARAM:
1675		return ("LIBUSB_ERROR_INVALID_PARAM");
1676	case LIBUSB_ERROR_ACCESS:
1677		return ("LIBUSB_ERROR_ACCESS");
1678	case LIBUSB_ERROR_NO_DEVICE:
1679		return ("LIBUSB_ERROR_NO_DEVICE");
1680	case LIBUSB_ERROR_NOT_FOUND:
1681		return ("LIBUSB_ERROR_NOT_FOUND");
1682	case LIBUSB_ERROR_BUSY:
1683		return ("LIBUSB_ERROR_BUSY");
1684	case LIBUSB_ERROR_TIMEOUT:
1685		return ("LIBUSB_ERROR_TIMEOUT");
1686	case LIBUSB_ERROR_OVERFLOW:
1687		return ("LIBUSB_ERROR_OVERFLOW");
1688	case LIBUSB_ERROR_PIPE:
1689		return ("LIBUSB_ERROR_PIPE");
1690	case LIBUSB_ERROR_INTERRUPTED:
1691		return ("LIBUSB_ERROR_INTERRUPTED");
1692	case LIBUSB_ERROR_NO_MEM:
1693		return ("LIBUSB_ERROR_NO_MEM");
1694	case LIBUSB_ERROR_NOT_SUPPORTED:
1695		return ("LIBUSB_ERROR_NOT_SUPPORTED");
1696	case LIBUSB_ERROR_OTHER:
1697		return ("LIBUSB_ERROR_OTHER");
1698	default:
1699		return ("LIBUSB_ERROR_UNKNOWN");
1700	}
1701}
1702