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) 1617230acdSAlan Stern * (C) Copyright 2004-2007 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); 3251e2f62fSJan Andersson uhci->term_td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); 331da177e4SLinus Torvalds } 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) 361da177e4SLinus Torvalds { 3751e2f62fSJan Andersson uhci->term_td->status &= ~cpu_to_hc32(uhci, 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 { 48e009f1b2SAlan Stern struct uhci_qh *lqh; 4917230acdSAlan Stern 50e009f1b2SAlan Stern /* The terminating skeleton QH always points back to the first 51e009f1b2SAlan Stern * FSBR QH. Make the last async QH point to the terminating 52e009f1b2SAlan Stern * skeleton QH. */ 5384afddd7SAlan Stern uhci->fsbr_is_on = 1; 5417230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 5517230acdSAlan Stern struct uhci_qh, node); 5651e2f62fSJan Andersson lqh->link = LINK_TO_QH(uhci, uhci->skel_term_qh); 5784afddd7SAlan Stern } 5884afddd7SAlan Stern 5984afddd7SAlan Stern static void uhci_fsbr_off(struct uhci_hcd *uhci) 6084afddd7SAlan Stern { 6117230acdSAlan Stern struct uhci_qh *lqh; 6217230acdSAlan Stern 63e009f1b2SAlan Stern /* Remove the link from the last async QH to the terminating 64e009f1b2SAlan Stern * skeleton QH. */ 6584afddd7SAlan Stern uhci->fsbr_is_on = 0; 6617230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 6717230acdSAlan Stern struct uhci_qh, node); 6851e2f62fSJan Andersson lqh->link = UHCI_PTR_TERM(uhci); 6984afddd7SAlan Stern } 7084afddd7SAlan Stern 7184afddd7SAlan Stern static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) 7284afddd7SAlan Stern { 7384afddd7SAlan Stern struct urb_priv *urbp = urb->hcpriv; 7484afddd7SAlan Stern 7584afddd7SAlan Stern if (!(urb->transfer_flags & URB_NO_FSBR)) 7684afddd7SAlan Stern urbp->fsbr = 1; 7784afddd7SAlan Stern } 7884afddd7SAlan Stern 79c5e3b741SAlan Stern static void uhci_urbp_wants_fsbr(struct uhci_hcd *uhci, struct urb_priv *urbp) 8084afddd7SAlan Stern { 8184afddd7SAlan Stern if (urbp->fsbr) { 82c5e3b741SAlan Stern uhci->fsbr_is_wanted = 1; 8384afddd7SAlan Stern if (!uhci->fsbr_is_on) 8484afddd7SAlan Stern uhci_fsbr_on(uhci); 85c5e3b741SAlan Stern else if (uhci->fsbr_expiring) { 86c5e3b741SAlan Stern uhci->fsbr_expiring = 0; 87c5e3b741SAlan Stern del_timer(&uhci->fsbr_timer); 8884afddd7SAlan Stern } 8984afddd7SAlan Stern } 90c5e3b741SAlan Stern } 91c5e3b741SAlan Stern 92c5e3b741SAlan Stern static void uhci_fsbr_timeout(unsigned long _uhci) 93c5e3b741SAlan Stern { 94c5e3b741SAlan Stern struct uhci_hcd *uhci = (struct uhci_hcd *) _uhci; 95c5e3b741SAlan Stern unsigned long flags; 96c5e3b741SAlan Stern 97c5e3b741SAlan Stern spin_lock_irqsave(&uhci->lock, flags); 98c5e3b741SAlan Stern if (uhci->fsbr_expiring) { 99c5e3b741SAlan Stern uhci->fsbr_expiring = 0; 100c5e3b741SAlan Stern uhci_fsbr_off(uhci); 101c5e3b741SAlan Stern } 102c5e3b741SAlan Stern spin_unlock_irqrestore(&uhci->lock, flags); 103c5e3b741SAlan Stern } 10484afddd7SAlan Stern 10584afddd7SAlan Stern 1062532178aSAlan Stern static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) 1071da177e4SLinus Torvalds { 1081da177e4SLinus Torvalds dma_addr_t dma_handle; 1091da177e4SLinus Torvalds struct uhci_td *td; 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle); 1121da177e4SLinus Torvalds if (!td) 1131da177e4SLinus Torvalds return NULL; 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds td->dma_handle = dma_handle; 1161da177e4SLinus Torvalds td->frame = -1; 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds INIT_LIST_HEAD(&td->list); 1191da177e4SLinus Torvalds INIT_LIST_HEAD(&td->fl_list); 1201da177e4SLinus Torvalds 1211da177e4SLinus Torvalds return td; 1221da177e4SLinus Torvalds } 1231da177e4SLinus Torvalds 124dccf4a48SAlan Stern static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) 125dccf4a48SAlan Stern { 1265172046dSArjan van de Ven if (!list_empty(&td->list)) 1275172046dSArjan van de Ven dev_WARN(uhci_dev(uhci), "td %p still in list!\n", td); 1285172046dSArjan van de Ven if (!list_empty(&td->fl_list)) 1295172046dSArjan van de Ven dev_WARN(uhci_dev(uhci), "td %p still in fl_list!\n", td); 130dccf4a48SAlan Stern 131dccf4a48SAlan Stern dma_pool_free(uhci->td_pool, td, td->dma_handle); 132dccf4a48SAlan Stern } 133dccf4a48SAlan Stern 13451e2f62fSJan Andersson static inline void uhci_fill_td(struct uhci_hcd *uhci, struct uhci_td *td, 13551e2f62fSJan Andersson u32 status, u32 token, u32 buffer) 1361da177e4SLinus Torvalds { 13751e2f62fSJan Andersson td->status = cpu_to_hc32(uhci, status); 13851e2f62fSJan Andersson td->token = cpu_to_hc32(uhci, token); 13951e2f62fSJan Andersson td->buffer = cpu_to_hc32(uhci, buffer); 1401da177e4SLinus Torvalds } 1411da177e4SLinus Torvalds 14204538a25SAlan Stern static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) 14304538a25SAlan Stern { 14404538a25SAlan Stern list_add_tail(&td->list, &urbp->td_list); 14504538a25SAlan Stern } 14604538a25SAlan Stern 14704538a25SAlan Stern static void uhci_remove_td_from_urbp(struct uhci_td *td) 14804538a25SAlan Stern { 14904538a25SAlan Stern list_del_init(&td->list); 15004538a25SAlan Stern } 15104538a25SAlan Stern 1521da177e4SLinus Torvalds /* 153687f5f34SAlan Stern * We insert Isochronous URBs directly into the frame list at the beginning 1541da177e4SLinus Torvalds */ 155dccf4a48SAlan Stern static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, 156dccf4a48SAlan Stern struct uhci_td *td, unsigned framenum) 1571da177e4SLinus Torvalds { 1581da177e4SLinus Torvalds framenum &= (UHCI_NUMFRAMES - 1); 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds td->frame = framenum; 1611da177e4SLinus Torvalds 1621da177e4SLinus Torvalds /* Is there a TD already mapped there? */ 163a1d59ce8SAlan Stern if (uhci->frame_cpu[framenum]) { 1641da177e4SLinus Torvalds struct uhci_td *ftd, *ltd; 1651da177e4SLinus Torvalds 166a1d59ce8SAlan Stern ftd = uhci->frame_cpu[framenum]; 1671da177e4SLinus Torvalds ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 1681da177e4SLinus Torvalds 1691da177e4SLinus Torvalds list_add_tail(&td->fl_list, &ftd->fl_list); 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds td->link = ltd->link; 1721da177e4SLinus Torvalds wmb(); 17351e2f62fSJan Andersson ltd->link = LINK_TO_TD(uhci, td); 1741da177e4SLinus Torvalds } else { 175a1d59ce8SAlan Stern td->link = uhci->frame[framenum]; 1761da177e4SLinus Torvalds wmb(); 17751e2f62fSJan Andersson uhci->frame[framenum] = LINK_TO_TD(uhci, td); 178a1d59ce8SAlan Stern uhci->frame_cpu[framenum] = td; 1791da177e4SLinus Torvalds } 1801da177e4SLinus Torvalds } 1811da177e4SLinus Torvalds 182dccf4a48SAlan Stern static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, 183b81d3436SAlan Stern struct uhci_td *td) 1841da177e4SLinus Torvalds { 1851da177e4SLinus Torvalds /* If it's not inserted, don't remove it */ 186b81d3436SAlan Stern if (td->frame == -1) { 187b81d3436SAlan Stern WARN_ON(!list_empty(&td->fl_list)); 1881da177e4SLinus Torvalds return; 189b81d3436SAlan Stern } 1901da177e4SLinus Torvalds 191b81d3436SAlan Stern if (uhci->frame_cpu[td->frame] == td) { 1921da177e4SLinus Torvalds if (list_empty(&td->fl_list)) { 193a1d59ce8SAlan Stern uhci->frame[td->frame] = td->link; 194a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = NULL; 1951da177e4SLinus Torvalds } else { 1961da177e4SLinus Torvalds struct uhci_td *ntd; 1971da177e4SLinus Torvalds 19816325f18STobias Ollmann ntd = list_entry(td->fl_list.next, 19916325f18STobias Ollmann struct uhci_td, 20016325f18STobias Ollmann fl_list); 20151e2f62fSJan Andersson uhci->frame[td->frame] = LINK_TO_TD(uhci, ntd); 202a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = ntd; 2031da177e4SLinus Torvalds } 2041da177e4SLinus Torvalds } else { 2051da177e4SLinus Torvalds struct uhci_td *ptd; 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list); 2081da177e4SLinus Torvalds ptd->link = td->link; 2091da177e4SLinus Torvalds } 2101da177e4SLinus Torvalds 2111da177e4SLinus Torvalds list_del_init(&td->fl_list); 2121da177e4SLinus Torvalds td->frame = -1; 2131da177e4SLinus Torvalds } 2141da177e4SLinus Torvalds 215c8155cc5SAlan Stern static inline void uhci_remove_tds_from_frame(struct uhci_hcd *uhci, 216c8155cc5SAlan Stern unsigned int framenum) 217c8155cc5SAlan Stern { 218c8155cc5SAlan Stern struct uhci_td *ftd, *ltd; 219c8155cc5SAlan Stern 220c8155cc5SAlan Stern framenum &= (UHCI_NUMFRAMES - 1); 221c8155cc5SAlan Stern 222c8155cc5SAlan Stern ftd = uhci->frame_cpu[framenum]; 223c8155cc5SAlan Stern if (ftd) { 224c8155cc5SAlan Stern ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 225c8155cc5SAlan Stern uhci->frame[framenum] = ltd->link; 226c8155cc5SAlan Stern uhci->frame_cpu[framenum] = NULL; 227c8155cc5SAlan Stern 228c8155cc5SAlan Stern while (!list_empty(&ftd->fl_list)) 229c8155cc5SAlan Stern list_del_init(ftd->fl_list.prev); 230c8155cc5SAlan Stern } 231c8155cc5SAlan Stern } 232c8155cc5SAlan Stern 233dccf4a48SAlan Stern /* 234dccf4a48SAlan Stern * Remove all the TDs for an Isochronous URB from the frame list 235dccf4a48SAlan Stern */ 236dccf4a48SAlan Stern static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) 237b81d3436SAlan Stern { 238b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 239b81d3436SAlan Stern struct uhci_td *td; 240b81d3436SAlan Stern 241b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) 242dccf4a48SAlan Stern uhci_remove_td_from_frame_list(uhci, td); 243b81d3436SAlan Stern } 244b81d3436SAlan Stern 245dccf4a48SAlan Stern static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, 246dccf4a48SAlan Stern struct usb_device *udev, struct usb_host_endpoint *hep) 2471da177e4SLinus Torvalds { 2481da177e4SLinus Torvalds dma_addr_t dma_handle; 2491da177e4SLinus Torvalds struct uhci_qh *qh; 2501da177e4SLinus Torvalds 2511da177e4SLinus Torvalds qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle); 2521da177e4SLinus Torvalds if (!qh) 2531da177e4SLinus Torvalds return NULL; 2541da177e4SLinus Torvalds 25559e29ed9SAlan Stern memset(qh, 0, sizeof(*qh)); 2561da177e4SLinus Torvalds qh->dma_handle = dma_handle; 2571da177e4SLinus Torvalds 25851e2f62fSJan Andersson qh->element = UHCI_PTR_TERM(uhci); 25951e2f62fSJan Andersson qh->link = UHCI_PTR_TERM(uhci); 2601da177e4SLinus Torvalds 261dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->queue); 262dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->node); 2631da177e4SLinus Torvalds 264dccf4a48SAlan Stern if (udev) { /* Normal QH */ 2651eba67a6SMatthias Kaehlcke qh->type = usb_endpoint_type(&hep->desc); 26685a975d0SAlan Stern if (qh->type != USB_ENDPOINT_XFER_ISOC) { 267af0bb599SAlan Stern qh->dummy_td = uhci_alloc_td(uhci); 268af0bb599SAlan Stern if (!qh->dummy_td) { 269af0bb599SAlan Stern dma_pool_free(uhci->qh_pool, qh, dma_handle); 270af0bb599SAlan Stern return NULL; 271af0bb599SAlan Stern } 27285a975d0SAlan Stern } 273dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 274dccf4a48SAlan Stern qh->hep = hep; 275dccf4a48SAlan Stern qh->udev = udev; 276dccf4a48SAlan Stern hep->hcpriv = qh; 2771da177e4SLinus Torvalds 2783ca2a321SAlan Stern if (qh->type == USB_ENDPOINT_XFER_INT || 2793ca2a321SAlan Stern qh->type == USB_ENDPOINT_XFER_ISOC) 2803ca2a321SAlan Stern qh->load = usb_calc_bus_time(udev->speed, 2813ca2a321SAlan Stern usb_endpoint_dir_in(&hep->desc), 2823ca2a321SAlan Stern qh->type == USB_ENDPOINT_XFER_ISOC, 28329cc8897SKuninori Morimoto usb_endpoint_maxp(&hep->desc)) 2843ca2a321SAlan Stern / 1000 + 1; 2853ca2a321SAlan Stern 286dccf4a48SAlan Stern } else { /* Skeleton QH */ 287dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 2884de7d2c2SAlan Stern qh->type = -1; 289dccf4a48SAlan Stern } 2901da177e4SLinus Torvalds return qh; 2911da177e4SLinus Torvalds } 2921da177e4SLinus Torvalds 2931da177e4SLinus Torvalds static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 2941da177e4SLinus Torvalds { 295dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_IDLE && qh->udev); 2965172046dSArjan van de Ven if (!list_empty(&qh->queue)) 2975172046dSArjan van de Ven dev_WARN(uhci_dev(uhci), "qh %p list not empty!\n", qh); 2981da177e4SLinus Torvalds 299dccf4a48SAlan Stern list_del(&qh->node); 300dccf4a48SAlan Stern if (qh->udev) { 301dccf4a48SAlan Stern qh->hep->hcpriv = NULL; 30285a975d0SAlan Stern if (qh->dummy_td) 303af0bb599SAlan Stern uhci_free_td(uhci, qh->dummy_td); 304dccf4a48SAlan Stern } 3051da177e4SLinus Torvalds dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); 3061da177e4SLinus Torvalds } 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvalds /* 309a0b458b6SAlan Stern * When a queue is stopped and a dequeued URB is given back, adjust 310a0b458b6SAlan Stern * the previous TD link (if the URB isn't first on the queue) or 311a0b458b6SAlan Stern * save its toggle value (if it is first and is currently executing). 31210b8e47dSAlan Stern * 31310b8e47dSAlan Stern * Returns 0 if the URB should not yet be given back, 1 otherwise. 3140ed8fee1SAlan Stern */ 31510b8e47dSAlan Stern static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, 316a0b458b6SAlan Stern struct urb *urb) 3170ed8fee1SAlan Stern { 318a0b458b6SAlan Stern struct urb_priv *urbp = urb->hcpriv; 3190ed8fee1SAlan Stern struct uhci_td *td; 32010b8e47dSAlan Stern int ret = 1; 3210ed8fee1SAlan Stern 322a0b458b6SAlan Stern /* Isochronous pipes don't use toggles and their TD link pointers 32310b8e47dSAlan Stern * get adjusted during uhci_urb_dequeue(). But since their queues 32410b8e47dSAlan Stern * cannot truly be stopped, we have to watch out for dequeues 32510b8e47dSAlan Stern * occurring after the nominal unlink frame. */ 32610b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 32710b8e47dSAlan Stern ret = (uhci->frame_number + uhci->is_stopped != 32810b8e47dSAlan Stern qh->unlink_frame); 329c5e3b741SAlan Stern goto done; 33010b8e47dSAlan Stern } 331a0b458b6SAlan Stern 332a0b458b6SAlan Stern /* If the URB isn't first on its queue, adjust the link pointer 333a0b458b6SAlan Stern * of the last TD in the previous URB. The toggle doesn't need 334a0b458b6SAlan Stern * to be saved since this URB can't be executing yet. */ 335a0b458b6SAlan Stern if (qh->queue.next != &urbp->node) { 336a0b458b6SAlan Stern struct urb_priv *purbp; 337a0b458b6SAlan Stern struct uhci_td *ptd; 338a0b458b6SAlan Stern 339a0b458b6SAlan Stern purbp = list_entry(urbp->node.prev, struct urb_priv, node); 340a0b458b6SAlan Stern WARN_ON(list_empty(&purbp->td_list)); 341a0b458b6SAlan Stern ptd = list_entry(purbp->td_list.prev, struct uhci_td, 342a0b458b6SAlan Stern list); 343a0b458b6SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, 344a0b458b6SAlan Stern list); 345a0b458b6SAlan Stern ptd->link = td->link; 346c5e3b741SAlan Stern goto done; 347a0b458b6SAlan Stern } 348a0b458b6SAlan Stern 3490ed8fee1SAlan Stern /* If the QH element pointer is UHCI_PTR_TERM then then currently 3500ed8fee1SAlan Stern * executing URB has already been unlinked, so this one isn't it. */ 35151e2f62fSJan Andersson if (qh_element(qh) == UHCI_PTR_TERM(uhci)) 352c5e3b741SAlan Stern goto done; 35351e2f62fSJan Andersson qh->element = UHCI_PTR_TERM(uhci); 3540ed8fee1SAlan Stern 35585a975d0SAlan Stern /* Control pipes don't have to worry about toggles */ 356a0b458b6SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) 357c5e3b741SAlan Stern goto done; 3580ed8fee1SAlan Stern 359a0b458b6SAlan Stern /* Save the next toggle value */ 36059e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 36159e29ed9SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 3620ed8fee1SAlan Stern qh->needs_fixup = 1; 36351e2f62fSJan Andersson qh->initial_toggle = uhci_toggle(td_token(uhci, td)); 364c5e3b741SAlan Stern 365c5e3b741SAlan Stern done: 36610b8e47dSAlan Stern return ret; 3670ed8fee1SAlan Stern } 3680ed8fee1SAlan Stern 3690ed8fee1SAlan Stern /* 3700ed8fee1SAlan Stern * Fix up the data toggles for URBs in a queue, when one of them 3710ed8fee1SAlan Stern * terminates early (short transfer, error, or dequeued). 3720ed8fee1SAlan Stern */ 37351e2f62fSJan Andersson static void uhci_fixup_toggles(struct uhci_hcd *uhci, struct uhci_qh *qh, 37451e2f62fSJan Andersson int skip_first) 3750ed8fee1SAlan Stern { 3760ed8fee1SAlan Stern struct urb_priv *urbp = NULL; 3770ed8fee1SAlan Stern struct uhci_td *td; 3780ed8fee1SAlan Stern unsigned int toggle = qh->initial_toggle; 3790ed8fee1SAlan Stern unsigned int pipe; 3800ed8fee1SAlan Stern 3810ed8fee1SAlan Stern /* Fixups for a short transfer start with the second URB in the 3820ed8fee1SAlan Stern * queue (the short URB is the first). */ 3830ed8fee1SAlan Stern if (skip_first) 3840ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 3850ed8fee1SAlan Stern 3860ed8fee1SAlan Stern /* When starting with the first URB, if the QH element pointer is 3870ed8fee1SAlan Stern * still valid then we know the URB's toggles are okay. */ 38851e2f62fSJan Andersson else if (qh_element(qh) != UHCI_PTR_TERM(uhci)) 3890ed8fee1SAlan Stern toggle = 2; 3900ed8fee1SAlan Stern 3910ed8fee1SAlan Stern /* Fix up the toggle for the URBs in the queue. Normally this 3920ed8fee1SAlan Stern * loop won't run more than once: When an error or short transfer 3930ed8fee1SAlan Stern * occurs, the queue usually gets emptied. */ 3941393adb2SAlan Stern urbp = list_prepare_entry(urbp, &qh->queue, node); 3950ed8fee1SAlan Stern list_for_each_entry_continue(urbp, &qh->queue, node) { 3960ed8fee1SAlan Stern 3970ed8fee1SAlan Stern /* If the first TD has the right toggle value, we don't 3980ed8fee1SAlan Stern * need to change any toggles in this URB */ 3990ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 40051e2f62fSJan Andersson if (toggle > 1 || uhci_toggle(td_token(uhci, td)) == toggle) { 401db59b464SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, 4020ed8fee1SAlan Stern list); 40351e2f62fSJan Andersson toggle = uhci_toggle(td_token(uhci, td)) ^ 1; 4040ed8fee1SAlan Stern 4050ed8fee1SAlan Stern /* Otherwise all the toggles in the URB have to be switched */ 4060ed8fee1SAlan Stern } else { 4070ed8fee1SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 40851e2f62fSJan Andersson td->token ^= cpu_to_hc32(uhci, 4090ed8fee1SAlan Stern TD_TOKEN_TOGGLE); 4100ed8fee1SAlan Stern toggle ^= 1; 4110ed8fee1SAlan Stern } 4120ed8fee1SAlan Stern } 4130ed8fee1SAlan Stern } 4140ed8fee1SAlan Stern 4150ed8fee1SAlan Stern wmb(); 4160ed8fee1SAlan Stern pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe; 4170ed8fee1SAlan Stern usb_settoggle(qh->udev, usb_pipeendpoint(pipe), 4180ed8fee1SAlan Stern usb_pipeout(pipe), toggle); 4190ed8fee1SAlan Stern qh->needs_fixup = 0; 4200ed8fee1SAlan Stern } 4210ed8fee1SAlan Stern 4220ed8fee1SAlan Stern /* 42317230acdSAlan Stern * Link an Isochronous QH into its skeleton's list 42417230acdSAlan Stern */ 42517230acdSAlan Stern static inline void link_iso(struct uhci_hcd *uhci, struct uhci_qh *qh) 42617230acdSAlan Stern { 42717230acdSAlan Stern list_add_tail(&qh->node, &uhci->skel_iso_qh->node); 42817230acdSAlan Stern 42917230acdSAlan Stern /* Isochronous QHs aren't linked by the hardware */ 43017230acdSAlan Stern } 43117230acdSAlan Stern 43217230acdSAlan Stern /* 43317230acdSAlan Stern * Link a high-period interrupt QH into the schedule at the end of its 43417230acdSAlan Stern * skeleton's list 43517230acdSAlan Stern */ 43617230acdSAlan Stern static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) 43717230acdSAlan Stern { 43817230acdSAlan Stern struct uhci_qh *pqh; 43917230acdSAlan Stern 44017230acdSAlan Stern list_add_tail(&qh->node, &uhci->skelqh[qh->skel]->node); 44117230acdSAlan Stern 44217230acdSAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 44317230acdSAlan Stern qh->link = pqh->link; 44417230acdSAlan Stern wmb(); 44551e2f62fSJan Andersson pqh->link = LINK_TO_QH(uhci, qh); 44617230acdSAlan Stern } 44717230acdSAlan Stern 44817230acdSAlan Stern /* 44917230acdSAlan Stern * Link a period-1 interrupt or async QH into the schedule at the 45017230acdSAlan Stern * correct spot in the async skeleton's list, and update the FSBR link 45117230acdSAlan Stern */ 45217230acdSAlan Stern static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) 45317230acdSAlan Stern { 454e009f1b2SAlan Stern struct uhci_qh *pqh; 45551e2f62fSJan Andersson __hc32 link_to_new_qh; 45617230acdSAlan Stern 45717230acdSAlan Stern /* Find the predecessor QH for our new one and insert it in the list. 45817230acdSAlan Stern * The list of QHs is expected to be short, so linear search won't 45917230acdSAlan Stern * take too long. */ 46017230acdSAlan Stern list_for_each_entry_reverse(pqh, &uhci->skel_async_qh->node, node) { 46117230acdSAlan Stern if (pqh->skel <= qh->skel) 46217230acdSAlan Stern break; 46317230acdSAlan Stern } 46417230acdSAlan Stern list_add(&qh->node, &pqh->node); 46517230acdSAlan Stern 46617230acdSAlan Stern /* Link it into the schedule */ 467e009f1b2SAlan Stern qh->link = pqh->link; 46817230acdSAlan Stern wmb(); 46951e2f62fSJan Andersson link_to_new_qh = LINK_TO_QH(uhci, qh); 470e009f1b2SAlan Stern pqh->link = link_to_new_qh; 471e009f1b2SAlan Stern 472e009f1b2SAlan Stern /* If this is now the first FSBR QH, link the terminating skeleton 473e009f1b2SAlan Stern * QH to it. */ 474e009f1b2SAlan Stern if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR) 475e009f1b2SAlan Stern uhci->skel_term_qh->link = link_to_new_qh; 47617230acdSAlan Stern } 47717230acdSAlan Stern 47817230acdSAlan Stern /* 479dccf4a48SAlan Stern * Put a QH on the schedule in both hardware and software 4801da177e4SLinus Torvalds */ 481dccf4a48SAlan Stern static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 4821da177e4SLinus Torvalds { 483dccf4a48SAlan Stern WARN_ON(list_empty(&qh->queue)); 484dccf4a48SAlan Stern 485dccf4a48SAlan Stern /* Set the element pointer if it isn't set already. 486dccf4a48SAlan Stern * This isn't needed for Isochronous queues, but it doesn't hurt. */ 48751e2f62fSJan Andersson if (qh_element(qh) == UHCI_PTR_TERM(uhci)) { 488dccf4a48SAlan Stern struct urb_priv *urbp = list_entry(qh->queue.next, 489dccf4a48SAlan Stern struct urb_priv, node); 490dccf4a48SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 491dccf4a48SAlan Stern struct uhci_td, list); 492dccf4a48SAlan Stern 49351e2f62fSJan Andersson qh->element = LINK_TO_TD(uhci, td); 494dccf4a48SAlan Stern } 495dccf4a48SAlan Stern 49684afddd7SAlan Stern /* Treat the queue as if it has just advanced */ 49784afddd7SAlan Stern qh->wait_expired = 0; 49884afddd7SAlan Stern qh->advance_jiffies = jiffies; 49984afddd7SAlan Stern 500dccf4a48SAlan Stern if (qh->state == QH_STATE_ACTIVE) 5011da177e4SLinus Torvalds return; 502dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 503dccf4a48SAlan Stern 50417230acdSAlan Stern /* Move the QH from its old list to the correct spot in the appropriate 505dccf4a48SAlan Stern * skeleton's list */ 5060ed8fee1SAlan Stern if (qh == uhci->next_qh) 5070ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 5080ed8fee1SAlan Stern node); 50917230acdSAlan Stern list_del(&qh->node); 510dccf4a48SAlan Stern 51117230acdSAlan Stern if (qh->skel == SKEL_ISO) 51217230acdSAlan Stern link_iso(uhci, qh); 51317230acdSAlan Stern else if (qh->skel < SKEL_ASYNC) 51417230acdSAlan Stern link_interrupt(uhci, qh); 51517230acdSAlan Stern else 51617230acdSAlan Stern link_async(uhci, qh); 51717230acdSAlan Stern } 51817230acdSAlan Stern 51917230acdSAlan Stern /* 52017230acdSAlan Stern * Unlink a high-period interrupt QH from the schedule 52117230acdSAlan Stern */ 52217230acdSAlan Stern static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) 52317230acdSAlan Stern { 52417230acdSAlan Stern struct uhci_qh *pqh; 52517230acdSAlan Stern 526dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 52717230acdSAlan Stern pqh->link = qh->link; 52817230acdSAlan Stern mb(); 52917230acdSAlan Stern } 53017230acdSAlan Stern 53117230acdSAlan Stern /* 53217230acdSAlan Stern * Unlink a period-1 interrupt or async QH from the schedule 53317230acdSAlan Stern */ 53417230acdSAlan Stern static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) 53517230acdSAlan Stern { 536e009f1b2SAlan Stern struct uhci_qh *pqh; 53751e2f62fSJan Andersson __hc32 link_to_next_qh = qh->link; 53817230acdSAlan Stern 53917230acdSAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 54017230acdSAlan Stern pqh->link = link_to_next_qh; 541e009f1b2SAlan Stern 542e009f1b2SAlan Stern /* If this was the old first FSBR QH, link the terminating skeleton 543e009f1b2SAlan Stern * QH to the next (new first FSBR) QH. */ 544e009f1b2SAlan Stern if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR) 545e009f1b2SAlan Stern uhci->skel_term_qh->link = link_to_next_qh; 54617230acdSAlan Stern mb(); 547dccf4a48SAlan Stern } 5481da177e4SLinus Torvalds 5491da177e4SLinus Torvalds /* 550dccf4a48SAlan Stern * Take a QH off the hardware schedule 5511da177e4SLinus Torvalds */ 552dccf4a48SAlan Stern static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 553dccf4a48SAlan Stern { 554dccf4a48SAlan Stern if (qh->state == QH_STATE_UNLINKING) 555dccf4a48SAlan Stern return; 556dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev); 557dccf4a48SAlan Stern qh->state = QH_STATE_UNLINKING; 5581da177e4SLinus Torvalds 559dccf4a48SAlan Stern /* Unlink the QH from the schedule and record when we did it */ 56017230acdSAlan Stern if (qh->skel == SKEL_ISO) 56117230acdSAlan Stern ; 56217230acdSAlan Stern else if (qh->skel < SKEL_ASYNC) 56317230acdSAlan Stern unlink_interrupt(uhci, qh); 56417230acdSAlan Stern else 56517230acdSAlan Stern unlink_async(uhci, qh); 5661da177e4SLinus Torvalds 5671da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 568dccf4a48SAlan Stern qh->unlink_frame = uhci->frame_number; 5691da177e4SLinus Torvalds 570dccf4a48SAlan Stern /* Force an interrupt so we know when the QH is fully unlinked */ 571ba297eddSAlan Stern if (list_empty(&uhci->skel_unlink_qh->node) || uhci->is_stopped) 5721da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 5731da177e4SLinus Torvalds 574dccf4a48SAlan Stern /* Move the QH from its old list to the end of the unlinking list */ 5750ed8fee1SAlan Stern if (qh == uhci->next_qh) 5760ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 5770ed8fee1SAlan Stern node); 578dccf4a48SAlan Stern list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); 5791da177e4SLinus Torvalds } 5801da177e4SLinus Torvalds 5811da177e4SLinus Torvalds /* 582dccf4a48SAlan Stern * When we and the controller are through with a QH, it becomes IDLE. 583dccf4a48SAlan Stern * This happens when a QH has been off the schedule (on the unlinking 584dccf4a48SAlan Stern * list) for more than one frame, or when an error occurs while adding 585dccf4a48SAlan Stern * the first URB onto a new QH. 5861da177e4SLinus Torvalds */ 587dccf4a48SAlan Stern static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) 588dccf4a48SAlan Stern { 589dccf4a48SAlan Stern WARN_ON(qh->state == QH_STATE_ACTIVE); 590dccf4a48SAlan Stern 5910ed8fee1SAlan Stern if (qh == uhci->next_qh) 5920ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 5930ed8fee1SAlan Stern node); 594dccf4a48SAlan Stern list_move(&qh->node, &uhci->idle_qh_list); 595dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 596dccf4a48SAlan Stern 59759e29ed9SAlan Stern /* Now that the QH is idle, its post_td isn't being used */ 59859e29ed9SAlan Stern if (qh->post_td) { 59959e29ed9SAlan Stern uhci_free_td(uhci, qh->post_td); 60059e29ed9SAlan Stern qh->post_td = NULL; 60159e29ed9SAlan Stern } 60259e29ed9SAlan Stern 603dccf4a48SAlan Stern /* If anyone is waiting for a QH to become idle, wake them up */ 604dccf4a48SAlan Stern if (uhci->num_waiting) 605dccf4a48SAlan Stern wake_up_all(&uhci->waitqh); 6061da177e4SLinus Torvalds } 6071da177e4SLinus Torvalds 6083ca2a321SAlan Stern /* 6093ca2a321SAlan Stern * Find the highest existing bandwidth load for a given phase and period. 6103ca2a321SAlan Stern */ 6113ca2a321SAlan Stern static int uhci_highest_load(struct uhci_hcd *uhci, int phase, int period) 6123ca2a321SAlan Stern { 6133ca2a321SAlan Stern int highest_load = uhci->load[phase]; 6143ca2a321SAlan Stern 6153ca2a321SAlan Stern for (phase += period; phase < MAX_PHASE; phase += period) 6163ca2a321SAlan Stern highest_load = max_t(int, highest_load, uhci->load[phase]); 6173ca2a321SAlan Stern return highest_load; 6183ca2a321SAlan Stern } 6193ca2a321SAlan Stern 6203ca2a321SAlan Stern /* 6213ca2a321SAlan Stern * Set qh->phase to the optimal phase for a periodic transfer and 6223ca2a321SAlan Stern * check whether the bandwidth requirement is acceptable. 6233ca2a321SAlan Stern */ 6243ca2a321SAlan Stern static int uhci_check_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 6253ca2a321SAlan Stern { 6263ca2a321SAlan Stern int minimax_load; 6273ca2a321SAlan Stern 6283ca2a321SAlan Stern /* Find the optimal phase (unless it is already set) and get 6293ca2a321SAlan Stern * its load value. */ 6303ca2a321SAlan Stern if (qh->phase >= 0) 6313ca2a321SAlan Stern minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); 6323ca2a321SAlan Stern else { 6333ca2a321SAlan Stern int phase, load; 6343ca2a321SAlan Stern int max_phase = min_t(int, MAX_PHASE, qh->period); 6353ca2a321SAlan Stern 6363ca2a321SAlan Stern qh->phase = 0; 6373ca2a321SAlan Stern minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); 6383ca2a321SAlan Stern for (phase = 1; phase < max_phase; ++phase) { 6393ca2a321SAlan Stern load = uhci_highest_load(uhci, phase, qh->period); 6403ca2a321SAlan Stern if (load < minimax_load) { 6413ca2a321SAlan Stern minimax_load = load; 6423ca2a321SAlan Stern qh->phase = phase; 6433ca2a321SAlan Stern } 6443ca2a321SAlan Stern } 6453ca2a321SAlan Stern } 6463ca2a321SAlan Stern 6473ca2a321SAlan Stern /* Maximum allowable periodic bandwidth is 90%, or 900 us per frame */ 6483ca2a321SAlan Stern if (minimax_load + qh->load > 900) { 6493ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), "bandwidth allocation failed: " 6503ca2a321SAlan Stern "period %d, phase %d, %d + %d us\n", 6513ca2a321SAlan Stern qh->period, qh->phase, minimax_load, qh->load); 6523ca2a321SAlan Stern return -ENOSPC; 6533ca2a321SAlan Stern } 6543ca2a321SAlan Stern return 0; 6553ca2a321SAlan Stern } 6563ca2a321SAlan Stern 6573ca2a321SAlan Stern /* 6583ca2a321SAlan Stern * Reserve a periodic QH's bandwidth in the schedule 6593ca2a321SAlan Stern */ 6603ca2a321SAlan Stern static void uhci_reserve_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 6613ca2a321SAlan Stern { 6623ca2a321SAlan Stern int i; 6633ca2a321SAlan Stern int load = qh->load; 6643ca2a321SAlan Stern char *p = "??"; 6653ca2a321SAlan Stern 6663ca2a321SAlan Stern for (i = qh->phase; i < MAX_PHASE; i += qh->period) { 6673ca2a321SAlan Stern uhci->load[i] += load; 6683ca2a321SAlan Stern uhci->total_load += load; 6693ca2a321SAlan Stern } 6703ca2a321SAlan Stern uhci_to_hcd(uhci)->self.bandwidth_allocated = 6713ca2a321SAlan Stern uhci->total_load / MAX_PHASE; 6723ca2a321SAlan Stern switch (qh->type) { 6733ca2a321SAlan Stern case USB_ENDPOINT_XFER_INT: 6743ca2a321SAlan Stern ++uhci_to_hcd(uhci)->self.bandwidth_int_reqs; 6753ca2a321SAlan Stern p = "INT"; 6763ca2a321SAlan Stern break; 6773ca2a321SAlan Stern case USB_ENDPOINT_XFER_ISOC: 6783ca2a321SAlan Stern ++uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; 6793ca2a321SAlan Stern p = "ISO"; 6803ca2a321SAlan Stern break; 6813ca2a321SAlan Stern } 6823ca2a321SAlan Stern qh->bandwidth_reserved = 1; 6833ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), 6843ca2a321SAlan Stern "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n", 6853ca2a321SAlan Stern "reserve", qh->udev->devnum, 6863ca2a321SAlan Stern qh->hep->desc.bEndpointAddress, p, 6873ca2a321SAlan Stern qh->period, qh->phase, load); 6883ca2a321SAlan Stern } 6893ca2a321SAlan Stern 6903ca2a321SAlan Stern /* 6913ca2a321SAlan Stern * Release a periodic QH's bandwidth reservation 6923ca2a321SAlan Stern */ 6933ca2a321SAlan Stern static void uhci_release_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 6943ca2a321SAlan Stern { 6953ca2a321SAlan Stern int i; 6963ca2a321SAlan Stern int load = qh->load; 6973ca2a321SAlan Stern char *p = "??"; 6983ca2a321SAlan Stern 6993ca2a321SAlan Stern for (i = qh->phase; i < MAX_PHASE; i += qh->period) { 7003ca2a321SAlan Stern uhci->load[i] -= load; 7013ca2a321SAlan Stern uhci->total_load -= load; 7023ca2a321SAlan Stern } 7033ca2a321SAlan Stern uhci_to_hcd(uhci)->self.bandwidth_allocated = 7043ca2a321SAlan Stern uhci->total_load / MAX_PHASE; 7053ca2a321SAlan Stern switch (qh->type) { 7063ca2a321SAlan Stern case USB_ENDPOINT_XFER_INT: 7073ca2a321SAlan Stern --uhci_to_hcd(uhci)->self.bandwidth_int_reqs; 7083ca2a321SAlan Stern p = "INT"; 7093ca2a321SAlan Stern break; 7103ca2a321SAlan Stern case USB_ENDPOINT_XFER_ISOC: 7113ca2a321SAlan Stern --uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; 7123ca2a321SAlan Stern p = "ISO"; 7133ca2a321SAlan Stern break; 7143ca2a321SAlan Stern } 7153ca2a321SAlan Stern qh->bandwidth_reserved = 0; 7163ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), 7173ca2a321SAlan Stern "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n", 7183ca2a321SAlan Stern "release", qh->udev->devnum, 7193ca2a321SAlan Stern qh->hep->desc.bEndpointAddress, p, 7203ca2a321SAlan Stern qh->period, qh->phase, load); 7213ca2a321SAlan Stern } 7223ca2a321SAlan Stern 723dccf4a48SAlan Stern static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, 724dccf4a48SAlan Stern struct urb *urb) 7251da177e4SLinus Torvalds { 7261da177e4SLinus Torvalds struct urb_priv *urbp; 7271da177e4SLinus Torvalds 728c3762229SRobert P. J. Day urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_ATOMIC); 7291da177e4SLinus Torvalds if (!urbp) 7301da177e4SLinus Torvalds return NULL; 7311da177e4SLinus Torvalds 7321da177e4SLinus Torvalds urbp->urb = urb; 7331da177e4SLinus Torvalds urb->hcpriv = urbp; 734dccf4a48SAlan Stern 735dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->node); 736dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->td_list); 7371da177e4SLinus Torvalds 7381da177e4SLinus Torvalds return urbp; 7391da177e4SLinus Torvalds } 7401da177e4SLinus Torvalds 741dccf4a48SAlan Stern static void uhci_free_urb_priv(struct uhci_hcd *uhci, 742dccf4a48SAlan Stern struct urb_priv *urbp) 7431da177e4SLinus Torvalds { 7441da177e4SLinus Torvalds struct uhci_td *td, *tmp; 7451da177e4SLinus Torvalds 7465172046dSArjan van de Ven if (!list_empty(&urbp->node)) 7475172046dSArjan van de Ven dev_WARN(uhci_dev(uhci), "urb %p still on QH's list!\n", 748dccf4a48SAlan Stern urbp->urb); 7491da177e4SLinus Torvalds 7501da177e4SLinus Torvalds list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 75104538a25SAlan Stern uhci_remove_td_from_urbp(td); 75204538a25SAlan Stern uhci_free_td(uhci, td); 7531da177e4SLinus Torvalds } 7541da177e4SLinus Torvalds 7551da177e4SLinus Torvalds kmem_cache_free(uhci_up_cachep, urbp); 7561da177e4SLinus Torvalds } 7571da177e4SLinus Torvalds 7581da177e4SLinus Torvalds /* 7591da177e4SLinus Torvalds * Map status to standard result codes 7601da177e4SLinus Torvalds * 76151e2f62fSJan Andersson * <status> is (td_status(uhci, td) & 0xF60000), a.k.a. 76251e2f62fSJan Andersson * uhci_status_bits(td_status(uhci, td)). 7631da177e4SLinus Torvalds * Note: <status> does not include the TD_CTRL_NAK bit. 7641da177e4SLinus Torvalds * <dir_out> is True for output TDs and False for input TDs. 7651da177e4SLinus Torvalds */ 7661da177e4SLinus Torvalds static int uhci_map_status(int status, int dir_out) 7671da177e4SLinus Torvalds { 7681da177e4SLinus Torvalds if (!status) 7691da177e4SLinus Torvalds return 0; 7701da177e4SLinus Torvalds if (status & TD_CTRL_BITSTUFF) /* Bitstuff error */ 7711da177e4SLinus Torvalds return -EPROTO; 7721da177e4SLinus Torvalds if (status & TD_CTRL_CRCTIMEO) { /* CRC/Timeout */ 7731da177e4SLinus Torvalds if (dir_out) 7741da177e4SLinus Torvalds return -EPROTO; 7751da177e4SLinus Torvalds else 7761da177e4SLinus Torvalds return -EILSEQ; 7771da177e4SLinus Torvalds } 7781da177e4SLinus Torvalds if (status & TD_CTRL_BABBLE) /* Babble */ 7791da177e4SLinus Torvalds return -EOVERFLOW; 7801da177e4SLinus Torvalds if (status & TD_CTRL_DBUFERR) /* Buffer error */ 7811da177e4SLinus Torvalds return -ENOSR; 7821da177e4SLinus Torvalds if (status & TD_CTRL_STALLED) /* Stalled */ 7831da177e4SLinus Torvalds return -EPIPE; 7841da177e4SLinus Torvalds return 0; 7851da177e4SLinus Torvalds } 7861da177e4SLinus Torvalds 7871da177e4SLinus Torvalds /* 7881da177e4SLinus Torvalds * Control transfers 7891da177e4SLinus Torvalds */ 790dccf4a48SAlan Stern static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, 791dccf4a48SAlan Stern struct uhci_qh *qh) 7921da177e4SLinus Torvalds { 7931da177e4SLinus Torvalds struct uhci_td *td; 7941da177e4SLinus Torvalds unsigned long destination, status; 79529cc8897SKuninori Morimoto int maxsze = usb_endpoint_maxp(&qh->hep->desc); 7961da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 7971da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 79851e2f62fSJan Andersson __hc32 *plink; 79904538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 80017230acdSAlan Stern int skel; 8011da177e4SLinus Torvalds 8021da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 8031da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP; 8041da177e4SLinus Torvalds 805af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 806af0bb599SAlan Stern status = uhci_maxerr(3); 8071da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 8081da177e4SLinus Torvalds status |= TD_CTRL_LS; 8091da177e4SLinus Torvalds 8101da177e4SLinus Torvalds /* 8111da177e4SLinus Torvalds * Build the TD for the control request setup packet 8121da177e4SLinus Torvalds */ 813af0bb599SAlan Stern td = qh->dummy_td; 81404538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 81551e2f62fSJan Andersson uhci_fill_td(uhci, td, status, destination | uhci_explen(8), 8161da177e4SLinus Torvalds urb->setup_dma); 817dccf4a48SAlan Stern plink = &td->link; 818af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 8191da177e4SLinus Torvalds 8201da177e4SLinus Torvalds /* 8211da177e4SLinus Torvalds * If direction is "send", change the packet ID from SETUP (0x2D) 8221da177e4SLinus Torvalds * to OUT (0xE1). Else change it from SETUP to IN (0x69) and 8231da177e4SLinus Torvalds * set Short Packet Detect (SPD) for all data packets. 824e7e7c360SAlan Stern * 825e7e7c360SAlan Stern * 0-length transfers always get treated as "send". 8261da177e4SLinus Torvalds */ 827e7e7c360SAlan Stern if (usb_pipeout(urb->pipe) || len == 0) 8281da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_OUT); 8291da177e4SLinus Torvalds else { 8301da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_IN); 8311da177e4SLinus Torvalds status |= TD_CTRL_SPD; 8321da177e4SLinus Torvalds } 8331da177e4SLinus Torvalds 8341da177e4SLinus Torvalds /* 835687f5f34SAlan Stern * Build the DATA TDs 8361da177e4SLinus Torvalds */ 8371da177e4SLinus Torvalds while (len > 0) { 838e7e7c360SAlan Stern int pktsze = maxsze; 839e7e7c360SAlan Stern 840e7e7c360SAlan Stern if (len <= pktsze) { /* The last data packet */ 841e7e7c360SAlan Stern pktsze = len; 842e7e7c360SAlan Stern status &= ~TD_CTRL_SPD; 843e7e7c360SAlan Stern } 8441da177e4SLinus Torvalds 8452532178aSAlan Stern td = uhci_alloc_td(uhci); 8461da177e4SLinus Torvalds if (!td) 847af0bb599SAlan Stern goto nomem; 84851e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 8491da177e4SLinus Torvalds 8501da177e4SLinus Torvalds /* Alternate Data0/1 (start with Data1) */ 8511da177e4SLinus Torvalds destination ^= TD_TOKEN_TOGGLE; 8521da177e4SLinus Torvalds 85304538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 85451e2f62fSJan Andersson uhci_fill_td(uhci, td, status, 85551e2f62fSJan Andersson destination | uhci_explen(pktsze), data); 856dccf4a48SAlan Stern plink = &td->link; 8571da177e4SLinus Torvalds 8581da177e4SLinus Torvalds data += pktsze; 8591da177e4SLinus Torvalds len -= pktsze; 8601da177e4SLinus Torvalds } 8611da177e4SLinus Torvalds 8621da177e4SLinus Torvalds /* 8631da177e4SLinus Torvalds * Build the final TD for control status 8641da177e4SLinus Torvalds */ 8652532178aSAlan Stern td = uhci_alloc_td(uhci); 8661da177e4SLinus Torvalds if (!td) 867af0bb599SAlan Stern goto nomem; 86851e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 8691da177e4SLinus Torvalds 870e7e7c360SAlan Stern /* Change direction for the status transaction */ 871e7e7c360SAlan Stern destination ^= (USB_PID_IN ^ USB_PID_OUT); 8721da177e4SLinus Torvalds destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ 8731da177e4SLinus Torvalds 87404538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 87551e2f62fSJan Andersson uhci_fill_td(uhci, td, status | TD_CTRL_IOC, 876fa346568SAlan Stern destination | uhci_explen(0), 0); 877af0bb599SAlan Stern plink = &td->link; 878af0bb599SAlan Stern 879af0bb599SAlan Stern /* 880af0bb599SAlan Stern * Build the new dummy TD and activate the old one 881af0bb599SAlan Stern */ 882af0bb599SAlan Stern td = uhci_alloc_td(uhci); 883af0bb599SAlan Stern if (!td) 884af0bb599SAlan Stern goto nomem; 88551e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 886af0bb599SAlan Stern 88751e2f62fSJan Andersson uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); 888af0bb599SAlan Stern wmb(); 88951e2f62fSJan Andersson qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); 890af0bb599SAlan Stern qh->dummy_td = td; 8911da177e4SLinus Torvalds 8921da177e4SLinus Torvalds /* Low-speed transfers get a different queue, and won't hog the bus. 8931da177e4SLinus Torvalds * Also, some devices enumerate better without FSBR; the easiest way 8941da177e4SLinus Torvalds * to do that is to put URBs on the low-speed queue while the device 895630aa3cfSAlan Stern * isn't in the CONFIGURED state. */ 8961da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW || 897630aa3cfSAlan Stern urb->dev->state != USB_STATE_CONFIGURED) 89817230acdSAlan Stern skel = SKEL_LS_CONTROL; 8991da177e4SLinus Torvalds else { 90017230acdSAlan Stern skel = SKEL_FS_CONTROL; 90184afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 9021da177e4SLinus Torvalds } 90317230acdSAlan Stern if (qh->state != QH_STATE_ACTIVE) 90417230acdSAlan Stern qh->skel = skel; 905dccf4a48SAlan Stern return 0; 906af0bb599SAlan Stern 907af0bb599SAlan Stern nomem: 908af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 90904538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 910af0bb599SAlan Stern return -ENOMEM; 9111da177e4SLinus Torvalds } 9121da177e4SLinus Torvalds 9131da177e4SLinus Torvalds /* 9141da177e4SLinus Torvalds * Common submit for bulk and interrupt 9151da177e4SLinus Torvalds */ 916dccf4a48SAlan Stern static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, 917dccf4a48SAlan Stern struct uhci_qh *qh) 9181da177e4SLinus Torvalds { 9191da177e4SLinus Torvalds struct uhci_td *td; 9201da177e4SLinus Torvalds unsigned long destination, status; 92129cc8897SKuninori Morimoto int maxsze = usb_endpoint_maxp(&qh->hep->desc); 9221da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 923689d6eacSMing Lei int this_sg_len; 924689d6eacSMing Lei dma_addr_t data; 92551e2f62fSJan Andersson __hc32 *plink; 92604538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 927af0bb599SAlan Stern unsigned int toggle; 928689d6eacSMing Lei struct scatterlist *sg; 929689d6eacSMing Lei int i; 9301da177e4SLinus Torvalds 9311da177e4SLinus Torvalds if (len < 0) 9321da177e4SLinus Torvalds return -EINVAL; 9331da177e4SLinus Torvalds 9341da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 9351da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 936af0bb599SAlan Stern toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), 937af0bb599SAlan Stern usb_pipeout(urb->pipe)); 9381da177e4SLinus Torvalds 939af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 940af0bb599SAlan Stern status = uhci_maxerr(3); 9411da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 9421da177e4SLinus Torvalds status |= TD_CTRL_LS; 9431da177e4SLinus Torvalds if (usb_pipein(urb->pipe)) 9441da177e4SLinus Torvalds status |= TD_CTRL_SPD; 9451da177e4SLinus Torvalds 946bc677d5bSClemens Ladisch i = urb->num_mapped_sgs; 947689d6eacSMing Lei if (len > 0 && i > 0) { 948689d6eacSMing Lei sg = urb->sg; 949689d6eacSMing Lei data = sg_dma_address(sg); 950689d6eacSMing Lei 951689d6eacSMing Lei /* urb->transfer_buffer_length may be smaller than the 952689d6eacSMing Lei * size of the scatterlist (or vice versa) 953689d6eacSMing Lei */ 954689d6eacSMing Lei this_sg_len = min_t(int, sg_dma_len(sg), len); 955689d6eacSMing Lei } else { 956689d6eacSMing Lei sg = NULL; 957689d6eacSMing Lei data = urb->transfer_dma; 958689d6eacSMing Lei this_sg_len = len; 959689d6eacSMing Lei } 9601da177e4SLinus Torvalds /* 961687f5f34SAlan Stern * Build the DATA TDs 9621da177e4SLinus Torvalds */ 963af0bb599SAlan Stern plink = NULL; 964af0bb599SAlan Stern td = qh->dummy_td; 965689d6eacSMing Lei for (;;) { /* Allow zero length packets */ 9661da177e4SLinus Torvalds int pktsze = maxsze; 9671da177e4SLinus Torvalds 968dccf4a48SAlan Stern if (len <= pktsze) { /* The last packet */ 9691da177e4SLinus Torvalds pktsze = len; 9701da177e4SLinus Torvalds if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) 9711da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 9721da177e4SLinus Torvalds } 9731da177e4SLinus Torvalds 974af0bb599SAlan Stern if (plink) { 9752532178aSAlan Stern td = uhci_alloc_td(uhci); 9761da177e4SLinus Torvalds if (!td) 977af0bb599SAlan Stern goto nomem; 97851e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 979af0bb599SAlan Stern } 98004538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 98151e2f62fSJan Andersson uhci_fill_td(uhci, td, status, 982dccf4a48SAlan Stern destination | uhci_explen(pktsze) | 983af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 9841da177e4SLinus Torvalds data); 985dccf4a48SAlan Stern plink = &td->link; 986af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 9871da177e4SLinus Torvalds 988af0bb599SAlan Stern toggle ^= 1; 989689d6eacSMing Lei data += pktsze; 990689d6eacSMing Lei this_sg_len -= pktsze; 991689d6eacSMing Lei len -= maxsze; 992689d6eacSMing Lei if (this_sg_len <= 0) { 993689d6eacSMing Lei if (--i <= 0 || len <= 0) 994689d6eacSMing Lei break; 995689d6eacSMing Lei sg = sg_next(sg); 996689d6eacSMing Lei data = sg_dma_address(sg); 997689d6eacSMing Lei this_sg_len = min_t(int, sg_dma_len(sg), len); 998689d6eacSMing Lei } 999689d6eacSMing Lei } 10001da177e4SLinus Torvalds 10011da177e4SLinus Torvalds /* 10021da177e4SLinus Torvalds * URB_ZERO_PACKET means adding a 0-length packet, if direction 10031da177e4SLinus Torvalds * is OUT and the transfer_length was an exact multiple of maxsze, 10041da177e4SLinus Torvalds * hence (len = transfer_length - N * maxsze) == 0 10051da177e4SLinus Torvalds * however, if transfer_length == 0, the zero packet was already 10061da177e4SLinus Torvalds * prepared above. 10071da177e4SLinus Torvalds */ 1008dccf4a48SAlan Stern if ((urb->transfer_flags & URB_ZERO_PACKET) && 1009dccf4a48SAlan Stern usb_pipeout(urb->pipe) && len == 0 && 1010dccf4a48SAlan Stern urb->transfer_buffer_length > 0) { 10112532178aSAlan Stern td = uhci_alloc_td(uhci); 10121da177e4SLinus Torvalds if (!td) 1013af0bb599SAlan Stern goto nomem; 101451e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 10151da177e4SLinus Torvalds 101604538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 101751e2f62fSJan Andersson uhci_fill_td(uhci, td, status, 1018af0bb599SAlan Stern destination | uhci_explen(0) | 1019af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 10201da177e4SLinus Torvalds data); 1021af0bb599SAlan Stern plink = &td->link; 10221da177e4SLinus Torvalds 1023af0bb599SAlan Stern toggle ^= 1; 10241da177e4SLinus Torvalds } 10251da177e4SLinus Torvalds 10261da177e4SLinus Torvalds /* Set the interrupt-on-completion flag on the last packet. 10271da177e4SLinus Torvalds * A more-or-less typical 4 KB URB (= size of one memory page) 10281da177e4SLinus Torvalds * will require about 3 ms to transfer; that's a little on the 10291da177e4SLinus Torvalds * fast side but not enough to justify delaying an interrupt 10301da177e4SLinus Torvalds * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT 10311da177e4SLinus Torvalds * flag setting. */ 103251e2f62fSJan Andersson td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); 10331da177e4SLinus Torvalds 1034af0bb599SAlan Stern /* 1035af0bb599SAlan Stern * Build the new dummy TD and activate the old one 1036af0bb599SAlan Stern */ 1037af0bb599SAlan Stern td = uhci_alloc_td(uhci); 1038af0bb599SAlan Stern if (!td) 1039af0bb599SAlan Stern goto nomem; 104051e2f62fSJan Andersson *plink = LINK_TO_TD(uhci, td); 1041af0bb599SAlan Stern 104251e2f62fSJan Andersson uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); 1043af0bb599SAlan Stern wmb(); 104451e2f62fSJan Andersson qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); 1045af0bb599SAlan Stern qh->dummy_td = td; 1046af0bb599SAlan Stern 1047af0bb599SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 1048af0bb599SAlan Stern usb_pipeout(urb->pipe), toggle); 1049dccf4a48SAlan Stern return 0; 1050af0bb599SAlan Stern 1051af0bb599SAlan Stern nomem: 1052af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 105304538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 1054af0bb599SAlan Stern return -ENOMEM; 10551da177e4SLinus Torvalds } 10561da177e4SLinus Torvalds 105717230acdSAlan Stern static int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, 1058dccf4a48SAlan Stern struct uhci_qh *qh) 10591da177e4SLinus Torvalds { 10601da177e4SLinus Torvalds int ret; 10611da177e4SLinus Torvalds 10621da177e4SLinus Torvalds /* Can't have low-speed bulk transfers */ 10631da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 10641da177e4SLinus Torvalds return -EINVAL; 10651da177e4SLinus Torvalds 106617230acdSAlan Stern if (qh->state != QH_STATE_ACTIVE) 106717230acdSAlan Stern qh->skel = SKEL_BULK; 1068dccf4a48SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 1069dccf4a48SAlan Stern if (ret == 0) 107084afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 10711da177e4SLinus Torvalds return ret; 10721da177e4SLinus Torvalds } 10731da177e4SLinus Torvalds 1074caf3827aSAlan Stern static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, 1075dccf4a48SAlan Stern struct uhci_qh *qh) 10761da177e4SLinus Torvalds { 10773ca2a321SAlan Stern int ret; 1078caf3827aSAlan Stern 1079dccf4a48SAlan Stern /* USB 1.1 interrupt transfers only involve one packet per interval. 1080dccf4a48SAlan Stern * Drivers can submit URBs of any length, but longer ones will need 1081dccf4a48SAlan Stern * multiple intervals to complete. 10821da177e4SLinus Torvalds */ 1083caf3827aSAlan Stern 10843ca2a321SAlan Stern if (!qh->bandwidth_reserved) { 10853ca2a321SAlan Stern int exponent; 10863ca2a321SAlan Stern 1087caf3827aSAlan Stern /* Figure out which power-of-two queue to use */ 1088caf3827aSAlan Stern for (exponent = 7; exponent >= 0; --exponent) { 1089caf3827aSAlan Stern if ((1 << exponent) <= urb->interval) 1090caf3827aSAlan Stern break; 1091caf3827aSAlan Stern } 1092caf3827aSAlan Stern if (exponent < 0) 1093caf3827aSAlan Stern return -EINVAL; 1094e58dcebcSAlan Stern 1095e58dcebcSAlan Stern /* If the slot is full, try a lower period */ 1096e58dcebcSAlan Stern do { 10973ca2a321SAlan Stern qh->period = 1 << exponent; 109817230acdSAlan Stern qh->skel = SKEL_INDEX(exponent); 1099caf3827aSAlan Stern 11003ca2a321SAlan Stern /* For now, interrupt phase is fixed by the layout 1101e58dcebcSAlan Stern * of the QH lists. 1102e58dcebcSAlan Stern */ 11033ca2a321SAlan Stern qh->phase = (qh->period / 2) & (MAX_PHASE - 1); 11043ca2a321SAlan Stern ret = uhci_check_bandwidth(uhci, qh); 1105e58dcebcSAlan Stern } while (ret != 0 && --exponent >= 0); 11063ca2a321SAlan Stern if (ret) 11073ca2a321SAlan Stern return ret; 11083ca2a321SAlan Stern } else if (qh->period > urb->interval) 11093ca2a321SAlan Stern return -EINVAL; /* Can't decrease the period */ 11103ca2a321SAlan Stern 11113ca2a321SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 11123ca2a321SAlan Stern if (ret == 0) { 11133ca2a321SAlan Stern urb->interval = qh->period; 11143ca2a321SAlan Stern if (!qh->bandwidth_reserved) 11153ca2a321SAlan Stern uhci_reserve_bandwidth(uhci, qh); 11163ca2a321SAlan Stern } 11173ca2a321SAlan Stern return ret; 11181da177e4SLinus Torvalds } 11191da177e4SLinus Torvalds 11201da177e4SLinus Torvalds /* 1121b1869000SAlan Stern * Fix up the data structures following a short transfer 1122b1869000SAlan Stern */ 1123b1869000SAlan Stern static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, 112459e29ed9SAlan Stern struct uhci_qh *qh, struct urb_priv *urbp) 1125b1869000SAlan Stern { 1126b1869000SAlan Stern struct uhci_td *td; 112759e29ed9SAlan Stern struct list_head *tmp; 112859e29ed9SAlan Stern int ret; 1129b1869000SAlan Stern 1130b1869000SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, list); 1131b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) { 1132b1869000SAlan Stern 1133b1869000SAlan Stern /* When a control transfer is short, we have to restart 1134b1869000SAlan Stern * the queue at the status stage transaction, which is 1135b1869000SAlan Stern * the last TD. */ 113659e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 113751e2f62fSJan Andersson qh->element = LINK_TO_TD(uhci, td); 113859e29ed9SAlan Stern tmp = td->list.prev; 1139b1869000SAlan Stern ret = -EINPROGRESS; 1140b1869000SAlan Stern 114159e29ed9SAlan Stern } else { 1142b1869000SAlan Stern 1143b1869000SAlan Stern /* When a bulk/interrupt transfer is short, we have to 1144b1869000SAlan Stern * fix up the toggles of the following URBs on the queue 1145b1869000SAlan Stern * before restarting the queue at the next URB. */ 114651e2f62fSJan Andersson qh->initial_toggle = 114751e2f62fSJan Andersson uhci_toggle(td_token(uhci, qh->post_td)) ^ 1; 114851e2f62fSJan Andersson uhci_fixup_toggles(uhci, qh, 1); 1149b1869000SAlan Stern 115059e29ed9SAlan Stern if (list_empty(&urbp->td_list)) 115159e29ed9SAlan Stern td = qh->post_td; 1152b1869000SAlan Stern qh->element = td->link; 115359e29ed9SAlan Stern tmp = urbp->td_list.prev; 115459e29ed9SAlan Stern ret = 0; 1155b1869000SAlan Stern } 1156b1869000SAlan Stern 115759e29ed9SAlan Stern /* Remove all the TDs we skipped over, from tmp back to the start */ 115859e29ed9SAlan Stern while (tmp != &urbp->td_list) { 115959e29ed9SAlan Stern td = list_entry(tmp, struct uhci_td, list); 116059e29ed9SAlan Stern tmp = tmp->prev; 116159e29ed9SAlan Stern 116204538a25SAlan Stern uhci_remove_td_from_urbp(td); 116304538a25SAlan Stern uhci_free_td(uhci, td); 116459e29ed9SAlan Stern } 1165b1869000SAlan Stern return ret; 1166b1869000SAlan Stern } 1167b1869000SAlan Stern 1168b1869000SAlan Stern /* 1169b1869000SAlan Stern * Common result for control, bulk, and interrupt 1170b1869000SAlan Stern */ 1171b1869000SAlan Stern static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) 1172b1869000SAlan Stern { 1173b1869000SAlan Stern struct urb_priv *urbp = urb->hcpriv; 1174b1869000SAlan Stern struct uhci_qh *qh = urbp->qh; 117559e29ed9SAlan Stern struct uhci_td *td, *tmp; 1176b1869000SAlan Stern unsigned status; 1177b1869000SAlan Stern int ret = 0; 1178b1869000SAlan Stern 117959e29ed9SAlan Stern list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 1180b1869000SAlan Stern unsigned int ctrlstat; 1181b1869000SAlan Stern int len; 1182b1869000SAlan Stern 118351e2f62fSJan Andersson ctrlstat = td_status(uhci, td); 1184b1869000SAlan Stern status = uhci_status_bits(ctrlstat); 1185b1869000SAlan Stern if (status & TD_CTRL_ACTIVE) 1186b1869000SAlan Stern return -EINPROGRESS; 1187b1869000SAlan Stern 1188b1869000SAlan Stern len = uhci_actual_length(ctrlstat); 1189b1869000SAlan Stern urb->actual_length += len; 1190b1869000SAlan Stern 1191b1869000SAlan Stern if (status) { 1192b1869000SAlan Stern ret = uhci_map_status(status, 119351e2f62fSJan Andersson uhci_packetout(td_token(uhci, td))); 1194b1869000SAlan Stern if ((debug == 1 && ret != -EPIPE) || debug > 1) { 1195b1869000SAlan Stern /* Some debugging code */ 1196be3cbc5fSDavid Brownell dev_dbg(&urb->dev->dev, 1197b1869000SAlan Stern "%s: failed with status %x\n", 1198441b62c1SHarvey Harrison __func__, status); 1199b1869000SAlan Stern 1200b1869000SAlan Stern if (debug > 1 && errbuf) { 1201b1869000SAlan Stern /* Print the chain for debugging */ 1202e009f1b2SAlan Stern uhci_show_qh(uhci, urbp->qh, errbuf, 1203b1869000SAlan Stern ERRBUF_LEN, 0); 1204b1869000SAlan Stern lprintk(errbuf); 1205b1869000SAlan Stern } 1206b1869000SAlan Stern } 1207b1869000SAlan Stern 1208e7e7c360SAlan Stern /* Did we receive a short packet? */ 120951e2f62fSJan Andersson } else if (len < uhci_expected_length(td_token(uhci, td))) { 1210b1869000SAlan Stern 1211e7e7c360SAlan Stern /* For control transfers, go to the status TD if 1212e7e7c360SAlan Stern * this isn't already the last data TD */ 1213e7e7c360SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) { 1214e7e7c360SAlan Stern if (td->list.next != urbp->td_list.prev) 1215e7e7c360SAlan Stern ret = 1; 1216e7e7c360SAlan Stern } 1217e7e7c360SAlan Stern 1218e7e7c360SAlan Stern /* For bulk and interrupt, this may be an error */ 1219e7e7c360SAlan Stern else if (urb->transfer_flags & URB_SHORT_NOT_OK) 1220b1869000SAlan Stern ret = -EREMOTEIO; 1221f443ddf1SAlan Stern 1222f443ddf1SAlan Stern /* Fixup needed only if this isn't the URB's last TD */ 1223f443ddf1SAlan Stern else if (&td->list != urbp->td_list.prev) 1224b1869000SAlan Stern ret = 1; 1225b1869000SAlan Stern } 1226b1869000SAlan Stern 122704538a25SAlan Stern uhci_remove_td_from_urbp(td); 122859e29ed9SAlan Stern if (qh->post_td) 122904538a25SAlan Stern uhci_free_td(uhci, qh->post_td); 123059e29ed9SAlan Stern qh->post_td = td; 123159e29ed9SAlan Stern 1232b1869000SAlan Stern if (ret != 0) 1233b1869000SAlan Stern goto err; 1234b1869000SAlan Stern } 1235b1869000SAlan Stern return ret; 1236b1869000SAlan Stern 1237b1869000SAlan Stern err: 1238b1869000SAlan Stern if (ret < 0) { 1239b1869000SAlan Stern /* Note that the queue has stopped and save 1240b1869000SAlan Stern * the next toggle value */ 124151e2f62fSJan Andersson qh->element = UHCI_PTR_TERM(uhci); 1242b1869000SAlan Stern qh->is_stopped = 1; 1243b1869000SAlan Stern qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); 124451e2f62fSJan Andersson qh->initial_toggle = uhci_toggle(td_token(uhci, td)) ^ 1245b1869000SAlan Stern (ret == -EREMOTEIO); 1246b1869000SAlan Stern 1247b1869000SAlan Stern } else /* Short packet received */ 124859e29ed9SAlan Stern ret = uhci_fixup_short_transfer(uhci, qh, urbp); 1249b1869000SAlan Stern return ret; 1250b1869000SAlan Stern } 1251b1869000SAlan Stern 1252b1869000SAlan Stern /* 12531da177e4SLinus Torvalds * Isochronous transfers 12541da177e4SLinus Torvalds */ 1255dccf4a48SAlan Stern static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, 1256dccf4a48SAlan Stern struct uhci_qh *qh) 12571da177e4SLinus Torvalds { 1258dccf4a48SAlan Stern struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ 1259*c44b2250SAlan Stern int i; 1260*c44b2250SAlan Stern unsigned frame, next; 1261dccf4a48SAlan Stern unsigned long destination, status; 1262b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 12631da177e4SLinus Torvalds 1264caf3827aSAlan Stern /* Values must not be too big (could overflow below) */ 1265caf3827aSAlan Stern if (urb->interval >= UHCI_NUMFRAMES || 1266caf3827aSAlan Stern urb->number_of_packets >= UHCI_NUMFRAMES) 1267caf3827aSAlan Stern return -EFBIG; 1268caf3827aSAlan Stern 1269*c44b2250SAlan Stern uhci_get_current_frame_number(uhci); 1270*c44b2250SAlan Stern 1271caf3827aSAlan Stern /* Check the period and figure out the starting frame number */ 12723ca2a321SAlan Stern if (!qh->bandwidth_reserved) { 12733ca2a321SAlan Stern qh->period = urb->interval; 12743ca2a321SAlan Stern qh->phase = -1; /* Find the best phase */ 12753ca2a321SAlan Stern i = uhci_check_bandwidth(uhci, qh); 12763ca2a321SAlan Stern if (i) 12773ca2a321SAlan Stern return i; 12783ca2a321SAlan Stern 12793ca2a321SAlan Stern /* Allow a little time to allocate the TDs */ 1280*c44b2250SAlan Stern next = uhci->frame_number + 10; 1281*c44b2250SAlan Stern frame = qh->phase; 12823ca2a321SAlan Stern 1283*c44b2250SAlan Stern /* Round up to the first available slot */ 1284*c44b2250SAlan Stern frame += (next - frame + qh->period - 1) & -qh->period; 12853ca2a321SAlan Stern 1286caf3827aSAlan Stern } else if (qh->period != urb->interval) { 1287caf3827aSAlan Stern return -EINVAL; /* Can't change the period */ 1288caf3827aSAlan Stern 12897898ffc5SAlan Stern } else { 1290*c44b2250SAlan Stern next = uhci->frame_number + 2; 1291*c44b2250SAlan Stern 12927898ffc5SAlan Stern /* Find the next unused frame */ 1293caf3827aSAlan Stern if (list_empty(&qh->queue)) { 1294c8155cc5SAlan Stern frame = qh->iso_frame; 1295caf3827aSAlan Stern } else { 1296caf3827aSAlan Stern struct urb *lurb; 1297caf3827aSAlan Stern 1298caf3827aSAlan Stern lurb = list_entry(qh->queue.prev, 1299caf3827aSAlan Stern struct urb_priv, node)->urb; 1300caf3827aSAlan Stern frame = lurb->start_frame + 1301caf3827aSAlan Stern lurb->number_of_packets * 1302caf3827aSAlan Stern lurb->interval; 1303caf3827aSAlan Stern } 1304*c44b2250SAlan Stern 1305*c44b2250SAlan Stern /* Fell behind? */ 1306*c44b2250SAlan Stern if (uhci_frame_before_eq(frame, next)) { 1307*c44b2250SAlan Stern 1308*c44b2250SAlan Stern /* USB_ISO_ASAP: Round up to the first available slot */ 1309*c44b2250SAlan Stern if (urb->transfer_flags & URB_ISO_ASAP) 1310*c44b2250SAlan Stern frame += (next - frame + qh->period - 1) & 1311*c44b2250SAlan Stern -qh->period; 1312*c44b2250SAlan Stern 1313*c44b2250SAlan Stern /* 1314*c44b2250SAlan Stern * Not ASAP: Use the next slot in the stream. If 1315*c44b2250SAlan Stern * the entire URB falls before the threshold, fail. 13167898ffc5SAlan Stern */ 1317*c44b2250SAlan Stern else if (!uhci_frame_before_eq(next, 1318*c44b2250SAlan Stern frame + (urb->number_of_packets - 1) * 1319*c44b2250SAlan Stern qh->period)) 1320*c44b2250SAlan Stern return -EXDEV; 13217898ffc5SAlan Stern } 1322caf3827aSAlan Stern } 1323caf3827aSAlan Stern 1324caf3827aSAlan Stern /* Make sure we won't have to go too far into the future */ 1325c8155cc5SAlan Stern if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, 1326*c44b2250SAlan Stern frame + urb->number_of_packets * urb->interval)) 13270ed8fee1SAlan Stern return -EFBIG; 1328*c44b2250SAlan Stern urb->start_frame = frame; 13290ed8fee1SAlan Stern 13301da177e4SLinus Torvalds status = TD_CTRL_ACTIVE | TD_CTRL_IOS; 13311da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 13321da177e4SLinus Torvalds 1333b81d3436SAlan Stern for (i = 0; i < urb->number_of_packets; i++) { 13342532178aSAlan Stern td = uhci_alloc_td(uhci); 13351da177e4SLinus Torvalds if (!td) 13361da177e4SLinus Torvalds return -ENOMEM; 13371da177e4SLinus Torvalds 133804538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 133951e2f62fSJan Andersson uhci_fill_td(uhci, td, status, destination | 1340dccf4a48SAlan Stern uhci_explen(urb->iso_frame_desc[i].length), 1341dccf4a48SAlan Stern urb->transfer_dma + 1342dccf4a48SAlan Stern urb->iso_frame_desc[i].offset); 1343b81d3436SAlan Stern } 13441da177e4SLinus Torvalds 1345dccf4a48SAlan Stern /* Set the interrupt-on-completion flag on the last packet. */ 134651e2f62fSJan Andersson td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); 1347dccf4a48SAlan Stern 1348dccf4a48SAlan Stern /* Add the TDs to the frame list */ 1349b81d3436SAlan Stern frame = urb->start_frame; 1350b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 1351dccf4a48SAlan Stern uhci_insert_td_in_frame_list(uhci, td, frame); 1352c8155cc5SAlan Stern frame += qh->period; 1353c8155cc5SAlan Stern } 1354c8155cc5SAlan Stern 1355c8155cc5SAlan Stern if (list_empty(&qh->queue)) { 1356c8155cc5SAlan Stern qh->iso_packet_desc = &urb->iso_frame_desc[0]; 1357c8155cc5SAlan Stern qh->iso_frame = urb->start_frame; 13581da177e4SLinus Torvalds } 13591da177e4SLinus Torvalds 136017230acdSAlan Stern qh->skel = SKEL_ISO; 13613ca2a321SAlan Stern if (!qh->bandwidth_reserved) 13623ca2a321SAlan Stern uhci_reserve_bandwidth(uhci, qh); 1363dccf4a48SAlan Stern return 0; 13641da177e4SLinus Torvalds } 13651da177e4SLinus Torvalds 13661da177e4SLinus Torvalds static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) 13671da177e4SLinus Torvalds { 1368c8155cc5SAlan Stern struct uhci_td *td, *tmp; 1369c8155cc5SAlan Stern struct urb_priv *urbp = urb->hcpriv; 1370c8155cc5SAlan Stern struct uhci_qh *qh = urbp->qh; 1371c8155cc5SAlan Stern 1372c8155cc5SAlan Stern list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 1373c8155cc5SAlan Stern unsigned int ctrlstat; 13741da177e4SLinus Torvalds int status; 13751da177e4SLinus Torvalds int actlength; 13761da177e4SLinus Torvalds 1377c8155cc5SAlan Stern if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame)) 13781da177e4SLinus Torvalds return -EINPROGRESS; 13791da177e4SLinus Torvalds 1380c8155cc5SAlan Stern uhci_remove_tds_from_frame(uhci, qh->iso_frame); 13811da177e4SLinus Torvalds 138251e2f62fSJan Andersson ctrlstat = td_status(uhci, td); 1383c8155cc5SAlan Stern if (ctrlstat & TD_CTRL_ACTIVE) { 1384c8155cc5SAlan Stern status = -EXDEV; /* TD was added too late? */ 1385c8155cc5SAlan Stern } else { 13861da177e4SLinus Torvalds status = uhci_map_status(uhci_status_bits(ctrlstat), 13871da177e4SLinus Torvalds usb_pipeout(urb->pipe)); 1388c8155cc5SAlan Stern actlength = uhci_actual_length(ctrlstat); 1389c8155cc5SAlan Stern 1390c8155cc5SAlan Stern urb->actual_length += actlength; 1391c8155cc5SAlan Stern qh->iso_packet_desc->actual_length = actlength; 1392c8155cc5SAlan Stern qh->iso_packet_desc->status = status; 1393c8155cc5SAlan Stern } 1394ee7d1f3fSAlan Stern if (status) 13951da177e4SLinus Torvalds urb->error_count++; 13961da177e4SLinus Torvalds 1397c8155cc5SAlan Stern uhci_remove_td_from_urbp(td); 1398c8155cc5SAlan Stern uhci_free_td(uhci, td); 1399c8155cc5SAlan Stern qh->iso_frame += qh->period; 1400c8155cc5SAlan Stern ++qh->iso_packet_desc; 14011da177e4SLinus Torvalds } 1402ee7d1f3fSAlan Stern return 0; 14031da177e4SLinus Torvalds } 14041da177e4SLinus Torvalds 14051da177e4SLinus Torvalds static int uhci_urb_enqueue(struct usb_hcd *hcd, 140655016f10SAl Viro struct urb *urb, gfp_t mem_flags) 14071da177e4SLinus Torvalds { 14081da177e4SLinus Torvalds int ret; 14091da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 14101da177e4SLinus Torvalds unsigned long flags; 1411dccf4a48SAlan Stern struct urb_priv *urbp; 1412dccf4a48SAlan Stern struct uhci_qh *qh; 14131da177e4SLinus Torvalds 14141da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 14151da177e4SLinus Torvalds 1416e9df41c5SAlan Stern ret = usb_hcd_link_urb_to_ep(hcd, urb); 1417e9df41c5SAlan Stern if (ret) 1418e9df41c5SAlan Stern goto done_not_linked; 14191da177e4SLinus Torvalds 14201da177e4SLinus Torvalds ret = -ENOMEM; 1421dccf4a48SAlan Stern urbp = uhci_alloc_urb_priv(uhci, urb); 1422dccf4a48SAlan Stern if (!urbp) 1423dccf4a48SAlan Stern goto done; 1424dccf4a48SAlan Stern 1425e9df41c5SAlan Stern if (urb->ep->hcpriv) 1426e9df41c5SAlan Stern qh = urb->ep->hcpriv; 1427dccf4a48SAlan Stern else { 1428e9df41c5SAlan Stern qh = uhci_alloc_qh(uhci, urb->dev, urb->ep); 1429dccf4a48SAlan Stern if (!qh) 1430dccf4a48SAlan Stern goto err_no_qh; 14311da177e4SLinus Torvalds } 1432dccf4a48SAlan Stern urbp->qh = qh; 14331da177e4SLinus Torvalds 14344de7d2c2SAlan Stern switch (qh->type) { 14354de7d2c2SAlan Stern case USB_ENDPOINT_XFER_CONTROL: 1436dccf4a48SAlan Stern ret = uhci_submit_control(uhci, urb, qh); 1437dccf4a48SAlan Stern break; 14384de7d2c2SAlan Stern case USB_ENDPOINT_XFER_BULK: 1439dccf4a48SAlan Stern ret = uhci_submit_bulk(uhci, urb, qh); 14401da177e4SLinus Torvalds break; 14414de7d2c2SAlan Stern case USB_ENDPOINT_XFER_INT: 1442dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 14431da177e4SLinus Torvalds break; 14444de7d2c2SAlan Stern case USB_ENDPOINT_XFER_ISOC: 1445c8155cc5SAlan Stern urb->error_count = 0; 1446dccf4a48SAlan Stern ret = uhci_submit_isochronous(uhci, urb, qh); 14471da177e4SLinus Torvalds break; 14481da177e4SLinus Torvalds } 1449dccf4a48SAlan Stern if (ret != 0) 1450dccf4a48SAlan Stern goto err_submit_failed; 14511da177e4SLinus Torvalds 1452dccf4a48SAlan Stern /* Add this URB to the QH */ 1453dccf4a48SAlan Stern list_add_tail(&urbp->node, &qh->queue); 14541da177e4SLinus Torvalds 1455dccf4a48SAlan Stern /* If the new URB is the first and only one on this QH then either 1456dccf4a48SAlan Stern * the QH is new and idle or else it's unlinked and waiting to 14572775562aSAlan Stern * become idle, so we can activate it right away. But only if the 14582775562aSAlan Stern * queue isn't stopped. */ 145984afddd7SAlan Stern if (qh->queue.next == &urbp->node && !qh->is_stopped) { 1460dccf4a48SAlan Stern uhci_activate_qh(uhci, qh); 1461c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, urbp); 146284afddd7SAlan Stern } 1463dccf4a48SAlan Stern goto done; 1464dccf4a48SAlan Stern 1465dccf4a48SAlan Stern err_submit_failed: 1466dccf4a48SAlan Stern if (qh->state == QH_STATE_IDLE) 1467dccf4a48SAlan Stern uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ 1468dccf4a48SAlan Stern err_no_qh: 1469dccf4a48SAlan Stern uhci_free_urb_priv(uhci, urbp); 1470dccf4a48SAlan Stern done: 1471e9df41c5SAlan Stern if (ret) 1472e9df41c5SAlan Stern usb_hcd_unlink_urb_from_ep(hcd, urb); 1473e9df41c5SAlan Stern done_not_linked: 14741da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 14751da177e4SLinus Torvalds return ret; 14761da177e4SLinus Torvalds } 14771da177e4SLinus Torvalds 1478e9df41c5SAlan Stern static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) 14791da177e4SLinus Torvalds { 14801da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 14811da177e4SLinus Torvalds unsigned long flags; 148210b8e47dSAlan Stern struct uhci_qh *qh; 1483e9df41c5SAlan Stern int rc; 14841da177e4SLinus Torvalds 14851da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 1486e9df41c5SAlan Stern rc = usb_hcd_check_unlink_urb(hcd, urb, status); 1487e9df41c5SAlan Stern if (rc) 14881da177e4SLinus Torvalds goto done; 1489e9df41c5SAlan Stern 1490e9df41c5SAlan Stern qh = ((struct urb_priv *) urb->hcpriv)->qh; 14911da177e4SLinus Torvalds 1492dccf4a48SAlan Stern /* Remove Isochronous TDs from the frame list ASAP */ 149310b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 1494dccf4a48SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 149510b8e47dSAlan Stern mb(); 149610b8e47dSAlan Stern 149710b8e47dSAlan Stern /* If the URB has already started, update the QH unlink time */ 149810b8e47dSAlan Stern uhci_get_current_frame_number(uhci); 149910b8e47dSAlan Stern if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number)) 150010b8e47dSAlan Stern qh->unlink_frame = uhci->frame_number; 150110b8e47dSAlan Stern } 150210b8e47dSAlan Stern 150310b8e47dSAlan Stern uhci_unlink_qh(uhci, qh); 15041da177e4SLinus Torvalds 15051da177e4SLinus Torvalds done: 15061da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 1507e9df41c5SAlan Stern return rc; 15081da177e4SLinus Torvalds } 15091da177e4SLinus Torvalds 15100ed8fee1SAlan Stern /* 15110ed8fee1SAlan Stern * Finish unlinking an URB and give it back 15120ed8fee1SAlan Stern */ 15130ed8fee1SAlan Stern static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, 15144a00027dSAlan Stern struct urb *urb, int status) 15150ed8fee1SAlan Stern __releases(uhci->lock) 15160ed8fee1SAlan Stern __acquires(uhci->lock) 15171da177e4SLinus Torvalds { 15181da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 15191da177e4SLinus Torvalds 1520e7e7c360SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) { 1521e7e7c360SAlan Stern 15227ea0a2bcSAlan Stern /* Subtract off the length of the SETUP packet from 15237ea0a2bcSAlan Stern * urb->actual_length. 15247ea0a2bcSAlan Stern */ 15257ea0a2bcSAlan Stern urb->actual_length -= min_t(u32, 8, urb->actual_length); 1526e7e7c360SAlan Stern } 1527e7e7c360SAlan Stern 1528c8155cc5SAlan Stern /* When giving back the first URB in an Isochronous queue, 1529c8155cc5SAlan Stern * reinitialize the QH's iso-related members for the next URB. */ 1530e7e7c360SAlan Stern else if (qh->type == USB_ENDPOINT_XFER_ISOC && 1531c8155cc5SAlan Stern urbp->node.prev == &qh->queue && 1532c8155cc5SAlan Stern urbp->node.next != &qh->queue) { 1533c8155cc5SAlan Stern struct urb *nurb = list_entry(urbp->node.next, 1534c8155cc5SAlan Stern struct urb_priv, node)->urb; 1535c8155cc5SAlan Stern 1536c8155cc5SAlan Stern qh->iso_packet_desc = &nurb->iso_frame_desc[0]; 1537c8155cc5SAlan Stern qh->iso_frame = nurb->start_frame; 1538c8155cc5SAlan Stern } 15391da177e4SLinus Torvalds 15400ed8fee1SAlan Stern /* Take the URB off the QH's queue. If the queue is now empty, 15410ed8fee1SAlan Stern * this is a perfect time for a toggle fixup. */ 15420ed8fee1SAlan Stern list_del_init(&urbp->node); 15430ed8fee1SAlan Stern if (list_empty(&qh->queue) && qh->needs_fixup) { 15440ed8fee1SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 15450ed8fee1SAlan Stern usb_pipeout(urb->pipe), qh->initial_toggle); 15460ed8fee1SAlan Stern qh->needs_fixup = 0; 15470ed8fee1SAlan Stern } 15480ed8fee1SAlan Stern 15490ed8fee1SAlan Stern uhci_free_urb_priv(uhci, urbp); 1550e9df41c5SAlan Stern usb_hcd_unlink_urb_from_ep(uhci_to_hcd(uhci), urb); 15510ed8fee1SAlan Stern 15520ed8fee1SAlan Stern spin_unlock(&uhci->lock); 15534a00027dSAlan Stern usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, status); 15540ed8fee1SAlan Stern spin_lock(&uhci->lock); 15550ed8fee1SAlan Stern 15560ed8fee1SAlan Stern /* If the queue is now empty, we can unlink the QH and give up its 15570ed8fee1SAlan Stern * reserved bandwidth. */ 15580ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 15590ed8fee1SAlan Stern uhci_unlink_qh(uhci, qh); 15603ca2a321SAlan Stern if (qh->bandwidth_reserved) 15613ca2a321SAlan Stern uhci_release_bandwidth(uhci, qh); 15620ed8fee1SAlan Stern } 15630ed8fee1SAlan Stern } 15640ed8fee1SAlan Stern 15650ed8fee1SAlan Stern /* 15660ed8fee1SAlan Stern * Scan the URBs in a QH's queue 15670ed8fee1SAlan Stern */ 15680ed8fee1SAlan Stern #define QH_FINISHED_UNLINKING(qh) \ 15690ed8fee1SAlan Stern (qh->state == QH_STATE_UNLINKING && \ 15700ed8fee1SAlan Stern uhci->frame_number + uhci->is_stopped != qh->unlink_frame) 15710ed8fee1SAlan Stern 15727d12e780SDavid Howells static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 15730ed8fee1SAlan Stern { 15740ed8fee1SAlan Stern struct urb_priv *urbp; 15750ed8fee1SAlan Stern struct urb *urb; 15760ed8fee1SAlan Stern int status; 15770ed8fee1SAlan Stern 15780ed8fee1SAlan Stern while (!list_empty(&qh->queue)) { 15790ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 15800ed8fee1SAlan Stern urb = urbp->urb; 15810ed8fee1SAlan Stern 1582b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 15830ed8fee1SAlan Stern status = uhci_result_isochronous(uhci, urb); 1584b1869000SAlan Stern else 15850ed8fee1SAlan Stern status = uhci_result_common(uhci, urb); 15860ed8fee1SAlan Stern if (status == -EINPROGRESS) 15870ed8fee1SAlan Stern break; 15880ed8fee1SAlan Stern 15890ed8fee1SAlan Stern /* Dequeued but completed URBs can't be given back unless 15900ed8fee1SAlan Stern * the QH is stopped or has finished unlinking. */ 1591eb231054SAlan Stern if (urb->unlinked) { 15922775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 15932775562aSAlan Stern qh->is_stopped = 1; 15942775562aSAlan Stern else if (!qh->is_stopped) 15950ed8fee1SAlan Stern return; 15962775562aSAlan Stern } 15970ed8fee1SAlan Stern 15984a00027dSAlan Stern uhci_giveback_urb(uhci, qh, urb, status); 1599ee7d1f3fSAlan Stern if (status < 0) 16000ed8fee1SAlan Stern break; 16010ed8fee1SAlan Stern } 16020ed8fee1SAlan Stern 16030ed8fee1SAlan Stern /* If the QH is neither stopped nor finished unlinking (normal case), 16040ed8fee1SAlan Stern * our work here is done. */ 16052775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 16062775562aSAlan Stern qh->is_stopped = 1; 16072775562aSAlan Stern else if (!qh->is_stopped) 16080ed8fee1SAlan Stern return; 16090ed8fee1SAlan Stern 16100ed8fee1SAlan Stern /* Otherwise give back each of the dequeued URBs */ 16112775562aSAlan Stern restart: 16120ed8fee1SAlan Stern list_for_each_entry(urbp, &qh->queue, node) { 16130ed8fee1SAlan Stern urb = urbp->urb; 1614eb231054SAlan Stern if (urb->unlinked) { 161510b8e47dSAlan Stern 161610b8e47dSAlan Stern /* Fix up the TD links and save the toggles for 161710b8e47dSAlan Stern * non-Isochronous queues. For Isochronous queues, 161810b8e47dSAlan Stern * test for too-recent dequeues. */ 161910b8e47dSAlan Stern if (!uhci_cleanup_queue(uhci, qh, urb)) { 162010b8e47dSAlan Stern qh->is_stopped = 0; 162110b8e47dSAlan Stern return; 162210b8e47dSAlan Stern } 16234a00027dSAlan Stern uhci_giveback_urb(uhci, qh, urb, 0); 16240ed8fee1SAlan Stern goto restart; 16250ed8fee1SAlan Stern } 16260ed8fee1SAlan Stern } 16270ed8fee1SAlan Stern qh->is_stopped = 0; 16280ed8fee1SAlan Stern 16290ed8fee1SAlan Stern /* There are no more dequeued URBs. If there are still URBs on the 16300ed8fee1SAlan Stern * queue, the QH can now be re-activated. */ 16310ed8fee1SAlan Stern if (!list_empty(&qh->queue)) { 16320ed8fee1SAlan Stern if (qh->needs_fixup) 163351e2f62fSJan Andersson uhci_fixup_toggles(uhci, qh, 0); 163484afddd7SAlan Stern 163584afddd7SAlan Stern /* If the first URB on the queue wants FSBR but its time 163684afddd7SAlan Stern * limit has expired, set the next TD to interrupt on 163784afddd7SAlan Stern * completion before reactivating the QH. */ 163884afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 163984afddd7SAlan Stern if (urbp->fsbr && qh->wait_expired) { 164084afddd7SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 164184afddd7SAlan Stern struct uhci_td, list); 164284afddd7SAlan Stern 164351e2f62fSJan Andersson td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); 164484afddd7SAlan Stern } 164584afddd7SAlan Stern 16460ed8fee1SAlan Stern uhci_activate_qh(uhci, qh); 16470ed8fee1SAlan Stern } 16480ed8fee1SAlan Stern 16490ed8fee1SAlan Stern /* The queue is empty. The QH can become idle if it is fully 16500ed8fee1SAlan Stern * unlinked. */ 16510ed8fee1SAlan Stern else if (QH_FINISHED_UNLINKING(qh)) 16520ed8fee1SAlan Stern uhci_make_qh_idle(uhci, qh); 16531da177e4SLinus Torvalds } 16541da177e4SLinus Torvalds 16550ed8fee1SAlan Stern /* 165684afddd7SAlan Stern * Check for queues that have made some forward progress. 165784afddd7SAlan Stern * Returns 0 if the queue is not Isochronous, is ACTIVE, and 165884afddd7SAlan Stern * has not advanced since last examined; 1 otherwise. 1659b761d9d8SAlan Stern * 1660b761d9d8SAlan Stern * Early Intel controllers have a bug which causes qh->element sometimes 1661b761d9d8SAlan Stern * not to advance when a TD completes successfully. The queue remains 1662b761d9d8SAlan Stern * stuck on the inactive completed TD. We detect such cases and advance 1663b761d9d8SAlan Stern * the element pointer by hand. 166484afddd7SAlan Stern */ 166584afddd7SAlan Stern static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) 166684afddd7SAlan Stern { 166784afddd7SAlan Stern struct urb_priv *urbp = NULL; 166884afddd7SAlan Stern struct uhci_td *td; 166984afddd7SAlan Stern int ret = 1; 167084afddd7SAlan Stern unsigned status; 167184afddd7SAlan Stern 167284afddd7SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 1673c5e3b741SAlan Stern goto done; 167484afddd7SAlan Stern 167584afddd7SAlan Stern /* Treat an UNLINKING queue as though it hasn't advanced. 167684afddd7SAlan Stern * This is okay because reactivation will treat it as though 167784afddd7SAlan Stern * it has advanced, and if it is going to become IDLE then 167884afddd7SAlan Stern * this doesn't matter anyway. Furthermore it's possible 167984afddd7SAlan Stern * for an UNLINKING queue not to have any URBs at all, or 168084afddd7SAlan Stern * for its first URB not to have any TDs (if it was dequeued 168184afddd7SAlan Stern * just as it completed). So it's not easy in any case to 168284afddd7SAlan Stern * test whether such queues have advanced. */ 168384afddd7SAlan Stern if (qh->state != QH_STATE_ACTIVE) { 168484afddd7SAlan Stern urbp = NULL; 168584afddd7SAlan Stern status = 0; 168684afddd7SAlan Stern 168784afddd7SAlan Stern } else { 168884afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 168984afddd7SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 169051e2f62fSJan Andersson status = td_status(uhci, td); 169184afddd7SAlan Stern if (!(status & TD_CTRL_ACTIVE)) { 169284afddd7SAlan Stern 169384afddd7SAlan Stern /* We're okay, the queue has advanced */ 169484afddd7SAlan Stern qh->wait_expired = 0; 169584afddd7SAlan Stern qh->advance_jiffies = jiffies; 1696c5e3b741SAlan Stern goto done; 169784afddd7SAlan Stern } 1698ba297eddSAlan Stern ret = uhci->is_stopped; 169984afddd7SAlan Stern } 170084afddd7SAlan Stern 170184afddd7SAlan Stern /* The queue hasn't advanced; check for timeout */ 1702c5e3b741SAlan Stern if (qh->wait_expired) 1703c5e3b741SAlan Stern goto done; 1704c5e3b741SAlan Stern 1705c5e3b741SAlan Stern if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { 1706b761d9d8SAlan Stern 1707b761d9d8SAlan Stern /* Detect the Intel bug and work around it */ 170851e2f62fSJan Andersson if (qh->post_td && qh_element(qh) == 170951e2f62fSJan Andersson LINK_TO_TD(uhci, qh->post_td)) { 1710b761d9d8SAlan Stern qh->element = qh->post_td->link; 1711b761d9d8SAlan Stern qh->advance_jiffies = jiffies; 1712c5e3b741SAlan Stern ret = 1; 1713c5e3b741SAlan Stern goto done; 1714b761d9d8SAlan Stern } 1715b761d9d8SAlan Stern 171684afddd7SAlan Stern qh->wait_expired = 1; 171784afddd7SAlan Stern 171884afddd7SAlan Stern /* If the current URB wants FSBR, unlink it temporarily 171984afddd7SAlan Stern * so that we can safely set the next TD to interrupt on 172084afddd7SAlan Stern * completion. That way we'll know as soon as the queue 172184afddd7SAlan Stern * starts moving again. */ 172284afddd7SAlan Stern if (urbp && urbp->fsbr && !(status & TD_CTRL_IOC)) 172384afddd7SAlan Stern uhci_unlink_qh(uhci, qh); 1724c5e3b741SAlan Stern 1725c5e3b741SAlan Stern } else { 1726c5e3b741SAlan Stern /* Unmoving but not-yet-expired queues keep FSBR alive */ 1727c5e3b741SAlan Stern if (urbp) 1728c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, urbp); 172984afddd7SAlan Stern } 1730c5e3b741SAlan Stern 1731c5e3b741SAlan Stern done: 173284afddd7SAlan Stern return ret; 173384afddd7SAlan Stern } 173484afddd7SAlan Stern 173584afddd7SAlan Stern /* 17360ed8fee1SAlan Stern * Process events in the schedule, but only in one thread at a time 17370ed8fee1SAlan Stern */ 17387d12e780SDavid Howells static void uhci_scan_schedule(struct uhci_hcd *uhci) 17391da177e4SLinus Torvalds { 17400ed8fee1SAlan Stern int i; 17410ed8fee1SAlan Stern struct uhci_qh *qh; 17421da177e4SLinus Torvalds 17431da177e4SLinus Torvalds /* Don't allow re-entrant calls */ 17441da177e4SLinus Torvalds if (uhci->scan_in_progress) { 17451da177e4SLinus Torvalds uhci->need_rescan = 1; 17461da177e4SLinus Torvalds return; 17471da177e4SLinus Torvalds } 17481da177e4SLinus Torvalds uhci->scan_in_progress = 1; 17491da177e4SLinus Torvalds rescan: 17501da177e4SLinus Torvalds uhci->need_rescan = 0; 1751c5e3b741SAlan Stern uhci->fsbr_is_wanted = 0; 17521da177e4SLinus Torvalds 17536c1b445cSAlan Stern uhci_clear_next_interrupt(uhci); 17541da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 1755c8155cc5SAlan Stern uhci->cur_iso_frame = uhci->frame_number; 17561da177e4SLinus Torvalds 17570ed8fee1SAlan Stern /* Go through all the QH queues and process the URBs in each one */ 17580ed8fee1SAlan Stern for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) { 17590ed8fee1SAlan Stern uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, 17600ed8fee1SAlan Stern struct uhci_qh, node); 17610ed8fee1SAlan Stern while ((qh = uhci->next_qh) != uhci->skelqh[i]) { 17620ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, 17630ed8fee1SAlan Stern struct uhci_qh, node); 176484afddd7SAlan Stern 176584afddd7SAlan Stern if (uhci_advance_check(uhci, qh)) { 17667d12e780SDavid Howells uhci_scan_qh(uhci, qh); 1767c5e3b741SAlan Stern if (qh->state == QH_STATE_ACTIVE) { 1768c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, 1769c5e3b741SAlan Stern list_entry(qh->queue.next, struct urb_priv, node)); 1770c5e3b741SAlan Stern } 177184afddd7SAlan Stern } 17721da177e4SLinus Torvalds } 17730ed8fee1SAlan Stern } 17741da177e4SLinus Torvalds 1775c8155cc5SAlan Stern uhci->last_iso_frame = uhci->cur_iso_frame; 17761da177e4SLinus Torvalds if (uhci->need_rescan) 17771da177e4SLinus Torvalds goto rescan; 17781da177e4SLinus Torvalds uhci->scan_in_progress = 0; 17791da177e4SLinus Torvalds 1780c5e3b741SAlan Stern if (uhci->fsbr_is_on && !uhci->fsbr_is_wanted && 1781c5e3b741SAlan Stern !uhci->fsbr_expiring) { 1782c5e3b741SAlan Stern uhci->fsbr_expiring = 1; 1783c5e3b741SAlan Stern mod_timer(&uhci->fsbr_timer, jiffies + FSBR_OFF_DELAY); 1784c5e3b741SAlan Stern } 178584afddd7SAlan Stern 178604538a25SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 17871da177e4SLinus Torvalds uhci_clear_next_interrupt(uhci); 17881da177e4SLinus Torvalds else 17891da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 17901da177e4SLinus Torvalds } 1791