1 /* $OpenBSD: usbfvar.h,v 1.6 2007/06/15 11:41:48 mbalmer Exp $ */
2
3 /*
4 * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 /*
20 * USB function driver interface
21 *
22 * This file is to be included only by the logical device driver and the
23 * USB device controller (DC) driver.
24 */
25
26 /*** structures corresponding to USB protocol components ***/
27
28 struct usbf_endpoint {
29 struct usbf_interface *iface;
30 usb_endpoint_descriptor_t *edesc;
31 int halted; /* UF_ENDPOINT_HALT set */
32 int refcnt;
33 SIMPLEQ_ENTRY(usbf_endpoint) next;
34 };
35
36 struct usbf_interface {
37 struct usbf_config *config;
38 usb_interface_descriptor_t *idesc;
39 LIST_HEAD(, usbf_pipe) pipes;
40 SIMPLEQ_HEAD(, usbf_endpoint) endpoint_head;
41 SIMPLEQ_ENTRY(usbf_interface) next;
42 };
43
44 struct usbf_config {
45 struct usbf_device *uc_device;
46 usb_config_descriptor_t *uc_cdesc;
47 size_t uc_cdesc_size;
48 int uc_closed;
49 SIMPLEQ_HEAD(, usbf_interface) iface_head;
50 SIMPLEQ_ENTRY(usbf_config) next;
51 };
52
53 struct usbf_device {
54 struct device bdev; /* base device */
55 struct usbf_bus *bus; /* device controller */
56 struct usbf_function *function; /* function driver */
57 struct usbf_pipe *default_pipe; /* pipe 0 (device control) */
58 struct usbf_xfer *default_xfer; /* device request xfer */
59 struct usbf_xfer *data_xfer; /* request response xfer */
60 int address; /* assigned by host (or 0) */
61 usbf_config_handle config; /* set by host (or NULL) */
62 usb_status_t status; /* device status */
63 usb_device_request_t def_req; /* device request buffer */
64 struct usbf_endpoint def_ep; /* for pipe 0 */
65 usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
66 usb_device_descriptor_t ddesc; /* device descriptor */
67 usb_string_descriptor_t *sdesc; /* string descriptors */
68 size_t sdesc_size; /* size of ud_sdesc */
69 uByte string_id; /* next string id */
70 SIMPLEQ_HEAD(, usbf_config) configs;
71 };
72
73 /*** software control structures ***/
74
75 struct usbf_pipe_methods {
76 usbf_status (*transfer)(usbf_xfer_handle);
77 usbf_status (*start)(usbf_xfer_handle);
78 void (*abort)(usbf_xfer_handle);
79 void (*done)(usbf_xfer_handle);
80 void (*close)(usbf_pipe_handle);
81 };
82
83 struct usbf_bus_methods {
84 usbf_status (*open_pipe)(struct usbf_pipe *);
85 void (*soft_intr)(void *);
86 usbf_status (*allocm)(struct usbf_bus *, usb_dma_t *, u_int32_t);
87 void (*freem)(struct usbf_bus *, usb_dma_t *);
88 struct usbf_xfer *(*allocx)(struct usbf_bus *);
89 void (*freex)(struct usbf_bus *, struct usbf_xfer *);
90 };
91
92 struct usbf_softc;
93
94 struct usbf_bus {
95 /* Filled by DC driver */
96 struct device bdev; /* base device */
97 struct usbf_bus_methods *methods;
98 size_t pipe_size; /* size of pipe struct */
99 u_int8_t ep0_maxp; /* packet size for EP0 */
100 int usbrev; /* as in struct usbd_bus */
101 /* Filled by usbf driver */
102 struct usbf_softc *usbfctl;
103 int intr_context;
104 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
105 void *soft; /* soft interrupt cookie */
106 #endif
107 bus_dma_tag_t dmatag; /* DMA tag */
108 };
109
110 struct usbf_port {
111 usb_port_status_t status;
112 u_int8_t portno;
113 struct usbf_device *device; /* connected function */
114 };
115
116 struct usbf_pipe {
117 struct usbf_device *device;
118 struct usbf_interface *iface; /* unless default pipe */
119 struct usbf_endpoint *endpoint;
120 int refcnt;
121 int running;
122 int aborting;
123 SIMPLEQ_HEAD(, usbf_xfer) queue;
124 LIST_ENTRY(usbf_pipe) next;
125
126 char repeat;
127 int interval;
128
129 /* Filled by DC driver. */
130 struct usbf_pipe_methods *methods;
131 };
132
133 struct usbf_xfer {
134 struct usbf_pipe *pipe;
135 usbf_private_handle priv;
136 void *buffer;
137 u_int32_t length;
138 u_int32_t actlen;
139 u_int16_t flags;
140 u_int32_t timeout;
141 usbf_status status;
142 usbf_callback callback;
143 SIMPLEQ_ENTRY(usbf_xfer) next;
144
145 /* for memory management */
146 struct usbf_device *device;
147 int rqflags;
148 usb_dma_t dmabuf;
149
150 struct timeout timeout_handle;
151 };
152
153
154 /* usbf.c */
155 void usbf_host_reset(usbf_bus_handle);
156 void usbf_do_request(usbf_xfer_handle, usbf_private_handle,
157 usbf_status);
158
159 /* usbf_subr.c */
160 usbf_status usbf_new_device(struct device *, usbf_bus_handle, int, int, int,
161 struct usbf_port *);
162 usbf_status usbf_set_endpoint_feature(usbf_config_handle, u_int8_t,
163 u_int16_t);
164 usbf_status usbf_clear_endpoint_feature(usbf_config_handle, u_int8_t,
165 u_int16_t);
166 usbf_status usbf_insert_transfer(usbf_xfer_handle xfer);
167 void usbf_transfer_complete(usbf_xfer_handle xfer);
168 usbf_status usbf_allocmem(usbf_bus_handle, size_t, size_t, usb_dma_t *);
169 void usbf_freemem(usbf_bus_handle, usb_dma_t *);
170 usbf_status usbf_softintr_establish(struct usbf_bus *);
171 void usbf_schedsoftintr(struct usbf_bus *);