1 /* $FreeBSD$ */ 2 /*- 3 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 4 * 5 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef __LIBUSB10_H__ 30 #define __LIBUSB10_H__ 31 32 #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 33 #include <sys/queue.h> 34 #endif 35 36 #define GET_CONTEXT(ctx) (((ctx) == NULL) ? usbi_default_context : (ctx)) 37 #define UNEXPORTED __attribute__((__visibility__("hidden"))) 38 #define CTX_LOCK(ctx) pthread_mutex_lock(&(ctx)->ctx_lock) 39 #define CTX_TRYLOCK(ctx) pthread_mutex_trylock(&(ctx)->ctx_lock) 40 #define CTX_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->ctx_lock) 41 #define HOTPLUG_LOCK(ctx) pthread_mutex_lock(&(ctx)->hotplug_lock) 42 #define HOTPLUG_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->hotplug_lock) 43 44 #define DPRINTF(ctx, dbg, format, ...) do { \ 45 switch (dbg) { \ 46 case LIBUSB_DEBUG_FUNCTION: \ 47 if ((ctx)->debug & LIBUSB_DEBUG_FUNCTION) { \ 48 printf("LIBUSB_FUNCTION: " \ 49 format "\n", ## __VA_ARGS__); \ 50 } \ 51 break; \ 52 case LIBUSB_DEBUG_TRANSFER: \ 53 if ((ctx)->debug & LIBUSB_DEBUG_TRANSFER) { \ 54 printf("LIBUSB_TRANSFER: " \ 55 format "\n", ## __VA_ARGS__); \ 56 } \ 57 break; \ 58 default: \ 59 break; \ 60 } \ 61 } while (0) 62 63 /* internal structures */ 64 65 struct libusb_super_pollfd { 66 TAILQ_ENTRY(libusb_super_pollfd) entry; 67 struct libusb20_device *pdev; 68 struct libusb_pollfd pollfd; 69 }; 70 71 struct libusb_super_transfer { 72 TAILQ_ENTRY(libusb_super_transfer) entry; 73 uint8_t *curr_data; 74 uint32_t rem_len; 75 uint32_t last_len; 76 uint32_t stream_id; 77 uint8_t state; 78 #define LIBUSB_SUPER_XFER_ST_NONE 0 79 #define LIBUSB_SUPER_XFER_ST_PEND 1 80 }; 81 82 struct libusb_hotplug_callback_handle_struct { 83 TAILQ_ENTRY(libusb_hotplug_callback_handle_struct) entry; 84 int events; 85 int vendor; 86 int product; 87 int devclass; 88 libusb_hotplug_callback_fn fn; 89 void *user_data; 90 }; 91 92 TAILQ_HEAD(libusb_device_head, libusb_device); 93 94 struct libusb_context { 95 int debug; 96 int debug_fixed; 97 int ctrl_pipe[2]; 98 int tr_done_ref; 99 int tr_done_gen; 100 101 pthread_mutex_t ctx_lock; 102 pthread_mutex_t hotplug_lock; 103 pthread_cond_t ctx_cond; 104 pthread_t hotplug_handler; 105 pthread_t ctx_handler; 106 #define NO_THREAD ((pthread_t)-1) 107 108 TAILQ_HEAD(, libusb_super_pollfd) pollfds; 109 TAILQ_HEAD(, libusb_super_transfer) tr_done; 110 TAILQ_HEAD(, libusb_hotplug_callback_handle_struct) hotplug_cbh; 111 struct libusb_device_head hotplug_devs; 112 113 struct libusb_super_pollfd ctx_poll; 114 115 libusb_pollfd_added_cb fd_added_cb; 116 libusb_pollfd_removed_cb fd_removed_cb; 117 void *fd_cb_user_data; 118 }; 119 120 struct libusb_device { 121 int refcnt; 122 123 int device_is_gone; 124 125 uint32_t claimed_interfaces; 126 127 struct libusb_super_pollfd dev_poll; 128 129 struct libusb_context *ctx; 130 131 TAILQ_ENTRY(libusb_device) hotplug_entry; 132 133 TAILQ_HEAD(, libusb_super_transfer) tr_head; 134 135 struct libusb20_device *os_priv; 136 }; 137 138 extern struct libusb_context *usbi_default_context; 139 140 void libusb10_add_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd, struct libusb20_device *pdev, int fd, short events); 141 void libusb10_remove_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd); 142 void libusb10_cancel_all_transfer(libusb_device *dev); 143 void libusb10_cancel_all_transfer_locked(struct libusb20_device *pdev, struct libusb_device *dev); 144 145 #endif /* __LIBUSB10_H__ */ 146