1 /* $FreeBSD$ */ 2 /*- 3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 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. 13 * 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 24 * SUCH DAMAGE. 25 */ 26 27 #ifndef __LIBUSB10_H__ 28 #define __LIBUSB10_H__ 29 30 #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 31 #include <sys/queue.h> 32 #endif 33 34 #define GET_CONTEXT(ctx) (((ctx) == NULL) ? usbi_default_context : (ctx)) 35 #define UNEXPORTED __attribute__((__visibility__("hidden"))) 36 #define CTX_LOCK(ctx) pthread_mutex_lock(&(ctx)->ctx_lock) 37 #define CTX_TRYLOCK(ctx) pthread_mutex_trylock(&(ctx)->ctx_lock) 38 #define CTX_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->ctx_lock) 39 40 #define DPRINTF(ctx, dbg, format, args...) do { \ 41 if ((ctx)->debug == dbg) { \ 42 switch (dbg) { \ 43 case LIBUSB_DEBUG_FUNCTION: \ 44 printf("LIBUSB_FUNCTION: " \ 45 format "\n", ## args); \ 46 break; \ 47 case LIBUSB_DEBUG_TRANSFER: \ 48 printf("LIBUSB_TRANSFER: " \ 49 format "\n", ## args); \ 50 break; \ 51 default: \ 52 break; \ 53 } \ 54 } \ 55 } while(0) 56 57 /* internal structures */ 58 59 struct libusb_super_pollfd { 60 TAILQ_ENTRY(libusb_super_pollfd) entry; 61 struct libusb20_device *pdev; 62 struct libusb_pollfd pollfd; 63 }; 64 65 struct libusb_super_transfer { 66 TAILQ_ENTRY(libusb_super_transfer) entry; 67 uint8_t *curr_data; 68 uint32_t rem_len; 69 uint32_t last_len; 70 uint8_t state; 71 #define LIBUSB_SUPER_XFER_ST_NONE 0 72 #define LIBUSB_SUPER_XFER_ST_PEND 1 73 }; 74 75 struct libusb_context { 76 int debug; 77 int debug_fixed; 78 int ctrl_pipe[2]; 79 int tr_done_ref; 80 int tr_done_gen; 81 82 pthread_mutex_t ctx_lock; 83 pthread_cond_t ctx_cond; 84 pthread_t ctx_handler; 85 #define NO_THREAD ((pthread_t)-1) 86 87 TAILQ_HEAD(, libusb_super_pollfd) pollfds; 88 TAILQ_HEAD(, libusb_super_transfer) tr_done; 89 90 struct libusb_super_pollfd ctx_poll; 91 92 libusb_pollfd_added_cb fd_added_cb; 93 libusb_pollfd_removed_cb fd_removed_cb; 94 void *fd_cb_user_data; 95 }; 96 97 struct libusb_device { 98 int refcnt; 99 100 uint32_t claimed_interfaces; 101 102 struct libusb_super_pollfd dev_poll; 103 104 struct libusb_context *ctx; 105 106 TAILQ_HEAD(, libusb_super_transfer) tr_head; 107 108 struct libusb20_device *os_priv; 109 }; 110 111 extern struct libusb_context *usbi_default_context; 112 113 void libusb10_add_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd, struct libusb20_device *pdev, int fd, short events); 114 void libusb10_remove_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd); 115 void libusb10_cancel_all_transfer(libusb_device *dev); 116 117 #endif /* __LIBUSB10_H__ */ 118