octusb.h revision 331722
1/* $FreeBSD: stable/11/sys/mips/cavium/usb/octusb.h 331722 2018-03-29 02:50:57Z eadler $ */
2
3/*-
4 * Copyright (c) 2010 Hans Petter Selasky. 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 _OCTUSB_H_
29#define	_OCTUSB_H_
30
31#define	OCTUSB_MAX_DEVICES MIN(USB_MAX_DEVICES, 64)
32#define	OCTUSB_MAX_PORTS	2	/* hardcoded */
33#define	OCTUSB_MAX_FIXUP	4096	/* bytes */
34#define	OCTUSB_INTR_ENDPT	0x01
35
36struct octusb_qh;
37struct octusb_td;
38struct octusb_softc;
39
40typedef uint8_t (octusb_cmd_t)(struct octusb_td *td);
41
42struct octusb_td {
43	struct octusb_qh *qh;
44	struct octusb_td *obj_next;
45	struct usb_page_cache *pc;
46	octusb_cmd_t *func;
47
48	uint32_t remainder;
49	uint32_t offset;
50
51	uint8_t	error_any:1;
52	uint8_t	error_stall:1;
53	uint8_t	short_pkt:1;
54	uint8_t	alt_next:1;
55	uint8_t	reserved:4;
56};
57
58struct octusb_qh {
59
60	uint64_t fixup_phys;
61
62	struct octusb_softc *sc;
63	struct usb_page_cache *fixup_pc;
64	uint8_t *fixup_buf;
65
66	cvmx_usb_iso_packet_t iso_pkt;
67
68	uint32_t fixup_off;
69
70	uint16_t max_frame_size;
71	uint16_t max_packet_size;
72	uint16_t fixup_actlen;
73	uint16_t fixup_len;
74	uint16_t ep_interval;
75
76	uint8_t	dev_addr;
77	uint8_t	dev_speed;
78	uint8_t	ep_allocated;
79	uint8_t	ep_mult;
80	uint8_t	ep_num;
81	uint8_t	ep_type;
82	uint8_t	ep_toggle_next;
83	uint8_t	root_port_index;
84	uint8_t	fixup_complete;
85	uint8_t	fixup_pending;
86	uint8_t	hs_hub_addr;
87	uint8_t	hs_hub_port;
88
89	int	fixup_handle;
90	int	ep_handle;
91};
92
93struct octusb_config_desc {
94	struct usb_config_descriptor confd;
95	struct usb_interface_descriptor ifcd;
96	struct usb_endpoint_descriptor endpd;
97} __packed;
98
99union octusb_hub_desc {
100	struct usb_status stat;
101	struct usb_port_status ps;
102	uint8_t	temp[128];
103};
104
105struct octusb_port {
106	cvmx_usb_state_t state;
107	uint8_t	disabled;
108};
109
110struct octusb_softc {
111
112	struct usb_bus sc_bus;		/* base device */
113	union octusb_hub_desc sc_hub_desc;
114
115	struct usb_device *sc_devices[OCTUSB_MAX_DEVICES];
116
117	struct resource *sc_irq_res[OCTUSB_MAX_PORTS];
118	void   *sc_intr_hdl[OCTUSB_MAX_PORTS];
119
120	struct octusb_port sc_port[OCTUSB_MAX_PORTS];
121	device_t sc_dev;
122
123	struct usb_hub_descriptor_min sc_hubd;
124
125	uint8_t	sc_noport;		/* number of ports */
126	uint8_t	sc_addr;		/* device address */
127	uint8_t	sc_conf;		/* device configuration */
128	uint8_t	sc_isreset;		/* set if current port is reset */
129
130	uint8_t	sc_hub_idata[1];
131};
132
133usb_bus_mem_cb_t octusb_iterate_hw_softc;
134usb_error_t octusb_init(struct octusb_softc *);
135usb_error_t octusb_uninit(struct octusb_softc *);
136void	octusb_interrupt(struct octusb_softc *);
137
138#endif					/* _OCTUSB_H_ */
139