xref: /openbmc/linux/drivers/usb/host/uhci-q.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  * Universal Host Controller Interface driver for USB.
3*1da177e4SLinus Torvalds  *
4*1da177e4SLinus Torvalds  * Maintainer: Alan Stern <stern@rowland.harvard.edu>
5*1da177e4SLinus Torvalds  *
6*1da177e4SLinus Torvalds  * (C) Copyright 1999 Linus Torvalds
7*1da177e4SLinus Torvalds  * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
8*1da177e4SLinus Torvalds  * (C) Copyright 1999 Randy Dunlap
9*1da177e4SLinus Torvalds  * (C) Copyright 1999 Georg Acher, acher@in.tum.de
10*1da177e4SLinus Torvalds  * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de
11*1da177e4SLinus Torvalds  * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch
12*1da177e4SLinus Torvalds  * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at
13*1da177e4SLinus Torvalds  * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface
14*1da177e4SLinus Torvalds  *               support from usb-ohci.c by Adam Richter, adam@yggdrasil.com).
15*1da177e4SLinus Torvalds  * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c)
16*1da177e4SLinus Torvalds  * (C) Copyright 2004 Alan Stern, stern@rowland.harvard.edu
17*1da177e4SLinus Torvalds  */
18*1da177e4SLinus Torvalds 
19*1da177e4SLinus Torvalds static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb);
20*1da177e4SLinus Torvalds static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb);
21*1da177e4SLinus Torvalds static void uhci_remove_pending_urbps(struct uhci_hcd *uhci);
22*1da177e4SLinus Torvalds static void uhci_free_pending_qhs(struct uhci_hcd *uhci);
23*1da177e4SLinus Torvalds static void uhci_free_pending_tds(struct uhci_hcd *uhci);
24*1da177e4SLinus Torvalds 
25*1da177e4SLinus Torvalds /*
26*1da177e4SLinus Torvalds  * Technically, updating td->status here is a race, but it's not really a
27*1da177e4SLinus Torvalds  * problem. The worst that can happen is that we set the IOC bit again
28*1da177e4SLinus Torvalds  * generating a spurious interrupt. We could fix this by creating another
29*1da177e4SLinus Torvalds  * QH and leaving the IOC bit always set, but then we would have to play
30*1da177e4SLinus Torvalds  * games with the FSBR code to make sure we get the correct order in all
31*1da177e4SLinus Torvalds  * the cases. I don't think it's worth the effort
32*1da177e4SLinus Torvalds  */
33*1da177e4SLinus Torvalds static inline void uhci_set_next_interrupt(struct uhci_hcd *uhci)
34*1da177e4SLinus Torvalds {
35*1da177e4SLinus Torvalds 	uhci->term_td->status |= cpu_to_le32(TD_CTRL_IOC);
36*1da177e4SLinus Torvalds }
37*1da177e4SLinus Torvalds 
38*1da177e4SLinus Torvalds static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci)
39*1da177e4SLinus Torvalds {
40*1da177e4SLinus Torvalds 	uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC);
41*1da177e4SLinus Torvalds }
42*1da177e4SLinus Torvalds 
43*1da177e4SLinus Torvalds static inline void uhci_moveto_complete(struct uhci_hcd *uhci,
44*1da177e4SLinus Torvalds 					struct urb_priv *urbp)
45*1da177e4SLinus Torvalds {
46*1da177e4SLinus Torvalds 	list_move_tail(&urbp->urb_list, &uhci->complete_list);
47*1da177e4SLinus Torvalds }
48*1da177e4SLinus Torvalds 
49*1da177e4SLinus Torvalds static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci, struct usb_device *dev)
50*1da177e4SLinus Torvalds {
51*1da177e4SLinus Torvalds 	dma_addr_t dma_handle;
52*1da177e4SLinus Torvalds 	struct uhci_td *td;
53*1da177e4SLinus Torvalds 
54*1da177e4SLinus Torvalds 	td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle);
55*1da177e4SLinus Torvalds 	if (!td)
56*1da177e4SLinus Torvalds 		return NULL;
57*1da177e4SLinus Torvalds 
58*1da177e4SLinus Torvalds 	td->dma_handle = dma_handle;
59*1da177e4SLinus Torvalds 
60*1da177e4SLinus Torvalds 	td->link = UHCI_PTR_TERM;
61*1da177e4SLinus Torvalds 	td->buffer = 0;
62*1da177e4SLinus Torvalds 
63*1da177e4SLinus Torvalds 	td->frame = -1;
64*1da177e4SLinus Torvalds 	td->dev = dev;
65*1da177e4SLinus Torvalds 
66*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&td->list);
67*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&td->remove_list);
68*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&td->fl_list);
69*1da177e4SLinus Torvalds 
70*1da177e4SLinus Torvalds 	usb_get_dev(dev);
71*1da177e4SLinus Torvalds 
72*1da177e4SLinus Torvalds 	return td;
73*1da177e4SLinus Torvalds }
74*1da177e4SLinus Torvalds 
75*1da177e4SLinus Torvalds static inline void uhci_fill_td(struct uhci_td *td, u32 status,
76*1da177e4SLinus Torvalds 		u32 token, u32 buffer)
77*1da177e4SLinus Torvalds {
78*1da177e4SLinus Torvalds 	td->status = cpu_to_le32(status);
79*1da177e4SLinus Torvalds 	td->token = cpu_to_le32(token);
80*1da177e4SLinus Torvalds 	td->buffer = cpu_to_le32(buffer);
81*1da177e4SLinus Torvalds }
82*1da177e4SLinus Torvalds 
83*1da177e4SLinus Torvalds /*
84*1da177e4SLinus Torvalds  * We insert Isochronous URB's directly into the frame list at the beginning
85*1da177e4SLinus Torvalds  */
86*1da177e4SLinus Torvalds static void uhci_insert_td_frame_list(struct uhci_hcd *uhci, struct uhci_td *td, unsigned framenum)
87*1da177e4SLinus Torvalds {
88*1da177e4SLinus Torvalds 	framenum &= (UHCI_NUMFRAMES - 1);
89*1da177e4SLinus Torvalds 
90*1da177e4SLinus Torvalds 	td->frame = framenum;
91*1da177e4SLinus Torvalds 
92*1da177e4SLinus Torvalds 	/* Is there a TD already mapped there? */
93*1da177e4SLinus Torvalds 	if (uhci->fl->frame_cpu[framenum]) {
94*1da177e4SLinus Torvalds 		struct uhci_td *ftd, *ltd;
95*1da177e4SLinus Torvalds 
96*1da177e4SLinus Torvalds 		ftd = uhci->fl->frame_cpu[framenum];
97*1da177e4SLinus Torvalds 		ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list);
98*1da177e4SLinus Torvalds 
99*1da177e4SLinus Torvalds 		list_add_tail(&td->fl_list, &ftd->fl_list);
100*1da177e4SLinus Torvalds 
101*1da177e4SLinus Torvalds 		td->link = ltd->link;
102*1da177e4SLinus Torvalds 		wmb();
103*1da177e4SLinus Torvalds 		ltd->link = cpu_to_le32(td->dma_handle);
104*1da177e4SLinus Torvalds 	} else {
105*1da177e4SLinus Torvalds 		td->link = uhci->fl->frame[framenum];
106*1da177e4SLinus Torvalds 		wmb();
107*1da177e4SLinus Torvalds 		uhci->fl->frame[framenum] = cpu_to_le32(td->dma_handle);
108*1da177e4SLinus Torvalds 		uhci->fl->frame_cpu[framenum] = td;
109*1da177e4SLinus Torvalds 	}
110*1da177e4SLinus Torvalds }
111*1da177e4SLinus Torvalds 
112*1da177e4SLinus Torvalds static void uhci_remove_td(struct uhci_hcd *uhci, struct uhci_td *td)
113*1da177e4SLinus Torvalds {
114*1da177e4SLinus Torvalds 	/* If it's not inserted, don't remove it */
115*1da177e4SLinus Torvalds 	if (td->frame == -1 && list_empty(&td->fl_list))
116*1da177e4SLinus Torvalds 		return;
117*1da177e4SLinus Torvalds 
118*1da177e4SLinus Torvalds 	if (td->frame != -1 && uhci->fl->frame_cpu[td->frame] == td) {
119*1da177e4SLinus Torvalds 		if (list_empty(&td->fl_list)) {
120*1da177e4SLinus Torvalds 			uhci->fl->frame[td->frame] = td->link;
121*1da177e4SLinus Torvalds 			uhci->fl->frame_cpu[td->frame] = NULL;
122*1da177e4SLinus Torvalds 		} else {
123*1da177e4SLinus Torvalds 			struct uhci_td *ntd;
124*1da177e4SLinus Torvalds 
125*1da177e4SLinus Torvalds 			ntd = list_entry(td->fl_list.next, struct uhci_td, fl_list);
126*1da177e4SLinus Torvalds 			uhci->fl->frame[td->frame] = cpu_to_le32(ntd->dma_handle);
127*1da177e4SLinus Torvalds 			uhci->fl->frame_cpu[td->frame] = ntd;
128*1da177e4SLinus Torvalds 		}
129*1da177e4SLinus Torvalds 	} else {
130*1da177e4SLinus Torvalds 		struct uhci_td *ptd;
131*1da177e4SLinus Torvalds 
132*1da177e4SLinus Torvalds 		ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list);
133*1da177e4SLinus Torvalds 		ptd->link = td->link;
134*1da177e4SLinus Torvalds 	}
135*1da177e4SLinus Torvalds 
136*1da177e4SLinus Torvalds 	wmb();
137*1da177e4SLinus Torvalds 	td->link = UHCI_PTR_TERM;
138*1da177e4SLinus Torvalds 
139*1da177e4SLinus Torvalds 	list_del_init(&td->fl_list);
140*1da177e4SLinus Torvalds 	td->frame = -1;
141*1da177e4SLinus Torvalds }
142*1da177e4SLinus Torvalds 
143*1da177e4SLinus Torvalds /*
144*1da177e4SLinus Torvalds  * Inserts a td list into qh.
145*1da177e4SLinus Torvalds  */
146*1da177e4SLinus Torvalds static void uhci_insert_tds_in_qh(struct uhci_qh *qh, struct urb *urb, __le32 breadth)
147*1da177e4SLinus Torvalds {
148*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
149*1da177e4SLinus Torvalds 	struct uhci_td *td;
150*1da177e4SLinus Torvalds 	__le32 *plink;
151*1da177e4SLinus Torvalds 
152*1da177e4SLinus Torvalds 	/* Ordering isn't important here yet since the QH hasn't been */
153*1da177e4SLinus Torvalds 	/* inserted into the schedule yet */
154*1da177e4SLinus Torvalds 	plink = &qh->element;
155*1da177e4SLinus Torvalds 	list_for_each_entry(td, &urbp->td_list, list) {
156*1da177e4SLinus Torvalds 		*plink = cpu_to_le32(td->dma_handle) | breadth;
157*1da177e4SLinus Torvalds 		plink = &td->link;
158*1da177e4SLinus Torvalds 	}
159*1da177e4SLinus Torvalds 	*plink = UHCI_PTR_TERM;
160*1da177e4SLinus Torvalds }
161*1da177e4SLinus Torvalds 
162*1da177e4SLinus Torvalds static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td)
163*1da177e4SLinus Torvalds {
164*1da177e4SLinus Torvalds 	if (!list_empty(&td->list))
165*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "td %p still in list!\n", td);
166*1da177e4SLinus Torvalds 	if (!list_empty(&td->remove_list))
167*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "td %p still in remove_list!\n", td);
168*1da177e4SLinus Torvalds 	if (!list_empty(&td->fl_list))
169*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td);
170*1da177e4SLinus Torvalds 
171*1da177e4SLinus Torvalds 	if (td->dev)
172*1da177e4SLinus Torvalds 		usb_put_dev(td->dev);
173*1da177e4SLinus Torvalds 
174*1da177e4SLinus Torvalds 	dma_pool_free(uhci->td_pool, td, td->dma_handle);
175*1da177e4SLinus Torvalds }
176*1da177e4SLinus Torvalds 
177*1da177e4SLinus Torvalds static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, struct usb_device *dev)
178*1da177e4SLinus Torvalds {
179*1da177e4SLinus Torvalds 	dma_addr_t dma_handle;
180*1da177e4SLinus Torvalds 	struct uhci_qh *qh;
181*1da177e4SLinus Torvalds 
182*1da177e4SLinus Torvalds 	qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle);
183*1da177e4SLinus Torvalds 	if (!qh)
184*1da177e4SLinus Torvalds 		return NULL;
185*1da177e4SLinus Torvalds 
186*1da177e4SLinus Torvalds 	qh->dma_handle = dma_handle;
187*1da177e4SLinus Torvalds 
188*1da177e4SLinus Torvalds 	qh->element = UHCI_PTR_TERM;
189*1da177e4SLinus Torvalds 	qh->link = UHCI_PTR_TERM;
190*1da177e4SLinus Torvalds 
191*1da177e4SLinus Torvalds 	qh->dev = dev;
192*1da177e4SLinus Torvalds 	qh->urbp = NULL;
193*1da177e4SLinus Torvalds 
194*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&qh->list);
195*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&qh->remove_list);
196*1da177e4SLinus Torvalds 
197*1da177e4SLinus Torvalds 	usb_get_dev(dev);
198*1da177e4SLinus Torvalds 
199*1da177e4SLinus Torvalds 	return qh;
200*1da177e4SLinus Torvalds }
201*1da177e4SLinus Torvalds 
202*1da177e4SLinus Torvalds static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
203*1da177e4SLinus Torvalds {
204*1da177e4SLinus Torvalds 	if (!list_empty(&qh->list))
205*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh);
206*1da177e4SLinus Torvalds 	if (!list_empty(&qh->remove_list))
207*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "qh %p still in remove_list!\n", qh);
208*1da177e4SLinus Torvalds 
209*1da177e4SLinus Torvalds 	if (qh->dev)
210*1da177e4SLinus Torvalds 		usb_put_dev(qh->dev);
211*1da177e4SLinus Torvalds 
212*1da177e4SLinus Torvalds 	dma_pool_free(uhci->qh_pool, qh, qh->dma_handle);
213*1da177e4SLinus Torvalds }
214*1da177e4SLinus Torvalds 
215*1da177e4SLinus Torvalds /*
216*1da177e4SLinus Torvalds  * Append this urb's qh after the last qh in skelqh->list
217*1da177e4SLinus Torvalds  *
218*1da177e4SLinus Torvalds  * Note that urb_priv.queue_list doesn't have a separate queue head;
219*1da177e4SLinus Torvalds  * it's a ring with every element "live".
220*1da177e4SLinus Torvalds  */
221*1da177e4SLinus Torvalds static void uhci_insert_qh(struct uhci_hcd *uhci, struct uhci_qh *skelqh, struct urb *urb)
222*1da177e4SLinus Torvalds {
223*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
224*1da177e4SLinus Torvalds 	struct urb_priv *turbp;
225*1da177e4SLinus Torvalds 	struct uhci_qh *lqh;
226*1da177e4SLinus Torvalds 
227*1da177e4SLinus Torvalds 	/* Grab the last QH */
228*1da177e4SLinus Torvalds 	lqh = list_entry(skelqh->list.prev, struct uhci_qh, list);
229*1da177e4SLinus Torvalds 
230*1da177e4SLinus Torvalds 	/* Point to the next skelqh */
231*1da177e4SLinus Torvalds 	urbp->qh->link = lqh->link;
232*1da177e4SLinus Torvalds 	wmb();				/* Ordering is important */
233*1da177e4SLinus Torvalds 
234*1da177e4SLinus Torvalds 	/*
235*1da177e4SLinus Torvalds 	 * Patch QHs for previous endpoint's queued URBs?  HC goes
236*1da177e4SLinus Torvalds 	 * here next, not to the next skelqh it now points to.
237*1da177e4SLinus Torvalds 	 *
238*1da177e4SLinus Torvalds 	 *    lqh --> td ... --> qh ... --> td --> qh ... --> td
239*1da177e4SLinus Torvalds 	 *     |                 |                 |
240*1da177e4SLinus Torvalds 	 *     v                 v                 v
241*1da177e4SLinus Torvalds 	 *     +<----------------+-----------------+
242*1da177e4SLinus Torvalds 	 *     v
243*1da177e4SLinus Torvalds 	 *    newqh --> td ... --> td
244*1da177e4SLinus Torvalds 	 *     |
245*1da177e4SLinus Torvalds 	 *     v
246*1da177e4SLinus Torvalds 	 *    ...
247*1da177e4SLinus Torvalds 	 *
248*1da177e4SLinus Torvalds 	 * The HC could see (and use!) any of these as we write them.
249*1da177e4SLinus Torvalds 	 */
250*1da177e4SLinus Torvalds 	lqh->link = cpu_to_le32(urbp->qh->dma_handle) | UHCI_PTR_QH;
251*1da177e4SLinus Torvalds 	if (lqh->urbp) {
252*1da177e4SLinus Torvalds 		list_for_each_entry(turbp, &lqh->urbp->queue_list, queue_list)
253*1da177e4SLinus Torvalds 			turbp->qh->link = lqh->link;
254*1da177e4SLinus Torvalds 	}
255*1da177e4SLinus Torvalds 
256*1da177e4SLinus Torvalds 	list_add_tail(&urbp->qh->list, &skelqh->list);
257*1da177e4SLinus Torvalds }
258*1da177e4SLinus Torvalds 
259*1da177e4SLinus Torvalds /*
260*1da177e4SLinus Torvalds  * Start removal of QH from schedule; it finishes next frame.
261*1da177e4SLinus Torvalds  * TDs should be unlinked before this is called.
262*1da177e4SLinus Torvalds  */
263*1da177e4SLinus Torvalds static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
264*1da177e4SLinus Torvalds {
265*1da177e4SLinus Torvalds 	struct uhci_qh *pqh;
266*1da177e4SLinus Torvalds 	__le32 newlink;
267*1da177e4SLinus Torvalds 
268*1da177e4SLinus Torvalds 	if (!qh)
269*1da177e4SLinus Torvalds 		return;
270*1da177e4SLinus Torvalds 
271*1da177e4SLinus Torvalds 	/*
272*1da177e4SLinus Torvalds 	 * Only go through the hoops if it's actually linked in
273*1da177e4SLinus Torvalds 	 */
274*1da177e4SLinus Torvalds 	if (!list_empty(&qh->list)) {
275*1da177e4SLinus Torvalds 
276*1da177e4SLinus Torvalds 		/* If our queue is nonempty, make the next URB the head */
277*1da177e4SLinus Torvalds 		if (!list_empty(&qh->urbp->queue_list)) {
278*1da177e4SLinus Torvalds 			struct urb_priv *nurbp;
279*1da177e4SLinus Torvalds 
280*1da177e4SLinus Torvalds 			nurbp = list_entry(qh->urbp->queue_list.next,
281*1da177e4SLinus Torvalds 					struct urb_priv, queue_list);
282*1da177e4SLinus Torvalds 			nurbp->queued = 0;
283*1da177e4SLinus Torvalds 			list_add(&nurbp->qh->list, &qh->list);
284*1da177e4SLinus Torvalds 			newlink = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH;
285*1da177e4SLinus Torvalds 		} else
286*1da177e4SLinus Torvalds 			newlink = qh->link;
287*1da177e4SLinus Torvalds 
288*1da177e4SLinus Torvalds 		/* Fix up the previous QH's queue to link to either
289*1da177e4SLinus Torvalds 		 * the new head of this queue or the start of the
290*1da177e4SLinus Torvalds 		 * next endpoint's queue. */
291*1da177e4SLinus Torvalds 		pqh = list_entry(qh->list.prev, struct uhci_qh, list);
292*1da177e4SLinus Torvalds 		pqh->link = newlink;
293*1da177e4SLinus Torvalds 		if (pqh->urbp) {
294*1da177e4SLinus Torvalds 			struct urb_priv *turbp;
295*1da177e4SLinus Torvalds 
296*1da177e4SLinus Torvalds 			list_for_each_entry(turbp, &pqh->urbp->queue_list,
297*1da177e4SLinus Torvalds 					queue_list)
298*1da177e4SLinus Torvalds 				turbp->qh->link = newlink;
299*1da177e4SLinus Torvalds 		}
300*1da177e4SLinus Torvalds 		wmb();
301*1da177e4SLinus Torvalds 
302*1da177e4SLinus Torvalds 		/* Leave qh->link in case the HC is on the QH now, it will */
303*1da177e4SLinus Torvalds 		/* continue the rest of the schedule */
304*1da177e4SLinus Torvalds 		qh->element = UHCI_PTR_TERM;
305*1da177e4SLinus Torvalds 
306*1da177e4SLinus Torvalds 		list_del_init(&qh->list);
307*1da177e4SLinus Torvalds 	}
308*1da177e4SLinus Torvalds 
309*1da177e4SLinus Torvalds 	list_del_init(&qh->urbp->queue_list);
310*1da177e4SLinus Torvalds 	qh->urbp = NULL;
311*1da177e4SLinus Torvalds 
312*1da177e4SLinus Torvalds 	uhci_get_current_frame_number(uhci);
313*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->qh_remove_age) {
314*1da177e4SLinus Torvalds 		uhci_free_pending_qhs(uhci);
315*1da177e4SLinus Torvalds 		uhci->qh_remove_age = uhci->frame_number;
316*1da177e4SLinus Torvalds 	}
317*1da177e4SLinus Torvalds 
318*1da177e4SLinus Torvalds 	/* Check to see if the remove list is empty. Set the IOC bit */
319*1da177e4SLinus Torvalds 	/* to force an interrupt so we can remove the QH */
320*1da177e4SLinus Torvalds 	if (list_empty(&uhci->qh_remove_list))
321*1da177e4SLinus Torvalds 		uhci_set_next_interrupt(uhci);
322*1da177e4SLinus Torvalds 
323*1da177e4SLinus Torvalds 	list_add(&qh->remove_list, &uhci->qh_remove_list);
324*1da177e4SLinus Torvalds }
325*1da177e4SLinus Torvalds 
326*1da177e4SLinus Torvalds static int uhci_fixup_toggle(struct urb *urb, unsigned int toggle)
327*1da177e4SLinus Torvalds {
328*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
329*1da177e4SLinus Torvalds 	struct uhci_td *td;
330*1da177e4SLinus Torvalds 
331*1da177e4SLinus Torvalds 	list_for_each_entry(td, &urbp->td_list, list) {
332*1da177e4SLinus Torvalds 		if (toggle)
333*1da177e4SLinus Torvalds 			td->token |= cpu_to_le32(TD_TOKEN_TOGGLE);
334*1da177e4SLinus Torvalds 		else
335*1da177e4SLinus Torvalds 			td->token &= ~cpu_to_le32(TD_TOKEN_TOGGLE);
336*1da177e4SLinus Torvalds 
337*1da177e4SLinus Torvalds 		toggle ^= 1;
338*1da177e4SLinus Torvalds 	}
339*1da177e4SLinus Torvalds 
340*1da177e4SLinus Torvalds 	return toggle;
341*1da177e4SLinus Torvalds }
342*1da177e4SLinus Torvalds 
343*1da177e4SLinus Torvalds /* This function will append one URB's QH to another URB's QH. This is for */
344*1da177e4SLinus Torvalds /* queuing interrupt, control or bulk transfers */
345*1da177e4SLinus Torvalds static void uhci_append_queued_urb(struct uhci_hcd *uhci, struct urb *eurb, struct urb *urb)
346*1da177e4SLinus Torvalds {
347*1da177e4SLinus Torvalds 	struct urb_priv *eurbp, *urbp, *furbp, *lurbp;
348*1da177e4SLinus Torvalds 	struct uhci_td *lltd;
349*1da177e4SLinus Torvalds 
350*1da177e4SLinus Torvalds 	eurbp = eurb->hcpriv;
351*1da177e4SLinus Torvalds 	urbp = urb->hcpriv;
352*1da177e4SLinus Torvalds 
353*1da177e4SLinus Torvalds 	/* Find the first URB in the queue */
354*1da177e4SLinus Torvalds 	furbp = eurbp;
355*1da177e4SLinus Torvalds 	if (eurbp->queued) {
356*1da177e4SLinus Torvalds 		list_for_each_entry(furbp, &eurbp->queue_list, queue_list)
357*1da177e4SLinus Torvalds 			if (!furbp->queued)
358*1da177e4SLinus Torvalds 				break;
359*1da177e4SLinus Torvalds 	}
360*1da177e4SLinus Torvalds 
361*1da177e4SLinus Torvalds 	lurbp = list_entry(furbp->queue_list.prev, struct urb_priv, queue_list);
362*1da177e4SLinus Torvalds 
363*1da177e4SLinus Torvalds 	lltd = list_entry(lurbp->td_list.prev, struct uhci_td, list);
364*1da177e4SLinus Torvalds 
365*1da177e4SLinus Torvalds 	/* Control transfers always start with toggle 0 */
366*1da177e4SLinus Torvalds 	if (!usb_pipecontrol(urb->pipe))
367*1da177e4SLinus Torvalds 		usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
368*1da177e4SLinus Torvalds 				usb_pipeout(urb->pipe),
369*1da177e4SLinus Torvalds 				uhci_fixup_toggle(urb,
370*1da177e4SLinus Torvalds 					uhci_toggle(td_token(lltd)) ^ 1));
371*1da177e4SLinus Torvalds 
372*1da177e4SLinus Torvalds 	/* All qh's in the queue need to link to the next queue */
373*1da177e4SLinus Torvalds 	urbp->qh->link = eurbp->qh->link;
374*1da177e4SLinus Torvalds 
375*1da177e4SLinus Torvalds 	wmb();			/* Make sure we flush everything */
376*1da177e4SLinus Torvalds 
377*1da177e4SLinus Torvalds 	lltd->link = cpu_to_le32(urbp->qh->dma_handle) | UHCI_PTR_QH;
378*1da177e4SLinus Torvalds 
379*1da177e4SLinus Torvalds 	list_add_tail(&urbp->queue_list, &furbp->queue_list);
380*1da177e4SLinus Torvalds 
381*1da177e4SLinus Torvalds 	urbp->queued = 1;
382*1da177e4SLinus Torvalds }
383*1da177e4SLinus Torvalds 
384*1da177e4SLinus Torvalds static void uhci_delete_queued_urb(struct uhci_hcd *uhci, struct urb *urb)
385*1da177e4SLinus Torvalds {
386*1da177e4SLinus Torvalds 	struct urb_priv *urbp, *nurbp, *purbp, *turbp;
387*1da177e4SLinus Torvalds 	struct uhci_td *pltd;
388*1da177e4SLinus Torvalds 	unsigned int toggle;
389*1da177e4SLinus Torvalds 
390*1da177e4SLinus Torvalds 	urbp = urb->hcpriv;
391*1da177e4SLinus Torvalds 
392*1da177e4SLinus Torvalds 	if (list_empty(&urbp->queue_list))
393*1da177e4SLinus Torvalds 		return;
394*1da177e4SLinus Torvalds 
395*1da177e4SLinus Torvalds 	nurbp = list_entry(urbp->queue_list.next, struct urb_priv, queue_list);
396*1da177e4SLinus Torvalds 
397*1da177e4SLinus Torvalds 	/*
398*1da177e4SLinus Torvalds 	 * Fix up the toggle for the following URBs in the queue.
399*1da177e4SLinus Torvalds 	 * Only needed for bulk and interrupt: control and isochronous
400*1da177e4SLinus Torvalds 	 * endpoints don't propagate toggles between messages.
401*1da177e4SLinus Torvalds 	 */
402*1da177e4SLinus Torvalds 	if (usb_pipebulk(urb->pipe) || usb_pipeint(urb->pipe)) {
403*1da177e4SLinus Torvalds 		if (!urbp->queued)
404*1da177e4SLinus Torvalds 			/* We just set the toggle in uhci_unlink_generic */
405*1da177e4SLinus Torvalds 			toggle = usb_gettoggle(urb->dev,
406*1da177e4SLinus Torvalds 					usb_pipeendpoint(urb->pipe),
407*1da177e4SLinus Torvalds 					usb_pipeout(urb->pipe));
408*1da177e4SLinus Torvalds 		else {
409*1da177e4SLinus Torvalds 			/* If we're in the middle of the queue, grab the */
410*1da177e4SLinus Torvalds 			/* toggle from the TD previous to us */
411*1da177e4SLinus Torvalds 			purbp = list_entry(urbp->queue_list.prev,
412*1da177e4SLinus Torvalds 					struct urb_priv, queue_list);
413*1da177e4SLinus Torvalds 			pltd = list_entry(purbp->td_list.prev,
414*1da177e4SLinus Torvalds 					struct uhci_td, list);
415*1da177e4SLinus Torvalds 			toggle = uhci_toggle(td_token(pltd)) ^ 1;
416*1da177e4SLinus Torvalds 		}
417*1da177e4SLinus Torvalds 
418*1da177e4SLinus Torvalds 		list_for_each_entry(turbp, &urbp->queue_list, queue_list) {
419*1da177e4SLinus Torvalds 			if (!turbp->queued)
420*1da177e4SLinus Torvalds 				break;
421*1da177e4SLinus Torvalds 			toggle = uhci_fixup_toggle(turbp->urb, toggle);
422*1da177e4SLinus Torvalds 		}
423*1da177e4SLinus Torvalds 
424*1da177e4SLinus Torvalds 		usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
425*1da177e4SLinus Torvalds 				usb_pipeout(urb->pipe), toggle);
426*1da177e4SLinus Torvalds 	}
427*1da177e4SLinus Torvalds 
428*1da177e4SLinus Torvalds 	if (urbp->queued) {
429*1da177e4SLinus Torvalds 		/* We're somewhere in the middle (or end).  The case where
430*1da177e4SLinus Torvalds 		 * we're at the head is handled in uhci_remove_qh(). */
431*1da177e4SLinus Torvalds 		purbp = list_entry(urbp->queue_list.prev, struct urb_priv,
432*1da177e4SLinus Torvalds 				queue_list);
433*1da177e4SLinus Torvalds 
434*1da177e4SLinus Torvalds 		pltd = list_entry(purbp->td_list.prev, struct uhci_td, list);
435*1da177e4SLinus Torvalds 		if (nurbp->queued)
436*1da177e4SLinus Torvalds 			pltd->link = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH;
437*1da177e4SLinus Torvalds 		else
438*1da177e4SLinus Torvalds 			/* The next URB happens to be the beginning, so */
439*1da177e4SLinus Torvalds 			/*  we're the last, end the chain */
440*1da177e4SLinus Torvalds 			pltd->link = UHCI_PTR_TERM;
441*1da177e4SLinus Torvalds 	}
442*1da177e4SLinus Torvalds 
443*1da177e4SLinus Torvalds 	/* urbp->queue_list is handled in uhci_remove_qh() */
444*1da177e4SLinus Torvalds }
445*1da177e4SLinus Torvalds 
446*1da177e4SLinus Torvalds static struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
447*1da177e4SLinus Torvalds {
448*1da177e4SLinus Torvalds 	struct urb_priv *urbp;
449*1da177e4SLinus Torvalds 
450*1da177e4SLinus Torvalds 	urbp = kmem_cache_alloc(uhci_up_cachep, SLAB_ATOMIC);
451*1da177e4SLinus Torvalds 	if (!urbp)
452*1da177e4SLinus Torvalds 		return NULL;
453*1da177e4SLinus Torvalds 
454*1da177e4SLinus Torvalds 	memset((void *)urbp, 0, sizeof(*urbp));
455*1da177e4SLinus Torvalds 
456*1da177e4SLinus Torvalds 	urbp->inserttime = jiffies;
457*1da177e4SLinus Torvalds 	urbp->fsbrtime = jiffies;
458*1da177e4SLinus Torvalds 	urbp->urb = urb;
459*1da177e4SLinus Torvalds 
460*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&urbp->td_list);
461*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&urbp->queue_list);
462*1da177e4SLinus Torvalds 	INIT_LIST_HEAD(&urbp->urb_list);
463*1da177e4SLinus Torvalds 
464*1da177e4SLinus Torvalds 	list_add_tail(&urbp->urb_list, &uhci->urb_list);
465*1da177e4SLinus Torvalds 
466*1da177e4SLinus Torvalds 	urb->hcpriv = urbp;
467*1da177e4SLinus Torvalds 
468*1da177e4SLinus Torvalds 	return urbp;
469*1da177e4SLinus Torvalds }
470*1da177e4SLinus Torvalds 
471*1da177e4SLinus Torvalds static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td)
472*1da177e4SLinus Torvalds {
473*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
474*1da177e4SLinus Torvalds 
475*1da177e4SLinus Torvalds 	td->urb = urb;
476*1da177e4SLinus Torvalds 
477*1da177e4SLinus Torvalds 	list_add_tail(&td->list, &urbp->td_list);
478*1da177e4SLinus Torvalds }
479*1da177e4SLinus Torvalds 
480*1da177e4SLinus Torvalds static void uhci_remove_td_from_urb(struct uhci_td *td)
481*1da177e4SLinus Torvalds {
482*1da177e4SLinus Torvalds 	if (list_empty(&td->list))
483*1da177e4SLinus Torvalds 		return;
484*1da177e4SLinus Torvalds 
485*1da177e4SLinus Torvalds 	list_del_init(&td->list);
486*1da177e4SLinus Torvalds 
487*1da177e4SLinus Torvalds 	td->urb = NULL;
488*1da177e4SLinus Torvalds }
489*1da177e4SLinus Torvalds 
490*1da177e4SLinus Torvalds static void uhci_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
491*1da177e4SLinus Torvalds {
492*1da177e4SLinus Torvalds 	struct uhci_td *td, *tmp;
493*1da177e4SLinus Torvalds 	struct urb_priv *urbp;
494*1da177e4SLinus Torvalds 
495*1da177e4SLinus Torvalds 	urbp = (struct urb_priv *)urb->hcpriv;
496*1da177e4SLinus Torvalds 	if (!urbp)
497*1da177e4SLinus Torvalds 		return;
498*1da177e4SLinus Torvalds 
499*1da177e4SLinus Torvalds 	if (!list_empty(&urbp->urb_list))
500*1da177e4SLinus Torvalds 		dev_warn(uhci_dev(uhci), "urb %p still on uhci->urb_list "
501*1da177e4SLinus Torvalds 				"or uhci->remove_list!\n", urb);
502*1da177e4SLinus Torvalds 
503*1da177e4SLinus Torvalds 	uhci_get_current_frame_number(uhci);
504*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) {
505*1da177e4SLinus Torvalds 		uhci_free_pending_tds(uhci);
506*1da177e4SLinus Torvalds 		uhci->td_remove_age = uhci->frame_number;
507*1da177e4SLinus Torvalds 	}
508*1da177e4SLinus Torvalds 
509*1da177e4SLinus Torvalds 	/* Check to see if the remove list is empty. Set the IOC bit */
510*1da177e4SLinus Torvalds 	/* to force an interrupt so we can remove the TD's*/
511*1da177e4SLinus Torvalds 	if (list_empty(&uhci->td_remove_list))
512*1da177e4SLinus Torvalds 		uhci_set_next_interrupt(uhci);
513*1da177e4SLinus Torvalds 
514*1da177e4SLinus Torvalds 	list_for_each_entry_safe(td, tmp, &urbp->td_list, list) {
515*1da177e4SLinus Torvalds 		uhci_remove_td_from_urb(td);
516*1da177e4SLinus Torvalds 		uhci_remove_td(uhci, td);
517*1da177e4SLinus Torvalds 		list_add(&td->remove_list, &uhci->td_remove_list);
518*1da177e4SLinus Torvalds 	}
519*1da177e4SLinus Torvalds 
520*1da177e4SLinus Torvalds 	urb->hcpriv = NULL;
521*1da177e4SLinus Torvalds 	kmem_cache_free(uhci_up_cachep, urbp);
522*1da177e4SLinus Torvalds }
523*1da177e4SLinus Torvalds 
524*1da177e4SLinus Torvalds static void uhci_inc_fsbr(struct uhci_hcd *uhci, struct urb *urb)
525*1da177e4SLinus Torvalds {
526*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
527*1da177e4SLinus Torvalds 
528*1da177e4SLinus Torvalds 	if ((!(urb->transfer_flags & URB_NO_FSBR)) && !urbp->fsbr) {
529*1da177e4SLinus Torvalds 		urbp->fsbr = 1;
530*1da177e4SLinus Torvalds 		if (!uhci->fsbr++ && !uhci->fsbrtimeout)
531*1da177e4SLinus Torvalds 			uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH;
532*1da177e4SLinus Torvalds 	}
533*1da177e4SLinus Torvalds }
534*1da177e4SLinus Torvalds 
535*1da177e4SLinus Torvalds static void uhci_dec_fsbr(struct uhci_hcd *uhci, struct urb *urb)
536*1da177e4SLinus Torvalds {
537*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
538*1da177e4SLinus Torvalds 
539*1da177e4SLinus Torvalds 	if ((!(urb->transfer_flags & URB_NO_FSBR)) && urbp->fsbr) {
540*1da177e4SLinus Torvalds 		urbp->fsbr = 0;
541*1da177e4SLinus Torvalds 		if (!--uhci->fsbr)
542*1da177e4SLinus Torvalds 			uhci->fsbrtimeout = jiffies + FSBR_DELAY;
543*1da177e4SLinus Torvalds 	}
544*1da177e4SLinus Torvalds }
545*1da177e4SLinus Torvalds 
546*1da177e4SLinus Torvalds /*
547*1da177e4SLinus Torvalds  * Map status to standard result codes
548*1da177e4SLinus Torvalds  *
549*1da177e4SLinus Torvalds  * <status> is (td_status(td) & 0xF60000), a.k.a.
550*1da177e4SLinus Torvalds  * uhci_status_bits(td_status(td)).
551*1da177e4SLinus Torvalds  * Note: <status> does not include the TD_CTRL_NAK bit.
552*1da177e4SLinus Torvalds  * <dir_out> is True for output TDs and False for input TDs.
553*1da177e4SLinus Torvalds  */
554*1da177e4SLinus Torvalds static int uhci_map_status(int status, int dir_out)
555*1da177e4SLinus Torvalds {
556*1da177e4SLinus Torvalds 	if (!status)
557*1da177e4SLinus Torvalds 		return 0;
558*1da177e4SLinus Torvalds 	if (status & TD_CTRL_BITSTUFF)			/* Bitstuff error */
559*1da177e4SLinus Torvalds 		return -EPROTO;
560*1da177e4SLinus Torvalds 	if (status & TD_CTRL_CRCTIMEO) {		/* CRC/Timeout */
561*1da177e4SLinus Torvalds 		if (dir_out)
562*1da177e4SLinus Torvalds 			return -EPROTO;
563*1da177e4SLinus Torvalds 		else
564*1da177e4SLinus Torvalds 			return -EILSEQ;
565*1da177e4SLinus Torvalds 	}
566*1da177e4SLinus Torvalds 	if (status & TD_CTRL_BABBLE)			/* Babble */
567*1da177e4SLinus Torvalds 		return -EOVERFLOW;
568*1da177e4SLinus Torvalds 	if (status & TD_CTRL_DBUFERR)			/* Buffer error */
569*1da177e4SLinus Torvalds 		return -ENOSR;
570*1da177e4SLinus Torvalds 	if (status & TD_CTRL_STALLED)			/* Stalled */
571*1da177e4SLinus Torvalds 		return -EPIPE;
572*1da177e4SLinus Torvalds 	WARN_ON(status & TD_CTRL_ACTIVE);		/* Active */
573*1da177e4SLinus Torvalds 	return 0;
574*1da177e4SLinus Torvalds }
575*1da177e4SLinus Torvalds 
576*1da177e4SLinus Torvalds /*
577*1da177e4SLinus Torvalds  * Control transfers
578*1da177e4SLinus Torvalds  */
579*1da177e4SLinus Torvalds static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb)
580*1da177e4SLinus Torvalds {
581*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
582*1da177e4SLinus Torvalds 	struct uhci_td *td;
583*1da177e4SLinus Torvalds 	struct uhci_qh *qh, *skelqh;
584*1da177e4SLinus Torvalds 	unsigned long destination, status;
585*1da177e4SLinus Torvalds 	int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));
586*1da177e4SLinus Torvalds 	int len = urb->transfer_buffer_length;
587*1da177e4SLinus Torvalds 	dma_addr_t data = urb->transfer_dma;
588*1da177e4SLinus Torvalds 
589*1da177e4SLinus Torvalds 	/* The "pipe" thing contains the destination in bits 8--18 */
590*1da177e4SLinus Torvalds 	destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP;
591*1da177e4SLinus Torvalds 
592*1da177e4SLinus Torvalds 	/* 3 errors */
593*1da177e4SLinus Torvalds 	status = TD_CTRL_ACTIVE | uhci_maxerr(3);
594*1da177e4SLinus Torvalds 	if (urb->dev->speed == USB_SPEED_LOW)
595*1da177e4SLinus Torvalds 		status |= TD_CTRL_LS;
596*1da177e4SLinus Torvalds 
597*1da177e4SLinus Torvalds 	/*
598*1da177e4SLinus Torvalds 	 * Build the TD for the control request setup packet
599*1da177e4SLinus Torvalds 	 */
600*1da177e4SLinus Torvalds 	td = uhci_alloc_td(uhci, urb->dev);
601*1da177e4SLinus Torvalds 	if (!td)
602*1da177e4SLinus Torvalds 		return -ENOMEM;
603*1da177e4SLinus Torvalds 
604*1da177e4SLinus Torvalds 	uhci_add_td_to_urb(urb, td);
605*1da177e4SLinus Torvalds 	uhci_fill_td(td, status, destination | uhci_explen(7),
606*1da177e4SLinus Torvalds 		urb->setup_dma);
607*1da177e4SLinus Torvalds 
608*1da177e4SLinus Torvalds 	/*
609*1da177e4SLinus Torvalds 	 * If direction is "send", change the packet ID from SETUP (0x2D)
610*1da177e4SLinus Torvalds 	 * to OUT (0xE1).  Else change it from SETUP to IN (0x69) and
611*1da177e4SLinus Torvalds 	 * set Short Packet Detect (SPD) for all data packets.
612*1da177e4SLinus Torvalds 	 */
613*1da177e4SLinus Torvalds 	if (usb_pipeout(urb->pipe))
614*1da177e4SLinus Torvalds 		destination ^= (USB_PID_SETUP ^ USB_PID_OUT);
615*1da177e4SLinus Torvalds 	else {
616*1da177e4SLinus Torvalds 		destination ^= (USB_PID_SETUP ^ USB_PID_IN);
617*1da177e4SLinus Torvalds 		status |= TD_CTRL_SPD;
618*1da177e4SLinus Torvalds 	}
619*1da177e4SLinus Torvalds 
620*1da177e4SLinus Torvalds 	/*
621*1da177e4SLinus Torvalds 	 * Build the DATA TD's
622*1da177e4SLinus Torvalds 	 */
623*1da177e4SLinus Torvalds 	while (len > 0) {
624*1da177e4SLinus Torvalds 		int pktsze = len;
625*1da177e4SLinus Torvalds 
626*1da177e4SLinus Torvalds 		if (pktsze > maxsze)
627*1da177e4SLinus Torvalds 			pktsze = maxsze;
628*1da177e4SLinus Torvalds 
629*1da177e4SLinus Torvalds 		td = uhci_alloc_td(uhci, urb->dev);
630*1da177e4SLinus Torvalds 		if (!td)
631*1da177e4SLinus Torvalds 			return -ENOMEM;
632*1da177e4SLinus Torvalds 
633*1da177e4SLinus Torvalds 		/* Alternate Data0/1 (start with Data1) */
634*1da177e4SLinus Torvalds 		destination ^= TD_TOKEN_TOGGLE;
635*1da177e4SLinus Torvalds 
636*1da177e4SLinus Torvalds 		uhci_add_td_to_urb(urb, td);
637*1da177e4SLinus Torvalds 		uhci_fill_td(td, status, destination | uhci_explen(pktsze - 1),
638*1da177e4SLinus Torvalds 			data);
639*1da177e4SLinus Torvalds 
640*1da177e4SLinus Torvalds 		data += pktsze;
641*1da177e4SLinus Torvalds 		len -= pktsze;
642*1da177e4SLinus Torvalds 	}
643*1da177e4SLinus Torvalds 
644*1da177e4SLinus Torvalds 	/*
645*1da177e4SLinus Torvalds 	 * Build the final TD for control status
646*1da177e4SLinus Torvalds 	 */
647*1da177e4SLinus Torvalds 	td = uhci_alloc_td(uhci, urb->dev);
648*1da177e4SLinus Torvalds 	if (!td)
649*1da177e4SLinus Torvalds 		return -ENOMEM;
650*1da177e4SLinus Torvalds 
651*1da177e4SLinus Torvalds 	/*
652*1da177e4SLinus Torvalds 	 * It's IN if the pipe is an output pipe or we're not expecting
653*1da177e4SLinus Torvalds 	 * data back.
654*1da177e4SLinus Torvalds 	 */
655*1da177e4SLinus Torvalds 	destination &= ~TD_TOKEN_PID_MASK;
656*1da177e4SLinus Torvalds 	if (usb_pipeout(urb->pipe) || !urb->transfer_buffer_length)
657*1da177e4SLinus Torvalds 		destination |= USB_PID_IN;
658*1da177e4SLinus Torvalds 	else
659*1da177e4SLinus Torvalds 		destination |= USB_PID_OUT;
660*1da177e4SLinus Torvalds 
661*1da177e4SLinus Torvalds 	destination |= TD_TOKEN_TOGGLE;		/* End in Data1 */
662*1da177e4SLinus Torvalds 
663*1da177e4SLinus Torvalds 	status &= ~TD_CTRL_SPD;
664*1da177e4SLinus Torvalds 
665*1da177e4SLinus Torvalds 	uhci_add_td_to_urb(urb, td);
666*1da177e4SLinus Torvalds 	uhci_fill_td(td, status | TD_CTRL_IOC,
667*1da177e4SLinus Torvalds 		destination | uhci_explen(UHCI_NULL_DATA_SIZE), 0);
668*1da177e4SLinus Torvalds 
669*1da177e4SLinus Torvalds 	qh = uhci_alloc_qh(uhci, urb->dev);
670*1da177e4SLinus Torvalds 	if (!qh)
671*1da177e4SLinus Torvalds 		return -ENOMEM;
672*1da177e4SLinus Torvalds 
673*1da177e4SLinus Torvalds 	urbp->qh = qh;
674*1da177e4SLinus Torvalds 	qh->urbp = urbp;
675*1da177e4SLinus Torvalds 
676*1da177e4SLinus Torvalds 	uhci_insert_tds_in_qh(qh, urb, UHCI_PTR_BREADTH);
677*1da177e4SLinus Torvalds 
678*1da177e4SLinus Torvalds 	/* Low-speed transfers get a different queue, and won't hog the bus.
679*1da177e4SLinus Torvalds 	 * Also, some devices enumerate better without FSBR; the easiest way
680*1da177e4SLinus Torvalds 	 * to do that is to put URBs on the low-speed queue while the device
681*1da177e4SLinus Torvalds 	 * is in the DEFAULT state. */
682*1da177e4SLinus Torvalds 	if (urb->dev->speed == USB_SPEED_LOW ||
683*1da177e4SLinus Torvalds 			urb->dev->state == USB_STATE_DEFAULT)
684*1da177e4SLinus Torvalds 		skelqh = uhci->skel_ls_control_qh;
685*1da177e4SLinus Torvalds 	else {
686*1da177e4SLinus Torvalds 		skelqh = uhci->skel_fs_control_qh;
687*1da177e4SLinus Torvalds 		uhci_inc_fsbr(uhci, urb);
688*1da177e4SLinus Torvalds 	}
689*1da177e4SLinus Torvalds 
690*1da177e4SLinus Torvalds 	if (eurb)
691*1da177e4SLinus Torvalds 		uhci_append_queued_urb(uhci, eurb, urb);
692*1da177e4SLinus Torvalds 	else
693*1da177e4SLinus Torvalds 		uhci_insert_qh(uhci, skelqh, urb);
694*1da177e4SLinus Torvalds 
695*1da177e4SLinus Torvalds 	return -EINPROGRESS;
696*1da177e4SLinus Torvalds }
697*1da177e4SLinus Torvalds 
698*1da177e4SLinus Torvalds /*
699*1da177e4SLinus Torvalds  * If control-IN transfer was short, the status packet wasn't sent.
700*1da177e4SLinus Torvalds  * This routine changes the element pointer in the QH to point at the
701*1da177e4SLinus Torvalds  * status TD.  It's safe to do this even while the QH is live, because
702*1da177e4SLinus Torvalds  * the hardware only updates the element pointer following a successful
703*1da177e4SLinus Torvalds  * transfer.  The inactive TD for the short packet won't cause an update,
704*1da177e4SLinus Torvalds  * so the pointer won't get overwritten.  The next time the controller
705*1da177e4SLinus Torvalds  * sees this QH, it will send the status packet.
706*1da177e4SLinus Torvalds  */
707*1da177e4SLinus Torvalds static int usb_control_retrigger_status(struct uhci_hcd *uhci, struct urb *urb)
708*1da177e4SLinus Torvalds {
709*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
710*1da177e4SLinus Torvalds 	struct uhci_td *td;
711*1da177e4SLinus Torvalds 
712*1da177e4SLinus Torvalds 	urbp->short_control_packet = 1;
713*1da177e4SLinus Torvalds 
714*1da177e4SLinus Torvalds 	td = list_entry(urbp->td_list.prev, struct uhci_td, list);
715*1da177e4SLinus Torvalds 	urbp->qh->element = cpu_to_le32(td->dma_handle);
716*1da177e4SLinus Torvalds 
717*1da177e4SLinus Torvalds 	return -EINPROGRESS;
718*1da177e4SLinus Torvalds }
719*1da177e4SLinus Torvalds 
720*1da177e4SLinus Torvalds 
721*1da177e4SLinus Torvalds static int uhci_result_control(struct uhci_hcd *uhci, struct urb *urb)
722*1da177e4SLinus Torvalds {
723*1da177e4SLinus Torvalds 	struct list_head *tmp, *head;
724*1da177e4SLinus Torvalds 	struct urb_priv *urbp = urb->hcpriv;
725*1da177e4SLinus Torvalds 	struct uhci_td *td;
726*1da177e4SLinus Torvalds 	unsigned int status;
727*1da177e4SLinus Torvalds 	int ret = 0;
728*1da177e4SLinus Torvalds 
729*1da177e4SLinus Torvalds 	if (list_empty(&urbp->td_list))
730*1da177e4SLinus Torvalds 		return -EINVAL;
731*1da177e4SLinus Torvalds 
732*1da177e4SLinus Torvalds 	head = &urbp->td_list;
733*1da177e4SLinus Torvalds 
734*1da177e4SLinus Torvalds 	if (urbp->short_control_packet) {
735*1da177e4SLinus Torvalds 		tmp = head->prev;
736*1da177e4SLinus Torvalds 		goto status_stage;
737*1da177e4SLinus Torvalds 	}
738*1da177e4SLinus Torvalds 
739*1da177e4SLinus Torvalds 	tmp = head->next;
740*1da177e4SLinus Torvalds 	td = list_entry(tmp, struct uhci_td, list);
741*1da177e4SLinus Torvalds 
742*1da177e4SLinus Torvalds 	/* The first TD is the SETUP stage, check the status, but skip */
743*1da177e4SLinus Torvalds 	/*  the count */
744*1da177e4SLinus Torvalds 	status = uhci_status_bits(td_status(td));
745*1da177e4SLinus Torvalds 	if (status & TD_CTRL_ACTIVE)
746*1da177e4SLinus Torvalds 		return -EINPROGRESS;
747*1da177e4SLinus Torvalds 
748*1da177e4SLinus Torvalds 	if (status)
749*1da177e4SLinus Torvalds 		goto td_error;
750*1da177e4SLinus Torvalds 
751*1da177e4SLinus Torvalds 	urb->actual_length = 0;
752*1da177e4SLinus Torvalds 
753*1da177e4SLinus Torvalds 	/* The rest of the TD's (but the last) are data */
754*1da177e4SLinus Torvalds 	tmp = tmp->next;
755*1da177e4SLinus Torvalds 	while (tmp != head && tmp->next != head) {
756*1da177e4SLinus Torvalds 		unsigned int ctrlstat;
757*1da177e4SLinus Torvalds 
758*1da177e4SLinus Torvalds 		td = list_entry(tmp, struct uhci_td, list);
759*1da177e4SLinus Torvalds 		tmp = tmp->next;
760*1da177e4SLinus Torvalds 
761*1da177e4SLinus Torvalds 		ctrlstat = td_status(td);
762*1da177e4SLinus Torvalds 		status = uhci_status_bits(ctrlstat);
763*1da177e4SLinus Torvalds 		if (status & TD_CTRL_ACTIVE)
764*1da177e4SLinus Torvalds 			return -EINPROGRESS;
765*1da177e4SLinus Torvalds 
766*1da177e4SLinus Torvalds 		urb->actual_length += uhci_actual_length(ctrlstat);
767*1da177e4SLinus Torvalds 
768*1da177e4SLinus Torvalds 		if (status)
769*1da177e4SLinus Torvalds 			goto td_error;
770*1da177e4SLinus Torvalds 
771*1da177e4SLinus Torvalds 		/* Check to see if we received a short packet */
772*1da177e4SLinus Torvalds 		if (uhci_actual_length(ctrlstat) <
773*1da177e4SLinus Torvalds 				uhci_expected_length(td_token(td))) {
774*1da177e4SLinus Torvalds 			if (urb->transfer_flags & URB_SHORT_NOT_OK) {
775*1da177e4SLinus Torvalds 				ret = -EREMOTEIO;
776*1da177e4SLinus Torvalds 				goto err;
777*1da177e4SLinus Torvalds 			}
778*1da177e4SLinus Torvalds 
779*1da177e4SLinus Torvalds 			if (uhci_packetid(td_token(td)) == USB_PID_IN)
780*1da177e4SLinus Torvalds 				return usb_control_retrigger_status(uhci, urb);
781*1da177e4SLinus Torvalds 			else
782*1da177e4SLinus Torvalds 				return 0;
783*1da177e4SLinus Torvalds 		}
784*1da177e4SLinus Torvalds 	}
785*1da177e4SLinus Torvalds 
786*1da177e4SLinus Torvalds status_stage:
787*1da177e4SLinus Torvalds 	td = list_entry(tmp, struct uhci_td, list);
788*1da177e4SLinus Torvalds 
789*1da177e4SLinus Torvalds 	/* Control status stage */
790*1da177e4SLinus Torvalds 	status = td_status(td);
791*1da177e4SLinus Torvalds 
792*1da177e4SLinus Torvalds #ifdef I_HAVE_BUGGY_APC_BACKUPS
793*1da177e4SLinus Torvalds 	/* APC BackUPS Pro kludge */
794*1da177e4SLinus Torvalds 	/* It tries to send all of the descriptor instead of the amount */
795*1da177e4SLinus Torvalds 	/*  we requested */
796*1da177e4SLinus Torvalds 	if (status & TD_CTRL_IOC &&	/* IOC is masked out by uhci_status_bits */
797*1da177e4SLinus Torvalds 	    status & TD_CTRL_ACTIVE &&
798*1da177e4SLinus Torvalds 	    status & TD_CTRL_NAK)
799*1da177e4SLinus Torvalds 		return 0;
800*1da177e4SLinus Torvalds #endif
801*1da177e4SLinus Torvalds 
802*1da177e4SLinus Torvalds 	status = uhci_status_bits(status);
803*1da177e4SLinus Torvalds 	if (status & TD_CTRL_ACTIVE)
804*1da177e4SLinus Torvalds 		return -EINPROGRESS;
805*1da177e4SLinus Torvalds 
806*1da177e4SLinus Torvalds 	if (status)
807*1da177e4SLinus Torvalds 		goto td_error;
808*1da177e4SLinus Torvalds 
809*1da177e4SLinus Torvalds 	return 0;
810*1da177e4SLinus Torvalds 
811*1da177e4SLinus Torvalds td_error:
812*1da177e4SLinus Torvalds 	ret = uhci_map_status(status, uhci_packetout(td_token(td)));
813*1da177e4SLinus Torvalds 
814*1da177e4SLinus Torvalds err:
815*1da177e4SLinus Torvalds 	if ((debug == 1 && ret != -EPIPE) || debug > 1) {
816*1da177e4SLinus Torvalds 		/* Some debugging code */
817*1da177e4SLinus Torvalds 		dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n",
818*1da177e4SLinus Torvalds 				__FUNCTION__, status);
819*1da177e4SLinus Torvalds 
820*1da177e4SLinus Torvalds 		if (errbuf) {
821*1da177e4SLinus Torvalds 			/* Print the chain for debugging purposes */
822*1da177e4SLinus Torvalds 			uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0);
823*1da177e4SLinus Torvalds 
824*1da177e4SLinus Torvalds 			lprintk(errbuf);
825*1da177e4SLinus Torvalds 		}
826*1da177e4SLinus Torvalds 	}
827*1da177e4SLinus Torvalds 
828*1da177e4SLinus Torvalds 	return ret;
829*1da177e4SLinus Torvalds }
830*1da177e4SLinus Torvalds 
831*1da177e4SLinus Torvalds /*
832*1da177e4SLinus Torvalds  * Common submit for bulk and interrupt
833*1da177e4SLinus Torvalds  */
834*1da177e4SLinus Torvalds static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb, struct uhci_qh *skelqh)
835*1da177e4SLinus Torvalds {
836*1da177e4SLinus Torvalds 	struct uhci_td *td;
837*1da177e4SLinus Torvalds 	struct uhci_qh *qh;
838*1da177e4SLinus Torvalds 	unsigned long destination, status;
839*1da177e4SLinus Torvalds 	int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));
840*1da177e4SLinus Torvalds 	int len = urb->transfer_buffer_length;
841*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
842*1da177e4SLinus Torvalds 	dma_addr_t data = urb->transfer_dma;
843*1da177e4SLinus Torvalds 
844*1da177e4SLinus Torvalds 	if (len < 0)
845*1da177e4SLinus Torvalds 		return -EINVAL;
846*1da177e4SLinus Torvalds 
847*1da177e4SLinus Torvalds 	/* The "pipe" thing contains the destination in bits 8--18 */
848*1da177e4SLinus Torvalds 	destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
849*1da177e4SLinus Torvalds 
850*1da177e4SLinus Torvalds 	status = uhci_maxerr(3) | TD_CTRL_ACTIVE;
851*1da177e4SLinus Torvalds 	if (urb->dev->speed == USB_SPEED_LOW)
852*1da177e4SLinus Torvalds 		status |= TD_CTRL_LS;
853*1da177e4SLinus Torvalds 	if (usb_pipein(urb->pipe))
854*1da177e4SLinus Torvalds 		status |= TD_CTRL_SPD;
855*1da177e4SLinus Torvalds 
856*1da177e4SLinus Torvalds 	/*
857*1da177e4SLinus Torvalds 	 * Build the DATA TD's
858*1da177e4SLinus Torvalds 	 */
859*1da177e4SLinus Torvalds 	do {	/* Allow zero length packets */
860*1da177e4SLinus Torvalds 		int pktsze = maxsze;
861*1da177e4SLinus Torvalds 
862*1da177e4SLinus Torvalds 		if (pktsze >= len) {
863*1da177e4SLinus Torvalds 			pktsze = len;
864*1da177e4SLinus Torvalds 			if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
865*1da177e4SLinus Torvalds 				status &= ~TD_CTRL_SPD;
866*1da177e4SLinus Torvalds 		}
867*1da177e4SLinus Torvalds 
868*1da177e4SLinus Torvalds 		td = uhci_alloc_td(uhci, urb->dev);
869*1da177e4SLinus Torvalds 		if (!td)
870*1da177e4SLinus Torvalds 			return -ENOMEM;
871*1da177e4SLinus Torvalds 
872*1da177e4SLinus Torvalds 		uhci_add_td_to_urb(urb, td);
873*1da177e4SLinus Torvalds 		uhci_fill_td(td, status, destination | uhci_explen(pktsze - 1) |
874*1da177e4SLinus Torvalds 			(usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
875*1da177e4SLinus Torvalds 			 usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
876*1da177e4SLinus Torvalds 			data);
877*1da177e4SLinus Torvalds 
878*1da177e4SLinus Torvalds 		data += pktsze;
879*1da177e4SLinus Torvalds 		len -= maxsze;
880*1da177e4SLinus Torvalds 
881*1da177e4SLinus Torvalds 		usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
882*1da177e4SLinus Torvalds 			usb_pipeout(urb->pipe));
883*1da177e4SLinus Torvalds 	} while (len > 0);
884*1da177e4SLinus Torvalds 
885*1da177e4SLinus Torvalds 	/*
886*1da177e4SLinus Torvalds 	 * URB_ZERO_PACKET means adding a 0-length packet, if direction
887*1da177e4SLinus Torvalds 	 * is OUT and the transfer_length was an exact multiple of maxsze,
888*1da177e4SLinus Torvalds 	 * hence (len = transfer_length - N * maxsze) == 0
889*1da177e4SLinus Torvalds 	 * however, if transfer_length == 0, the zero packet was already
890*1da177e4SLinus Torvalds 	 * prepared above.
891*1da177e4SLinus Torvalds 	 */
892*1da177e4SLinus Torvalds 	if (usb_pipeout(urb->pipe) && (urb->transfer_flags & URB_ZERO_PACKET) &&
893*1da177e4SLinus Torvalds 	    !len && urb->transfer_buffer_length) {
894*1da177e4SLinus Torvalds 		td = uhci_alloc_td(uhci, urb->dev);
895*1da177e4SLinus Torvalds 		if (!td)
896*1da177e4SLinus Torvalds 			return -ENOMEM;
897*1da177e4SLinus Torvalds 
898*1da177e4SLinus Torvalds 		uhci_add_td_to_urb(urb, td);
899*1da177e4SLinus Torvalds 		uhci_fill_td(td, status, destination | uhci_explen(UHCI_NULL_DATA_SIZE) |
900*1da177e4SLinus Torvalds 			(usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
901*1da177e4SLinus Torvalds 			 usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
902*1da177e4SLinus Torvalds 			data);
903*1da177e4SLinus Torvalds 
904*1da177e4SLinus Torvalds 		usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
905*1da177e4SLinus Torvalds 			usb_pipeout(urb->pipe));
906*1da177e4SLinus Torvalds 	}
907*1da177e4SLinus Torvalds 
908*1da177e4SLinus Torvalds 	/* Set the interrupt-on-completion flag on the last packet.
909*1da177e4SLinus Torvalds 	 * A more-or-less typical 4 KB URB (= size of one memory page)
910*1da177e4SLinus Torvalds 	 * will require about 3 ms to transfer; that's a little on the
911*1da177e4SLinus Torvalds 	 * fast side but not enough to justify delaying an interrupt
912*1da177e4SLinus Torvalds 	 * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT
913*1da177e4SLinus Torvalds 	 * flag setting. */
914*1da177e4SLinus Torvalds 	td->status |= cpu_to_le32(TD_CTRL_IOC);
915*1da177e4SLinus Torvalds 
916*1da177e4SLinus Torvalds 	qh = uhci_alloc_qh(uhci, urb->dev);
917*1da177e4SLinus Torvalds 	if (!qh)
918*1da177e4SLinus Torvalds 		return -ENOMEM;
919*1da177e4SLinus Torvalds 
920*1da177e4SLinus Torvalds 	urbp->qh = qh;
921*1da177e4SLinus Torvalds 	qh->urbp = urbp;
922*1da177e4SLinus Torvalds 
923*1da177e4SLinus Torvalds 	/* Always breadth first */
924*1da177e4SLinus Torvalds 	uhci_insert_tds_in_qh(qh, urb, UHCI_PTR_BREADTH);
925*1da177e4SLinus Torvalds 
926*1da177e4SLinus Torvalds 	if (eurb)
927*1da177e4SLinus Torvalds 		uhci_append_queued_urb(uhci, eurb, urb);
928*1da177e4SLinus Torvalds 	else
929*1da177e4SLinus Torvalds 		uhci_insert_qh(uhci, skelqh, urb);
930*1da177e4SLinus Torvalds 
931*1da177e4SLinus Torvalds 	return -EINPROGRESS;
932*1da177e4SLinus Torvalds }
933*1da177e4SLinus Torvalds 
934*1da177e4SLinus Torvalds /*
935*1da177e4SLinus Torvalds  * Common result for bulk and interrupt
936*1da177e4SLinus Torvalds  */
937*1da177e4SLinus Torvalds static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb)
938*1da177e4SLinus Torvalds {
939*1da177e4SLinus Torvalds 	struct urb_priv *urbp = urb->hcpriv;
940*1da177e4SLinus Torvalds 	struct uhci_td *td;
941*1da177e4SLinus Torvalds 	unsigned int status = 0;
942*1da177e4SLinus Torvalds 	int ret = 0;
943*1da177e4SLinus Torvalds 
944*1da177e4SLinus Torvalds 	urb->actual_length = 0;
945*1da177e4SLinus Torvalds 
946*1da177e4SLinus Torvalds 	list_for_each_entry(td, &urbp->td_list, list) {
947*1da177e4SLinus Torvalds 		unsigned int ctrlstat = td_status(td);
948*1da177e4SLinus Torvalds 
949*1da177e4SLinus Torvalds 		status = uhci_status_bits(ctrlstat);
950*1da177e4SLinus Torvalds 		if (status & TD_CTRL_ACTIVE)
951*1da177e4SLinus Torvalds 			return -EINPROGRESS;
952*1da177e4SLinus Torvalds 
953*1da177e4SLinus Torvalds 		urb->actual_length += uhci_actual_length(ctrlstat);
954*1da177e4SLinus Torvalds 
955*1da177e4SLinus Torvalds 		if (status)
956*1da177e4SLinus Torvalds 			goto td_error;
957*1da177e4SLinus Torvalds 
958*1da177e4SLinus Torvalds 		if (uhci_actual_length(ctrlstat) <
959*1da177e4SLinus Torvalds 				uhci_expected_length(td_token(td))) {
960*1da177e4SLinus Torvalds 			if (urb->transfer_flags & URB_SHORT_NOT_OK) {
961*1da177e4SLinus Torvalds 				ret = -EREMOTEIO;
962*1da177e4SLinus Torvalds 				goto err;
963*1da177e4SLinus Torvalds 			} else
964*1da177e4SLinus Torvalds 				return 0;
965*1da177e4SLinus Torvalds 		}
966*1da177e4SLinus Torvalds 	}
967*1da177e4SLinus Torvalds 
968*1da177e4SLinus Torvalds 	return 0;
969*1da177e4SLinus Torvalds 
970*1da177e4SLinus Torvalds td_error:
971*1da177e4SLinus Torvalds 	ret = uhci_map_status(status, uhci_packetout(td_token(td)));
972*1da177e4SLinus Torvalds 
973*1da177e4SLinus Torvalds err:
974*1da177e4SLinus Torvalds 	/*
975*1da177e4SLinus Torvalds 	 * Enable this chunk of code if you want to see some more debugging.
976*1da177e4SLinus Torvalds 	 * But be careful, it has the tendancy to starve out khubd and prevent
977*1da177e4SLinus Torvalds 	 * disconnects from happening successfully if you have a slow debug
978*1da177e4SLinus Torvalds 	 * log interface (like a serial console.
979*1da177e4SLinus Torvalds 	 */
980*1da177e4SLinus Torvalds #if 0
981*1da177e4SLinus Torvalds 	if ((debug == 1 && ret != -EPIPE) || debug > 1) {
982*1da177e4SLinus Torvalds 		/* Some debugging code */
983*1da177e4SLinus Torvalds 		dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n",
984*1da177e4SLinus Torvalds 				__FUNCTION__, status);
985*1da177e4SLinus Torvalds 
986*1da177e4SLinus Torvalds 		if (errbuf) {
987*1da177e4SLinus Torvalds 			/* Print the chain for debugging purposes */
988*1da177e4SLinus Torvalds 			uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0);
989*1da177e4SLinus Torvalds 
990*1da177e4SLinus Torvalds 			lprintk(errbuf);
991*1da177e4SLinus Torvalds 		}
992*1da177e4SLinus Torvalds 	}
993*1da177e4SLinus Torvalds #endif
994*1da177e4SLinus Torvalds 	return ret;
995*1da177e4SLinus Torvalds }
996*1da177e4SLinus Torvalds 
997*1da177e4SLinus Torvalds static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb)
998*1da177e4SLinus Torvalds {
999*1da177e4SLinus Torvalds 	int ret;
1000*1da177e4SLinus Torvalds 
1001*1da177e4SLinus Torvalds 	/* Can't have low-speed bulk transfers */
1002*1da177e4SLinus Torvalds 	if (urb->dev->speed == USB_SPEED_LOW)
1003*1da177e4SLinus Torvalds 		return -EINVAL;
1004*1da177e4SLinus Torvalds 
1005*1da177e4SLinus Torvalds 	ret = uhci_submit_common(uhci, urb, eurb, uhci->skel_bulk_qh);
1006*1da177e4SLinus Torvalds 	if (ret == -EINPROGRESS)
1007*1da177e4SLinus Torvalds 		uhci_inc_fsbr(uhci, urb);
1008*1da177e4SLinus Torvalds 
1009*1da177e4SLinus Torvalds 	return ret;
1010*1da177e4SLinus Torvalds }
1011*1da177e4SLinus Torvalds 
1012*1da177e4SLinus Torvalds static inline int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb)
1013*1da177e4SLinus Torvalds {
1014*1da177e4SLinus Torvalds 	/* USB 1.1 interrupt transfers only involve one packet per interval;
1015*1da177e4SLinus Torvalds 	 * that's the uhci_submit_common() "breadth first" policy.  Drivers
1016*1da177e4SLinus Torvalds 	 * can submit urbs of any length, but longer ones might need many
1017*1da177e4SLinus Torvalds 	 * intervals to complete.
1018*1da177e4SLinus Torvalds 	 */
1019*1da177e4SLinus Torvalds 	return uhci_submit_common(uhci, urb, eurb, uhci->skelqh[__interval_to_skel(urb->interval)]);
1020*1da177e4SLinus Torvalds }
1021*1da177e4SLinus Torvalds 
1022*1da177e4SLinus Torvalds /*
1023*1da177e4SLinus Torvalds  * Isochronous transfers
1024*1da177e4SLinus Torvalds  */
1025*1da177e4SLinus Torvalds static int isochronous_find_limits(struct uhci_hcd *uhci, struct urb *urb, unsigned int *start, unsigned int *end)
1026*1da177e4SLinus Torvalds {
1027*1da177e4SLinus Torvalds 	struct urb *last_urb = NULL;
1028*1da177e4SLinus Torvalds 	struct urb_priv *up;
1029*1da177e4SLinus Torvalds 	int ret = 0;
1030*1da177e4SLinus Torvalds 
1031*1da177e4SLinus Torvalds 	list_for_each_entry(up, &uhci->urb_list, urb_list) {
1032*1da177e4SLinus Torvalds 		struct urb *u = up->urb;
1033*1da177e4SLinus Torvalds 
1034*1da177e4SLinus Torvalds 		/* look for pending URB's with identical pipe handle */
1035*1da177e4SLinus Torvalds 		if ((urb->pipe == u->pipe) && (urb->dev == u->dev) &&
1036*1da177e4SLinus Torvalds 		    (u->status == -EINPROGRESS) && (u != urb)) {
1037*1da177e4SLinus Torvalds 			if (!last_urb)
1038*1da177e4SLinus Torvalds 				*start = u->start_frame;
1039*1da177e4SLinus Torvalds 			last_urb = u;
1040*1da177e4SLinus Torvalds 		}
1041*1da177e4SLinus Torvalds 	}
1042*1da177e4SLinus Torvalds 
1043*1da177e4SLinus Torvalds 	if (last_urb) {
1044*1da177e4SLinus Torvalds 		*end = (last_urb->start_frame + last_urb->number_of_packets *
1045*1da177e4SLinus Torvalds 				last_urb->interval) & (UHCI_NUMFRAMES-1);
1046*1da177e4SLinus Torvalds 		ret = 0;
1047*1da177e4SLinus Torvalds 	} else
1048*1da177e4SLinus Torvalds 		ret = -1;	/* no previous urb found */
1049*1da177e4SLinus Torvalds 
1050*1da177e4SLinus Torvalds 	return ret;
1051*1da177e4SLinus Torvalds }
1052*1da177e4SLinus Torvalds 
1053*1da177e4SLinus Torvalds static int isochronous_find_start(struct uhci_hcd *uhci, struct urb *urb)
1054*1da177e4SLinus Torvalds {
1055*1da177e4SLinus Torvalds 	int limits;
1056*1da177e4SLinus Torvalds 	unsigned int start = 0, end = 0;
1057*1da177e4SLinus Torvalds 
1058*1da177e4SLinus Torvalds 	if (urb->number_of_packets > 900)	/* 900? Why? */
1059*1da177e4SLinus Torvalds 		return -EFBIG;
1060*1da177e4SLinus Torvalds 
1061*1da177e4SLinus Torvalds 	limits = isochronous_find_limits(uhci, urb, &start, &end);
1062*1da177e4SLinus Torvalds 
1063*1da177e4SLinus Torvalds 	if (urb->transfer_flags & URB_ISO_ASAP) {
1064*1da177e4SLinus Torvalds 		if (limits) {
1065*1da177e4SLinus Torvalds 			uhci_get_current_frame_number(uhci);
1066*1da177e4SLinus Torvalds 			urb->start_frame = (uhci->frame_number + 10)
1067*1da177e4SLinus Torvalds 					& (UHCI_NUMFRAMES - 1);
1068*1da177e4SLinus Torvalds 		} else
1069*1da177e4SLinus Torvalds 			urb->start_frame = end;
1070*1da177e4SLinus Torvalds 	} else {
1071*1da177e4SLinus Torvalds 		urb->start_frame &= (UHCI_NUMFRAMES - 1);
1072*1da177e4SLinus Torvalds 		/* FIXME: Sanity check */
1073*1da177e4SLinus Torvalds 	}
1074*1da177e4SLinus Torvalds 
1075*1da177e4SLinus Torvalds 	return 0;
1076*1da177e4SLinus Torvalds }
1077*1da177e4SLinus Torvalds 
1078*1da177e4SLinus Torvalds /*
1079*1da177e4SLinus Torvalds  * Isochronous transfers
1080*1da177e4SLinus Torvalds  */
1081*1da177e4SLinus Torvalds static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb)
1082*1da177e4SLinus Torvalds {
1083*1da177e4SLinus Torvalds 	struct uhci_td *td;
1084*1da177e4SLinus Torvalds 	int i, ret, frame;
1085*1da177e4SLinus Torvalds 	int status, destination;
1086*1da177e4SLinus Torvalds 
1087*1da177e4SLinus Torvalds 	status = TD_CTRL_ACTIVE | TD_CTRL_IOS;
1088*1da177e4SLinus Torvalds 	destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
1089*1da177e4SLinus Torvalds 
1090*1da177e4SLinus Torvalds 	ret = isochronous_find_start(uhci, urb);
1091*1da177e4SLinus Torvalds 	if (ret)
1092*1da177e4SLinus Torvalds 		return ret;
1093*1da177e4SLinus Torvalds 
1094*1da177e4SLinus Torvalds 	frame = urb->start_frame;
1095*1da177e4SLinus Torvalds 	for (i = 0; i < urb->number_of_packets; i++, frame += urb->interval) {
1096*1da177e4SLinus Torvalds 		if (!urb->iso_frame_desc[i].length)
1097*1da177e4SLinus Torvalds 			continue;
1098*1da177e4SLinus Torvalds 
1099*1da177e4SLinus Torvalds 		td = uhci_alloc_td(uhci, urb->dev);
1100*1da177e4SLinus Torvalds 		if (!td)
1101*1da177e4SLinus Torvalds 			return -ENOMEM;
1102*1da177e4SLinus Torvalds 
1103*1da177e4SLinus Torvalds 		uhci_add_td_to_urb(urb, td);
1104*1da177e4SLinus Torvalds 		uhci_fill_td(td, status, destination | uhci_explen(urb->iso_frame_desc[i].length - 1),
1105*1da177e4SLinus Torvalds 			urb->transfer_dma + urb->iso_frame_desc[i].offset);
1106*1da177e4SLinus Torvalds 
1107*1da177e4SLinus Torvalds 		if (i + 1 >= urb->number_of_packets)
1108*1da177e4SLinus Torvalds 			td->status |= cpu_to_le32(TD_CTRL_IOC);
1109*1da177e4SLinus Torvalds 
1110*1da177e4SLinus Torvalds 		uhci_insert_td_frame_list(uhci, td, frame);
1111*1da177e4SLinus Torvalds 	}
1112*1da177e4SLinus Torvalds 
1113*1da177e4SLinus Torvalds 	return -EINPROGRESS;
1114*1da177e4SLinus Torvalds }
1115*1da177e4SLinus Torvalds 
1116*1da177e4SLinus Torvalds static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb)
1117*1da177e4SLinus Torvalds {
1118*1da177e4SLinus Torvalds 	struct uhci_td *td;
1119*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1120*1da177e4SLinus Torvalds 	int status;
1121*1da177e4SLinus Torvalds 	int i, ret = 0;
1122*1da177e4SLinus Torvalds 
1123*1da177e4SLinus Torvalds 	urb->actual_length = 0;
1124*1da177e4SLinus Torvalds 
1125*1da177e4SLinus Torvalds 	i = 0;
1126*1da177e4SLinus Torvalds 	list_for_each_entry(td, &urbp->td_list, list) {
1127*1da177e4SLinus Torvalds 		int actlength;
1128*1da177e4SLinus Torvalds 		unsigned int ctrlstat = td_status(td);
1129*1da177e4SLinus Torvalds 
1130*1da177e4SLinus Torvalds 		if (ctrlstat & TD_CTRL_ACTIVE)
1131*1da177e4SLinus Torvalds 			return -EINPROGRESS;
1132*1da177e4SLinus Torvalds 
1133*1da177e4SLinus Torvalds 		actlength = uhci_actual_length(ctrlstat);
1134*1da177e4SLinus Torvalds 		urb->iso_frame_desc[i].actual_length = actlength;
1135*1da177e4SLinus Torvalds 		urb->actual_length += actlength;
1136*1da177e4SLinus Torvalds 
1137*1da177e4SLinus Torvalds 		status = uhci_map_status(uhci_status_bits(ctrlstat),
1138*1da177e4SLinus Torvalds 				usb_pipeout(urb->pipe));
1139*1da177e4SLinus Torvalds 		urb->iso_frame_desc[i].status = status;
1140*1da177e4SLinus Torvalds 		if (status) {
1141*1da177e4SLinus Torvalds 			urb->error_count++;
1142*1da177e4SLinus Torvalds 			ret = status;
1143*1da177e4SLinus Torvalds 		}
1144*1da177e4SLinus Torvalds 
1145*1da177e4SLinus Torvalds 		i++;
1146*1da177e4SLinus Torvalds 	}
1147*1da177e4SLinus Torvalds 
1148*1da177e4SLinus Torvalds 	return ret;
1149*1da177e4SLinus Torvalds }
1150*1da177e4SLinus Torvalds 
1151*1da177e4SLinus Torvalds static struct urb *uhci_find_urb_ep(struct uhci_hcd *uhci, struct urb *urb)
1152*1da177e4SLinus Torvalds {
1153*1da177e4SLinus Torvalds 	struct urb_priv *up;
1154*1da177e4SLinus Torvalds 
1155*1da177e4SLinus Torvalds 	/* We don't match Isoc transfers since they are special */
1156*1da177e4SLinus Torvalds 	if (usb_pipeisoc(urb->pipe))
1157*1da177e4SLinus Torvalds 		return NULL;
1158*1da177e4SLinus Torvalds 
1159*1da177e4SLinus Torvalds 	list_for_each_entry(up, &uhci->urb_list, urb_list) {
1160*1da177e4SLinus Torvalds 		struct urb *u = up->urb;
1161*1da177e4SLinus Torvalds 
1162*1da177e4SLinus Torvalds 		if (u->dev == urb->dev && u->status == -EINPROGRESS) {
1163*1da177e4SLinus Torvalds 			/* For control, ignore the direction */
1164*1da177e4SLinus Torvalds 			if (usb_pipecontrol(urb->pipe) &&
1165*1da177e4SLinus Torvalds 			    (u->pipe & ~USB_DIR_IN) == (urb->pipe & ~USB_DIR_IN))
1166*1da177e4SLinus Torvalds 				return u;
1167*1da177e4SLinus Torvalds 			else if (u->pipe == urb->pipe)
1168*1da177e4SLinus Torvalds 				return u;
1169*1da177e4SLinus Torvalds 		}
1170*1da177e4SLinus Torvalds 	}
1171*1da177e4SLinus Torvalds 
1172*1da177e4SLinus Torvalds 	return NULL;
1173*1da177e4SLinus Torvalds }
1174*1da177e4SLinus Torvalds 
1175*1da177e4SLinus Torvalds static int uhci_urb_enqueue(struct usb_hcd *hcd,
1176*1da177e4SLinus Torvalds 		struct usb_host_endpoint *ep,
1177*1da177e4SLinus Torvalds 		struct urb *urb, int mem_flags)
1178*1da177e4SLinus Torvalds {
1179*1da177e4SLinus Torvalds 	int ret;
1180*1da177e4SLinus Torvalds 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
1181*1da177e4SLinus Torvalds 	unsigned long flags;
1182*1da177e4SLinus Torvalds 	struct urb *eurb;
1183*1da177e4SLinus Torvalds 	int bustime;
1184*1da177e4SLinus Torvalds 
1185*1da177e4SLinus Torvalds 	spin_lock_irqsave(&uhci->lock, flags);
1186*1da177e4SLinus Torvalds 
1187*1da177e4SLinus Torvalds 	ret = urb->status;
1188*1da177e4SLinus Torvalds 	if (ret != -EINPROGRESS)		/* URB already unlinked! */
1189*1da177e4SLinus Torvalds 		goto out;
1190*1da177e4SLinus Torvalds 
1191*1da177e4SLinus Torvalds 	eurb = uhci_find_urb_ep(uhci, urb);
1192*1da177e4SLinus Torvalds 
1193*1da177e4SLinus Torvalds 	if (!uhci_alloc_urb_priv(uhci, urb)) {
1194*1da177e4SLinus Torvalds 		ret = -ENOMEM;
1195*1da177e4SLinus Torvalds 		goto out;
1196*1da177e4SLinus Torvalds 	}
1197*1da177e4SLinus Torvalds 
1198*1da177e4SLinus Torvalds 	switch (usb_pipetype(urb->pipe)) {
1199*1da177e4SLinus Torvalds 	case PIPE_CONTROL:
1200*1da177e4SLinus Torvalds 		ret = uhci_submit_control(uhci, urb, eurb);
1201*1da177e4SLinus Torvalds 		break;
1202*1da177e4SLinus Torvalds 	case PIPE_INTERRUPT:
1203*1da177e4SLinus Torvalds 		if (!eurb) {
1204*1da177e4SLinus Torvalds 			bustime = usb_check_bandwidth(urb->dev, urb);
1205*1da177e4SLinus Torvalds 			if (bustime < 0)
1206*1da177e4SLinus Torvalds 				ret = bustime;
1207*1da177e4SLinus Torvalds 			else {
1208*1da177e4SLinus Torvalds 				ret = uhci_submit_interrupt(uhci, urb, eurb);
1209*1da177e4SLinus Torvalds 				if (ret == -EINPROGRESS)
1210*1da177e4SLinus Torvalds 					usb_claim_bandwidth(urb->dev, urb, bustime, 0);
1211*1da177e4SLinus Torvalds 			}
1212*1da177e4SLinus Torvalds 		} else {	/* inherit from parent */
1213*1da177e4SLinus Torvalds 			urb->bandwidth = eurb->bandwidth;
1214*1da177e4SLinus Torvalds 			ret = uhci_submit_interrupt(uhci, urb, eurb);
1215*1da177e4SLinus Torvalds 		}
1216*1da177e4SLinus Torvalds 		break;
1217*1da177e4SLinus Torvalds 	case PIPE_BULK:
1218*1da177e4SLinus Torvalds 		ret = uhci_submit_bulk(uhci, urb, eurb);
1219*1da177e4SLinus Torvalds 		break;
1220*1da177e4SLinus Torvalds 	case PIPE_ISOCHRONOUS:
1221*1da177e4SLinus Torvalds 		bustime = usb_check_bandwidth(urb->dev, urb);
1222*1da177e4SLinus Torvalds 		if (bustime < 0) {
1223*1da177e4SLinus Torvalds 			ret = bustime;
1224*1da177e4SLinus Torvalds 			break;
1225*1da177e4SLinus Torvalds 		}
1226*1da177e4SLinus Torvalds 
1227*1da177e4SLinus Torvalds 		ret = uhci_submit_isochronous(uhci, urb);
1228*1da177e4SLinus Torvalds 		if (ret == -EINPROGRESS)
1229*1da177e4SLinus Torvalds 			usb_claim_bandwidth(urb->dev, urb, bustime, 1);
1230*1da177e4SLinus Torvalds 		break;
1231*1da177e4SLinus Torvalds 	}
1232*1da177e4SLinus Torvalds 
1233*1da177e4SLinus Torvalds 	if (ret != -EINPROGRESS) {
1234*1da177e4SLinus Torvalds 		/* Submit failed, so delete it from the urb_list */
1235*1da177e4SLinus Torvalds 		struct urb_priv *urbp = urb->hcpriv;
1236*1da177e4SLinus Torvalds 
1237*1da177e4SLinus Torvalds 		list_del_init(&urbp->urb_list);
1238*1da177e4SLinus Torvalds 		uhci_destroy_urb_priv(uhci, urb);
1239*1da177e4SLinus Torvalds 	} else
1240*1da177e4SLinus Torvalds 		ret = 0;
1241*1da177e4SLinus Torvalds 
1242*1da177e4SLinus Torvalds out:
1243*1da177e4SLinus Torvalds 	spin_unlock_irqrestore(&uhci->lock, flags);
1244*1da177e4SLinus Torvalds 	return ret;
1245*1da177e4SLinus Torvalds }
1246*1da177e4SLinus Torvalds 
1247*1da177e4SLinus Torvalds /*
1248*1da177e4SLinus Torvalds  * Return the result of a transfer
1249*1da177e4SLinus Torvalds  */
1250*1da177e4SLinus Torvalds static void uhci_transfer_result(struct uhci_hcd *uhci, struct urb *urb)
1251*1da177e4SLinus Torvalds {
1252*1da177e4SLinus Torvalds 	int ret = -EINPROGRESS;
1253*1da177e4SLinus Torvalds 	struct urb_priv *urbp;
1254*1da177e4SLinus Torvalds 
1255*1da177e4SLinus Torvalds 	spin_lock(&urb->lock);
1256*1da177e4SLinus Torvalds 
1257*1da177e4SLinus Torvalds 	urbp = (struct urb_priv *)urb->hcpriv;
1258*1da177e4SLinus Torvalds 
1259*1da177e4SLinus Torvalds 	if (urb->status != -EINPROGRESS)	/* URB already dequeued */
1260*1da177e4SLinus Torvalds 		goto out;
1261*1da177e4SLinus Torvalds 
1262*1da177e4SLinus Torvalds 	switch (usb_pipetype(urb->pipe)) {
1263*1da177e4SLinus Torvalds 	case PIPE_CONTROL:
1264*1da177e4SLinus Torvalds 		ret = uhci_result_control(uhci, urb);
1265*1da177e4SLinus Torvalds 		break;
1266*1da177e4SLinus Torvalds 	case PIPE_BULK:
1267*1da177e4SLinus Torvalds 	case PIPE_INTERRUPT:
1268*1da177e4SLinus Torvalds 		ret = uhci_result_common(uhci, urb);
1269*1da177e4SLinus Torvalds 		break;
1270*1da177e4SLinus Torvalds 	case PIPE_ISOCHRONOUS:
1271*1da177e4SLinus Torvalds 		ret = uhci_result_isochronous(uhci, urb);
1272*1da177e4SLinus Torvalds 		break;
1273*1da177e4SLinus Torvalds 	}
1274*1da177e4SLinus Torvalds 
1275*1da177e4SLinus Torvalds 	if (ret == -EINPROGRESS)
1276*1da177e4SLinus Torvalds 		goto out;
1277*1da177e4SLinus Torvalds 	urb->status = ret;
1278*1da177e4SLinus Torvalds 
1279*1da177e4SLinus Torvalds 	switch (usb_pipetype(urb->pipe)) {
1280*1da177e4SLinus Torvalds 	case PIPE_CONTROL:
1281*1da177e4SLinus Torvalds 	case PIPE_BULK:
1282*1da177e4SLinus Torvalds 	case PIPE_ISOCHRONOUS:
1283*1da177e4SLinus Torvalds 		/* Release bandwidth for Interrupt or Isoc. transfers */
1284*1da177e4SLinus Torvalds 		if (urb->bandwidth)
1285*1da177e4SLinus Torvalds 			usb_release_bandwidth(urb->dev, urb, 1);
1286*1da177e4SLinus Torvalds 		uhci_unlink_generic(uhci, urb);
1287*1da177e4SLinus Torvalds 		break;
1288*1da177e4SLinus Torvalds 	case PIPE_INTERRUPT:
1289*1da177e4SLinus Torvalds 		/* Release bandwidth for Interrupt or Isoc. transfers */
1290*1da177e4SLinus Torvalds 		/* Make sure we don't release if we have a queued URB */
1291*1da177e4SLinus Torvalds 		if (list_empty(&urbp->queue_list) && urb->bandwidth)
1292*1da177e4SLinus Torvalds 			usb_release_bandwidth(urb->dev, urb, 0);
1293*1da177e4SLinus Torvalds 		else
1294*1da177e4SLinus Torvalds 			/* bandwidth was passed on to queued URB, */
1295*1da177e4SLinus Torvalds 			/* so don't let usb_unlink_urb() release it */
1296*1da177e4SLinus Torvalds 			urb->bandwidth = 0;
1297*1da177e4SLinus Torvalds 		uhci_unlink_generic(uhci, urb);
1298*1da177e4SLinus Torvalds 		break;
1299*1da177e4SLinus Torvalds 	default:
1300*1da177e4SLinus Torvalds 		dev_info(uhci_dev(uhci), "%s: unknown pipe type %d "
1301*1da177e4SLinus Torvalds 				"for urb %p\n",
1302*1da177e4SLinus Torvalds 				__FUNCTION__, usb_pipetype(urb->pipe), urb);
1303*1da177e4SLinus Torvalds 	}
1304*1da177e4SLinus Torvalds 
1305*1da177e4SLinus Torvalds 	/* Move it from uhci->urb_list to uhci->complete_list */
1306*1da177e4SLinus Torvalds 	uhci_moveto_complete(uhci, urbp);
1307*1da177e4SLinus Torvalds 
1308*1da177e4SLinus Torvalds out:
1309*1da177e4SLinus Torvalds 	spin_unlock(&urb->lock);
1310*1da177e4SLinus Torvalds }
1311*1da177e4SLinus Torvalds 
1312*1da177e4SLinus Torvalds static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb)
1313*1da177e4SLinus Torvalds {
1314*1da177e4SLinus Torvalds 	struct list_head *head;
1315*1da177e4SLinus Torvalds 	struct uhci_td *td;
1316*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1317*1da177e4SLinus Torvalds 	int prevactive = 0;
1318*1da177e4SLinus Torvalds 
1319*1da177e4SLinus Torvalds 	uhci_dec_fsbr(uhci, urb);	/* Safe since it checks */
1320*1da177e4SLinus Torvalds 
1321*1da177e4SLinus Torvalds 	/*
1322*1da177e4SLinus Torvalds 	 * Now we need to find out what the last successful toggle was
1323*1da177e4SLinus Torvalds 	 * so we can update the local data toggle for the next transfer
1324*1da177e4SLinus Torvalds 	 *
1325*1da177e4SLinus Torvalds 	 * There are 2 ways the last successful completed TD is found:
1326*1da177e4SLinus Torvalds 	 *
1327*1da177e4SLinus Torvalds 	 * 1) The TD is NOT active and the actual length < expected length
1328*1da177e4SLinus Torvalds 	 * 2) The TD is NOT active and it's the last TD in the chain
1329*1da177e4SLinus Torvalds 	 *
1330*1da177e4SLinus Torvalds 	 * and a third way the first uncompleted TD is found:
1331*1da177e4SLinus Torvalds 	 *
1332*1da177e4SLinus Torvalds 	 * 3) The TD is active and the previous TD is NOT active
1333*1da177e4SLinus Torvalds 	 *
1334*1da177e4SLinus Torvalds 	 * Control and Isochronous ignore the toggle, so this is safe
1335*1da177e4SLinus Torvalds 	 * for all types
1336*1da177e4SLinus Torvalds 	 *
1337*1da177e4SLinus Torvalds 	 * FIXME: The toggle fixups won't be 100% reliable until we
1338*1da177e4SLinus Torvalds 	 * change over to using a single queue for each endpoint and
1339*1da177e4SLinus Torvalds 	 * stop the queue before unlinking.
1340*1da177e4SLinus Torvalds 	 */
1341*1da177e4SLinus Torvalds 	head = &urbp->td_list;
1342*1da177e4SLinus Torvalds 	list_for_each_entry(td, head, list) {
1343*1da177e4SLinus Torvalds 		unsigned int ctrlstat = td_status(td);
1344*1da177e4SLinus Torvalds 
1345*1da177e4SLinus Torvalds 		if (!(ctrlstat & TD_CTRL_ACTIVE) &&
1346*1da177e4SLinus Torvalds 				(uhci_actual_length(ctrlstat) <
1347*1da177e4SLinus Torvalds 				 uhci_expected_length(td_token(td)) ||
1348*1da177e4SLinus Torvalds 				td->list.next == head))
1349*1da177e4SLinus Torvalds 			usb_settoggle(urb->dev, uhci_endpoint(td_token(td)),
1350*1da177e4SLinus Torvalds 				uhci_packetout(td_token(td)),
1351*1da177e4SLinus Torvalds 				uhci_toggle(td_token(td)) ^ 1);
1352*1da177e4SLinus Torvalds 		else if ((ctrlstat & TD_CTRL_ACTIVE) && !prevactive)
1353*1da177e4SLinus Torvalds 			usb_settoggle(urb->dev, uhci_endpoint(td_token(td)),
1354*1da177e4SLinus Torvalds 				uhci_packetout(td_token(td)),
1355*1da177e4SLinus Torvalds 				uhci_toggle(td_token(td)));
1356*1da177e4SLinus Torvalds 
1357*1da177e4SLinus Torvalds 		prevactive = ctrlstat & TD_CTRL_ACTIVE;
1358*1da177e4SLinus Torvalds 	}
1359*1da177e4SLinus Torvalds 
1360*1da177e4SLinus Torvalds 	uhci_delete_queued_urb(uhci, urb);
1361*1da177e4SLinus Torvalds 
1362*1da177e4SLinus Torvalds 	/* The interrupt loop will reclaim the QH's */
1363*1da177e4SLinus Torvalds 	uhci_remove_qh(uhci, urbp->qh);
1364*1da177e4SLinus Torvalds 	urbp->qh = NULL;
1365*1da177e4SLinus Torvalds }
1366*1da177e4SLinus Torvalds 
1367*1da177e4SLinus Torvalds static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
1368*1da177e4SLinus Torvalds {
1369*1da177e4SLinus Torvalds 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
1370*1da177e4SLinus Torvalds 	unsigned long flags;
1371*1da177e4SLinus Torvalds 	struct urb_priv *urbp;
1372*1da177e4SLinus Torvalds 
1373*1da177e4SLinus Torvalds 	spin_lock_irqsave(&uhci->lock, flags);
1374*1da177e4SLinus Torvalds 	urbp = urb->hcpriv;
1375*1da177e4SLinus Torvalds 	if (!urbp)			/* URB was never linked! */
1376*1da177e4SLinus Torvalds 		goto done;
1377*1da177e4SLinus Torvalds 	list_del_init(&urbp->urb_list);
1378*1da177e4SLinus Torvalds 
1379*1da177e4SLinus Torvalds 	uhci_unlink_generic(uhci, urb);
1380*1da177e4SLinus Torvalds 
1381*1da177e4SLinus Torvalds 	uhci_get_current_frame_number(uhci);
1382*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->urb_remove_age) {
1383*1da177e4SLinus Torvalds 		uhci_remove_pending_urbps(uhci);
1384*1da177e4SLinus Torvalds 		uhci->urb_remove_age = uhci->frame_number;
1385*1da177e4SLinus Torvalds 	}
1386*1da177e4SLinus Torvalds 
1387*1da177e4SLinus Torvalds 	/* If we're the first, set the next interrupt bit */
1388*1da177e4SLinus Torvalds 	if (list_empty(&uhci->urb_remove_list))
1389*1da177e4SLinus Torvalds 		uhci_set_next_interrupt(uhci);
1390*1da177e4SLinus Torvalds 	list_add_tail(&urbp->urb_list, &uhci->urb_remove_list);
1391*1da177e4SLinus Torvalds 
1392*1da177e4SLinus Torvalds done:
1393*1da177e4SLinus Torvalds 	spin_unlock_irqrestore(&uhci->lock, flags);
1394*1da177e4SLinus Torvalds 	return 0;
1395*1da177e4SLinus Torvalds }
1396*1da177e4SLinus Torvalds 
1397*1da177e4SLinus Torvalds static int uhci_fsbr_timeout(struct uhci_hcd *uhci, struct urb *urb)
1398*1da177e4SLinus Torvalds {
1399*1da177e4SLinus Torvalds 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1400*1da177e4SLinus Torvalds 	struct list_head *head;
1401*1da177e4SLinus Torvalds 	struct uhci_td *td;
1402*1da177e4SLinus Torvalds 	int count = 0;
1403*1da177e4SLinus Torvalds 
1404*1da177e4SLinus Torvalds 	uhci_dec_fsbr(uhci, urb);
1405*1da177e4SLinus Torvalds 
1406*1da177e4SLinus Torvalds 	urbp->fsbr_timeout = 1;
1407*1da177e4SLinus Torvalds 
1408*1da177e4SLinus Torvalds 	/*
1409*1da177e4SLinus Torvalds 	 * Ideally we would want to fix qh->element as well, but it's
1410*1da177e4SLinus Torvalds 	 * read/write by the HC, so that can introduce a race. It's not
1411*1da177e4SLinus Torvalds 	 * really worth the hassle
1412*1da177e4SLinus Torvalds 	 */
1413*1da177e4SLinus Torvalds 
1414*1da177e4SLinus Torvalds 	head = &urbp->td_list;
1415*1da177e4SLinus Torvalds 	list_for_each_entry(td, head, list) {
1416*1da177e4SLinus Torvalds 		/*
1417*1da177e4SLinus Torvalds 		 * Make sure we don't do the last one (since it'll have the
1418*1da177e4SLinus Torvalds 		 * TERM bit set) as well as we skip every so many TD's to
1419*1da177e4SLinus Torvalds 		 * make sure it doesn't hog the bandwidth
1420*1da177e4SLinus Torvalds 		 */
1421*1da177e4SLinus Torvalds 		if (td->list.next != head && (count % DEPTH_INTERVAL) ==
1422*1da177e4SLinus Torvalds 				(DEPTH_INTERVAL - 1))
1423*1da177e4SLinus Torvalds 			td->link |= UHCI_PTR_DEPTH;
1424*1da177e4SLinus Torvalds 
1425*1da177e4SLinus Torvalds 		count++;
1426*1da177e4SLinus Torvalds 	}
1427*1da177e4SLinus Torvalds 
1428*1da177e4SLinus Torvalds 	return 0;
1429*1da177e4SLinus Torvalds }
1430*1da177e4SLinus Torvalds 
1431*1da177e4SLinus Torvalds static void uhci_free_pending_qhs(struct uhci_hcd *uhci)
1432*1da177e4SLinus Torvalds {
1433*1da177e4SLinus Torvalds 	struct uhci_qh *qh, *tmp;
1434*1da177e4SLinus Torvalds 
1435*1da177e4SLinus Torvalds 	list_for_each_entry_safe(qh, tmp, &uhci->qh_remove_list, remove_list) {
1436*1da177e4SLinus Torvalds 		list_del_init(&qh->remove_list);
1437*1da177e4SLinus Torvalds 
1438*1da177e4SLinus Torvalds 		uhci_free_qh(uhci, qh);
1439*1da177e4SLinus Torvalds 	}
1440*1da177e4SLinus Torvalds }
1441*1da177e4SLinus Torvalds 
1442*1da177e4SLinus Torvalds static void uhci_free_pending_tds(struct uhci_hcd *uhci)
1443*1da177e4SLinus Torvalds {
1444*1da177e4SLinus Torvalds 	struct uhci_td *td, *tmp;
1445*1da177e4SLinus Torvalds 
1446*1da177e4SLinus Torvalds 	list_for_each_entry_safe(td, tmp, &uhci->td_remove_list, remove_list) {
1447*1da177e4SLinus Torvalds 		list_del_init(&td->remove_list);
1448*1da177e4SLinus Torvalds 
1449*1da177e4SLinus Torvalds 		uhci_free_td(uhci, td);
1450*1da177e4SLinus Torvalds 	}
1451*1da177e4SLinus Torvalds }
1452*1da177e4SLinus Torvalds 
1453*1da177e4SLinus Torvalds static void
1454*1da177e4SLinus Torvalds uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs)
1455*1da177e4SLinus Torvalds __releases(uhci->lock)
1456*1da177e4SLinus Torvalds __acquires(uhci->lock)
1457*1da177e4SLinus Torvalds {
1458*1da177e4SLinus Torvalds 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
1459*1da177e4SLinus Torvalds 
1460*1da177e4SLinus Torvalds 	uhci_destroy_urb_priv(uhci, urb);
1461*1da177e4SLinus Torvalds 
1462*1da177e4SLinus Torvalds 	spin_unlock(&uhci->lock);
1463*1da177e4SLinus Torvalds 	usb_hcd_giveback_urb(hcd, urb, regs);
1464*1da177e4SLinus Torvalds 	spin_lock(&uhci->lock);
1465*1da177e4SLinus Torvalds }
1466*1da177e4SLinus Torvalds 
1467*1da177e4SLinus Torvalds static void uhci_finish_completion(struct uhci_hcd *uhci, struct pt_regs *regs)
1468*1da177e4SLinus Torvalds {
1469*1da177e4SLinus Torvalds 	struct urb_priv *urbp, *tmp;
1470*1da177e4SLinus Torvalds 
1471*1da177e4SLinus Torvalds 	list_for_each_entry_safe(urbp, tmp, &uhci->complete_list, urb_list) {
1472*1da177e4SLinus Torvalds 		struct urb *urb = urbp->urb;
1473*1da177e4SLinus Torvalds 
1474*1da177e4SLinus Torvalds 		list_del_init(&urbp->urb_list);
1475*1da177e4SLinus Torvalds 		uhci_finish_urb(uhci_to_hcd(uhci), urb, regs);
1476*1da177e4SLinus Torvalds 	}
1477*1da177e4SLinus Torvalds }
1478*1da177e4SLinus Torvalds 
1479*1da177e4SLinus Torvalds static void uhci_remove_pending_urbps(struct uhci_hcd *uhci)
1480*1da177e4SLinus Torvalds {
1481*1da177e4SLinus Torvalds 
1482*1da177e4SLinus Torvalds 	/* Splice the urb_remove_list onto the end of the complete_list */
1483*1da177e4SLinus Torvalds 	list_splice_init(&uhci->urb_remove_list, uhci->complete_list.prev);
1484*1da177e4SLinus Torvalds }
1485*1da177e4SLinus Torvalds 
1486*1da177e4SLinus Torvalds /* Process events in the schedule, but only in one thread at a time */
1487*1da177e4SLinus Torvalds static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs)
1488*1da177e4SLinus Torvalds {
1489*1da177e4SLinus Torvalds 	struct urb_priv *urbp, *tmp;
1490*1da177e4SLinus Torvalds 
1491*1da177e4SLinus Torvalds 	/* Don't allow re-entrant calls */
1492*1da177e4SLinus Torvalds 	if (uhci->scan_in_progress) {
1493*1da177e4SLinus Torvalds 		uhci->need_rescan = 1;
1494*1da177e4SLinus Torvalds 		return;
1495*1da177e4SLinus Torvalds 	}
1496*1da177e4SLinus Torvalds 	uhci->scan_in_progress = 1;
1497*1da177e4SLinus Torvalds  rescan:
1498*1da177e4SLinus Torvalds 	uhci->need_rescan = 0;
1499*1da177e4SLinus Torvalds 
1500*1da177e4SLinus Torvalds 	uhci_get_current_frame_number(uhci);
1501*1da177e4SLinus Torvalds 
1502*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->qh_remove_age)
1503*1da177e4SLinus Torvalds 		uhci_free_pending_qhs(uhci);
1504*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age)
1505*1da177e4SLinus Torvalds 		uhci_free_pending_tds(uhci);
1506*1da177e4SLinus Torvalds 	if (uhci->frame_number + uhci->is_stopped != uhci->urb_remove_age)
1507*1da177e4SLinus Torvalds 		uhci_remove_pending_urbps(uhci);
1508*1da177e4SLinus Torvalds 
1509*1da177e4SLinus Torvalds 	/* Walk the list of pending URBs to see which ones completed
1510*1da177e4SLinus Torvalds 	 * (must be _safe because uhci_transfer_result() dequeues URBs) */
1511*1da177e4SLinus Torvalds 	list_for_each_entry_safe(urbp, tmp, &uhci->urb_list, urb_list) {
1512*1da177e4SLinus Torvalds 		struct urb *urb = urbp->urb;
1513*1da177e4SLinus Torvalds 
1514*1da177e4SLinus Torvalds 		/* Checks the status and does all of the magic necessary */
1515*1da177e4SLinus Torvalds 		uhci_transfer_result(uhci, urb);
1516*1da177e4SLinus Torvalds 	}
1517*1da177e4SLinus Torvalds 	uhci_finish_completion(uhci, regs);
1518*1da177e4SLinus Torvalds 
1519*1da177e4SLinus Torvalds 	/* If the controller is stopped, we can finish these off right now */
1520*1da177e4SLinus Torvalds 	if (uhci->is_stopped) {
1521*1da177e4SLinus Torvalds 		uhci_free_pending_qhs(uhci);
1522*1da177e4SLinus Torvalds 		uhci_free_pending_tds(uhci);
1523*1da177e4SLinus Torvalds 		uhci_remove_pending_urbps(uhci);
1524*1da177e4SLinus Torvalds 	}
1525*1da177e4SLinus Torvalds 
1526*1da177e4SLinus Torvalds 	if (uhci->need_rescan)
1527*1da177e4SLinus Torvalds 		goto rescan;
1528*1da177e4SLinus Torvalds 	uhci->scan_in_progress = 0;
1529*1da177e4SLinus Torvalds 
1530*1da177e4SLinus Torvalds 	if (list_empty(&uhci->urb_remove_list) &&
1531*1da177e4SLinus Torvalds 	    list_empty(&uhci->td_remove_list) &&
1532*1da177e4SLinus Torvalds 	    list_empty(&uhci->qh_remove_list))
1533*1da177e4SLinus Torvalds 		uhci_clear_next_interrupt(uhci);
1534*1da177e4SLinus Torvalds 	else
1535*1da177e4SLinus Torvalds 		uhci_set_next_interrupt(uhci);
1536*1da177e4SLinus Torvalds 
1537*1da177e4SLinus Torvalds 	/* Wake up anyone waiting for an URB to complete */
1538*1da177e4SLinus Torvalds 	wake_up_all(&uhci->waitqh);
1539*1da177e4SLinus Torvalds }
1540