11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Universal Host Controller Interface driver for USB. 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Maintainer: Alan Stern <stern@rowland.harvard.edu> 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * (C) Copyright 1999 Linus Torvalds 71da177e4SLinus Torvalds * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com 81da177e4SLinus Torvalds * (C) Copyright 1999 Randy Dunlap 91da177e4SLinus Torvalds * (C) Copyright 1999 Georg Acher, acher@in.tum.de 101da177e4SLinus Torvalds * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de 111da177e4SLinus Torvalds * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch 121da177e4SLinus Torvalds * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at 131da177e4SLinus Torvalds * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface 141da177e4SLinus Torvalds * support from usb-ohci.c by Adam Richter, adam@yggdrasil.com). 151da177e4SLinus Torvalds * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c) 16b761d9d8SAlan Stern * (C) Copyright 2004-2006 Alan Stern, stern@rowland.harvard.edu 171da177e4SLinus Torvalds */ 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds /* 211da177e4SLinus Torvalds * Technically, updating td->status here is a race, but it's not really a 221da177e4SLinus Torvalds * problem. The worst that can happen is that we set the IOC bit again 231da177e4SLinus Torvalds * generating a spurious interrupt. We could fix this by creating another 241da177e4SLinus Torvalds * QH and leaving the IOC bit always set, but then we would have to play 251da177e4SLinus Torvalds * games with the FSBR code to make sure we get the correct order in all 261da177e4SLinus Torvalds * the cases. I don't think it's worth the effort 271da177e4SLinus Torvalds */ 28dccf4a48SAlan Stern static void uhci_set_next_interrupt(struct uhci_hcd *uhci) 291da177e4SLinus Torvalds { 306c1b445cSAlan Stern if (uhci->is_stopped) 311f09df8bSAlan Stern mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); 321da177e4SLinus Torvalds uhci->term_td->status |= cpu_to_le32(TD_CTRL_IOC); 331da177e4SLinus Torvalds } 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) 361da177e4SLinus Torvalds { 371da177e4SLinus Torvalds uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC); 381da177e4SLinus Torvalds } 391da177e4SLinus Torvalds 4084afddd7SAlan Stern 4184afddd7SAlan Stern /* 4284afddd7SAlan Stern * Full-Speed Bandwidth Reclamation (FSBR). 4384afddd7SAlan Stern * We turn on FSBR whenever a queue that wants it is advancing, 4484afddd7SAlan Stern * and leave it on for a short time thereafter. 4584afddd7SAlan Stern */ 4684afddd7SAlan Stern static void uhci_fsbr_on(struct uhci_hcd *uhci) 4784afddd7SAlan Stern { 4884afddd7SAlan Stern uhci->fsbr_is_on = 1; 4984afddd7SAlan Stern uhci->skel_term_qh->link = cpu_to_le32( 5084afddd7SAlan Stern uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH; 5184afddd7SAlan Stern } 5284afddd7SAlan Stern 5384afddd7SAlan Stern static void uhci_fsbr_off(struct uhci_hcd *uhci) 5484afddd7SAlan Stern { 5584afddd7SAlan Stern uhci->fsbr_is_on = 0; 5684afddd7SAlan Stern uhci->skel_term_qh->link = UHCI_PTR_TERM; 5784afddd7SAlan Stern } 5884afddd7SAlan Stern 5984afddd7SAlan Stern static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) 6084afddd7SAlan Stern { 6184afddd7SAlan Stern struct urb_priv *urbp = urb->hcpriv; 6284afddd7SAlan Stern 6384afddd7SAlan Stern if (!(urb->transfer_flags & URB_NO_FSBR)) 6484afddd7SAlan Stern urbp->fsbr = 1; 6584afddd7SAlan Stern } 6684afddd7SAlan Stern 6784afddd7SAlan Stern static void uhci_qh_wants_fsbr(struct uhci_hcd *uhci, struct uhci_qh *qh) 6884afddd7SAlan Stern { 6984afddd7SAlan Stern struct urb_priv *urbp = 7084afddd7SAlan Stern list_entry(qh->queue.next, struct urb_priv, node); 7184afddd7SAlan Stern 7284afddd7SAlan Stern if (urbp->fsbr) { 7384afddd7SAlan Stern uhci->fsbr_jiffies = jiffies; 7484afddd7SAlan Stern if (!uhci->fsbr_is_on) 7584afddd7SAlan Stern uhci_fsbr_on(uhci); 7684afddd7SAlan Stern } 7784afddd7SAlan Stern } 7884afddd7SAlan Stern 7984afddd7SAlan Stern 802532178aSAlan Stern static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) 811da177e4SLinus Torvalds { 821da177e4SLinus Torvalds dma_addr_t dma_handle; 831da177e4SLinus Torvalds struct uhci_td *td; 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle); 861da177e4SLinus Torvalds if (!td) 871da177e4SLinus Torvalds return NULL; 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds td->dma_handle = dma_handle; 901da177e4SLinus Torvalds td->frame = -1; 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds INIT_LIST_HEAD(&td->list); 931da177e4SLinus Torvalds INIT_LIST_HEAD(&td->fl_list); 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds return td; 961da177e4SLinus Torvalds } 971da177e4SLinus Torvalds 98dccf4a48SAlan Stern static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) 99dccf4a48SAlan Stern { 100dccf4a48SAlan Stern if (!list_empty(&td->list)) 101dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in list!\n", td); 102dccf4a48SAlan Stern if (!list_empty(&td->fl_list)) 103dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td); 104dccf4a48SAlan Stern 105dccf4a48SAlan Stern dma_pool_free(uhci->td_pool, td, td->dma_handle); 106dccf4a48SAlan Stern } 107dccf4a48SAlan Stern 1081da177e4SLinus Torvalds static inline void uhci_fill_td(struct uhci_td *td, u32 status, 1091da177e4SLinus Torvalds u32 token, u32 buffer) 1101da177e4SLinus Torvalds { 1111da177e4SLinus Torvalds td->status = cpu_to_le32(status); 1121da177e4SLinus Torvalds td->token = cpu_to_le32(token); 1131da177e4SLinus Torvalds td->buffer = cpu_to_le32(buffer); 1141da177e4SLinus Torvalds } 1151da177e4SLinus Torvalds 11604538a25SAlan Stern static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) 11704538a25SAlan Stern { 11804538a25SAlan Stern list_add_tail(&td->list, &urbp->td_list); 11904538a25SAlan Stern } 12004538a25SAlan Stern 12104538a25SAlan Stern static void uhci_remove_td_from_urbp(struct uhci_td *td) 12204538a25SAlan Stern { 12304538a25SAlan Stern list_del_init(&td->list); 12404538a25SAlan Stern } 12504538a25SAlan Stern 1261da177e4SLinus Torvalds /* 127687f5f34SAlan Stern * We insert Isochronous URBs directly into the frame list at the beginning 1281da177e4SLinus Torvalds */ 129dccf4a48SAlan Stern static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, 130dccf4a48SAlan Stern struct uhci_td *td, unsigned framenum) 1311da177e4SLinus Torvalds { 1321da177e4SLinus Torvalds framenum &= (UHCI_NUMFRAMES - 1); 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds td->frame = framenum; 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds /* Is there a TD already mapped there? */ 137a1d59ce8SAlan Stern if (uhci->frame_cpu[framenum]) { 1381da177e4SLinus Torvalds struct uhci_td *ftd, *ltd; 1391da177e4SLinus Torvalds 140a1d59ce8SAlan Stern ftd = uhci->frame_cpu[framenum]; 1411da177e4SLinus Torvalds ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds list_add_tail(&td->fl_list, &ftd->fl_list); 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds td->link = ltd->link; 1461da177e4SLinus Torvalds wmb(); 1471da177e4SLinus Torvalds ltd->link = cpu_to_le32(td->dma_handle); 1481da177e4SLinus Torvalds } else { 149a1d59ce8SAlan Stern td->link = uhci->frame[framenum]; 1501da177e4SLinus Torvalds wmb(); 151a1d59ce8SAlan Stern uhci->frame[framenum] = cpu_to_le32(td->dma_handle); 152a1d59ce8SAlan Stern uhci->frame_cpu[framenum] = td; 1531da177e4SLinus Torvalds } 1541da177e4SLinus Torvalds } 1551da177e4SLinus Torvalds 156dccf4a48SAlan Stern static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, 157b81d3436SAlan Stern struct uhci_td *td) 1581da177e4SLinus Torvalds { 1591da177e4SLinus Torvalds /* If it's not inserted, don't remove it */ 160b81d3436SAlan Stern if (td->frame == -1) { 161b81d3436SAlan Stern WARN_ON(!list_empty(&td->fl_list)); 1621da177e4SLinus Torvalds return; 163b81d3436SAlan Stern } 1641da177e4SLinus Torvalds 165b81d3436SAlan Stern if (uhci->frame_cpu[td->frame] == td) { 1661da177e4SLinus Torvalds if (list_empty(&td->fl_list)) { 167a1d59ce8SAlan Stern uhci->frame[td->frame] = td->link; 168a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = NULL; 1691da177e4SLinus Torvalds } else { 1701da177e4SLinus Torvalds struct uhci_td *ntd; 1711da177e4SLinus Torvalds 1721da177e4SLinus Torvalds ntd = list_entry(td->fl_list.next, struct uhci_td, fl_list); 173a1d59ce8SAlan Stern uhci->frame[td->frame] = cpu_to_le32(ntd->dma_handle); 174a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = ntd; 1751da177e4SLinus Torvalds } 1761da177e4SLinus Torvalds } else { 1771da177e4SLinus Torvalds struct uhci_td *ptd; 1781da177e4SLinus Torvalds 1791da177e4SLinus Torvalds ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list); 1801da177e4SLinus Torvalds ptd->link = td->link; 1811da177e4SLinus Torvalds } 1821da177e4SLinus Torvalds 1831da177e4SLinus Torvalds list_del_init(&td->fl_list); 1841da177e4SLinus Torvalds td->frame = -1; 1851da177e4SLinus Torvalds } 1861da177e4SLinus Torvalds 187dccf4a48SAlan Stern /* 188dccf4a48SAlan Stern * Remove all the TDs for an Isochronous URB from the frame list 189dccf4a48SAlan Stern */ 190dccf4a48SAlan Stern static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) 191b81d3436SAlan Stern { 192b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 193b81d3436SAlan Stern struct uhci_td *td; 194b81d3436SAlan Stern 195b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) 196dccf4a48SAlan Stern uhci_remove_td_from_frame_list(uhci, td); 197b81d3436SAlan Stern } 198b81d3436SAlan Stern 199dccf4a48SAlan Stern static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, 200dccf4a48SAlan Stern struct usb_device *udev, struct usb_host_endpoint *hep) 2011da177e4SLinus Torvalds { 2021da177e4SLinus Torvalds dma_addr_t dma_handle; 2031da177e4SLinus Torvalds struct uhci_qh *qh; 2041da177e4SLinus Torvalds 2051da177e4SLinus Torvalds qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle); 2061da177e4SLinus Torvalds if (!qh) 2071da177e4SLinus Torvalds return NULL; 2081da177e4SLinus Torvalds 20959e29ed9SAlan Stern memset(qh, 0, sizeof(*qh)); 2101da177e4SLinus Torvalds qh->dma_handle = dma_handle; 2111da177e4SLinus Torvalds 2121da177e4SLinus Torvalds qh->element = UHCI_PTR_TERM; 2131da177e4SLinus Torvalds qh->link = UHCI_PTR_TERM; 2141da177e4SLinus Torvalds 215dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->queue); 216dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->node); 2171da177e4SLinus Torvalds 218dccf4a48SAlan Stern if (udev) { /* Normal QH */ 219af0bb599SAlan Stern qh->dummy_td = uhci_alloc_td(uhci); 220af0bb599SAlan Stern if (!qh->dummy_td) { 221af0bb599SAlan Stern dma_pool_free(uhci->qh_pool, qh, dma_handle); 222af0bb599SAlan Stern return NULL; 223af0bb599SAlan Stern } 224dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 225dccf4a48SAlan Stern qh->hep = hep; 226dccf4a48SAlan Stern qh->udev = udev; 227dccf4a48SAlan Stern hep->hcpriv = qh; 2284de7d2c2SAlan Stern qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; 2291da177e4SLinus Torvalds 230dccf4a48SAlan Stern } else { /* Skeleton QH */ 231dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 2324de7d2c2SAlan Stern qh->type = -1; 233dccf4a48SAlan Stern } 2341da177e4SLinus Torvalds return qh; 2351da177e4SLinus Torvalds } 2361da177e4SLinus Torvalds 2371da177e4SLinus Torvalds static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 2381da177e4SLinus Torvalds { 239dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_IDLE && qh->udev); 240dccf4a48SAlan Stern if (!list_empty(&qh->queue)) 2411da177e4SLinus Torvalds dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh); 2421da177e4SLinus Torvalds 243dccf4a48SAlan Stern list_del(&qh->node); 244dccf4a48SAlan Stern if (qh->udev) { 245dccf4a48SAlan Stern qh->hep->hcpriv = NULL; 246af0bb599SAlan Stern uhci_free_td(uhci, qh->dummy_td); 247dccf4a48SAlan Stern } 2481da177e4SLinus Torvalds dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); 2491da177e4SLinus Torvalds } 2501da177e4SLinus Torvalds 2511da177e4SLinus Torvalds /* 252a0b458b6SAlan Stern * When a queue is stopped and a dequeued URB is given back, adjust 253a0b458b6SAlan Stern * the previous TD link (if the URB isn't first on the queue) or 254a0b458b6SAlan Stern * save its toggle value (if it is first and is currently executing). 255*10b8e47dSAlan Stern * 256*10b8e47dSAlan Stern * Returns 0 if the URB should not yet be given back, 1 otherwise. 2570ed8fee1SAlan Stern */ 258*10b8e47dSAlan Stern static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, 259a0b458b6SAlan Stern struct urb *urb) 2600ed8fee1SAlan Stern { 261a0b458b6SAlan Stern struct urb_priv *urbp = urb->hcpriv; 2620ed8fee1SAlan Stern struct uhci_td *td; 263*10b8e47dSAlan Stern int ret = 1; 2640ed8fee1SAlan Stern 265a0b458b6SAlan Stern /* Isochronous pipes don't use toggles and their TD link pointers 266*10b8e47dSAlan Stern * get adjusted during uhci_urb_dequeue(). But since their queues 267*10b8e47dSAlan Stern * cannot truly be stopped, we have to watch out for dequeues 268*10b8e47dSAlan Stern * occurring after the nominal unlink frame. */ 269*10b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 270*10b8e47dSAlan Stern ret = (uhci->frame_number + uhci->is_stopped != 271*10b8e47dSAlan Stern qh->unlink_frame); 272*10b8e47dSAlan Stern return ret; 273*10b8e47dSAlan Stern } 274a0b458b6SAlan Stern 275a0b458b6SAlan Stern /* If the URB isn't first on its queue, adjust the link pointer 276a0b458b6SAlan Stern * of the last TD in the previous URB. The toggle doesn't need 277a0b458b6SAlan Stern * to be saved since this URB can't be executing yet. */ 278a0b458b6SAlan Stern if (qh->queue.next != &urbp->node) { 279a0b458b6SAlan Stern struct urb_priv *purbp; 280a0b458b6SAlan Stern struct uhci_td *ptd; 281a0b458b6SAlan Stern 282a0b458b6SAlan Stern purbp = list_entry(urbp->node.prev, struct urb_priv, node); 283a0b458b6SAlan Stern WARN_ON(list_empty(&purbp->td_list)); 284a0b458b6SAlan Stern ptd = list_entry(purbp->td_list.prev, struct uhci_td, 285a0b458b6SAlan Stern list); 286a0b458b6SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, 287a0b458b6SAlan Stern list); 288a0b458b6SAlan Stern ptd->link = td->link; 289*10b8e47dSAlan Stern return ret; 290a0b458b6SAlan Stern } 291a0b458b6SAlan Stern 2920ed8fee1SAlan Stern /* If the QH element pointer is UHCI_PTR_TERM then then currently 2930ed8fee1SAlan Stern * executing URB has already been unlinked, so this one isn't it. */ 294a0b458b6SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM) 295*10b8e47dSAlan Stern return ret; 2960ed8fee1SAlan Stern qh->element = UHCI_PTR_TERM; 2970ed8fee1SAlan Stern 298a0b458b6SAlan Stern /* Control pipes have to worry about toggles */ 299a0b458b6SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) 300*10b8e47dSAlan Stern return ret; 3010ed8fee1SAlan Stern 302a0b458b6SAlan Stern /* Save the next toggle value */ 30359e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 30459e29ed9SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 3050ed8fee1SAlan Stern qh->needs_fixup = 1; 3060ed8fee1SAlan Stern qh->initial_toggle = uhci_toggle(td_token(td)); 307*10b8e47dSAlan Stern return ret; 3080ed8fee1SAlan Stern } 3090ed8fee1SAlan Stern 3100ed8fee1SAlan Stern /* 3110ed8fee1SAlan Stern * Fix up the data toggles for URBs in a queue, when one of them 3120ed8fee1SAlan Stern * terminates early (short transfer, error, or dequeued). 3130ed8fee1SAlan Stern */ 3140ed8fee1SAlan Stern static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) 3150ed8fee1SAlan Stern { 3160ed8fee1SAlan Stern struct urb_priv *urbp = NULL; 3170ed8fee1SAlan Stern struct uhci_td *td; 3180ed8fee1SAlan Stern unsigned int toggle = qh->initial_toggle; 3190ed8fee1SAlan Stern unsigned int pipe; 3200ed8fee1SAlan Stern 3210ed8fee1SAlan Stern /* Fixups for a short transfer start with the second URB in the 3220ed8fee1SAlan Stern * queue (the short URB is the first). */ 3230ed8fee1SAlan Stern if (skip_first) 3240ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 3250ed8fee1SAlan Stern 3260ed8fee1SAlan Stern /* When starting with the first URB, if the QH element pointer is 3270ed8fee1SAlan Stern * still valid then we know the URB's toggles are okay. */ 3280ed8fee1SAlan Stern else if (qh_element(qh) != UHCI_PTR_TERM) 3290ed8fee1SAlan Stern toggle = 2; 3300ed8fee1SAlan Stern 3310ed8fee1SAlan Stern /* Fix up the toggle for the URBs in the queue. Normally this 3320ed8fee1SAlan Stern * loop won't run more than once: When an error or short transfer 3330ed8fee1SAlan Stern * occurs, the queue usually gets emptied. */ 3341393adb2SAlan Stern urbp = list_prepare_entry(urbp, &qh->queue, node); 3350ed8fee1SAlan Stern list_for_each_entry_continue(urbp, &qh->queue, node) { 3360ed8fee1SAlan Stern 3370ed8fee1SAlan Stern /* If the first TD has the right toggle value, we don't 3380ed8fee1SAlan Stern * need to change any toggles in this URB */ 3390ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 3400ed8fee1SAlan Stern if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { 3410ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, 3420ed8fee1SAlan Stern list); 3430ed8fee1SAlan Stern toggle = uhci_toggle(td_token(td)) ^ 1; 3440ed8fee1SAlan Stern 3450ed8fee1SAlan Stern /* Otherwise all the toggles in the URB have to be switched */ 3460ed8fee1SAlan Stern } else { 3470ed8fee1SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 3480ed8fee1SAlan Stern td->token ^= __constant_cpu_to_le32( 3490ed8fee1SAlan Stern TD_TOKEN_TOGGLE); 3500ed8fee1SAlan Stern toggle ^= 1; 3510ed8fee1SAlan Stern } 3520ed8fee1SAlan Stern } 3530ed8fee1SAlan Stern } 3540ed8fee1SAlan Stern 3550ed8fee1SAlan Stern wmb(); 3560ed8fee1SAlan Stern pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe; 3570ed8fee1SAlan Stern usb_settoggle(qh->udev, usb_pipeendpoint(pipe), 3580ed8fee1SAlan Stern usb_pipeout(pipe), toggle); 3590ed8fee1SAlan Stern qh->needs_fixup = 0; 3600ed8fee1SAlan Stern } 3610ed8fee1SAlan Stern 3620ed8fee1SAlan Stern /* 363dccf4a48SAlan Stern * Put a QH on the schedule in both hardware and software 3641da177e4SLinus Torvalds */ 365dccf4a48SAlan Stern static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 3661da177e4SLinus Torvalds { 3671da177e4SLinus Torvalds struct uhci_qh *pqh; 3681da177e4SLinus Torvalds 369dccf4a48SAlan Stern WARN_ON(list_empty(&qh->queue)); 370dccf4a48SAlan Stern 371dccf4a48SAlan Stern /* Set the element pointer if it isn't set already. 372dccf4a48SAlan Stern * This isn't needed for Isochronous queues, but it doesn't hurt. */ 373dccf4a48SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM) { 374dccf4a48SAlan Stern struct urb_priv *urbp = list_entry(qh->queue.next, 375dccf4a48SAlan Stern struct urb_priv, node); 376dccf4a48SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 377dccf4a48SAlan Stern struct uhci_td, list); 378dccf4a48SAlan Stern 379dccf4a48SAlan Stern qh->element = cpu_to_le32(td->dma_handle); 380dccf4a48SAlan Stern } 381dccf4a48SAlan Stern 38284afddd7SAlan Stern /* Treat the queue as if it has just advanced */ 38384afddd7SAlan Stern qh->wait_expired = 0; 38484afddd7SAlan Stern qh->advance_jiffies = jiffies; 38584afddd7SAlan Stern 386dccf4a48SAlan Stern if (qh->state == QH_STATE_ACTIVE) 3871da177e4SLinus Torvalds return; 388dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 389dccf4a48SAlan Stern 390dccf4a48SAlan Stern /* Move the QH from its old list to the end of the appropriate 391dccf4a48SAlan Stern * skeleton's list */ 3920ed8fee1SAlan Stern if (qh == uhci->next_qh) 3930ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 3940ed8fee1SAlan Stern node); 395dccf4a48SAlan Stern list_move_tail(&qh->node, &qh->skel->node); 396dccf4a48SAlan Stern 397dccf4a48SAlan Stern /* Link it into the schedule */ 398dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 399dccf4a48SAlan Stern qh->link = pqh->link; 400dccf4a48SAlan Stern wmb(); 401dccf4a48SAlan Stern pqh->link = UHCI_PTR_QH | cpu_to_le32(qh->dma_handle); 402dccf4a48SAlan Stern } 4031da177e4SLinus Torvalds 4041da177e4SLinus Torvalds /* 405dccf4a48SAlan Stern * Take a QH off the hardware schedule 4061da177e4SLinus Torvalds */ 407dccf4a48SAlan Stern static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 408dccf4a48SAlan Stern { 409dccf4a48SAlan Stern struct uhci_qh *pqh; 4101da177e4SLinus Torvalds 411dccf4a48SAlan Stern if (qh->state == QH_STATE_UNLINKING) 412dccf4a48SAlan Stern return; 413dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev); 414dccf4a48SAlan Stern qh->state = QH_STATE_UNLINKING; 4151da177e4SLinus Torvalds 416dccf4a48SAlan Stern /* Unlink the QH from the schedule and record when we did it */ 417dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 418dccf4a48SAlan Stern pqh->link = qh->link; 419dccf4a48SAlan Stern mb(); 4201da177e4SLinus Torvalds 4211da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 422dccf4a48SAlan Stern qh->unlink_frame = uhci->frame_number; 4231da177e4SLinus Torvalds 424dccf4a48SAlan Stern /* Force an interrupt so we know when the QH is fully unlinked */ 425dccf4a48SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 4261da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 4271da177e4SLinus Torvalds 428dccf4a48SAlan Stern /* Move the QH from its old list to the end of the unlinking list */ 4290ed8fee1SAlan Stern if (qh == uhci->next_qh) 4300ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 4310ed8fee1SAlan Stern node); 432dccf4a48SAlan Stern list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); 4331da177e4SLinus Torvalds } 4341da177e4SLinus Torvalds 4351da177e4SLinus Torvalds /* 436dccf4a48SAlan Stern * When we and the controller are through with a QH, it becomes IDLE. 437dccf4a48SAlan Stern * This happens when a QH has been off the schedule (on the unlinking 438dccf4a48SAlan Stern * list) for more than one frame, or when an error occurs while adding 439dccf4a48SAlan Stern * the first URB onto a new QH. 4401da177e4SLinus Torvalds */ 441dccf4a48SAlan Stern static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) 442dccf4a48SAlan Stern { 443dccf4a48SAlan Stern WARN_ON(qh->state == QH_STATE_ACTIVE); 444dccf4a48SAlan Stern 4450ed8fee1SAlan Stern if (qh == uhci->next_qh) 4460ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 4470ed8fee1SAlan Stern node); 448dccf4a48SAlan Stern list_move(&qh->node, &uhci->idle_qh_list); 449dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 450dccf4a48SAlan Stern 45159e29ed9SAlan Stern /* Now that the QH is idle, its post_td isn't being used */ 45259e29ed9SAlan Stern if (qh->post_td) { 45359e29ed9SAlan Stern uhci_free_td(uhci, qh->post_td); 45459e29ed9SAlan Stern qh->post_td = NULL; 45559e29ed9SAlan Stern } 45659e29ed9SAlan Stern 457dccf4a48SAlan Stern /* If anyone is waiting for a QH to become idle, wake them up */ 458dccf4a48SAlan Stern if (uhci->num_waiting) 459dccf4a48SAlan Stern wake_up_all(&uhci->waitqh); 4601da177e4SLinus Torvalds } 4611da177e4SLinus Torvalds 462dccf4a48SAlan Stern static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, 463dccf4a48SAlan Stern struct urb *urb) 4641da177e4SLinus Torvalds { 4651da177e4SLinus Torvalds struct urb_priv *urbp; 4661da177e4SLinus Torvalds 4671da177e4SLinus Torvalds urbp = kmem_cache_alloc(uhci_up_cachep, SLAB_ATOMIC); 4681da177e4SLinus Torvalds if (!urbp) 4691da177e4SLinus Torvalds return NULL; 4701da177e4SLinus Torvalds 4711da177e4SLinus Torvalds memset((void *)urbp, 0, sizeof(*urbp)); 4721da177e4SLinus Torvalds 4731da177e4SLinus Torvalds urbp->urb = urb; 4741da177e4SLinus Torvalds urb->hcpriv = urbp; 475dccf4a48SAlan Stern 476dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->node); 477dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->td_list); 4781da177e4SLinus Torvalds 4791da177e4SLinus Torvalds return urbp; 4801da177e4SLinus Torvalds } 4811da177e4SLinus Torvalds 482dccf4a48SAlan Stern static void uhci_free_urb_priv(struct uhci_hcd *uhci, 483dccf4a48SAlan Stern struct urb_priv *urbp) 4841da177e4SLinus Torvalds { 4851da177e4SLinus Torvalds struct uhci_td *td, *tmp; 4861da177e4SLinus Torvalds 487dccf4a48SAlan Stern if (!list_empty(&urbp->node)) 488dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n", 489dccf4a48SAlan Stern urbp->urb); 4901da177e4SLinus Torvalds 4911da177e4SLinus Torvalds list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 49204538a25SAlan Stern uhci_remove_td_from_urbp(td); 49304538a25SAlan Stern uhci_free_td(uhci, td); 4941da177e4SLinus Torvalds } 4951da177e4SLinus Torvalds 496dccf4a48SAlan Stern urbp->urb->hcpriv = NULL; 4971da177e4SLinus Torvalds kmem_cache_free(uhci_up_cachep, urbp); 4981da177e4SLinus Torvalds } 4991da177e4SLinus Torvalds 5001da177e4SLinus Torvalds /* 5011da177e4SLinus Torvalds * Map status to standard result codes 5021da177e4SLinus Torvalds * 5031da177e4SLinus Torvalds * <status> is (td_status(td) & 0xF60000), a.k.a. 5041da177e4SLinus Torvalds * uhci_status_bits(td_status(td)). 5051da177e4SLinus Torvalds * Note: <status> does not include the TD_CTRL_NAK bit. 5061da177e4SLinus Torvalds * <dir_out> is True for output TDs and False for input TDs. 5071da177e4SLinus Torvalds */ 5081da177e4SLinus Torvalds static int uhci_map_status(int status, int dir_out) 5091da177e4SLinus Torvalds { 5101da177e4SLinus Torvalds if (!status) 5111da177e4SLinus Torvalds return 0; 5121da177e4SLinus Torvalds if (status & TD_CTRL_BITSTUFF) /* Bitstuff error */ 5131da177e4SLinus Torvalds return -EPROTO; 5141da177e4SLinus Torvalds if (status & TD_CTRL_CRCTIMEO) { /* CRC/Timeout */ 5151da177e4SLinus Torvalds if (dir_out) 5161da177e4SLinus Torvalds return -EPROTO; 5171da177e4SLinus Torvalds else 5181da177e4SLinus Torvalds return -EILSEQ; 5191da177e4SLinus Torvalds } 5201da177e4SLinus Torvalds if (status & TD_CTRL_BABBLE) /* Babble */ 5211da177e4SLinus Torvalds return -EOVERFLOW; 5221da177e4SLinus Torvalds if (status & TD_CTRL_DBUFERR) /* Buffer error */ 5231da177e4SLinus Torvalds return -ENOSR; 5241da177e4SLinus Torvalds if (status & TD_CTRL_STALLED) /* Stalled */ 5251da177e4SLinus Torvalds return -EPIPE; 5261da177e4SLinus Torvalds WARN_ON(status & TD_CTRL_ACTIVE); /* Active */ 5271da177e4SLinus Torvalds return 0; 5281da177e4SLinus Torvalds } 5291da177e4SLinus Torvalds 5301da177e4SLinus Torvalds /* 5311da177e4SLinus Torvalds * Control transfers 5321da177e4SLinus Torvalds */ 533dccf4a48SAlan Stern static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, 534dccf4a48SAlan Stern struct uhci_qh *qh) 5351da177e4SLinus Torvalds { 5361da177e4SLinus Torvalds struct uhci_td *td; 5371da177e4SLinus Torvalds unsigned long destination, status; 538dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 5391da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 5401da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 541dccf4a48SAlan Stern __le32 *plink; 54204538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 5431da177e4SLinus Torvalds 5441da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 5451da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP; 5461da177e4SLinus Torvalds 547af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 548af0bb599SAlan Stern status = uhci_maxerr(3); 5491da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 5501da177e4SLinus Torvalds status |= TD_CTRL_LS; 5511da177e4SLinus Torvalds 5521da177e4SLinus Torvalds /* 5531da177e4SLinus Torvalds * Build the TD for the control request setup packet 5541da177e4SLinus Torvalds */ 555af0bb599SAlan Stern td = qh->dummy_td; 55604538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 557fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(8), 5581da177e4SLinus Torvalds urb->setup_dma); 559dccf4a48SAlan Stern plink = &td->link; 560af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 5611da177e4SLinus Torvalds 5621da177e4SLinus Torvalds /* 5631da177e4SLinus Torvalds * If direction is "send", change the packet ID from SETUP (0x2D) 5641da177e4SLinus Torvalds * to OUT (0xE1). Else change it from SETUP to IN (0x69) and 5651da177e4SLinus Torvalds * set Short Packet Detect (SPD) for all data packets. 5661da177e4SLinus Torvalds */ 5671da177e4SLinus Torvalds if (usb_pipeout(urb->pipe)) 5681da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_OUT); 5691da177e4SLinus Torvalds else { 5701da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_IN); 5711da177e4SLinus Torvalds status |= TD_CTRL_SPD; 5721da177e4SLinus Torvalds } 5731da177e4SLinus Torvalds 5741da177e4SLinus Torvalds /* 575687f5f34SAlan Stern * Build the DATA TDs 5761da177e4SLinus Torvalds */ 5771da177e4SLinus Torvalds while (len > 0) { 578dccf4a48SAlan Stern int pktsze = min(len, maxsze); 5791da177e4SLinus Torvalds 5802532178aSAlan Stern td = uhci_alloc_td(uhci); 5811da177e4SLinus Torvalds if (!td) 582af0bb599SAlan Stern goto nomem; 583dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 5841da177e4SLinus Torvalds 5851da177e4SLinus Torvalds /* Alternate Data0/1 (start with Data1) */ 5861da177e4SLinus Torvalds destination ^= TD_TOKEN_TOGGLE; 5871da177e4SLinus Torvalds 58804538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 589fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(pktsze), 5901da177e4SLinus Torvalds data); 591dccf4a48SAlan Stern plink = &td->link; 5921da177e4SLinus Torvalds 5931da177e4SLinus Torvalds data += pktsze; 5941da177e4SLinus Torvalds len -= pktsze; 5951da177e4SLinus Torvalds } 5961da177e4SLinus Torvalds 5971da177e4SLinus Torvalds /* 5981da177e4SLinus Torvalds * Build the final TD for control status 5991da177e4SLinus Torvalds */ 6002532178aSAlan Stern td = uhci_alloc_td(uhci); 6011da177e4SLinus Torvalds if (!td) 602af0bb599SAlan Stern goto nomem; 603dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 6041da177e4SLinus Torvalds 6051da177e4SLinus Torvalds /* 6061da177e4SLinus Torvalds * It's IN if the pipe is an output pipe or we're not expecting 6071da177e4SLinus Torvalds * data back. 6081da177e4SLinus Torvalds */ 6091da177e4SLinus Torvalds destination &= ~TD_TOKEN_PID_MASK; 6101da177e4SLinus Torvalds if (usb_pipeout(urb->pipe) || !urb->transfer_buffer_length) 6111da177e4SLinus Torvalds destination |= USB_PID_IN; 6121da177e4SLinus Torvalds else 6131da177e4SLinus Torvalds destination |= USB_PID_OUT; 6141da177e4SLinus Torvalds 6151da177e4SLinus Torvalds destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ 6161da177e4SLinus Torvalds 6171da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 6181da177e4SLinus Torvalds 61904538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 6201da177e4SLinus Torvalds uhci_fill_td(td, status | TD_CTRL_IOC, 621fa346568SAlan Stern destination | uhci_explen(0), 0); 622af0bb599SAlan Stern plink = &td->link; 623af0bb599SAlan Stern 624af0bb599SAlan Stern /* 625af0bb599SAlan Stern * Build the new dummy TD and activate the old one 626af0bb599SAlan Stern */ 627af0bb599SAlan Stern td = uhci_alloc_td(uhci); 628af0bb599SAlan Stern if (!td) 629af0bb599SAlan Stern goto nomem; 630af0bb599SAlan Stern *plink = cpu_to_le32(td->dma_handle); 631af0bb599SAlan Stern 632af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 633af0bb599SAlan Stern wmb(); 634af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 635af0bb599SAlan Stern qh->dummy_td = td; 6361da177e4SLinus Torvalds 6371da177e4SLinus Torvalds /* Low-speed transfers get a different queue, and won't hog the bus. 6381da177e4SLinus Torvalds * Also, some devices enumerate better without FSBR; the easiest way 6391da177e4SLinus Torvalds * to do that is to put URBs on the low-speed queue while the device 640630aa3cfSAlan Stern * isn't in the CONFIGURED state. */ 6411da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW || 642630aa3cfSAlan Stern urb->dev->state != USB_STATE_CONFIGURED) 643dccf4a48SAlan Stern qh->skel = uhci->skel_ls_control_qh; 6441da177e4SLinus Torvalds else { 645dccf4a48SAlan Stern qh->skel = uhci->skel_fs_control_qh; 64684afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 6471da177e4SLinus Torvalds } 64859e29ed9SAlan Stern 64959e29ed9SAlan Stern urb->actual_length = -8; /* Account for the SETUP packet */ 650dccf4a48SAlan Stern return 0; 651af0bb599SAlan Stern 652af0bb599SAlan Stern nomem: 653af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 65404538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 655af0bb599SAlan Stern return -ENOMEM; 6561da177e4SLinus Torvalds } 6571da177e4SLinus Torvalds 6581da177e4SLinus Torvalds /* 6591da177e4SLinus Torvalds * Common submit for bulk and interrupt 6601da177e4SLinus Torvalds */ 661dccf4a48SAlan Stern static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, 662dccf4a48SAlan Stern struct uhci_qh *qh) 6631da177e4SLinus Torvalds { 6641da177e4SLinus Torvalds struct uhci_td *td; 6651da177e4SLinus Torvalds unsigned long destination, status; 666dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 6671da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 6681da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 669af0bb599SAlan Stern __le32 *plink; 67004538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 671af0bb599SAlan Stern unsigned int toggle; 6721da177e4SLinus Torvalds 6731da177e4SLinus Torvalds if (len < 0) 6741da177e4SLinus Torvalds return -EINVAL; 6751da177e4SLinus Torvalds 6761da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 6771da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 678af0bb599SAlan Stern toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), 679af0bb599SAlan Stern usb_pipeout(urb->pipe)); 6801da177e4SLinus Torvalds 681af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 682af0bb599SAlan Stern status = uhci_maxerr(3); 6831da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 6841da177e4SLinus Torvalds status |= TD_CTRL_LS; 6851da177e4SLinus Torvalds if (usb_pipein(urb->pipe)) 6861da177e4SLinus Torvalds status |= TD_CTRL_SPD; 6871da177e4SLinus Torvalds 6881da177e4SLinus Torvalds /* 689687f5f34SAlan Stern * Build the DATA TDs 6901da177e4SLinus Torvalds */ 691af0bb599SAlan Stern plink = NULL; 692af0bb599SAlan Stern td = qh->dummy_td; 6931da177e4SLinus Torvalds do { /* Allow zero length packets */ 6941da177e4SLinus Torvalds int pktsze = maxsze; 6951da177e4SLinus Torvalds 696dccf4a48SAlan Stern if (len <= pktsze) { /* The last packet */ 6971da177e4SLinus Torvalds pktsze = len; 6981da177e4SLinus Torvalds if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) 6991da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 7001da177e4SLinus Torvalds } 7011da177e4SLinus Torvalds 702af0bb599SAlan Stern if (plink) { 7032532178aSAlan Stern td = uhci_alloc_td(uhci); 7041da177e4SLinus Torvalds if (!td) 705af0bb599SAlan Stern goto nomem; 706dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 707af0bb599SAlan Stern } 70804538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 709dccf4a48SAlan Stern uhci_fill_td(td, status, 710dccf4a48SAlan Stern destination | uhci_explen(pktsze) | 711af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 7121da177e4SLinus Torvalds data); 713dccf4a48SAlan Stern plink = &td->link; 714af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 7151da177e4SLinus Torvalds 7161da177e4SLinus Torvalds data += pktsze; 7171da177e4SLinus Torvalds len -= maxsze; 718af0bb599SAlan Stern toggle ^= 1; 7191da177e4SLinus Torvalds } while (len > 0); 7201da177e4SLinus Torvalds 7211da177e4SLinus Torvalds /* 7221da177e4SLinus Torvalds * URB_ZERO_PACKET means adding a 0-length packet, if direction 7231da177e4SLinus Torvalds * is OUT and the transfer_length was an exact multiple of maxsze, 7241da177e4SLinus Torvalds * hence (len = transfer_length - N * maxsze) == 0 7251da177e4SLinus Torvalds * however, if transfer_length == 0, the zero packet was already 7261da177e4SLinus Torvalds * prepared above. 7271da177e4SLinus Torvalds */ 728dccf4a48SAlan Stern if ((urb->transfer_flags & URB_ZERO_PACKET) && 729dccf4a48SAlan Stern usb_pipeout(urb->pipe) && len == 0 && 730dccf4a48SAlan Stern urb->transfer_buffer_length > 0) { 7312532178aSAlan Stern td = uhci_alloc_td(uhci); 7321da177e4SLinus Torvalds if (!td) 733af0bb599SAlan Stern goto nomem; 734dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 7351da177e4SLinus Torvalds 73604538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 737af0bb599SAlan Stern uhci_fill_td(td, status, 738af0bb599SAlan Stern destination | uhci_explen(0) | 739af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 7401da177e4SLinus Torvalds data); 741af0bb599SAlan Stern plink = &td->link; 7421da177e4SLinus Torvalds 743af0bb599SAlan Stern toggle ^= 1; 7441da177e4SLinus Torvalds } 7451da177e4SLinus Torvalds 7461da177e4SLinus Torvalds /* Set the interrupt-on-completion flag on the last packet. 7471da177e4SLinus Torvalds * A more-or-less typical 4 KB URB (= size of one memory page) 7481da177e4SLinus Torvalds * will require about 3 ms to transfer; that's a little on the 7491da177e4SLinus Torvalds * fast side but not enough to justify delaying an interrupt 7501da177e4SLinus Torvalds * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT 7511da177e4SLinus Torvalds * flag setting. */ 752dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 7531da177e4SLinus Torvalds 754af0bb599SAlan Stern /* 755af0bb599SAlan Stern * Build the new dummy TD and activate the old one 756af0bb599SAlan Stern */ 757af0bb599SAlan Stern td = uhci_alloc_td(uhci); 758af0bb599SAlan Stern if (!td) 759af0bb599SAlan Stern goto nomem; 760af0bb599SAlan Stern *plink = cpu_to_le32(td->dma_handle); 761af0bb599SAlan Stern 762af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 763af0bb599SAlan Stern wmb(); 764af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 765af0bb599SAlan Stern qh->dummy_td = td; 766af0bb599SAlan Stern 767af0bb599SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 768af0bb599SAlan Stern usb_pipeout(urb->pipe), toggle); 769dccf4a48SAlan Stern return 0; 770af0bb599SAlan Stern 771af0bb599SAlan Stern nomem: 772af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 77304538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 774af0bb599SAlan Stern return -ENOMEM; 7751da177e4SLinus Torvalds } 7761da177e4SLinus Torvalds 777dccf4a48SAlan Stern static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, 778dccf4a48SAlan Stern struct uhci_qh *qh) 7791da177e4SLinus Torvalds { 7801da177e4SLinus Torvalds int ret; 7811da177e4SLinus Torvalds 7821da177e4SLinus Torvalds /* Can't have low-speed bulk transfers */ 7831da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 7841da177e4SLinus Torvalds return -EINVAL; 7851da177e4SLinus Torvalds 786dccf4a48SAlan Stern qh->skel = uhci->skel_bulk_qh; 787dccf4a48SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 788dccf4a48SAlan Stern if (ret == 0) 78984afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 7901da177e4SLinus Torvalds return ret; 7911da177e4SLinus Torvalds } 7921da177e4SLinus Torvalds 793dccf4a48SAlan Stern static inline int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, 794dccf4a48SAlan Stern struct uhci_qh *qh) 7951da177e4SLinus Torvalds { 796dccf4a48SAlan Stern /* USB 1.1 interrupt transfers only involve one packet per interval. 797dccf4a48SAlan Stern * Drivers can submit URBs of any length, but longer ones will need 798dccf4a48SAlan Stern * multiple intervals to complete. 7991da177e4SLinus Torvalds */ 800dccf4a48SAlan Stern qh->skel = uhci->skelqh[__interval_to_skel(urb->interval)]; 801dccf4a48SAlan Stern return uhci_submit_common(uhci, urb, qh); 8021da177e4SLinus Torvalds } 8031da177e4SLinus Torvalds 8041da177e4SLinus Torvalds /* 805b1869000SAlan Stern * Fix up the data structures following a short transfer 806b1869000SAlan Stern */ 807b1869000SAlan Stern static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, 80859e29ed9SAlan Stern struct uhci_qh *qh, struct urb_priv *urbp) 809b1869000SAlan Stern { 810b1869000SAlan Stern struct uhci_td *td; 81159e29ed9SAlan Stern struct list_head *tmp; 81259e29ed9SAlan Stern int ret; 813b1869000SAlan Stern 814b1869000SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, list); 815b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) { 816b1869000SAlan Stern 817b1869000SAlan Stern /* When a control transfer is short, we have to restart 818b1869000SAlan Stern * the queue at the status stage transaction, which is 819b1869000SAlan Stern * the last TD. */ 82059e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 821b1869000SAlan Stern qh->element = cpu_to_le32(td->dma_handle); 82259e29ed9SAlan Stern tmp = td->list.prev; 823b1869000SAlan Stern ret = -EINPROGRESS; 824b1869000SAlan Stern 82559e29ed9SAlan Stern } else { 826b1869000SAlan Stern 827b1869000SAlan Stern /* When a bulk/interrupt transfer is short, we have to 828b1869000SAlan Stern * fix up the toggles of the following URBs on the queue 829b1869000SAlan Stern * before restarting the queue at the next URB. */ 83059e29ed9SAlan Stern qh->initial_toggle = uhci_toggle(td_token(qh->post_td)) ^ 1; 831b1869000SAlan Stern uhci_fixup_toggles(qh, 1); 832b1869000SAlan Stern 83359e29ed9SAlan Stern if (list_empty(&urbp->td_list)) 83459e29ed9SAlan Stern td = qh->post_td; 835b1869000SAlan Stern qh->element = td->link; 83659e29ed9SAlan Stern tmp = urbp->td_list.prev; 83759e29ed9SAlan Stern ret = 0; 838b1869000SAlan Stern } 839b1869000SAlan Stern 84059e29ed9SAlan Stern /* Remove all the TDs we skipped over, from tmp back to the start */ 84159e29ed9SAlan Stern while (tmp != &urbp->td_list) { 84259e29ed9SAlan Stern td = list_entry(tmp, struct uhci_td, list); 84359e29ed9SAlan Stern tmp = tmp->prev; 84459e29ed9SAlan Stern 84504538a25SAlan Stern uhci_remove_td_from_urbp(td); 84604538a25SAlan Stern uhci_free_td(uhci, td); 84759e29ed9SAlan Stern } 848b1869000SAlan Stern return ret; 849b1869000SAlan Stern } 850b1869000SAlan Stern 851b1869000SAlan Stern /* 852b1869000SAlan Stern * Common result for control, bulk, and interrupt 853b1869000SAlan Stern */ 854b1869000SAlan Stern static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) 855b1869000SAlan Stern { 856b1869000SAlan Stern struct urb_priv *urbp = urb->hcpriv; 857b1869000SAlan Stern struct uhci_qh *qh = urbp->qh; 85859e29ed9SAlan Stern struct uhci_td *td, *tmp; 859b1869000SAlan Stern unsigned status; 860b1869000SAlan Stern int ret = 0; 861b1869000SAlan Stern 86259e29ed9SAlan Stern list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 863b1869000SAlan Stern unsigned int ctrlstat; 864b1869000SAlan Stern int len; 865b1869000SAlan Stern 866b1869000SAlan Stern ctrlstat = td_status(td); 867b1869000SAlan Stern status = uhci_status_bits(ctrlstat); 868b1869000SAlan Stern if (status & TD_CTRL_ACTIVE) 869b1869000SAlan Stern return -EINPROGRESS; 870b1869000SAlan Stern 871b1869000SAlan Stern len = uhci_actual_length(ctrlstat); 872b1869000SAlan Stern urb->actual_length += len; 873b1869000SAlan Stern 874b1869000SAlan Stern if (status) { 875b1869000SAlan Stern ret = uhci_map_status(status, 876b1869000SAlan Stern uhci_packetout(td_token(td))); 877b1869000SAlan Stern if ((debug == 1 && ret != -EPIPE) || debug > 1) { 878b1869000SAlan Stern /* Some debugging code */ 879b1869000SAlan Stern dev_dbg(uhci_dev(uhci), 880b1869000SAlan Stern "%s: failed with status %x\n", 881b1869000SAlan Stern __FUNCTION__, status); 882b1869000SAlan Stern 883b1869000SAlan Stern if (debug > 1 && errbuf) { 884b1869000SAlan Stern /* Print the chain for debugging */ 885b1869000SAlan Stern uhci_show_qh(urbp->qh, errbuf, 886b1869000SAlan Stern ERRBUF_LEN, 0); 887b1869000SAlan Stern lprintk(errbuf); 888b1869000SAlan Stern } 889b1869000SAlan Stern } 890b1869000SAlan Stern 891b1869000SAlan Stern } else if (len < uhci_expected_length(td_token(td))) { 892b1869000SAlan Stern 893b1869000SAlan Stern /* We received a short packet */ 894b1869000SAlan Stern if (urb->transfer_flags & URB_SHORT_NOT_OK) 895b1869000SAlan Stern ret = -EREMOTEIO; 896b1869000SAlan Stern else if (ctrlstat & TD_CTRL_SPD) 897b1869000SAlan Stern ret = 1; 898b1869000SAlan Stern } 899b1869000SAlan Stern 90004538a25SAlan Stern uhci_remove_td_from_urbp(td); 90159e29ed9SAlan Stern if (qh->post_td) 90204538a25SAlan Stern uhci_free_td(uhci, qh->post_td); 90359e29ed9SAlan Stern qh->post_td = td; 90459e29ed9SAlan Stern 905b1869000SAlan Stern if (ret != 0) 906b1869000SAlan Stern goto err; 907b1869000SAlan Stern } 908b1869000SAlan Stern return ret; 909b1869000SAlan Stern 910b1869000SAlan Stern err: 911b1869000SAlan Stern if (ret < 0) { 912b1869000SAlan Stern /* In case a control transfer gets an error 913b1869000SAlan Stern * during the setup stage */ 914b1869000SAlan Stern urb->actual_length = max(urb->actual_length, 0); 915b1869000SAlan Stern 916b1869000SAlan Stern /* Note that the queue has stopped and save 917b1869000SAlan Stern * the next toggle value */ 918b1869000SAlan Stern qh->element = UHCI_PTR_TERM; 919b1869000SAlan Stern qh->is_stopped = 1; 920b1869000SAlan Stern qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); 921b1869000SAlan Stern qh->initial_toggle = uhci_toggle(td_token(td)) ^ 922b1869000SAlan Stern (ret == -EREMOTEIO); 923b1869000SAlan Stern 924b1869000SAlan Stern } else /* Short packet received */ 92559e29ed9SAlan Stern ret = uhci_fixup_short_transfer(uhci, qh, urbp); 926b1869000SAlan Stern return ret; 927b1869000SAlan Stern } 928b1869000SAlan Stern 929b1869000SAlan Stern /* 9301da177e4SLinus Torvalds * Isochronous transfers 9311da177e4SLinus Torvalds */ 932dccf4a48SAlan Stern static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, 933dccf4a48SAlan Stern struct uhci_qh *qh) 9341da177e4SLinus Torvalds { 935dccf4a48SAlan Stern struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ 9360ed8fee1SAlan Stern int i, frame; 937dccf4a48SAlan Stern unsigned long destination, status; 938b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 9391da177e4SLinus Torvalds 9400ed8fee1SAlan Stern if (urb->number_of_packets > 900) /* 900? Why? */ 9410ed8fee1SAlan Stern return -EFBIG; 9420ed8fee1SAlan Stern 9431da177e4SLinus Torvalds status = TD_CTRL_ACTIVE | TD_CTRL_IOS; 9441da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 9451da177e4SLinus Torvalds 9460ed8fee1SAlan Stern /* Figure out the starting frame number */ 9470ed8fee1SAlan Stern if (urb->transfer_flags & URB_ISO_ASAP) { 9480ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 9490ed8fee1SAlan Stern uhci_get_current_frame_number(uhci); 9500ed8fee1SAlan Stern urb->start_frame = (uhci->frame_number + 10); 9510ed8fee1SAlan Stern 9520ed8fee1SAlan Stern } else { /* Go right after the last one */ 9530ed8fee1SAlan Stern struct urb *last_urb; 9540ed8fee1SAlan Stern 9550ed8fee1SAlan Stern last_urb = list_entry(qh->queue.prev, 9560ed8fee1SAlan Stern struct urb_priv, node)->urb; 9570ed8fee1SAlan Stern urb->start_frame = (last_urb->start_frame + 9580ed8fee1SAlan Stern last_urb->number_of_packets * 9590ed8fee1SAlan Stern last_urb->interval); 9600ed8fee1SAlan Stern } 9610ed8fee1SAlan Stern } else { 9620ed8fee1SAlan Stern /* FIXME: Sanity check */ 9630ed8fee1SAlan Stern } 9641da177e4SLinus Torvalds 965b81d3436SAlan Stern for (i = 0; i < urb->number_of_packets; i++) { 9662532178aSAlan Stern td = uhci_alloc_td(uhci); 9671da177e4SLinus Torvalds if (!td) 9681da177e4SLinus Torvalds return -ENOMEM; 9691da177e4SLinus Torvalds 97004538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 971dccf4a48SAlan Stern uhci_fill_td(td, status, destination | 972dccf4a48SAlan Stern uhci_explen(urb->iso_frame_desc[i].length), 973dccf4a48SAlan Stern urb->transfer_dma + 974dccf4a48SAlan Stern urb->iso_frame_desc[i].offset); 975b81d3436SAlan Stern } 9761da177e4SLinus Torvalds 977dccf4a48SAlan Stern /* Set the interrupt-on-completion flag on the last packet. */ 978dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 979dccf4a48SAlan Stern 980dccf4a48SAlan Stern qh->skel = uhci->skel_iso_qh; 981dccf4a48SAlan Stern 982dccf4a48SAlan Stern /* Add the TDs to the frame list */ 983b81d3436SAlan Stern frame = urb->start_frame; 984b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 985dccf4a48SAlan Stern uhci_insert_td_in_frame_list(uhci, td, frame); 986b81d3436SAlan Stern frame += urb->interval; 9871da177e4SLinus Torvalds } 9881da177e4SLinus Torvalds 989dccf4a48SAlan Stern return 0; 9901da177e4SLinus Torvalds } 9911da177e4SLinus Torvalds 9921da177e4SLinus Torvalds static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) 9931da177e4SLinus Torvalds { 9941da177e4SLinus Torvalds struct uhci_td *td; 9951da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 9961da177e4SLinus Torvalds int status; 9971da177e4SLinus Torvalds int i, ret = 0; 9981da177e4SLinus Torvalds 999b81d3436SAlan Stern urb->actual_length = urb->error_count = 0; 10001da177e4SLinus Torvalds 10011da177e4SLinus Torvalds i = 0; 10021da177e4SLinus Torvalds list_for_each_entry(td, &urbp->td_list, list) { 10031da177e4SLinus Torvalds int actlength; 10041da177e4SLinus Torvalds unsigned int ctrlstat = td_status(td); 10051da177e4SLinus Torvalds 10061da177e4SLinus Torvalds if (ctrlstat & TD_CTRL_ACTIVE) 10071da177e4SLinus Torvalds return -EINPROGRESS; 10081da177e4SLinus Torvalds 10091da177e4SLinus Torvalds actlength = uhci_actual_length(ctrlstat); 10101da177e4SLinus Torvalds urb->iso_frame_desc[i].actual_length = actlength; 10111da177e4SLinus Torvalds urb->actual_length += actlength; 10121da177e4SLinus Torvalds 10131da177e4SLinus Torvalds status = uhci_map_status(uhci_status_bits(ctrlstat), 10141da177e4SLinus Torvalds usb_pipeout(urb->pipe)); 10151da177e4SLinus Torvalds urb->iso_frame_desc[i].status = status; 10161da177e4SLinus Torvalds if (status) { 10171da177e4SLinus Torvalds urb->error_count++; 10181da177e4SLinus Torvalds ret = status; 10191da177e4SLinus Torvalds } 10201da177e4SLinus Torvalds 10211da177e4SLinus Torvalds i++; 10221da177e4SLinus Torvalds } 10231da177e4SLinus Torvalds 10241da177e4SLinus Torvalds return ret; 10251da177e4SLinus Torvalds } 10261da177e4SLinus Torvalds 10271da177e4SLinus Torvalds static int uhci_urb_enqueue(struct usb_hcd *hcd, 1028dccf4a48SAlan Stern struct usb_host_endpoint *hep, 102955016f10SAl Viro struct urb *urb, gfp_t mem_flags) 10301da177e4SLinus Torvalds { 10311da177e4SLinus Torvalds int ret; 10321da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 10331da177e4SLinus Torvalds unsigned long flags; 1034dccf4a48SAlan Stern struct urb_priv *urbp; 1035dccf4a48SAlan Stern struct uhci_qh *qh; 10361da177e4SLinus Torvalds int bustime; 10371da177e4SLinus Torvalds 10381da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 10391da177e4SLinus Torvalds 10401da177e4SLinus Torvalds ret = urb->status; 10411da177e4SLinus Torvalds if (ret != -EINPROGRESS) /* URB already unlinked! */ 1042dccf4a48SAlan Stern goto done; 10431da177e4SLinus Torvalds 10441da177e4SLinus Torvalds ret = -ENOMEM; 1045dccf4a48SAlan Stern urbp = uhci_alloc_urb_priv(uhci, urb); 1046dccf4a48SAlan Stern if (!urbp) 1047dccf4a48SAlan Stern goto done; 1048dccf4a48SAlan Stern 1049dccf4a48SAlan Stern if (hep->hcpriv) 1050dccf4a48SAlan Stern qh = (struct uhci_qh *) hep->hcpriv; 1051dccf4a48SAlan Stern else { 1052dccf4a48SAlan Stern qh = uhci_alloc_qh(uhci, urb->dev, hep); 1053dccf4a48SAlan Stern if (!qh) 1054dccf4a48SAlan Stern goto err_no_qh; 10551da177e4SLinus Torvalds } 1056dccf4a48SAlan Stern urbp->qh = qh; 10571da177e4SLinus Torvalds 10584de7d2c2SAlan Stern switch (qh->type) { 10594de7d2c2SAlan Stern case USB_ENDPOINT_XFER_CONTROL: 1060dccf4a48SAlan Stern ret = uhci_submit_control(uhci, urb, qh); 1061dccf4a48SAlan Stern break; 10624de7d2c2SAlan Stern case USB_ENDPOINT_XFER_BULK: 1063dccf4a48SAlan Stern ret = uhci_submit_bulk(uhci, urb, qh); 10641da177e4SLinus Torvalds break; 10654de7d2c2SAlan Stern case USB_ENDPOINT_XFER_INT: 1066dccf4a48SAlan Stern if (list_empty(&qh->queue)) { 10671da177e4SLinus Torvalds bustime = usb_check_bandwidth(urb->dev, urb); 10681da177e4SLinus Torvalds if (bustime < 0) 10691da177e4SLinus Torvalds ret = bustime; 10701da177e4SLinus Torvalds else { 1071dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 1072dccf4a48SAlan Stern if (ret == 0) 10731da177e4SLinus Torvalds usb_claim_bandwidth(urb->dev, urb, bustime, 0); 10741da177e4SLinus Torvalds } 10751da177e4SLinus Torvalds } else { /* inherit from parent */ 1076dccf4a48SAlan Stern struct urb_priv *eurbp; 1077dccf4a48SAlan Stern 1078dccf4a48SAlan Stern eurbp = list_entry(qh->queue.prev, struct urb_priv, 1079dccf4a48SAlan Stern node); 1080dccf4a48SAlan Stern urb->bandwidth = eurbp->urb->bandwidth; 1081dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 10821da177e4SLinus Torvalds } 10831da177e4SLinus Torvalds break; 10844de7d2c2SAlan Stern case USB_ENDPOINT_XFER_ISOC: 10851da177e4SLinus Torvalds bustime = usb_check_bandwidth(urb->dev, urb); 10861da177e4SLinus Torvalds if (bustime < 0) { 10871da177e4SLinus Torvalds ret = bustime; 10881da177e4SLinus Torvalds break; 10891da177e4SLinus Torvalds } 10901da177e4SLinus Torvalds 1091dccf4a48SAlan Stern ret = uhci_submit_isochronous(uhci, urb, qh); 1092dccf4a48SAlan Stern if (ret == 0) 10931da177e4SLinus Torvalds usb_claim_bandwidth(urb->dev, urb, bustime, 1); 10941da177e4SLinus Torvalds break; 10951da177e4SLinus Torvalds } 1096dccf4a48SAlan Stern if (ret != 0) 1097dccf4a48SAlan Stern goto err_submit_failed; 10981da177e4SLinus Torvalds 1099dccf4a48SAlan Stern /* Add this URB to the QH */ 1100dccf4a48SAlan Stern urbp->qh = qh; 1101dccf4a48SAlan Stern list_add_tail(&urbp->node, &qh->queue); 11021da177e4SLinus Torvalds 1103dccf4a48SAlan Stern /* If the new URB is the first and only one on this QH then either 1104dccf4a48SAlan Stern * the QH is new and idle or else it's unlinked and waiting to 11052775562aSAlan Stern * become idle, so we can activate it right away. But only if the 11062775562aSAlan Stern * queue isn't stopped. */ 110784afddd7SAlan Stern if (qh->queue.next == &urbp->node && !qh->is_stopped) { 1108dccf4a48SAlan Stern uhci_activate_qh(uhci, qh); 110984afddd7SAlan Stern uhci_qh_wants_fsbr(uhci, qh); 111084afddd7SAlan Stern } 1111dccf4a48SAlan Stern goto done; 1112dccf4a48SAlan Stern 1113dccf4a48SAlan Stern err_submit_failed: 1114dccf4a48SAlan Stern if (qh->state == QH_STATE_IDLE) 1115dccf4a48SAlan Stern uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ 1116dccf4a48SAlan Stern 1117dccf4a48SAlan Stern err_no_qh: 1118dccf4a48SAlan Stern uhci_free_urb_priv(uhci, urbp); 1119dccf4a48SAlan Stern 1120dccf4a48SAlan Stern done: 11211da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 11221da177e4SLinus Torvalds return ret; 11231da177e4SLinus Torvalds } 11241da177e4SLinus Torvalds 11251da177e4SLinus Torvalds static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) 11261da177e4SLinus Torvalds { 11271da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 11281da177e4SLinus Torvalds unsigned long flags; 11291da177e4SLinus Torvalds struct urb_priv *urbp; 1130*10b8e47dSAlan Stern struct uhci_qh *qh; 11311da177e4SLinus Torvalds 11321da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 11331da177e4SLinus Torvalds urbp = urb->hcpriv; 11341da177e4SLinus Torvalds if (!urbp) /* URB was never linked! */ 11351da177e4SLinus Torvalds goto done; 1136*10b8e47dSAlan Stern qh = urbp->qh; 11371da177e4SLinus Torvalds 1138dccf4a48SAlan Stern /* Remove Isochronous TDs from the frame list ASAP */ 1139*10b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 1140dccf4a48SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 1141*10b8e47dSAlan Stern mb(); 1142*10b8e47dSAlan Stern 1143*10b8e47dSAlan Stern /* If the URB has already started, update the QH unlink time */ 1144*10b8e47dSAlan Stern uhci_get_current_frame_number(uhci); 1145*10b8e47dSAlan Stern if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number)) 1146*10b8e47dSAlan Stern qh->unlink_frame = uhci->frame_number; 1147*10b8e47dSAlan Stern } 1148*10b8e47dSAlan Stern 1149*10b8e47dSAlan Stern uhci_unlink_qh(uhci, qh); 11501da177e4SLinus Torvalds 11511da177e4SLinus Torvalds done: 11521da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 11531da177e4SLinus Torvalds return 0; 11541da177e4SLinus Torvalds } 11551da177e4SLinus Torvalds 11560ed8fee1SAlan Stern /* 11570ed8fee1SAlan Stern * Finish unlinking an URB and give it back 11580ed8fee1SAlan Stern */ 11590ed8fee1SAlan Stern static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, 11600ed8fee1SAlan Stern struct urb *urb, struct pt_regs *regs) 11610ed8fee1SAlan Stern __releases(uhci->lock) 11620ed8fee1SAlan Stern __acquires(uhci->lock) 11631da177e4SLinus Torvalds { 11641da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 11651da177e4SLinus Torvalds 11660ed8fee1SAlan Stern /* Isochronous TDs get unlinked directly from the frame list */ 11674de7d2c2SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 11680ed8fee1SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 11691da177e4SLinus Torvalds 11700ed8fee1SAlan Stern /* Take the URB off the QH's queue. If the queue is now empty, 11710ed8fee1SAlan Stern * this is a perfect time for a toggle fixup. */ 11720ed8fee1SAlan Stern list_del_init(&urbp->node); 11730ed8fee1SAlan Stern if (list_empty(&qh->queue) && qh->needs_fixup) { 11740ed8fee1SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 11750ed8fee1SAlan Stern usb_pipeout(urb->pipe), qh->initial_toggle); 11760ed8fee1SAlan Stern qh->needs_fixup = 0; 11770ed8fee1SAlan Stern } 11780ed8fee1SAlan Stern 11790ed8fee1SAlan Stern uhci_free_urb_priv(uhci, urbp); 11800ed8fee1SAlan Stern 11814de7d2c2SAlan Stern switch (qh->type) { 11824de7d2c2SAlan Stern case USB_ENDPOINT_XFER_ISOC: 11830ed8fee1SAlan Stern /* Release bandwidth for Interrupt or Isoc. transfers */ 11840ed8fee1SAlan Stern if (urb->bandwidth) 11850ed8fee1SAlan Stern usb_release_bandwidth(urb->dev, urb, 1); 11860ed8fee1SAlan Stern break; 11874de7d2c2SAlan Stern case USB_ENDPOINT_XFER_INT: 11880ed8fee1SAlan Stern /* Release bandwidth for Interrupt or Isoc. transfers */ 11890ed8fee1SAlan Stern /* Make sure we don't release if we have a queued URB */ 11900ed8fee1SAlan Stern if (list_empty(&qh->queue) && urb->bandwidth) 11910ed8fee1SAlan Stern usb_release_bandwidth(urb->dev, urb, 0); 11920ed8fee1SAlan Stern else 11930ed8fee1SAlan Stern /* bandwidth was passed on to queued URB, */ 11940ed8fee1SAlan Stern /* so don't let usb_unlink_urb() release it */ 11950ed8fee1SAlan Stern urb->bandwidth = 0; 11960ed8fee1SAlan Stern break; 11970ed8fee1SAlan Stern } 11980ed8fee1SAlan Stern 11990ed8fee1SAlan Stern spin_unlock(&uhci->lock); 12000ed8fee1SAlan Stern usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, regs); 12010ed8fee1SAlan Stern spin_lock(&uhci->lock); 12020ed8fee1SAlan Stern 12030ed8fee1SAlan Stern /* If the queue is now empty, we can unlink the QH and give up its 12040ed8fee1SAlan Stern * reserved bandwidth. */ 12050ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 12060ed8fee1SAlan Stern uhci_unlink_qh(uhci, qh); 12070ed8fee1SAlan Stern 12080ed8fee1SAlan Stern /* Bandwidth stuff not yet implemented */ 12090ed8fee1SAlan Stern } 12100ed8fee1SAlan Stern } 12110ed8fee1SAlan Stern 12120ed8fee1SAlan Stern /* 12130ed8fee1SAlan Stern * Scan the URBs in a QH's queue 12140ed8fee1SAlan Stern */ 12150ed8fee1SAlan Stern #define QH_FINISHED_UNLINKING(qh) \ 12160ed8fee1SAlan Stern (qh->state == QH_STATE_UNLINKING && \ 12170ed8fee1SAlan Stern uhci->frame_number + uhci->is_stopped != qh->unlink_frame) 12180ed8fee1SAlan Stern 12190ed8fee1SAlan Stern static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, 12200ed8fee1SAlan Stern struct pt_regs *regs) 12210ed8fee1SAlan Stern { 12220ed8fee1SAlan Stern struct urb_priv *urbp; 12230ed8fee1SAlan Stern struct urb *urb; 12240ed8fee1SAlan Stern int status; 12250ed8fee1SAlan Stern 12260ed8fee1SAlan Stern while (!list_empty(&qh->queue)) { 12270ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 12280ed8fee1SAlan Stern urb = urbp->urb; 12290ed8fee1SAlan Stern 1230b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 12310ed8fee1SAlan Stern status = uhci_result_isochronous(uhci, urb); 1232b1869000SAlan Stern else 12330ed8fee1SAlan Stern status = uhci_result_common(uhci, urb); 12340ed8fee1SAlan Stern if (status == -EINPROGRESS) 12350ed8fee1SAlan Stern break; 12360ed8fee1SAlan Stern 12370ed8fee1SAlan Stern spin_lock(&urb->lock); 12380ed8fee1SAlan Stern if (urb->status == -EINPROGRESS) /* Not dequeued */ 12390ed8fee1SAlan Stern urb->status = status; 12400ed8fee1SAlan Stern else 12412775562aSAlan Stern status = ECONNRESET; /* Not -ECONNRESET */ 12420ed8fee1SAlan Stern spin_unlock(&urb->lock); 12430ed8fee1SAlan Stern 12440ed8fee1SAlan Stern /* Dequeued but completed URBs can't be given back unless 12450ed8fee1SAlan Stern * the QH is stopped or has finished unlinking. */ 12462775562aSAlan Stern if (status == ECONNRESET) { 12472775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 12482775562aSAlan Stern qh->is_stopped = 1; 12492775562aSAlan Stern else if (!qh->is_stopped) 12500ed8fee1SAlan Stern return; 12512775562aSAlan Stern } 12520ed8fee1SAlan Stern 12530ed8fee1SAlan Stern uhci_giveback_urb(uhci, qh, urb, regs); 12542775562aSAlan Stern if (status < 0) 12550ed8fee1SAlan Stern break; 12560ed8fee1SAlan Stern } 12570ed8fee1SAlan Stern 12580ed8fee1SAlan Stern /* If the QH is neither stopped nor finished unlinking (normal case), 12590ed8fee1SAlan Stern * our work here is done. */ 12602775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 12612775562aSAlan Stern qh->is_stopped = 1; 12622775562aSAlan Stern else if (!qh->is_stopped) 12630ed8fee1SAlan Stern return; 12640ed8fee1SAlan Stern 12650ed8fee1SAlan Stern /* Otherwise give back each of the dequeued URBs */ 12662775562aSAlan Stern restart: 12670ed8fee1SAlan Stern list_for_each_entry(urbp, &qh->queue, node) { 12680ed8fee1SAlan Stern urb = urbp->urb; 12690ed8fee1SAlan Stern if (urb->status != -EINPROGRESS) { 1270*10b8e47dSAlan Stern 1271*10b8e47dSAlan Stern /* Fix up the TD links and save the toggles for 1272*10b8e47dSAlan Stern * non-Isochronous queues. For Isochronous queues, 1273*10b8e47dSAlan Stern * test for too-recent dequeues. */ 1274*10b8e47dSAlan Stern if (!uhci_cleanup_queue(uhci, qh, urb)) { 1275*10b8e47dSAlan Stern qh->is_stopped = 0; 1276*10b8e47dSAlan Stern return; 1277*10b8e47dSAlan Stern } 12780ed8fee1SAlan Stern uhci_giveback_urb(uhci, qh, urb, regs); 12790ed8fee1SAlan Stern goto restart; 12800ed8fee1SAlan Stern } 12810ed8fee1SAlan Stern } 12820ed8fee1SAlan Stern qh->is_stopped = 0; 12830ed8fee1SAlan Stern 12840ed8fee1SAlan Stern /* There are no more dequeued URBs. If there are still URBs on the 12850ed8fee1SAlan Stern * queue, the QH can now be re-activated. */ 12860ed8fee1SAlan Stern if (!list_empty(&qh->queue)) { 12870ed8fee1SAlan Stern if (qh->needs_fixup) 12880ed8fee1SAlan Stern uhci_fixup_toggles(qh, 0); 128984afddd7SAlan Stern 129084afddd7SAlan Stern /* If the first URB on the queue wants FSBR but its time 129184afddd7SAlan Stern * limit has expired, set the next TD to interrupt on 129284afddd7SAlan Stern * completion before reactivating the QH. */ 129384afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 129484afddd7SAlan Stern if (urbp->fsbr && qh->wait_expired) { 129584afddd7SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 129684afddd7SAlan Stern struct uhci_td, list); 129784afddd7SAlan Stern 129884afddd7SAlan Stern td->status |= __cpu_to_le32(TD_CTRL_IOC); 129984afddd7SAlan Stern } 130084afddd7SAlan Stern 13010ed8fee1SAlan Stern uhci_activate_qh(uhci, qh); 13020ed8fee1SAlan Stern } 13030ed8fee1SAlan Stern 13040ed8fee1SAlan Stern /* The queue is empty. The QH can become idle if it is fully 13050ed8fee1SAlan Stern * unlinked. */ 13060ed8fee1SAlan Stern else if (QH_FINISHED_UNLINKING(qh)) 13070ed8fee1SAlan Stern uhci_make_qh_idle(uhci, qh); 13081da177e4SLinus Torvalds } 13091da177e4SLinus Torvalds 13100ed8fee1SAlan Stern /* 131184afddd7SAlan Stern * Check for queues that have made some forward progress. 131284afddd7SAlan Stern * Returns 0 if the queue is not Isochronous, is ACTIVE, and 131384afddd7SAlan Stern * has not advanced since last examined; 1 otherwise. 1314b761d9d8SAlan Stern * 1315b761d9d8SAlan Stern * Early Intel controllers have a bug which causes qh->element sometimes 1316b761d9d8SAlan Stern * not to advance when a TD completes successfully. The queue remains 1317b761d9d8SAlan Stern * stuck on the inactive completed TD. We detect such cases and advance 1318b761d9d8SAlan Stern * the element pointer by hand. 131984afddd7SAlan Stern */ 132084afddd7SAlan Stern static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) 132184afddd7SAlan Stern { 132284afddd7SAlan Stern struct urb_priv *urbp = NULL; 132384afddd7SAlan Stern struct uhci_td *td; 132484afddd7SAlan Stern int ret = 1; 132584afddd7SAlan Stern unsigned status; 132684afddd7SAlan Stern 132784afddd7SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 132884afddd7SAlan Stern return ret; 132984afddd7SAlan Stern 133084afddd7SAlan Stern /* Treat an UNLINKING queue as though it hasn't advanced. 133184afddd7SAlan Stern * This is okay because reactivation will treat it as though 133284afddd7SAlan Stern * it has advanced, and if it is going to become IDLE then 133384afddd7SAlan Stern * this doesn't matter anyway. Furthermore it's possible 133484afddd7SAlan Stern * for an UNLINKING queue not to have any URBs at all, or 133584afddd7SAlan Stern * for its first URB not to have any TDs (if it was dequeued 133684afddd7SAlan Stern * just as it completed). So it's not easy in any case to 133784afddd7SAlan Stern * test whether such queues have advanced. */ 133884afddd7SAlan Stern if (qh->state != QH_STATE_ACTIVE) { 133984afddd7SAlan Stern urbp = NULL; 134084afddd7SAlan Stern status = 0; 134184afddd7SAlan Stern 134284afddd7SAlan Stern } else { 134384afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 134484afddd7SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 134584afddd7SAlan Stern status = td_status(td); 134684afddd7SAlan Stern if (!(status & TD_CTRL_ACTIVE)) { 134784afddd7SAlan Stern 134884afddd7SAlan Stern /* We're okay, the queue has advanced */ 134984afddd7SAlan Stern qh->wait_expired = 0; 135084afddd7SAlan Stern qh->advance_jiffies = jiffies; 135184afddd7SAlan Stern return ret; 135284afddd7SAlan Stern } 135384afddd7SAlan Stern ret = 0; 135484afddd7SAlan Stern } 135584afddd7SAlan Stern 135684afddd7SAlan Stern /* The queue hasn't advanced; check for timeout */ 135784afddd7SAlan Stern if (!qh->wait_expired && time_after(jiffies, 135884afddd7SAlan Stern qh->advance_jiffies + QH_WAIT_TIMEOUT)) { 1359b761d9d8SAlan Stern 1360b761d9d8SAlan Stern /* Detect the Intel bug and work around it */ 1361b761d9d8SAlan Stern if (qh->post_td && qh_element(qh) == 1362b761d9d8SAlan Stern cpu_to_le32(qh->post_td->dma_handle)) { 1363b761d9d8SAlan Stern qh->element = qh->post_td->link; 1364b761d9d8SAlan Stern qh->advance_jiffies = jiffies; 1365b761d9d8SAlan Stern return 1; 1366b761d9d8SAlan Stern } 1367b761d9d8SAlan Stern 136884afddd7SAlan Stern qh->wait_expired = 1; 136984afddd7SAlan Stern 137084afddd7SAlan Stern /* If the current URB wants FSBR, unlink it temporarily 137184afddd7SAlan Stern * so that we can safely set the next TD to interrupt on 137284afddd7SAlan Stern * completion. That way we'll know as soon as the queue 137384afddd7SAlan Stern * starts moving again. */ 137484afddd7SAlan Stern if (urbp && urbp->fsbr && !(status & TD_CTRL_IOC)) 137584afddd7SAlan Stern uhci_unlink_qh(uhci, qh); 137684afddd7SAlan Stern } 137784afddd7SAlan Stern return ret; 137884afddd7SAlan Stern } 137984afddd7SAlan Stern 138084afddd7SAlan Stern /* 13810ed8fee1SAlan Stern * Process events in the schedule, but only in one thread at a time 13820ed8fee1SAlan Stern */ 13831da177e4SLinus Torvalds static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs) 13841da177e4SLinus Torvalds { 13850ed8fee1SAlan Stern int i; 13860ed8fee1SAlan Stern struct uhci_qh *qh; 13871da177e4SLinus Torvalds 13881da177e4SLinus Torvalds /* Don't allow re-entrant calls */ 13891da177e4SLinus Torvalds if (uhci->scan_in_progress) { 13901da177e4SLinus Torvalds uhci->need_rescan = 1; 13911da177e4SLinus Torvalds return; 13921da177e4SLinus Torvalds } 13931da177e4SLinus Torvalds uhci->scan_in_progress = 1; 13941da177e4SLinus Torvalds rescan: 13951da177e4SLinus Torvalds uhci->need_rescan = 0; 13961da177e4SLinus Torvalds 13976c1b445cSAlan Stern uhci_clear_next_interrupt(uhci); 13981da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 13991da177e4SLinus Torvalds 14000ed8fee1SAlan Stern /* Go through all the QH queues and process the URBs in each one */ 14010ed8fee1SAlan Stern for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) { 14020ed8fee1SAlan Stern uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, 14030ed8fee1SAlan Stern struct uhci_qh, node); 14040ed8fee1SAlan Stern while ((qh = uhci->next_qh) != uhci->skelqh[i]) { 14050ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, 14060ed8fee1SAlan Stern struct uhci_qh, node); 140784afddd7SAlan Stern 140884afddd7SAlan Stern if (uhci_advance_check(uhci, qh)) { 14090ed8fee1SAlan Stern uhci_scan_qh(uhci, qh, regs); 141084afddd7SAlan Stern if (qh->state == QH_STATE_ACTIVE) 141184afddd7SAlan Stern uhci_qh_wants_fsbr(uhci, qh); 141284afddd7SAlan Stern } 14131da177e4SLinus Torvalds } 14140ed8fee1SAlan Stern } 14151da177e4SLinus Torvalds 14161da177e4SLinus Torvalds if (uhci->need_rescan) 14171da177e4SLinus Torvalds goto rescan; 14181da177e4SLinus Torvalds uhci->scan_in_progress = 0; 14191da177e4SLinus Torvalds 142084afddd7SAlan Stern if (uhci->fsbr_is_on && time_after(jiffies, 142184afddd7SAlan Stern uhci->fsbr_jiffies + FSBR_OFF_DELAY)) 142284afddd7SAlan Stern uhci_fsbr_off(uhci); 142384afddd7SAlan Stern 142404538a25SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 14251da177e4SLinus Torvalds uhci_clear_next_interrupt(uhci); 14261da177e4SLinus Torvalds else 14271da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 14281da177e4SLinus Torvalds } 1429