1 /* $FreeBSD: head/lib/libusb/libusb10_io.c 260315 2014-01-05 10:41:43Z hselasky $ */
3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #ifdef LIBUSB_GLOBAL_INCLUDE_FILE
28 #include LIBUSB_GLOBAL_INCLUDE_FILE
38 #include <sys/queue.h>
39 #include <sys/endian.h>
42 #define libusb_device_handle libusb20_device
45 #include "libusb20_desc.h"
46 #include "libusb20_int.h"
51 libusb10_add_pollfd(libusb_context
*ctx
, struct libusb_super_pollfd
*pollfd
,
52 struct libusb20_device
*pdev
, int fd
, short events
)
57 if (pollfd
->entry
.tqe_prev
!= NULL
)
58 return; /* already queued */
64 pollfd
->pollfd
.fd
= fd
;
65 pollfd
->pollfd
.events
= events
;
68 TAILQ_INSERT_TAIL(&ctx
->pollfds
, pollfd
, entry
);
72 ctx
->fd_added_cb(fd
, events
, ctx
->fd_cb_user_data
);
76 libusb10_remove_pollfd(libusb_context
*ctx
, struct libusb_super_pollfd
*pollfd
)
81 if (pollfd
->entry
.tqe_prev
== NULL
)
82 return; /* already dequeued */
85 TAILQ_REMOVE(&ctx
->pollfds
, pollfd
, entry
);
86 pollfd
->entry
.tqe_prev
= NULL
;
89 if (ctx
->fd_removed_cb
)
90 ctx
->fd_removed_cb(pollfd
->pollfd
.fd
, ctx
->fd_cb_user_data
);
93 /* This function must be called locked */
96 libusb10_handle_events_sub(struct libusb_context
*ctx
, struct timeval
*tv
)
98 struct libusb_device
*dev
;
99 struct libusb20_device
**ppdev
;
100 struct libusb_super_pollfd
*pfd
;
102 struct libusb_super_transfer
*sxfer
;
103 struct libusb_transfer
*uxfer
;
109 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb10_handle_events_sub enter");
113 TAILQ_FOREACH(pfd
, &ctx
->pollfds
, entry
)
116 fds
= alloca(sizeof(*fds
) * nfds
);
118 return (LIBUSB_ERROR_NO_MEM
);
120 ppdev
= alloca(sizeof(*ppdev
) * nfds
);
122 return (LIBUSB_ERROR_NO_MEM
);
124 TAILQ_FOREACH(pfd
, &ctx
->pollfds
, entry
) {
125 fds
[i
].fd
= pfd
->pollfd
.fd
;
126 fds
[i
].events
= pfd
->pollfd
.events
;
128 ppdev
[i
] = pfd
->pdev
;
129 if (pfd
->pdev
!= NULL
)
130 libusb_get_device(pfd
->pdev
)->refcnt
++;
137 timeout
= (tv
->tv_sec
* 1000) + ((tv
->tv_usec
+ 999) / 1000);
140 err
= poll(fds
, nfds
, timeout
);
143 if ((err
== -1) && (errno
== EINTR
))
144 err
= LIBUSB_ERROR_INTERRUPTED
;
146 err
= LIBUSB_ERROR_IO
;
149 for (i
= 0; i
!= (int)nfds
; i
++) {
150 if (ppdev
[i
] != NULL
) {
152 libusb_unref_device(libusb_get_device(ppdev
[i
]));
158 for (i
= 0; i
!= (int)nfds
; i
++) {
159 if (ppdev
[i
] != NULL
) {
160 dev
= libusb_get_device(ppdev
[i
]);
162 if (fds
[i
].revents
== 0)
163 err
= 0; /* nothing to do */
165 err
= libusb20_dev_process(ppdev
[i
]);
168 /* cancel all transfers - device is gone */
169 libusb10_cancel_all_transfer(dev
);
171 /* remove USB device from polling loop */
172 libusb10_remove_pollfd(dev
->ctx
, &dev
->dev_poll
);
175 libusb_unref_device(dev
);
182 if (read(fds
[i
].fd
, &dummy
, 1) != 1)
192 /* Do all done callbacks */
194 while ((sxfer
= TAILQ_FIRST(&ctx
->tr_done
))) {
197 TAILQ_REMOVE(&ctx
->tr_done
, sxfer
, entry
);
198 sxfer
->entry
.tqe_prev
= NULL
;
204 uxfer
= (struct libusb_transfer
*)(
205 ((uint8_t *)sxfer
) + sizeof(*sxfer
));
207 /* Allow the callback to free the transfer itself. */
208 flags
= uxfer
->flags
;
210 if (uxfer
->callback
!= NULL
)
211 (uxfer
->callback
) (uxfer
);
213 /* Check if the USB transfer should be automatically freed. */
214 if (flags
& LIBUSB_TRANSFER_FREE_TRANSFER
)
215 libusb_free_transfer(uxfer
);
223 /* Wakeup other waiters */
224 pthread_cond_broadcast(&ctx
->ctx_cond
);
229 /* Polling and timing */
232 libusb_try_lock_events(libusb_context
*ctx
)
236 ctx
= GET_CONTEXT(ctx
);
240 err
= CTX_TRYLOCK(ctx
);
244 err
= (ctx
->ctx_handler
!= NO_THREAD
);
248 ctx
->ctx_handler
= pthread_self();
254 libusb_lock_events(libusb_context
*ctx
)
256 ctx
= GET_CONTEXT(ctx
);
258 if (ctx
->ctx_handler
== NO_THREAD
)
259 ctx
->ctx_handler
= pthread_self();
263 libusb_unlock_events(libusb_context
*ctx
)
265 ctx
= GET_CONTEXT(ctx
);
266 if (ctx
->ctx_handler
== pthread_self()) {
267 ctx
->ctx_handler
= NO_THREAD
;
268 pthread_cond_broadcast(&ctx
->ctx_cond
);
274 libusb_event_handling_ok(libusb_context
*ctx
)
276 ctx
= GET_CONTEXT(ctx
);
277 return (ctx
->ctx_handler
== pthread_self());
281 libusb_event_handler_active(libusb_context
*ctx
)
283 ctx
= GET_CONTEXT(ctx
);
284 return (ctx
->ctx_handler
!= NO_THREAD
);
288 libusb_lock_event_waiters(libusb_context
*ctx
)
290 ctx
= GET_CONTEXT(ctx
);
295 libusb_unlock_event_waiters(libusb_context
*ctx
)
297 ctx
= GET_CONTEXT(ctx
);
302 libusb_wait_for_event(libusb_context
*ctx
, struct timeval
*tv
)
307 ctx
= GET_CONTEXT(ctx
);
308 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_wait_for_event enter");
311 pthread_cond_wait(&ctx
->ctx_cond
,
315 err
= clock_gettime(CLOCK_MONOTONIC
, &ts
);
317 return (LIBUSB_ERROR_OTHER
);
320 * The "tv" arguments points to a relative time structure and
321 * not an absolute time structure.
323 ts
.tv_sec
+= tv
->tv_sec
;
324 ts
.tv_nsec
+= tv
->tv_usec
* 1000;
325 if (ts
.tv_nsec
>= 1000000000) {
326 ts
.tv_nsec
-= 1000000000;
329 err
= pthread_cond_timedwait(&ctx
->ctx_cond
,
330 &ctx
->ctx_lock
, &ts
);
332 if (err
== ETIMEDOUT
)
339 libusb_handle_events_timeout_completed(libusb_context
*ctx
,
340 struct timeval
*tv
, int *completed
)
344 ctx
= GET_CONTEXT(ctx
);
346 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_handle_events_timeout_completed enter");
348 libusb_lock_events(ctx
);
351 if (completed
!= NULL
) {
352 if (*completed
!= 0 || err
!= 0)
355 err
= libusb_handle_events_locked(ctx
, tv
);
356 if (completed
== NULL
)
360 libusb_unlock_events(ctx
);
362 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_handle_events_timeout_completed exit");
368 libusb_handle_events_completed(libusb_context
*ctx
, int *completed
)
370 return (libusb_handle_events_timeout_completed(ctx
, NULL
, completed
));
374 libusb_handle_events_timeout(libusb_context
*ctx
, struct timeval
*tv
)
376 return (libusb_handle_events_timeout_completed(ctx
, tv
, NULL
));
380 libusb_handle_events(libusb_context
*ctx
)
382 return (libusb_handle_events_timeout_completed(ctx
, NULL
, NULL
));
386 libusb_handle_events_locked(libusb_context
*ctx
, struct timeval
*tv
)
390 ctx
= GET_CONTEXT(ctx
);
392 if (libusb_event_handling_ok(ctx
)) {
393 err
= libusb10_handle_events_sub(ctx
, tv
);
395 err
= libusb_wait_for_event(ctx
, tv
);
397 err
= LIBUSB_ERROR_TIMEOUT
;
403 libusb_get_next_timeout(libusb_context
*ctx
, struct timeval
*tv
)
405 /* all timeouts are currently being done by the kernel */
411 libusb_set_pollfd_notifiers(libusb_context
*ctx
,
412 libusb_pollfd_added_cb added_cb
, libusb_pollfd_removed_cb removed_cb
,
415 ctx
= GET_CONTEXT(ctx
);
417 ctx
->fd_added_cb
= added_cb
;
418 ctx
->fd_removed_cb
= removed_cb
;
419 ctx
->fd_cb_user_data
= user_data
;
422 const struct libusb_pollfd
**
423 libusb_get_pollfds(libusb_context
*ctx
)
425 struct libusb_super_pollfd
*pollfd
;
429 ctx
= GET_CONTEXT(ctx
);
434 TAILQ_FOREACH(pollfd
, &ctx
->pollfds
, entry
)
437 ret
= calloc(i
+ 1, sizeof(struct libusb_pollfd
*));
442 TAILQ_FOREACH(pollfd
, &ctx
->pollfds
, entry
)
443 ret
[i
++] = &pollfd
->pollfd
;
448 return ((const struct libusb_pollfd
**)ret
);
452 /* Synchronous device I/O */
455 libusb_control_transfer(libusb_device_handle
*devh
,
456 uint8_t bmRequestType
, uint8_t bRequest
, uint16_t wValue
, uint16_t wIndex
,
457 uint8_t *data
, uint16_t wLength
, unsigned int timeout
)
459 struct LIBUSB20_CONTROL_SETUP_DECODED req
;
464 return (LIBUSB_ERROR_INVALID_PARAM
);
466 if ((wLength
!= 0) && (data
== NULL
))
467 return (LIBUSB_ERROR_INVALID_PARAM
);
469 LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP
, &req
);
471 req
.bmRequestType
= bmRequestType
;
472 req
.bRequest
= bRequest
;
475 req
.wLength
= wLength
;
477 err
= libusb20_dev_request_sync(devh
, &req
, data
,
478 &actlen
, timeout
, 0);
480 if (err
== LIBUSB20_ERROR_PIPE
)
481 return (LIBUSB_ERROR_PIPE
);
482 else if (err
== LIBUSB20_ERROR_TIMEOUT
)
483 return (LIBUSB_ERROR_TIMEOUT
);
485 return (LIBUSB_ERROR_NO_DEVICE
);
491 libusb10_do_transfer_cb(struct libusb_transfer
*transfer
)
496 ctx
= GET_CONTEXT(NULL
);
498 DPRINTF(ctx
, LIBUSB_DEBUG_TRANSFER
, "sync I/O done");
500 pdone
= transfer
->user_data
;
505 * TODO: Replace the following function. Allocating and freeing on a
506 * per-transfer basis is slow. --HPS
509 libusb10_do_transfer(libusb_device_handle
*devh
,
510 uint8_t endpoint
, uint8_t *data
, int length
,
511 int *transferred
, unsigned int timeout
, int type
)
514 struct libusb_transfer
*xfer
;
519 return (LIBUSB_ERROR_INVALID_PARAM
);
521 if ((length
!= 0) && (data
== NULL
))
522 return (LIBUSB_ERROR_INVALID_PARAM
);
524 xfer
= libusb_alloc_transfer(0);
526 return (LIBUSB_ERROR_NO_MEM
);
528 ctx
= libusb_get_device(devh
)->ctx
;
530 xfer
->dev_handle
= devh
;
531 xfer
->endpoint
= endpoint
;
533 xfer
->timeout
= timeout
;
535 xfer
->length
= length
;
536 xfer
->user_data
= (void *)&done
;
537 xfer
->callback
= libusb10_do_transfer_cb
;
540 if ((ret
= libusb_submit_transfer(xfer
)) < 0) {
541 libusb_free_transfer(xfer
);
545 if ((ret
= libusb_handle_events(ctx
)) < 0) {
546 libusb_cancel_transfer(xfer
);
547 usleep(1000); /* nice it */
551 *transferred
= xfer
->actual_length
;
553 switch (xfer
->status
) {
554 case LIBUSB_TRANSFER_COMPLETED
:
557 case LIBUSB_TRANSFER_TIMED_OUT
:
558 ret
= LIBUSB_ERROR_TIMEOUT
;
560 case LIBUSB_TRANSFER_OVERFLOW
:
561 ret
= LIBUSB_ERROR_OVERFLOW
;
563 case LIBUSB_TRANSFER_STALL
:
564 ret
= LIBUSB_ERROR_PIPE
;
566 case LIBUSB_TRANSFER_NO_DEVICE
:
567 ret
= LIBUSB_ERROR_NO_DEVICE
;
570 ret
= LIBUSB_ERROR_OTHER
;
574 libusb_free_transfer(xfer
);
579 libusb_bulk_transfer(libusb_device_handle
*devh
,
580 uint8_t endpoint
, uint8_t *data
, int length
,
581 int *transferred
, unsigned int timeout
)
586 ctx
= GET_CONTEXT(NULL
);
587 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_bulk_transfer enter");
589 ret
= libusb10_do_transfer(devh
, endpoint
, data
, length
, transferred
,
590 timeout
, LIBUSB_TRANSFER_TYPE_BULK
);
592 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_bulk_transfer leave");
597 libusb_interrupt_transfer(libusb_device_handle
*devh
,
598 uint8_t endpoint
, uint8_t *data
, int length
,
599 int *transferred
, unsigned int timeout
)
604 ctx
= GET_CONTEXT(NULL
);
605 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_interrupt_transfer enter");
607 ret
= libusb10_do_transfer(devh
, endpoint
, data
, length
, transferred
,
608 timeout
, LIBUSB_TRANSFER_TYPE_INTERRUPT
);
610 DPRINTF(ctx
, LIBUSB_DEBUG_FUNCTION
, "libusb_interrupt_transfer leave");
615 libusb_get_iso_packet_buffer(struct libusb_transfer
*transfer
, uint32_t off
)
620 if (transfer
->num_iso_packets
< 0)
623 if (off
>= (uint32_t)transfer
->num_iso_packets
)
626 ptr
= transfer
->buffer
;
630 for (n
= 0; n
!= off
; n
++) {
631 ptr
+= transfer
->iso_packet_desc
[n
].length
;
637 libusb_get_iso_packet_buffer_simple(struct libusb_transfer
*transfer
, uint32_t off
)
641 if (transfer
->num_iso_packets
< 0)
644 if (off
>= (uint32_t)transfer
->num_iso_packets
)
647 ptr
= transfer
->buffer
;
651 ptr
+= transfer
->iso_packet_desc
[0].length
* off
;
657 libusb_set_iso_packet_lengths(struct libusb_transfer
*transfer
, uint32_t length
)
661 if (transfer
->num_iso_packets
< 0)
664 for (n
= 0; n
!= transfer
->num_iso_packets
; n
++)
665 transfer
->iso_packet_desc
[n
].length
= length
;
669 libusb_control_transfer_get_data(struct libusb_transfer
*transfer
)
671 if (transfer
->buffer
== NULL
)
674 return (transfer
->buffer
+ LIBUSB_CONTROL_SETUP_SIZE
);
677 struct libusb_control_setup
*
678 libusb_control_transfer_get_setup(struct libusb_transfer
*transfer
)
680 return ((struct libusb_control_setup
*)transfer
->buffer
);
684 libusb_fill_control_setup(uint8_t *buf
, uint8_t bmRequestType
,
685 uint8_t bRequest
, uint16_t wValue
,
686 uint16_t wIndex
, uint16_t wLength
)
688 struct libusb_control_setup
*req
= (struct libusb_control_setup
*)buf
;
690 /* The alignment is OK for all fields below. */
691 req
->bmRequestType
= bmRequestType
;
692 req
->bRequest
= bRequest
;
693 req
->wValue
= htole16(wValue
);
694 req
->wIndex
= htole16(wIndex
);
695 req
->wLength
= htole16(wLength
);
699 libusb_fill_control_transfer(struct libusb_transfer
*transfer
,
700 libusb_device_handle
*devh
, uint8_t *buf
,
701 libusb_transfer_cb_fn callback
, void *user_data
,
704 struct libusb_control_setup
*setup
= (struct libusb_control_setup
*)buf
;
706 transfer
->dev_handle
= devh
;
707 transfer
->endpoint
= 0;
708 transfer
->type
= LIBUSB_TRANSFER_TYPE_CONTROL
;
709 transfer
->timeout
= timeout
;
710 transfer
->buffer
= buf
;
712 transfer
->length
= LIBUSB_CONTROL_SETUP_SIZE
713 + le16toh(setup
->wLength
);
715 transfer
->length
= 0;
716 transfer
->user_data
= user_data
;
717 transfer
->callback
= callback
;
722 libusb_fill_bulk_transfer(struct libusb_transfer
*transfer
,
723 libusb_device_handle
*devh
, uint8_t endpoint
, uint8_t *buf
,
724 int length
, libusb_transfer_cb_fn callback
, void *user_data
,
727 transfer
->dev_handle
= devh
;
728 transfer
->endpoint
= endpoint
;
729 transfer
->type
= LIBUSB_TRANSFER_TYPE_BULK
;
730 transfer
->timeout
= timeout
;
731 transfer
->buffer
= buf
;
732 transfer
->length
= length
;
733 transfer
->user_data
= user_data
;
734 transfer
->callback
= callback
;
738 libusb_fill_interrupt_transfer(struct libusb_transfer
*transfer
,
739 libusb_device_handle
*devh
, uint8_t endpoint
, uint8_t *buf
,
740 int length
, libusb_transfer_cb_fn callback
, void *user_data
,
743 transfer
->dev_handle
= devh
;
744 transfer
->endpoint
= endpoint
;
745 transfer
->type
= LIBUSB_TRANSFER_TYPE_INTERRUPT
;
746 transfer
->timeout
= timeout
;
747 transfer
->buffer
= buf
;
748 transfer
->length
= length
;
749 transfer
->user_data
= user_data
;
750 transfer
->callback
= callback
;
754 libusb_fill_iso_transfer(struct libusb_transfer
*transfer
,
755 libusb_device_handle
*devh
, uint8_t endpoint
, uint8_t *buf
,
756 int length
, int npacket
, libusb_transfer_cb_fn callback
,
757 void *user_data
, uint32_t timeout
)
759 transfer
->dev_handle
= devh
;
760 transfer
->endpoint
= endpoint
;
761 transfer
->type
= LIBUSB_TRANSFER_TYPE_ISOCHRONOUS
;
762 transfer
->timeout
= timeout
;
763 transfer
->buffer
= buf
;
764 transfer
->length
= length
;
765 transfer
->num_iso_packets
= npacket
;
766 transfer
->user_data
= user_data
;
767 transfer
->callback
= callback
;