1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2009 Sylvestre Gallon. 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 #ifndef __LIBUSB10_H__ 29 #define __LIBUSB10_H__ 30 31 #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 32 #include <sys/queue.h> 33 #include <netlink/netlink.h> 34 #include <netlink/netlink_generic.h> 35 #include <netlink/netlink_snl.h> 36 #include <netlink/netlink_snl_generic.h> 37 #include <netlink/netlink_sysevent.h> 38 39 #endif 40 41 #define GET_CONTEXT(ctx) (((ctx) == NULL) ? usbi_default_context : (ctx)) 42 #define UNEXPORTED __attribute__((__visibility__("hidden"))) 43 #define CTX_LOCK(ctx) pthread_mutex_lock(&(ctx)->ctx_lock) 44 #define CTX_TRYLOCK(ctx) pthread_mutex_trylock(&(ctx)->ctx_lock) 45 #define CTX_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->ctx_lock) 46 #define HOTPLUG_LOCK(ctx) pthread_mutex_lock(&(ctx)->hotplug_lock) 47 #define HOTPLUG_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->hotplug_lock) 48 49 #define DPRINTF(ctx, dbg, format, ...) do { \ 50 switch (dbg) { \ 51 case LIBUSB_DEBUG_FUNCTION: \ 52 if ((ctx)->debug & LIBUSB_DEBUG_FUNCTION) { \ 53 printf("LIBUSB_FUNCTION: " \ 54 format "\n", ## __VA_ARGS__); \ 55 } \ 56 break; \ 57 case LIBUSB_DEBUG_TRANSFER: \ 58 if ((ctx)->debug & LIBUSB_DEBUG_TRANSFER) { \ 59 printf("LIBUSB_TRANSFER: " \ 60 format "\n", ## __VA_ARGS__); \ 61 } \ 62 break; \ 63 default: \ 64 break; \ 65 } \ 66 } while (0) 67 68 /* internal structures */ 69 70 struct libusb_super_pollfd { 71 TAILQ_ENTRY(libusb_super_pollfd) entry; 72 struct libusb20_device *pdev; 73 struct libusb_pollfd pollfd; 74 }; 75 76 struct libusb_super_transfer { 77 TAILQ_ENTRY(libusb_super_transfer) entry; 78 uint8_t *curr_data; 79 uint32_t rem_len; 80 uint32_t last_len; 81 uint32_t stream_id; 82 uint8_t state; 83 #define LIBUSB_SUPER_XFER_ST_NONE 0 84 #define LIBUSB_SUPER_XFER_ST_PEND 1 85 }; 86 87 struct libusb_hotplug_callback_handle_struct { 88 TAILQ_ENTRY(libusb_hotplug_callback_handle_struct) entry; 89 int events; 90 int vendor; 91 int product; 92 int devclass; 93 libusb_hotplug_callback_fn fn; 94 void *user_data; 95 }; 96 97 TAILQ_HEAD(libusb_device_head, libusb_device); 98 99 typedef enum { 100 usb_event_none, 101 usb_event_scan, 102 usb_event_devd, 103 usb_event_netlink 104 } usb_event_mode_t; 105 106 struct libusb_context { 107 int debug; 108 int debug_fixed; 109 int ctrl_pipe[2]; 110 int tr_done_ref; 111 int tr_done_gen; 112 usb_event_mode_t usb_event_mode; 113 int devd_pipe; 114 struct snl_state ss; 115 116 pthread_mutex_t ctx_lock; 117 pthread_mutex_t hotplug_lock; 118 pthread_cond_t ctx_cond; 119 pthread_t hotplug_handler; 120 pthread_t ctx_handler; 121 #define NO_THREAD ((pthread_t)-1) 122 123 TAILQ_HEAD(, libusb_super_pollfd) pollfds; 124 TAILQ_HEAD(, libusb_super_transfer) tr_done; 125 TAILQ_HEAD(, libusb_hotplug_callback_handle_struct) hotplug_cbh; 126 struct libusb_device_head hotplug_devs; 127 128 struct libusb_super_pollfd ctx_poll; 129 130 libusb_pollfd_added_cb fd_added_cb; 131 libusb_pollfd_removed_cb fd_removed_cb; 132 void *fd_cb_user_data; 133 }; 134 135 struct libusb_device { 136 int refcnt; 137 138 int device_is_gone; 139 140 uint32_t claimed_interfaces; 141 142 struct libusb_super_pollfd dev_poll; 143 144 struct libusb_context *ctx; 145 146 TAILQ_ENTRY(libusb_device) hotplug_entry; 147 148 TAILQ_HEAD(, libusb_super_transfer) tr_head; 149 150 struct libusb20_device *os_priv; 151 }; 152 153 extern struct libusb_context *usbi_default_context; 154 155 void libusb10_add_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd, struct libusb20_device *pdev, int fd, short events); 156 void libusb10_remove_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd); 157 void libusb10_cancel_all_transfer(libusb_device *dev); 158 void libusb10_cancel_all_transfer_locked(struct libusb20_device *pdev, struct libusb_device *dev); 159 160 #endif /* __LIBUSB10_H__ */ 161