1/*-------------------------------------------------------------------------*/
2/* list of all controllers using this driver
3 * */
4
5static LIST_HEAD (hci_hcd_list);
6
7/* URB states (urb_state) */
8/* isoc, interrupt single state */
9
10/* bulk transfer main state and 0-length packet */
11#define US_BULK		0
12#define US_BULK0	1
13/* three setup states */
14#define US_CTRL_SETUP	2
15#define US_CTRL_DATA	1
16#define US_CTRL_ACK	0
17
18/*-------------------------------------------------------------------------*/
19/* HC private part of a device descriptor
20 * */
21
22#define NUM_EDS 32
23
24typedef struct epd {
25	struct urb *pipe_head;
26	struct list_head urb_queue;
27//	int urb_state;
28	struct timer_list timeout;
29	int last_iso;		/* timestamp of last queued ISOC transfer */
30
31} epd_t;
32
33struct hci_device {
34	epd_t ed[NUM_EDS];
35};
36
37/*-------------------------------------------------------------------------*/
38/* Virtual Root HUB
39 */
40
41#define usb_to_hci(usb)	((struct hci_device *)(usb)->hcpriv)
42
43struct virt_root_hub {
44	int devnum;		/* Address of Root Hub endpoint */
45	void *urb;		/* interrupt URB of root hub */
46	int send;		/* active flag */
47	int interval;		/* intervall of roothub interrupt transfers */
48	struct timer_list rh_int_timer;	/* intervall timer for rh interrupt EP */
49};
50
51#if 1
52/* USB HUB CONSTANTS (not OHCI-specific; see hub.h and USB spec) */
53
54/* destination of request */
55#define RH_INTERFACE		0x01
56#define RH_ENDPOINT		0x02
57#define RH_OTHER		0x03
58
59#define RH_CLASS		0x20
60#define RH_VENDOR		0x40
61
62/* Requests: bRequest << 8 | bmRequestType */
63#define RH_GET_STATUS		0x0080
64#define RH_CLEAR_FEATURE	0x0100
65#define RH_SET_FEATURE		0x0300
66#define RH_SET_ADDRESS		0x0500
67#define RH_GET_DESCRIPTOR	0x0680
68#define RH_SET_DESCRIPTOR	0x0700
69#define RH_GET_CONFIGURATION	0x0880
70#define RH_SET_CONFIGURATION	0x0900
71#define RH_GET_STATE		0x0280
72#define RH_GET_INTERFACE	0x0A80
73#define RH_SET_INTERFACE	0x0B00
74#define RH_SYNC_FRAME		0x0C80
75/* Our Vendor Specific Request */
76#define RH_SET_EP		0x2000
77
78/* Hub port features */
79#define RH_PORT_CONNECTION	0x00
80#define RH_PORT_ENABLE		0x01
81#define RH_PORT_SUSPEND		0x02
82#define RH_PORT_OVER_CURRENT	0x03
83#define RH_PORT_RESET		0x04
84#define RH_PORT_POWER		0x08
85#define RH_PORT_LOW_SPEED	0x09
86
87#define RH_C_PORT_CONNECTION	0x10
88#define RH_C_PORT_ENABLE	0x11
89#define RH_C_PORT_SUSPEND	0x12
90#define RH_C_PORT_OVER_CURRENT	0x13
91#define RH_C_PORT_RESET		0x14
92
93/* Hub features */
94#define RH_C_HUB_LOCAL_POWER	0x00
95#define RH_C_HUB_OVER_CURRENT	0x01
96
97#define RH_DEVICE_REMOTE_WAKEUP	0x00
98#define RH_ENDPOINT_STALL	0x01
99
100#endif
101
102/*-------------------------------------------------------------------------*/
103/* struct for each HC
104 */
105
106#define MAX_TRANS	32
107
108typedef struct td {
109	struct urb *urb;
110	__u16 len;
111	__u16 iso_index;
112} td_t;
113
114typedef struct td_array {
115	int len;
116	td_t td[MAX_TRANS];
117} td_array_t;
118
119typedef struct hci {
120	struct virt_root_hub rh;	/* roothub */
121	wait_queue_head_t waitq;	/* deletion of URBs and devices needs a waitqueue */
122	int active;			/* HC is operating */
123
124	struct list_head ctrl_list;	/* set of ctrl endpoints */
125	struct list_head bulk_list;	/* set of bulk endpoints */
126	struct list_head iso_list;	/* set of isoc endpoints */
127	struct list_head intr_list;	/* ordered (tree) set of int endpoints */
128	struct list_head del_list;	/* set of entpoints to be deleted */
129
130	td_array_t *td_array;
131	td_array_t a_td_array;
132	td_array_t i_td_array[2];
133
134	struct list_head hci_hcd_list;	/* list of all hci_hcd */
135	struct usb_bus *bus;		/* our bus */
136
137//	int trans;			/* number of transactions pending */
138	int active_urbs;
139	int active_trans;
140	int frame_number;		/* frame number */
141	hcipriv_t hp;			/* individual part of hc type */
142	int nakCnt;
143	int last_packet_nak;
144
145} hci_t;
146
147/*-------------------------------------------------------------------------*/
148/* condition (error) CC codes and mapping OHCI like
149 */
150
151#define TD_CC_NOERROR		0x00
152#define TD_CC_CRC		0x01
153#define TD_CC_BITSTUFFING	0x02
154#define TD_CC_DATATOGGLEM	0x03
155#define TD_CC_STALL		0x04
156#define TD_DEVNOTRESP		0x05
157#define TD_PIDCHECKFAIL		0x06
158#define TD_UNEXPECTEDPID	0x07
159#define TD_DATAOVERRUN		0x08
160#define TD_DATAUNDERRUN		0x09
161#define TD_BUFFEROVERRUN	0x0C
162#define TD_BUFFERUNDERRUN	0x0D
163#define TD_NOTACCESSED		0x0F
164
165
166/* urb interface functions */
167static int hci_get_current_frame_number (struct usb_device *usb_dev);
168static int hci_unlink_urb (struct urb * urb);
169
170static int qu_queue_urb (hci_t * hci, struct urb * urb);
171
172/* root hub */
173static int rh_init_int_timer (struct urb * urb);
174static int rh_submit_urb (struct urb * urb);
175static int rh_unlink_urb (struct urb * urb);
176
177/* schedule functions */
178static int sh_add_packet (hci_t * hci, struct urb * urb);
179
180/* hc specific functions */
181static inline void hc_flush_data_cache (hci_t * hci, void *data, int len);
182static inline int hc_parse_trans (hci_t * hci, int *actbytes, __u8 * data,
183				  int *cc, int *toggle, int length, int pid,
184				  int urb_state);
185static inline int hc_add_trans (hci_t * hci, int len, void *data, int toggle,
186				int maxps, int slow, int endpoint, int address,
187				int pid, int format, int urb_state);
188
189static void hc_start_int (hci_t * hci);
190static void hc_stop_int (hci_t * hci);
191
192/* debug| print the main components of an URB
193 * small: 0) header + data packets 1) just header */
194
195static void urb_print (struct urb * urb, char *str, int small)
196{
197	unsigned int pipe = urb->pipe;
198	int i, len;
199
200	if (!urb->dev || !urb->dev->bus) {
201		dbg ("%s URB: no dev", str);
202		return;
203	}
204
205	printk ("%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,flags:%4x,len:%d/%d,stat:%d(%x)\n",
206		str, hci_get_current_frame_number (urb->dev),
207		usb_pipedevice (pipe), usb_pipeendpoint (pipe),
208		usb_pipeout (pipe) ? 'O' : 'I',
209		usb_pipetype (pipe) < 2 ? (usb_pipeint (pipe) ? "INTR" : "ISOC")
210		: (usb_pipecontrol (pipe) ? "CTRL" : "BULK"), urb->transfer_flags,
211		urb->actual_length, urb->transfer_buffer_length, urb->status,
212		urb->status);
213	if (!small) {
214		if (usb_pipecontrol (pipe)) {
215			printk (__FILE__ ": cmd(8):");
216			for (i = 0; i < 8; i++)
217				printk (" %02x", ((__u8 *) urb->setup_packet)[i]);
218			printk ("\n");
219		}
220		if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {
221			printk (__FILE__ ": data(%d/%d):", urb->actual_length,
222				urb->transfer_buffer_length);
223			len = usb_pipeout (pipe) ? urb-> transfer_buffer_length : urb->actual_length;
224			for (i = 0; i < 2096 && i < len; i++)
225				printk (" %02x", ((__u8 *) urb->transfer_buffer)[i]);
226			printk ("%s stat:%d\n", i < len ? "..." : "",
227				urb->status);
228		}
229	}
230}
231