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) 16*17230acdSAlan 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); 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 { 48*17230acdSAlan Stern struct uhci_qh *fsbr_qh, *lqh, *tqh; 49*17230acdSAlan Stern 5084afddd7SAlan Stern uhci->fsbr_is_on = 1; 51*17230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 52*17230acdSAlan Stern struct uhci_qh, node); 53*17230acdSAlan Stern 54*17230acdSAlan Stern /* Find the first FSBR QH. Linear search through the list is 55*17230acdSAlan Stern * acceptable because normally FSBR gets turned on as soon as 56*17230acdSAlan Stern * one QH needs it. */ 57*17230acdSAlan Stern fsbr_qh = NULL; 58*17230acdSAlan Stern list_for_each_entry_reverse(tqh, &uhci->skel_async_qh->node, node) { 59*17230acdSAlan Stern if (tqh->skel < SKEL_FSBR) 60*17230acdSAlan Stern break; 61*17230acdSAlan Stern fsbr_qh = tqh; 62*17230acdSAlan Stern } 63*17230acdSAlan Stern 64*17230acdSAlan Stern /* No FSBR QH means we must insert the terminating skeleton QH */ 65*17230acdSAlan Stern if (!fsbr_qh) { 66*17230acdSAlan Stern uhci->skel_term_qh->link = LINK_TO_QH(uhci->skel_term_qh); 67*17230acdSAlan Stern wmb(); 68*17230acdSAlan Stern lqh->link = uhci->skel_term_qh->link; 69*17230acdSAlan Stern 70*17230acdSAlan Stern /* Otherwise loop the last QH to the first FSBR QH */ 71*17230acdSAlan Stern } else 72*17230acdSAlan Stern lqh->link = LINK_TO_QH(fsbr_qh); 7384afddd7SAlan Stern } 7484afddd7SAlan Stern 7584afddd7SAlan Stern static void uhci_fsbr_off(struct uhci_hcd *uhci) 7684afddd7SAlan Stern { 77*17230acdSAlan Stern struct uhci_qh *lqh; 78*17230acdSAlan Stern 7984afddd7SAlan Stern uhci->fsbr_is_on = 0; 80*17230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 81*17230acdSAlan Stern struct uhci_qh, node); 82*17230acdSAlan Stern 83*17230acdSAlan Stern /* End the async list normally and unlink the terminating QH */ 84*17230acdSAlan Stern lqh->link = uhci->skel_term_qh->link = UHCI_PTR_TERM; 8584afddd7SAlan Stern } 8684afddd7SAlan Stern 8784afddd7SAlan Stern static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) 8884afddd7SAlan Stern { 8984afddd7SAlan Stern struct urb_priv *urbp = urb->hcpriv; 9084afddd7SAlan Stern 9184afddd7SAlan Stern if (!(urb->transfer_flags & URB_NO_FSBR)) 9284afddd7SAlan Stern urbp->fsbr = 1; 9384afddd7SAlan Stern } 9484afddd7SAlan Stern 95c5e3b741SAlan Stern static void uhci_urbp_wants_fsbr(struct uhci_hcd *uhci, struct urb_priv *urbp) 9684afddd7SAlan Stern { 9784afddd7SAlan Stern if (urbp->fsbr) { 98c5e3b741SAlan Stern uhci->fsbr_is_wanted = 1; 9984afddd7SAlan Stern if (!uhci->fsbr_is_on) 10084afddd7SAlan Stern uhci_fsbr_on(uhci); 101c5e3b741SAlan Stern else if (uhci->fsbr_expiring) { 102c5e3b741SAlan Stern uhci->fsbr_expiring = 0; 103c5e3b741SAlan Stern del_timer(&uhci->fsbr_timer); 10484afddd7SAlan Stern } 10584afddd7SAlan Stern } 106c5e3b741SAlan Stern } 107c5e3b741SAlan Stern 108c5e3b741SAlan Stern static void uhci_fsbr_timeout(unsigned long _uhci) 109c5e3b741SAlan Stern { 110c5e3b741SAlan Stern struct uhci_hcd *uhci = (struct uhci_hcd *) _uhci; 111c5e3b741SAlan Stern unsigned long flags; 112c5e3b741SAlan Stern 113c5e3b741SAlan Stern spin_lock_irqsave(&uhci->lock, flags); 114c5e3b741SAlan Stern if (uhci->fsbr_expiring) { 115c5e3b741SAlan Stern uhci->fsbr_expiring = 0; 116c5e3b741SAlan Stern uhci_fsbr_off(uhci); 117c5e3b741SAlan Stern } 118c5e3b741SAlan Stern spin_unlock_irqrestore(&uhci->lock, flags); 119c5e3b741SAlan Stern } 12084afddd7SAlan Stern 12184afddd7SAlan Stern 1222532178aSAlan Stern static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) 1231da177e4SLinus Torvalds { 1241da177e4SLinus Torvalds dma_addr_t dma_handle; 1251da177e4SLinus Torvalds struct uhci_td *td; 1261da177e4SLinus Torvalds 1271da177e4SLinus Torvalds td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle); 1281da177e4SLinus Torvalds if (!td) 1291da177e4SLinus Torvalds return NULL; 1301da177e4SLinus Torvalds 1311da177e4SLinus Torvalds td->dma_handle = dma_handle; 1321da177e4SLinus Torvalds td->frame = -1; 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds INIT_LIST_HEAD(&td->list); 1351da177e4SLinus Torvalds INIT_LIST_HEAD(&td->fl_list); 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds return td; 1381da177e4SLinus Torvalds } 1391da177e4SLinus Torvalds 140dccf4a48SAlan Stern static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) 141dccf4a48SAlan Stern { 142dccf4a48SAlan Stern if (!list_empty(&td->list)) 143dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in list!\n", td); 144dccf4a48SAlan Stern if (!list_empty(&td->fl_list)) 145dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td); 146dccf4a48SAlan Stern 147dccf4a48SAlan Stern dma_pool_free(uhci->td_pool, td, td->dma_handle); 148dccf4a48SAlan Stern } 149dccf4a48SAlan Stern 1501da177e4SLinus Torvalds static inline void uhci_fill_td(struct uhci_td *td, u32 status, 1511da177e4SLinus Torvalds u32 token, u32 buffer) 1521da177e4SLinus Torvalds { 1531da177e4SLinus Torvalds td->status = cpu_to_le32(status); 1541da177e4SLinus Torvalds td->token = cpu_to_le32(token); 1551da177e4SLinus Torvalds td->buffer = cpu_to_le32(buffer); 1561da177e4SLinus Torvalds } 1571da177e4SLinus Torvalds 15804538a25SAlan Stern static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) 15904538a25SAlan Stern { 16004538a25SAlan Stern list_add_tail(&td->list, &urbp->td_list); 16104538a25SAlan Stern } 16204538a25SAlan Stern 16304538a25SAlan Stern static void uhci_remove_td_from_urbp(struct uhci_td *td) 16404538a25SAlan Stern { 16504538a25SAlan Stern list_del_init(&td->list); 16604538a25SAlan Stern } 16704538a25SAlan Stern 1681da177e4SLinus Torvalds /* 169687f5f34SAlan Stern * We insert Isochronous URBs directly into the frame list at the beginning 1701da177e4SLinus Torvalds */ 171dccf4a48SAlan Stern static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, 172dccf4a48SAlan Stern struct uhci_td *td, unsigned framenum) 1731da177e4SLinus Torvalds { 1741da177e4SLinus Torvalds framenum &= (UHCI_NUMFRAMES - 1); 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds td->frame = framenum; 1771da177e4SLinus Torvalds 1781da177e4SLinus Torvalds /* Is there a TD already mapped there? */ 179a1d59ce8SAlan Stern if (uhci->frame_cpu[framenum]) { 1801da177e4SLinus Torvalds struct uhci_td *ftd, *ltd; 1811da177e4SLinus Torvalds 182a1d59ce8SAlan Stern ftd = uhci->frame_cpu[framenum]; 1831da177e4SLinus Torvalds ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 1841da177e4SLinus Torvalds 1851da177e4SLinus Torvalds list_add_tail(&td->fl_list, &ftd->fl_list); 1861da177e4SLinus Torvalds 1871da177e4SLinus Torvalds td->link = ltd->link; 1881da177e4SLinus Torvalds wmb(); 18928b9325eSAlan Stern ltd->link = LINK_TO_TD(td); 1901da177e4SLinus Torvalds } else { 191a1d59ce8SAlan Stern td->link = uhci->frame[framenum]; 1921da177e4SLinus Torvalds wmb(); 19328b9325eSAlan Stern uhci->frame[framenum] = LINK_TO_TD(td); 194a1d59ce8SAlan Stern uhci->frame_cpu[framenum] = td; 1951da177e4SLinus Torvalds } 1961da177e4SLinus Torvalds } 1971da177e4SLinus Torvalds 198dccf4a48SAlan Stern static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, 199b81d3436SAlan Stern struct uhci_td *td) 2001da177e4SLinus Torvalds { 2011da177e4SLinus Torvalds /* If it's not inserted, don't remove it */ 202b81d3436SAlan Stern if (td->frame == -1) { 203b81d3436SAlan Stern WARN_ON(!list_empty(&td->fl_list)); 2041da177e4SLinus Torvalds return; 205b81d3436SAlan Stern } 2061da177e4SLinus Torvalds 207b81d3436SAlan Stern if (uhci->frame_cpu[td->frame] == td) { 2081da177e4SLinus Torvalds if (list_empty(&td->fl_list)) { 209a1d59ce8SAlan Stern uhci->frame[td->frame] = td->link; 210a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = NULL; 2111da177e4SLinus Torvalds } else { 2121da177e4SLinus Torvalds struct uhci_td *ntd; 2131da177e4SLinus Torvalds 2141da177e4SLinus Torvalds ntd = list_entry(td->fl_list.next, struct uhci_td, fl_list); 21528b9325eSAlan Stern uhci->frame[td->frame] = LINK_TO_TD(ntd); 216a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = ntd; 2171da177e4SLinus Torvalds } 2181da177e4SLinus Torvalds } else { 2191da177e4SLinus Torvalds struct uhci_td *ptd; 2201da177e4SLinus Torvalds 2211da177e4SLinus Torvalds ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list); 2221da177e4SLinus Torvalds ptd->link = td->link; 2231da177e4SLinus Torvalds } 2241da177e4SLinus Torvalds 2251da177e4SLinus Torvalds list_del_init(&td->fl_list); 2261da177e4SLinus Torvalds td->frame = -1; 2271da177e4SLinus Torvalds } 2281da177e4SLinus Torvalds 229c8155cc5SAlan Stern static inline void uhci_remove_tds_from_frame(struct uhci_hcd *uhci, 230c8155cc5SAlan Stern unsigned int framenum) 231c8155cc5SAlan Stern { 232c8155cc5SAlan Stern struct uhci_td *ftd, *ltd; 233c8155cc5SAlan Stern 234c8155cc5SAlan Stern framenum &= (UHCI_NUMFRAMES - 1); 235c8155cc5SAlan Stern 236c8155cc5SAlan Stern ftd = uhci->frame_cpu[framenum]; 237c8155cc5SAlan Stern if (ftd) { 238c8155cc5SAlan Stern ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 239c8155cc5SAlan Stern uhci->frame[framenum] = ltd->link; 240c8155cc5SAlan Stern uhci->frame_cpu[framenum] = NULL; 241c8155cc5SAlan Stern 242c8155cc5SAlan Stern while (!list_empty(&ftd->fl_list)) 243c8155cc5SAlan Stern list_del_init(ftd->fl_list.prev); 244c8155cc5SAlan Stern } 245c8155cc5SAlan Stern } 246c8155cc5SAlan Stern 247dccf4a48SAlan Stern /* 248dccf4a48SAlan Stern * Remove all the TDs for an Isochronous URB from the frame list 249dccf4a48SAlan Stern */ 250dccf4a48SAlan Stern static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) 251b81d3436SAlan Stern { 252b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 253b81d3436SAlan Stern struct uhci_td *td; 254b81d3436SAlan Stern 255b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) 256dccf4a48SAlan Stern uhci_remove_td_from_frame_list(uhci, td); 257b81d3436SAlan Stern } 258b81d3436SAlan Stern 259dccf4a48SAlan Stern static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, 260dccf4a48SAlan Stern struct usb_device *udev, struct usb_host_endpoint *hep) 2611da177e4SLinus Torvalds { 2621da177e4SLinus Torvalds dma_addr_t dma_handle; 2631da177e4SLinus Torvalds struct uhci_qh *qh; 2641da177e4SLinus Torvalds 2651da177e4SLinus Torvalds qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle); 2661da177e4SLinus Torvalds if (!qh) 2671da177e4SLinus Torvalds return NULL; 2681da177e4SLinus Torvalds 26959e29ed9SAlan Stern memset(qh, 0, sizeof(*qh)); 2701da177e4SLinus Torvalds qh->dma_handle = dma_handle; 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds qh->element = UHCI_PTR_TERM; 2731da177e4SLinus Torvalds qh->link = UHCI_PTR_TERM; 2741da177e4SLinus Torvalds 275dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->queue); 276dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->node); 2771da177e4SLinus Torvalds 278dccf4a48SAlan Stern if (udev) { /* Normal QH */ 27985a975d0SAlan Stern qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; 28085a975d0SAlan Stern if (qh->type != USB_ENDPOINT_XFER_ISOC) { 281af0bb599SAlan Stern qh->dummy_td = uhci_alloc_td(uhci); 282af0bb599SAlan Stern if (!qh->dummy_td) { 283af0bb599SAlan Stern dma_pool_free(uhci->qh_pool, qh, dma_handle); 284af0bb599SAlan Stern return NULL; 285af0bb599SAlan Stern } 28685a975d0SAlan Stern } 287dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 288dccf4a48SAlan Stern qh->hep = hep; 289dccf4a48SAlan Stern qh->udev = udev; 290dccf4a48SAlan Stern hep->hcpriv = qh; 2911da177e4SLinus Torvalds 2923ca2a321SAlan Stern if (qh->type == USB_ENDPOINT_XFER_INT || 2933ca2a321SAlan Stern qh->type == USB_ENDPOINT_XFER_ISOC) 2943ca2a321SAlan Stern qh->load = usb_calc_bus_time(udev->speed, 2953ca2a321SAlan Stern usb_endpoint_dir_in(&hep->desc), 2963ca2a321SAlan Stern qh->type == USB_ENDPOINT_XFER_ISOC, 2973ca2a321SAlan Stern le16_to_cpu(hep->desc.wMaxPacketSize)) 2983ca2a321SAlan Stern / 1000 + 1; 2993ca2a321SAlan Stern 300dccf4a48SAlan Stern } else { /* Skeleton QH */ 301dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 3024de7d2c2SAlan Stern qh->type = -1; 303dccf4a48SAlan Stern } 3041da177e4SLinus Torvalds return qh; 3051da177e4SLinus Torvalds } 3061da177e4SLinus Torvalds 3071da177e4SLinus Torvalds static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 3081da177e4SLinus Torvalds { 309dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_IDLE && qh->udev); 310dccf4a48SAlan Stern if (!list_empty(&qh->queue)) 3111da177e4SLinus Torvalds dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh); 3121da177e4SLinus Torvalds 313dccf4a48SAlan Stern list_del(&qh->node); 314dccf4a48SAlan Stern if (qh->udev) { 315dccf4a48SAlan Stern qh->hep->hcpriv = NULL; 31685a975d0SAlan Stern if (qh->dummy_td) 317af0bb599SAlan Stern uhci_free_td(uhci, qh->dummy_td); 318dccf4a48SAlan Stern } 3191da177e4SLinus Torvalds dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); 3201da177e4SLinus Torvalds } 3211da177e4SLinus Torvalds 3221da177e4SLinus Torvalds /* 323a0b458b6SAlan Stern * When a queue is stopped and a dequeued URB is given back, adjust 324a0b458b6SAlan Stern * the previous TD link (if the URB isn't first on the queue) or 325a0b458b6SAlan Stern * save its toggle value (if it is first and is currently executing). 32610b8e47dSAlan Stern * 32710b8e47dSAlan Stern * Returns 0 if the URB should not yet be given back, 1 otherwise. 3280ed8fee1SAlan Stern */ 32910b8e47dSAlan Stern static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, 330a0b458b6SAlan Stern struct urb *urb) 3310ed8fee1SAlan Stern { 332a0b458b6SAlan Stern struct urb_priv *urbp = urb->hcpriv; 3330ed8fee1SAlan Stern struct uhci_td *td; 33410b8e47dSAlan Stern int ret = 1; 3350ed8fee1SAlan Stern 336a0b458b6SAlan Stern /* Isochronous pipes don't use toggles and their TD link pointers 33710b8e47dSAlan Stern * get adjusted during uhci_urb_dequeue(). But since their queues 33810b8e47dSAlan Stern * cannot truly be stopped, we have to watch out for dequeues 33910b8e47dSAlan Stern * occurring after the nominal unlink frame. */ 34010b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 34110b8e47dSAlan Stern ret = (uhci->frame_number + uhci->is_stopped != 34210b8e47dSAlan Stern qh->unlink_frame); 343c5e3b741SAlan Stern goto done; 34410b8e47dSAlan Stern } 345a0b458b6SAlan Stern 346a0b458b6SAlan Stern /* If the URB isn't first on its queue, adjust the link pointer 347a0b458b6SAlan Stern * of the last TD in the previous URB. The toggle doesn't need 348a0b458b6SAlan Stern * to be saved since this URB can't be executing yet. */ 349a0b458b6SAlan Stern if (qh->queue.next != &urbp->node) { 350a0b458b6SAlan Stern struct urb_priv *purbp; 351a0b458b6SAlan Stern struct uhci_td *ptd; 352a0b458b6SAlan Stern 353a0b458b6SAlan Stern purbp = list_entry(urbp->node.prev, struct urb_priv, node); 354a0b458b6SAlan Stern WARN_ON(list_empty(&purbp->td_list)); 355a0b458b6SAlan Stern ptd = list_entry(purbp->td_list.prev, struct uhci_td, 356a0b458b6SAlan Stern list); 357a0b458b6SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, 358a0b458b6SAlan Stern list); 359a0b458b6SAlan Stern ptd->link = td->link; 360c5e3b741SAlan Stern goto done; 361a0b458b6SAlan Stern } 362a0b458b6SAlan Stern 3630ed8fee1SAlan Stern /* If the QH element pointer is UHCI_PTR_TERM then then currently 3640ed8fee1SAlan Stern * executing URB has already been unlinked, so this one isn't it. */ 365a0b458b6SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM) 366c5e3b741SAlan Stern goto done; 3670ed8fee1SAlan Stern qh->element = UHCI_PTR_TERM; 3680ed8fee1SAlan Stern 36985a975d0SAlan Stern /* Control pipes don't have to worry about toggles */ 370a0b458b6SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) 371c5e3b741SAlan Stern goto done; 3720ed8fee1SAlan Stern 373a0b458b6SAlan Stern /* Save the next toggle value */ 37459e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 37559e29ed9SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 3760ed8fee1SAlan Stern qh->needs_fixup = 1; 3770ed8fee1SAlan Stern qh->initial_toggle = uhci_toggle(td_token(td)); 378c5e3b741SAlan Stern 379c5e3b741SAlan Stern done: 38010b8e47dSAlan Stern return ret; 3810ed8fee1SAlan Stern } 3820ed8fee1SAlan Stern 3830ed8fee1SAlan Stern /* 3840ed8fee1SAlan Stern * Fix up the data toggles for URBs in a queue, when one of them 3850ed8fee1SAlan Stern * terminates early (short transfer, error, or dequeued). 3860ed8fee1SAlan Stern */ 3870ed8fee1SAlan Stern static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) 3880ed8fee1SAlan Stern { 3890ed8fee1SAlan Stern struct urb_priv *urbp = NULL; 3900ed8fee1SAlan Stern struct uhci_td *td; 3910ed8fee1SAlan Stern unsigned int toggle = qh->initial_toggle; 3920ed8fee1SAlan Stern unsigned int pipe; 3930ed8fee1SAlan Stern 3940ed8fee1SAlan Stern /* Fixups for a short transfer start with the second URB in the 3950ed8fee1SAlan Stern * queue (the short URB is the first). */ 3960ed8fee1SAlan Stern if (skip_first) 3970ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 3980ed8fee1SAlan Stern 3990ed8fee1SAlan Stern /* When starting with the first URB, if the QH element pointer is 4000ed8fee1SAlan Stern * still valid then we know the URB's toggles are okay. */ 4010ed8fee1SAlan Stern else if (qh_element(qh) != UHCI_PTR_TERM) 4020ed8fee1SAlan Stern toggle = 2; 4030ed8fee1SAlan Stern 4040ed8fee1SAlan Stern /* Fix up the toggle for the URBs in the queue. Normally this 4050ed8fee1SAlan Stern * loop won't run more than once: When an error or short transfer 4060ed8fee1SAlan Stern * occurs, the queue usually gets emptied. */ 4071393adb2SAlan Stern urbp = list_prepare_entry(urbp, &qh->queue, node); 4080ed8fee1SAlan Stern list_for_each_entry_continue(urbp, &qh->queue, node) { 4090ed8fee1SAlan Stern 4100ed8fee1SAlan Stern /* If the first TD has the right toggle value, we don't 4110ed8fee1SAlan Stern * need to change any toggles in this URB */ 4120ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 4130ed8fee1SAlan Stern if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { 414db59b464SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, 4150ed8fee1SAlan Stern list); 4160ed8fee1SAlan Stern toggle = uhci_toggle(td_token(td)) ^ 1; 4170ed8fee1SAlan Stern 4180ed8fee1SAlan Stern /* Otherwise all the toggles in the URB have to be switched */ 4190ed8fee1SAlan Stern } else { 4200ed8fee1SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 4210ed8fee1SAlan Stern td->token ^= __constant_cpu_to_le32( 4220ed8fee1SAlan Stern TD_TOKEN_TOGGLE); 4230ed8fee1SAlan Stern toggle ^= 1; 4240ed8fee1SAlan Stern } 4250ed8fee1SAlan Stern } 4260ed8fee1SAlan Stern } 4270ed8fee1SAlan Stern 4280ed8fee1SAlan Stern wmb(); 4290ed8fee1SAlan Stern pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe; 4300ed8fee1SAlan Stern usb_settoggle(qh->udev, usb_pipeendpoint(pipe), 4310ed8fee1SAlan Stern usb_pipeout(pipe), toggle); 4320ed8fee1SAlan Stern qh->needs_fixup = 0; 4330ed8fee1SAlan Stern } 4340ed8fee1SAlan Stern 4350ed8fee1SAlan Stern /* 436*17230acdSAlan Stern * Link an Isochronous QH into its skeleton's list 437*17230acdSAlan Stern */ 438*17230acdSAlan Stern static inline void link_iso(struct uhci_hcd *uhci, struct uhci_qh *qh) 439*17230acdSAlan Stern { 440*17230acdSAlan Stern list_add_tail(&qh->node, &uhci->skel_iso_qh->node); 441*17230acdSAlan Stern 442*17230acdSAlan Stern /* Isochronous QHs aren't linked by the hardware */ 443*17230acdSAlan Stern } 444*17230acdSAlan Stern 445*17230acdSAlan Stern /* 446*17230acdSAlan Stern * Link a high-period interrupt QH into the schedule at the end of its 447*17230acdSAlan Stern * skeleton's list 448*17230acdSAlan Stern */ 449*17230acdSAlan Stern static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) 450*17230acdSAlan Stern { 451*17230acdSAlan Stern struct uhci_qh *pqh; 452*17230acdSAlan Stern 453*17230acdSAlan Stern list_add_tail(&qh->node, &uhci->skelqh[qh->skel]->node); 454*17230acdSAlan Stern 455*17230acdSAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 456*17230acdSAlan Stern qh->link = pqh->link; 457*17230acdSAlan Stern wmb(); 458*17230acdSAlan Stern pqh->link = LINK_TO_QH(qh); 459*17230acdSAlan Stern } 460*17230acdSAlan Stern 461*17230acdSAlan Stern /* 462*17230acdSAlan Stern * Link a period-1 interrupt or async QH into the schedule at the 463*17230acdSAlan Stern * correct spot in the async skeleton's list, and update the FSBR link 464*17230acdSAlan Stern */ 465*17230acdSAlan Stern static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) 466*17230acdSAlan Stern { 467*17230acdSAlan Stern struct uhci_qh *pqh, *lqh; 468*17230acdSAlan Stern __le32 link_to_new_qh; 469*17230acdSAlan Stern __le32 *extra_link = &link_to_new_qh; 470*17230acdSAlan Stern 471*17230acdSAlan Stern /* Find the predecessor QH for our new one and insert it in the list. 472*17230acdSAlan Stern * The list of QHs is expected to be short, so linear search won't 473*17230acdSAlan Stern * take too long. */ 474*17230acdSAlan Stern list_for_each_entry_reverse(pqh, &uhci->skel_async_qh->node, node) { 475*17230acdSAlan Stern if (pqh->skel <= qh->skel) 476*17230acdSAlan Stern break; 477*17230acdSAlan Stern } 478*17230acdSAlan Stern list_add(&qh->node, &pqh->node); 479*17230acdSAlan Stern qh->link = pqh->link; 480*17230acdSAlan Stern 481*17230acdSAlan Stern link_to_new_qh = LINK_TO_QH(qh); 482*17230acdSAlan Stern 483*17230acdSAlan Stern /* If this is now the first FSBR QH, take special action */ 484*17230acdSAlan Stern if (uhci->fsbr_is_on && pqh->skel < SKEL_FSBR && 485*17230acdSAlan Stern qh->skel >= SKEL_FSBR) { 486*17230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 487*17230acdSAlan Stern struct uhci_qh, node); 488*17230acdSAlan Stern 489*17230acdSAlan Stern /* If the new QH is also the last one, we must unlink 490*17230acdSAlan Stern * the terminating skeleton QH and make the new QH point 491*17230acdSAlan Stern * back to itself. */ 492*17230acdSAlan Stern if (qh == lqh) { 493*17230acdSAlan Stern qh->link = link_to_new_qh; 494*17230acdSAlan Stern extra_link = &uhci->skel_term_qh->link; 495*17230acdSAlan Stern 496*17230acdSAlan Stern /* Otherwise the last QH must point to the new QH */ 497*17230acdSAlan Stern } else 498*17230acdSAlan Stern extra_link = &lqh->link; 499*17230acdSAlan Stern } 500*17230acdSAlan Stern 501*17230acdSAlan Stern /* Link it into the schedule */ 502*17230acdSAlan Stern wmb(); 503*17230acdSAlan Stern *extra_link = pqh->link = link_to_new_qh; 504*17230acdSAlan Stern } 505*17230acdSAlan Stern 506*17230acdSAlan Stern /* 507dccf4a48SAlan Stern * Put a QH on the schedule in both hardware and software 5081da177e4SLinus Torvalds */ 509dccf4a48SAlan Stern static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 5101da177e4SLinus Torvalds { 511dccf4a48SAlan Stern WARN_ON(list_empty(&qh->queue)); 512dccf4a48SAlan Stern 513dccf4a48SAlan Stern /* Set the element pointer if it isn't set already. 514dccf4a48SAlan Stern * This isn't needed for Isochronous queues, but it doesn't hurt. */ 515dccf4a48SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM) { 516dccf4a48SAlan Stern struct urb_priv *urbp = list_entry(qh->queue.next, 517dccf4a48SAlan Stern struct urb_priv, node); 518dccf4a48SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 519dccf4a48SAlan Stern struct uhci_td, list); 520dccf4a48SAlan Stern 52128b9325eSAlan Stern qh->element = LINK_TO_TD(td); 522dccf4a48SAlan Stern } 523dccf4a48SAlan Stern 52484afddd7SAlan Stern /* Treat the queue as if it has just advanced */ 52584afddd7SAlan Stern qh->wait_expired = 0; 52684afddd7SAlan Stern qh->advance_jiffies = jiffies; 52784afddd7SAlan Stern 528dccf4a48SAlan Stern if (qh->state == QH_STATE_ACTIVE) 5291da177e4SLinus Torvalds return; 530dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 531dccf4a48SAlan Stern 532*17230acdSAlan Stern /* Move the QH from its old list to the correct spot in the appropriate 533dccf4a48SAlan Stern * skeleton's list */ 5340ed8fee1SAlan Stern if (qh == uhci->next_qh) 5350ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 5360ed8fee1SAlan Stern node); 537*17230acdSAlan Stern list_del(&qh->node); 538dccf4a48SAlan Stern 539*17230acdSAlan Stern if (qh->skel == SKEL_ISO) 540*17230acdSAlan Stern link_iso(uhci, qh); 541*17230acdSAlan Stern else if (qh->skel < SKEL_ASYNC) 542*17230acdSAlan Stern link_interrupt(uhci, qh); 543*17230acdSAlan Stern else 544*17230acdSAlan Stern link_async(uhci, qh); 545*17230acdSAlan Stern } 546*17230acdSAlan Stern 547*17230acdSAlan Stern /* 548*17230acdSAlan Stern * Unlink a high-period interrupt QH from the schedule 549*17230acdSAlan Stern */ 550*17230acdSAlan Stern static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) 551*17230acdSAlan Stern { 552*17230acdSAlan Stern struct uhci_qh *pqh; 553*17230acdSAlan Stern 554dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 555*17230acdSAlan Stern pqh->link = qh->link; 556*17230acdSAlan Stern mb(); 557*17230acdSAlan Stern } 558*17230acdSAlan Stern 559*17230acdSAlan Stern /* 560*17230acdSAlan Stern * Unlink a period-1 interrupt or async QH from the schedule 561*17230acdSAlan Stern */ 562*17230acdSAlan Stern static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) 563*17230acdSAlan Stern { 564*17230acdSAlan Stern struct uhci_qh *pqh, *lqh; 565*17230acdSAlan Stern __le32 link_to_next_qh = qh->link; 566*17230acdSAlan Stern 567*17230acdSAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 568*17230acdSAlan Stern 569*17230acdSAlan Stern /* If this is the first FSBQ QH, take special action */ 570*17230acdSAlan Stern if (uhci->fsbr_is_on && pqh->skel < SKEL_FSBR && 571*17230acdSAlan Stern qh->skel >= SKEL_FSBR) { 572*17230acdSAlan Stern lqh = list_entry(uhci->skel_async_qh->node.prev, 573*17230acdSAlan Stern struct uhci_qh, node); 574*17230acdSAlan Stern 575*17230acdSAlan Stern /* If this QH is also the last one, we must link in 576*17230acdSAlan Stern * the terminating skeleton QH. */ 577*17230acdSAlan Stern if (qh == lqh) { 578*17230acdSAlan Stern link_to_next_qh = LINK_TO_QH(uhci->skel_term_qh); 579*17230acdSAlan Stern uhci->skel_term_qh->link = link_to_next_qh; 580dccf4a48SAlan Stern wmb(); 581*17230acdSAlan Stern qh->link = link_to_next_qh; 582*17230acdSAlan Stern 583*17230acdSAlan Stern /* Otherwise the last QH must point to the new first FSBR QH */ 584*17230acdSAlan Stern } else 585*17230acdSAlan Stern lqh->link = link_to_next_qh; 586*17230acdSAlan Stern } 587*17230acdSAlan Stern 588*17230acdSAlan Stern pqh->link = link_to_next_qh; 589*17230acdSAlan Stern mb(); 590dccf4a48SAlan Stern } 5911da177e4SLinus Torvalds 5921da177e4SLinus Torvalds /* 593dccf4a48SAlan Stern * Take a QH off the hardware schedule 5941da177e4SLinus Torvalds */ 595dccf4a48SAlan Stern static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 596dccf4a48SAlan Stern { 597dccf4a48SAlan Stern if (qh->state == QH_STATE_UNLINKING) 598dccf4a48SAlan Stern return; 599dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev); 600dccf4a48SAlan Stern qh->state = QH_STATE_UNLINKING; 6011da177e4SLinus Torvalds 602dccf4a48SAlan Stern /* Unlink the QH from the schedule and record when we did it */ 603*17230acdSAlan Stern if (qh->skel == SKEL_ISO) 604*17230acdSAlan Stern ; 605*17230acdSAlan Stern else if (qh->skel < SKEL_ASYNC) 606*17230acdSAlan Stern unlink_interrupt(uhci, qh); 607*17230acdSAlan Stern else 608*17230acdSAlan Stern unlink_async(uhci, qh); 6091da177e4SLinus Torvalds 6101da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 611dccf4a48SAlan Stern qh->unlink_frame = uhci->frame_number; 6121da177e4SLinus Torvalds 613dccf4a48SAlan Stern /* Force an interrupt so we know when the QH is fully unlinked */ 614dccf4a48SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 6151da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 6161da177e4SLinus Torvalds 617dccf4a48SAlan Stern /* Move the QH from its old list to the end of the unlinking list */ 6180ed8fee1SAlan Stern if (qh == uhci->next_qh) 6190ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 6200ed8fee1SAlan Stern node); 621dccf4a48SAlan Stern list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); 6221da177e4SLinus Torvalds } 6231da177e4SLinus Torvalds 6241da177e4SLinus Torvalds /* 625dccf4a48SAlan Stern * When we and the controller are through with a QH, it becomes IDLE. 626dccf4a48SAlan Stern * This happens when a QH has been off the schedule (on the unlinking 627dccf4a48SAlan Stern * list) for more than one frame, or when an error occurs while adding 628dccf4a48SAlan Stern * the first URB onto a new QH. 6291da177e4SLinus Torvalds */ 630dccf4a48SAlan Stern static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) 631dccf4a48SAlan Stern { 632dccf4a48SAlan Stern WARN_ON(qh->state == QH_STATE_ACTIVE); 633dccf4a48SAlan Stern 6340ed8fee1SAlan Stern if (qh == uhci->next_qh) 6350ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 6360ed8fee1SAlan Stern node); 637dccf4a48SAlan Stern list_move(&qh->node, &uhci->idle_qh_list); 638dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 639dccf4a48SAlan Stern 64059e29ed9SAlan Stern /* Now that the QH is idle, its post_td isn't being used */ 64159e29ed9SAlan Stern if (qh->post_td) { 64259e29ed9SAlan Stern uhci_free_td(uhci, qh->post_td); 64359e29ed9SAlan Stern qh->post_td = NULL; 64459e29ed9SAlan Stern } 64559e29ed9SAlan Stern 646dccf4a48SAlan Stern /* If anyone is waiting for a QH to become idle, wake them up */ 647dccf4a48SAlan Stern if (uhci->num_waiting) 648dccf4a48SAlan Stern wake_up_all(&uhci->waitqh); 6491da177e4SLinus Torvalds } 6501da177e4SLinus Torvalds 6513ca2a321SAlan Stern /* 6523ca2a321SAlan Stern * Find the highest existing bandwidth load for a given phase and period. 6533ca2a321SAlan Stern */ 6543ca2a321SAlan Stern static int uhci_highest_load(struct uhci_hcd *uhci, int phase, int period) 6553ca2a321SAlan Stern { 6563ca2a321SAlan Stern int highest_load = uhci->load[phase]; 6573ca2a321SAlan Stern 6583ca2a321SAlan Stern for (phase += period; phase < MAX_PHASE; phase += period) 6593ca2a321SAlan Stern highest_load = max_t(int, highest_load, uhci->load[phase]); 6603ca2a321SAlan Stern return highest_load; 6613ca2a321SAlan Stern } 6623ca2a321SAlan Stern 6633ca2a321SAlan Stern /* 6643ca2a321SAlan Stern * Set qh->phase to the optimal phase for a periodic transfer and 6653ca2a321SAlan Stern * check whether the bandwidth requirement is acceptable. 6663ca2a321SAlan Stern */ 6673ca2a321SAlan Stern static int uhci_check_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 6683ca2a321SAlan Stern { 6693ca2a321SAlan Stern int minimax_load; 6703ca2a321SAlan Stern 6713ca2a321SAlan Stern /* Find the optimal phase (unless it is already set) and get 6723ca2a321SAlan Stern * its load value. */ 6733ca2a321SAlan Stern if (qh->phase >= 0) 6743ca2a321SAlan Stern minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); 6753ca2a321SAlan Stern else { 6763ca2a321SAlan Stern int phase, load; 6773ca2a321SAlan Stern int max_phase = min_t(int, MAX_PHASE, qh->period); 6783ca2a321SAlan Stern 6793ca2a321SAlan Stern qh->phase = 0; 6803ca2a321SAlan Stern minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); 6813ca2a321SAlan Stern for (phase = 1; phase < max_phase; ++phase) { 6823ca2a321SAlan Stern load = uhci_highest_load(uhci, phase, qh->period); 6833ca2a321SAlan Stern if (load < minimax_load) { 6843ca2a321SAlan Stern minimax_load = load; 6853ca2a321SAlan Stern qh->phase = phase; 6863ca2a321SAlan Stern } 6873ca2a321SAlan Stern } 6883ca2a321SAlan Stern } 6893ca2a321SAlan Stern 6903ca2a321SAlan Stern /* Maximum allowable periodic bandwidth is 90%, or 900 us per frame */ 6913ca2a321SAlan Stern if (minimax_load + qh->load > 900) { 6923ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), "bandwidth allocation failed: " 6933ca2a321SAlan Stern "period %d, phase %d, %d + %d us\n", 6943ca2a321SAlan Stern qh->period, qh->phase, minimax_load, qh->load); 6953ca2a321SAlan Stern return -ENOSPC; 6963ca2a321SAlan Stern } 6973ca2a321SAlan Stern return 0; 6983ca2a321SAlan Stern } 6993ca2a321SAlan Stern 7003ca2a321SAlan Stern /* 7013ca2a321SAlan Stern * Reserve a periodic QH's bandwidth in the schedule 7023ca2a321SAlan Stern */ 7033ca2a321SAlan Stern static void uhci_reserve_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 7043ca2a321SAlan Stern { 7053ca2a321SAlan Stern int i; 7063ca2a321SAlan Stern int load = qh->load; 7073ca2a321SAlan Stern char *p = "??"; 7083ca2a321SAlan Stern 7093ca2a321SAlan Stern for (i = qh->phase; i < MAX_PHASE; i += qh->period) { 7103ca2a321SAlan Stern uhci->load[i] += load; 7113ca2a321SAlan Stern uhci->total_load += load; 7123ca2a321SAlan Stern } 7133ca2a321SAlan Stern uhci_to_hcd(uhci)->self.bandwidth_allocated = 7143ca2a321SAlan Stern uhci->total_load / MAX_PHASE; 7153ca2a321SAlan Stern switch (qh->type) { 7163ca2a321SAlan Stern case USB_ENDPOINT_XFER_INT: 7173ca2a321SAlan Stern ++uhci_to_hcd(uhci)->self.bandwidth_int_reqs; 7183ca2a321SAlan Stern p = "INT"; 7193ca2a321SAlan Stern break; 7203ca2a321SAlan Stern case USB_ENDPOINT_XFER_ISOC: 7213ca2a321SAlan Stern ++uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; 7223ca2a321SAlan Stern p = "ISO"; 7233ca2a321SAlan Stern break; 7243ca2a321SAlan Stern } 7253ca2a321SAlan Stern qh->bandwidth_reserved = 1; 7263ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), 7273ca2a321SAlan Stern "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n", 7283ca2a321SAlan Stern "reserve", qh->udev->devnum, 7293ca2a321SAlan Stern qh->hep->desc.bEndpointAddress, p, 7303ca2a321SAlan Stern qh->period, qh->phase, load); 7313ca2a321SAlan Stern } 7323ca2a321SAlan Stern 7333ca2a321SAlan Stern /* 7343ca2a321SAlan Stern * Release a periodic QH's bandwidth reservation 7353ca2a321SAlan Stern */ 7363ca2a321SAlan Stern static void uhci_release_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) 7373ca2a321SAlan Stern { 7383ca2a321SAlan Stern int i; 7393ca2a321SAlan Stern int load = qh->load; 7403ca2a321SAlan Stern char *p = "??"; 7413ca2a321SAlan Stern 7423ca2a321SAlan Stern for (i = qh->phase; i < MAX_PHASE; i += qh->period) { 7433ca2a321SAlan Stern uhci->load[i] -= load; 7443ca2a321SAlan Stern uhci->total_load -= load; 7453ca2a321SAlan Stern } 7463ca2a321SAlan Stern uhci_to_hcd(uhci)->self.bandwidth_allocated = 7473ca2a321SAlan Stern uhci->total_load / MAX_PHASE; 7483ca2a321SAlan Stern switch (qh->type) { 7493ca2a321SAlan Stern case USB_ENDPOINT_XFER_INT: 7503ca2a321SAlan Stern --uhci_to_hcd(uhci)->self.bandwidth_int_reqs; 7513ca2a321SAlan Stern p = "INT"; 7523ca2a321SAlan Stern break; 7533ca2a321SAlan Stern case USB_ENDPOINT_XFER_ISOC: 7543ca2a321SAlan Stern --uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; 7553ca2a321SAlan Stern p = "ISO"; 7563ca2a321SAlan Stern break; 7573ca2a321SAlan Stern } 7583ca2a321SAlan Stern qh->bandwidth_reserved = 0; 7593ca2a321SAlan Stern dev_dbg(uhci_dev(uhci), 7603ca2a321SAlan Stern "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n", 7613ca2a321SAlan Stern "release", qh->udev->devnum, 7623ca2a321SAlan Stern qh->hep->desc.bEndpointAddress, p, 7633ca2a321SAlan Stern qh->period, qh->phase, load); 7643ca2a321SAlan Stern } 7653ca2a321SAlan Stern 766dccf4a48SAlan Stern static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, 767dccf4a48SAlan Stern struct urb *urb) 7681da177e4SLinus Torvalds { 7691da177e4SLinus Torvalds struct urb_priv *urbp; 7701da177e4SLinus Torvalds 771c3762229SRobert P. J. Day urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_ATOMIC); 7721da177e4SLinus Torvalds if (!urbp) 7731da177e4SLinus Torvalds return NULL; 7741da177e4SLinus Torvalds 7751da177e4SLinus Torvalds urbp->urb = urb; 7761da177e4SLinus Torvalds urb->hcpriv = urbp; 777dccf4a48SAlan Stern 778dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->node); 779dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->td_list); 7801da177e4SLinus Torvalds 7811da177e4SLinus Torvalds return urbp; 7821da177e4SLinus Torvalds } 7831da177e4SLinus Torvalds 784dccf4a48SAlan Stern static void uhci_free_urb_priv(struct uhci_hcd *uhci, 785dccf4a48SAlan Stern struct urb_priv *urbp) 7861da177e4SLinus Torvalds { 7871da177e4SLinus Torvalds struct uhci_td *td, *tmp; 7881da177e4SLinus Torvalds 789dccf4a48SAlan Stern if (!list_empty(&urbp->node)) 790dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n", 791dccf4a48SAlan Stern urbp->urb); 7921da177e4SLinus Torvalds 7931da177e4SLinus Torvalds list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 79404538a25SAlan Stern uhci_remove_td_from_urbp(td); 79504538a25SAlan Stern uhci_free_td(uhci, td); 7961da177e4SLinus Torvalds } 7971da177e4SLinus Torvalds 798dccf4a48SAlan Stern urbp->urb->hcpriv = NULL; 7991da177e4SLinus Torvalds kmem_cache_free(uhci_up_cachep, urbp); 8001da177e4SLinus Torvalds } 8011da177e4SLinus Torvalds 8021da177e4SLinus Torvalds /* 8031da177e4SLinus Torvalds * Map status to standard result codes 8041da177e4SLinus Torvalds * 8051da177e4SLinus Torvalds * <status> is (td_status(td) & 0xF60000), a.k.a. 8061da177e4SLinus Torvalds * uhci_status_bits(td_status(td)). 8071da177e4SLinus Torvalds * Note: <status> does not include the TD_CTRL_NAK bit. 8081da177e4SLinus Torvalds * <dir_out> is True for output TDs and False for input TDs. 8091da177e4SLinus Torvalds */ 8101da177e4SLinus Torvalds static int uhci_map_status(int status, int dir_out) 8111da177e4SLinus Torvalds { 8121da177e4SLinus Torvalds if (!status) 8131da177e4SLinus Torvalds return 0; 8141da177e4SLinus Torvalds if (status & TD_CTRL_BITSTUFF) /* Bitstuff error */ 8151da177e4SLinus Torvalds return -EPROTO; 8161da177e4SLinus Torvalds if (status & TD_CTRL_CRCTIMEO) { /* CRC/Timeout */ 8171da177e4SLinus Torvalds if (dir_out) 8181da177e4SLinus Torvalds return -EPROTO; 8191da177e4SLinus Torvalds else 8201da177e4SLinus Torvalds return -EILSEQ; 8211da177e4SLinus Torvalds } 8221da177e4SLinus Torvalds if (status & TD_CTRL_BABBLE) /* Babble */ 8231da177e4SLinus Torvalds return -EOVERFLOW; 8241da177e4SLinus Torvalds if (status & TD_CTRL_DBUFERR) /* Buffer error */ 8251da177e4SLinus Torvalds return -ENOSR; 8261da177e4SLinus Torvalds if (status & TD_CTRL_STALLED) /* Stalled */ 8271da177e4SLinus Torvalds return -EPIPE; 8281da177e4SLinus Torvalds return 0; 8291da177e4SLinus Torvalds } 8301da177e4SLinus Torvalds 8311da177e4SLinus Torvalds /* 8321da177e4SLinus Torvalds * Control transfers 8331da177e4SLinus Torvalds */ 834dccf4a48SAlan Stern static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, 835dccf4a48SAlan Stern struct uhci_qh *qh) 8361da177e4SLinus Torvalds { 8371da177e4SLinus Torvalds struct uhci_td *td; 8381da177e4SLinus Torvalds unsigned long destination, status; 839dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 8401da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 8411da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 842dccf4a48SAlan Stern __le32 *plink; 84304538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 844*17230acdSAlan Stern int skel; 8451da177e4SLinus Torvalds 8461da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 8471da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP; 8481da177e4SLinus Torvalds 849af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 850af0bb599SAlan Stern status = uhci_maxerr(3); 8511da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 8521da177e4SLinus Torvalds status |= TD_CTRL_LS; 8531da177e4SLinus Torvalds 8541da177e4SLinus Torvalds /* 8551da177e4SLinus Torvalds * Build the TD for the control request setup packet 8561da177e4SLinus Torvalds */ 857af0bb599SAlan Stern td = qh->dummy_td; 85804538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 859fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(8), 8601da177e4SLinus Torvalds urb->setup_dma); 861dccf4a48SAlan Stern plink = &td->link; 862af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 8631da177e4SLinus Torvalds 8641da177e4SLinus Torvalds /* 8651da177e4SLinus Torvalds * If direction is "send", change the packet ID from SETUP (0x2D) 8661da177e4SLinus Torvalds * to OUT (0xE1). Else change it from SETUP to IN (0x69) and 8671da177e4SLinus Torvalds * set Short Packet Detect (SPD) for all data packets. 8681da177e4SLinus Torvalds */ 8691da177e4SLinus Torvalds if (usb_pipeout(urb->pipe)) 8701da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_OUT); 8711da177e4SLinus Torvalds else { 8721da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_IN); 8731da177e4SLinus Torvalds status |= TD_CTRL_SPD; 8741da177e4SLinus Torvalds } 8751da177e4SLinus Torvalds 8761da177e4SLinus Torvalds /* 877687f5f34SAlan Stern * Build the DATA TDs 8781da177e4SLinus Torvalds */ 8791da177e4SLinus Torvalds while (len > 0) { 880dccf4a48SAlan Stern int pktsze = min(len, maxsze); 8811da177e4SLinus Torvalds 8822532178aSAlan Stern td = uhci_alloc_td(uhci); 8831da177e4SLinus Torvalds if (!td) 884af0bb599SAlan Stern goto nomem; 88528b9325eSAlan Stern *plink = LINK_TO_TD(td); 8861da177e4SLinus Torvalds 8871da177e4SLinus Torvalds /* Alternate Data0/1 (start with Data1) */ 8881da177e4SLinus Torvalds destination ^= TD_TOKEN_TOGGLE; 8891da177e4SLinus Torvalds 89004538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 891fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(pktsze), 8921da177e4SLinus Torvalds data); 893dccf4a48SAlan Stern plink = &td->link; 8941da177e4SLinus Torvalds 8951da177e4SLinus Torvalds data += pktsze; 8961da177e4SLinus Torvalds len -= pktsze; 8971da177e4SLinus Torvalds } 8981da177e4SLinus Torvalds 8991da177e4SLinus Torvalds /* 9001da177e4SLinus Torvalds * Build the final TD for control status 9011da177e4SLinus Torvalds */ 9022532178aSAlan Stern td = uhci_alloc_td(uhci); 9031da177e4SLinus Torvalds if (!td) 904af0bb599SAlan Stern goto nomem; 90528b9325eSAlan Stern *plink = LINK_TO_TD(td); 9061da177e4SLinus Torvalds 9071da177e4SLinus Torvalds /* 9081da177e4SLinus Torvalds * It's IN if the pipe is an output pipe or we're not expecting 9091da177e4SLinus Torvalds * data back. 9101da177e4SLinus Torvalds */ 9111da177e4SLinus Torvalds destination &= ~TD_TOKEN_PID_MASK; 9121da177e4SLinus Torvalds if (usb_pipeout(urb->pipe) || !urb->transfer_buffer_length) 9131da177e4SLinus Torvalds destination |= USB_PID_IN; 9141da177e4SLinus Torvalds else 9151da177e4SLinus Torvalds destination |= USB_PID_OUT; 9161da177e4SLinus Torvalds 9171da177e4SLinus Torvalds destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ 9181da177e4SLinus Torvalds 9191da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 9201da177e4SLinus Torvalds 92104538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 9221da177e4SLinus Torvalds uhci_fill_td(td, status | TD_CTRL_IOC, 923fa346568SAlan Stern destination | uhci_explen(0), 0); 924af0bb599SAlan Stern plink = &td->link; 925af0bb599SAlan Stern 926af0bb599SAlan Stern /* 927af0bb599SAlan Stern * Build the new dummy TD and activate the old one 928af0bb599SAlan Stern */ 929af0bb599SAlan Stern td = uhci_alloc_td(uhci); 930af0bb599SAlan Stern if (!td) 931af0bb599SAlan Stern goto nomem; 93228b9325eSAlan Stern *plink = LINK_TO_TD(td); 933af0bb599SAlan Stern 934af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 935af0bb599SAlan Stern wmb(); 936af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 937af0bb599SAlan Stern qh->dummy_td = td; 9381da177e4SLinus Torvalds 9391da177e4SLinus Torvalds /* Low-speed transfers get a different queue, and won't hog the bus. 9401da177e4SLinus Torvalds * Also, some devices enumerate better without FSBR; the easiest way 9411da177e4SLinus Torvalds * to do that is to put URBs on the low-speed queue while the device 942630aa3cfSAlan Stern * isn't in the CONFIGURED state. */ 9431da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW || 944630aa3cfSAlan Stern urb->dev->state != USB_STATE_CONFIGURED) 945*17230acdSAlan Stern skel = SKEL_LS_CONTROL; 9461da177e4SLinus Torvalds else { 947*17230acdSAlan Stern skel = SKEL_FS_CONTROL; 94884afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 9491da177e4SLinus Torvalds } 950*17230acdSAlan Stern if (qh->state != QH_STATE_ACTIVE) 951*17230acdSAlan Stern qh->skel = skel; 95259e29ed9SAlan Stern 95359e29ed9SAlan Stern urb->actual_length = -8; /* Account for the SETUP packet */ 954dccf4a48SAlan Stern return 0; 955af0bb599SAlan Stern 956af0bb599SAlan Stern nomem: 957af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 95804538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 959af0bb599SAlan Stern return -ENOMEM; 9601da177e4SLinus Torvalds } 9611da177e4SLinus Torvalds 9621da177e4SLinus Torvalds /* 9631da177e4SLinus Torvalds * Common submit for bulk and interrupt 9641da177e4SLinus Torvalds */ 965dccf4a48SAlan Stern static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, 966dccf4a48SAlan Stern struct uhci_qh *qh) 9671da177e4SLinus Torvalds { 9681da177e4SLinus Torvalds struct uhci_td *td; 9691da177e4SLinus Torvalds unsigned long destination, status; 970dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 9711da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 9721da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 973af0bb599SAlan Stern __le32 *plink; 97404538a25SAlan Stern struct urb_priv *urbp = urb->hcpriv; 975af0bb599SAlan Stern unsigned int toggle; 9761da177e4SLinus Torvalds 9771da177e4SLinus Torvalds if (len < 0) 9781da177e4SLinus Torvalds return -EINVAL; 9791da177e4SLinus Torvalds 9801da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 9811da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 982af0bb599SAlan Stern toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), 983af0bb599SAlan Stern usb_pipeout(urb->pipe)); 9841da177e4SLinus Torvalds 985af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 986af0bb599SAlan Stern status = uhci_maxerr(3); 9871da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 9881da177e4SLinus Torvalds status |= TD_CTRL_LS; 9891da177e4SLinus Torvalds if (usb_pipein(urb->pipe)) 9901da177e4SLinus Torvalds status |= TD_CTRL_SPD; 9911da177e4SLinus Torvalds 9921da177e4SLinus Torvalds /* 993687f5f34SAlan Stern * Build the DATA TDs 9941da177e4SLinus Torvalds */ 995af0bb599SAlan Stern plink = NULL; 996af0bb599SAlan Stern td = qh->dummy_td; 9971da177e4SLinus Torvalds do { /* Allow zero length packets */ 9981da177e4SLinus Torvalds int pktsze = maxsze; 9991da177e4SLinus Torvalds 1000dccf4a48SAlan Stern if (len <= pktsze) { /* The last packet */ 10011da177e4SLinus Torvalds pktsze = len; 10021da177e4SLinus Torvalds if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) 10031da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 10041da177e4SLinus Torvalds } 10051da177e4SLinus Torvalds 1006af0bb599SAlan Stern if (plink) { 10072532178aSAlan Stern td = uhci_alloc_td(uhci); 10081da177e4SLinus Torvalds if (!td) 1009af0bb599SAlan Stern goto nomem; 101028b9325eSAlan Stern *plink = LINK_TO_TD(td); 1011af0bb599SAlan Stern } 101204538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 1013dccf4a48SAlan Stern uhci_fill_td(td, status, 1014dccf4a48SAlan Stern destination | uhci_explen(pktsze) | 1015af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 10161da177e4SLinus Torvalds data); 1017dccf4a48SAlan Stern plink = &td->link; 1018af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 10191da177e4SLinus Torvalds 10201da177e4SLinus Torvalds data += pktsze; 10211da177e4SLinus Torvalds len -= maxsze; 1022af0bb599SAlan Stern toggle ^= 1; 10231da177e4SLinus Torvalds } while (len > 0); 10241da177e4SLinus Torvalds 10251da177e4SLinus Torvalds /* 10261da177e4SLinus Torvalds * URB_ZERO_PACKET means adding a 0-length packet, if direction 10271da177e4SLinus Torvalds * is OUT and the transfer_length was an exact multiple of maxsze, 10281da177e4SLinus Torvalds * hence (len = transfer_length - N * maxsze) == 0 10291da177e4SLinus Torvalds * however, if transfer_length == 0, the zero packet was already 10301da177e4SLinus Torvalds * prepared above. 10311da177e4SLinus Torvalds */ 1032dccf4a48SAlan Stern if ((urb->transfer_flags & URB_ZERO_PACKET) && 1033dccf4a48SAlan Stern usb_pipeout(urb->pipe) && len == 0 && 1034dccf4a48SAlan Stern urb->transfer_buffer_length > 0) { 10352532178aSAlan Stern td = uhci_alloc_td(uhci); 10361da177e4SLinus Torvalds if (!td) 1037af0bb599SAlan Stern goto nomem; 103828b9325eSAlan Stern *plink = LINK_TO_TD(td); 10391da177e4SLinus Torvalds 104004538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 1041af0bb599SAlan Stern uhci_fill_td(td, status, 1042af0bb599SAlan Stern destination | uhci_explen(0) | 1043af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 10441da177e4SLinus Torvalds data); 1045af0bb599SAlan Stern plink = &td->link; 10461da177e4SLinus Torvalds 1047af0bb599SAlan Stern toggle ^= 1; 10481da177e4SLinus Torvalds } 10491da177e4SLinus Torvalds 10501da177e4SLinus Torvalds /* Set the interrupt-on-completion flag on the last packet. 10511da177e4SLinus Torvalds * A more-or-less typical 4 KB URB (= size of one memory page) 10521da177e4SLinus Torvalds * will require about 3 ms to transfer; that's a little on the 10531da177e4SLinus Torvalds * fast side but not enough to justify delaying an interrupt 10541da177e4SLinus Torvalds * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT 10551da177e4SLinus Torvalds * flag setting. */ 1056dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 10571da177e4SLinus Torvalds 1058af0bb599SAlan Stern /* 1059af0bb599SAlan Stern * Build the new dummy TD and activate the old one 1060af0bb599SAlan Stern */ 1061af0bb599SAlan Stern td = uhci_alloc_td(uhci); 1062af0bb599SAlan Stern if (!td) 1063af0bb599SAlan Stern goto nomem; 106428b9325eSAlan Stern *plink = LINK_TO_TD(td); 1065af0bb599SAlan Stern 1066af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 1067af0bb599SAlan Stern wmb(); 1068af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 1069af0bb599SAlan Stern qh->dummy_td = td; 1070af0bb599SAlan Stern 1071af0bb599SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 1072af0bb599SAlan Stern usb_pipeout(urb->pipe), toggle); 1073dccf4a48SAlan Stern return 0; 1074af0bb599SAlan Stern 1075af0bb599SAlan Stern nomem: 1076af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 107704538a25SAlan Stern uhci_remove_td_from_urbp(qh->dummy_td); 1078af0bb599SAlan Stern return -ENOMEM; 10791da177e4SLinus Torvalds } 10801da177e4SLinus Torvalds 1081*17230acdSAlan Stern static int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, 1082dccf4a48SAlan Stern struct uhci_qh *qh) 10831da177e4SLinus Torvalds { 10841da177e4SLinus Torvalds int ret; 10851da177e4SLinus Torvalds 10861da177e4SLinus Torvalds /* Can't have low-speed bulk transfers */ 10871da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 10881da177e4SLinus Torvalds return -EINVAL; 10891da177e4SLinus Torvalds 1090*17230acdSAlan Stern if (qh->state != QH_STATE_ACTIVE) 1091*17230acdSAlan Stern qh->skel = SKEL_BULK; 1092dccf4a48SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 1093dccf4a48SAlan Stern if (ret == 0) 109484afddd7SAlan Stern uhci_add_fsbr(uhci, urb); 10951da177e4SLinus Torvalds return ret; 10961da177e4SLinus Torvalds } 10971da177e4SLinus Torvalds 1098caf3827aSAlan Stern static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, 1099dccf4a48SAlan Stern struct uhci_qh *qh) 11001da177e4SLinus Torvalds { 11013ca2a321SAlan Stern int ret; 1102caf3827aSAlan Stern 1103dccf4a48SAlan Stern /* USB 1.1 interrupt transfers only involve one packet per interval. 1104dccf4a48SAlan Stern * Drivers can submit URBs of any length, but longer ones will need 1105dccf4a48SAlan Stern * multiple intervals to complete. 11061da177e4SLinus Torvalds */ 1107caf3827aSAlan Stern 11083ca2a321SAlan Stern if (!qh->bandwidth_reserved) { 11093ca2a321SAlan Stern int exponent; 11103ca2a321SAlan Stern 1111caf3827aSAlan Stern /* Figure out which power-of-two queue to use */ 1112caf3827aSAlan Stern for (exponent = 7; exponent >= 0; --exponent) { 1113caf3827aSAlan Stern if ((1 << exponent) <= urb->interval) 1114caf3827aSAlan Stern break; 1115caf3827aSAlan Stern } 1116caf3827aSAlan Stern if (exponent < 0) 1117caf3827aSAlan Stern return -EINVAL; 11183ca2a321SAlan Stern qh->period = 1 << exponent; 1119*17230acdSAlan Stern qh->skel = SKEL_INDEX(exponent); 1120caf3827aSAlan Stern 11213ca2a321SAlan Stern /* For now, interrupt phase is fixed by the layout 11223ca2a321SAlan Stern * of the QH lists. */ 11233ca2a321SAlan Stern qh->phase = (qh->period / 2) & (MAX_PHASE - 1); 11243ca2a321SAlan Stern ret = uhci_check_bandwidth(uhci, qh); 11253ca2a321SAlan Stern if (ret) 11263ca2a321SAlan Stern return ret; 11273ca2a321SAlan Stern } else if (qh->period > urb->interval) 11283ca2a321SAlan Stern return -EINVAL; /* Can't decrease the period */ 11293ca2a321SAlan Stern 11303ca2a321SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 11313ca2a321SAlan Stern if (ret == 0) { 11323ca2a321SAlan Stern urb->interval = qh->period; 11333ca2a321SAlan Stern if (!qh->bandwidth_reserved) 11343ca2a321SAlan Stern uhci_reserve_bandwidth(uhci, qh); 11353ca2a321SAlan Stern } 11363ca2a321SAlan Stern return ret; 11371da177e4SLinus Torvalds } 11381da177e4SLinus Torvalds 11391da177e4SLinus Torvalds /* 1140b1869000SAlan Stern * Fix up the data structures following a short transfer 1141b1869000SAlan Stern */ 1142b1869000SAlan Stern static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, 114359e29ed9SAlan Stern struct uhci_qh *qh, struct urb_priv *urbp) 1144b1869000SAlan Stern { 1145b1869000SAlan Stern struct uhci_td *td; 114659e29ed9SAlan Stern struct list_head *tmp; 114759e29ed9SAlan Stern int ret; 1148b1869000SAlan Stern 1149b1869000SAlan Stern td = list_entry(urbp->td_list.prev, struct uhci_td, list); 1150b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_CONTROL) { 1151b1869000SAlan Stern 1152b1869000SAlan Stern /* When a control transfer is short, we have to restart 1153b1869000SAlan Stern * the queue at the status stage transaction, which is 1154b1869000SAlan Stern * the last TD. */ 115559e29ed9SAlan Stern WARN_ON(list_empty(&urbp->td_list)); 115628b9325eSAlan Stern qh->element = LINK_TO_TD(td); 115759e29ed9SAlan Stern tmp = td->list.prev; 1158b1869000SAlan Stern ret = -EINPROGRESS; 1159b1869000SAlan Stern 116059e29ed9SAlan Stern } else { 1161b1869000SAlan Stern 1162b1869000SAlan Stern /* When a bulk/interrupt transfer is short, we have to 1163b1869000SAlan Stern * fix up the toggles of the following URBs on the queue 1164b1869000SAlan Stern * before restarting the queue at the next URB. */ 116559e29ed9SAlan Stern qh->initial_toggle = uhci_toggle(td_token(qh->post_td)) ^ 1; 1166b1869000SAlan Stern uhci_fixup_toggles(qh, 1); 1167b1869000SAlan Stern 116859e29ed9SAlan Stern if (list_empty(&urbp->td_list)) 116959e29ed9SAlan Stern td = qh->post_td; 1170b1869000SAlan Stern qh->element = td->link; 117159e29ed9SAlan Stern tmp = urbp->td_list.prev; 117259e29ed9SAlan Stern ret = 0; 1173b1869000SAlan Stern } 1174b1869000SAlan Stern 117559e29ed9SAlan Stern /* Remove all the TDs we skipped over, from tmp back to the start */ 117659e29ed9SAlan Stern while (tmp != &urbp->td_list) { 117759e29ed9SAlan Stern td = list_entry(tmp, struct uhci_td, list); 117859e29ed9SAlan Stern tmp = tmp->prev; 117959e29ed9SAlan Stern 118004538a25SAlan Stern uhci_remove_td_from_urbp(td); 118104538a25SAlan Stern uhci_free_td(uhci, td); 118259e29ed9SAlan Stern } 1183b1869000SAlan Stern return ret; 1184b1869000SAlan Stern } 1185b1869000SAlan Stern 1186b1869000SAlan Stern /* 1187b1869000SAlan Stern * Common result for control, bulk, and interrupt 1188b1869000SAlan Stern */ 1189b1869000SAlan Stern static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) 1190b1869000SAlan Stern { 1191b1869000SAlan Stern struct urb_priv *urbp = urb->hcpriv; 1192b1869000SAlan Stern struct uhci_qh *qh = urbp->qh; 119359e29ed9SAlan Stern struct uhci_td *td, *tmp; 1194b1869000SAlan Stern unsigned status; 1195b1869000SAlan Stern int ret = 0; 1196b1869000SAlan Stern 119759e29ed9SAlan Stern list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 1198b1869000SAlan Stern unsigned int ctrlstat; 1199b1869000SAlan Stern int len; 1200b1869000SAlan Stern 1201b1869000SAlan Stern ctrlstat = td_status(td); 1202b1869000SAlan Stern status = uhci_status_bits(ctrlstat); 1203b1869000SAlan Stern if (status & TD_CTRL_ACTIVE) 1204b1869000SAlan Stern return -EINPROGRESS; 1205b1869000SAlan Stern 1206b1869000SAlan Stern len = uhci_actual_length(ctrlstat); 1207b1869000SAlan Stern urb->actual_length += len; 1208b1869000SAlan Stern 1209b1869000SAlan Stern if (status) { 1210b1869000SAlan Stern ret = uhci_map_status(status, 1211b1869000SAlan Stern uhci_packetout(td_token(td))); 1212b1869000SAlan Stern if ((debug == 1 && ret != -EPIPE) || debug > 1) { 1213b1869000SAlan Stern /* Some debugging code */ 1214be3cbc5fSDavid Brownell dev_dbg(&urb->dev->dev, 1215b1869000SAlan Stern "%s: failed with status %x\n", 1216b1869000SAlan Stern __FUNCTION__, status); 1217b1869000SAlan Stern 1218b1869000SAlan Stern if (debug > 1 && errbuf) { 1219b1869000SAlan Stern /* Print the chain for debugging */ 1220b1869000SAlan Stern uhci_show_qh(urbp->qh, errbuf, 1221b1869000SAlan Stern ERRBUF_LEN, 0); 1222b1869000SAlan Stern lprintk(errbuf); 1223b1869000SAlan Stern } 1224b1869000SAlan Stern } 1225b1869000SAlan Stern 1226b1869000SAlan Stern } else if (len < uhci_expected_length(td_token(td))) { 1227b1869000SAlan Stern 1228b1869000SAlan Stern /* We received a short packet */ 1229b1869000SAlan Stern if (urb->transfer_flags & URB_SHORT_NOT_OK) 1230b1869000SAlan Stern ret = -EREMOTEIO; 1231f443ddf1SAlan Stern 1232f443ddf1SAlan Stern /* Fixup needed only if this isn't the URB's last TD */ 1233f443ddf1SAlan Stern else if (&td->list != urbp->td_list.prev) 1234b1869000SAlan Stern ret = 1; 1235b1869000SAlan Stern } 1236b1869000SAlan Stern 123704538a25SAlan Stern uhci_remove_td_from_urbp(td); 123859e29ed9SAlan Stern if (qh->post_td) 123904538a25SAlan Stern uhci_free_td(uhci, qh->post_td); 124059e29ed9SAlan Stern qh->post_td = td; 124159e29ed9SAlan Stern 1242b1869000SAlan Stern if (ret != 0) 1243b1869000SAlan Stern goto err; 1244b1869000SAlan Stern } 1245b1869000SAlan Stern return ret; 1246b1869000SAlan Stern 1247b1869000SAlan Stern err: 1248b1869000SAlan Stern if (ret < 0) { 1249b1869000SAlan Stern /* In case a control transfer gets an error 1250b1869000SAlan Stern * during the setup stage */ 1251b1869000SAlan Stern urb->actual_length = max(urb->actual_length, 0); 1252b1869000SAlan Stern 1253b1869000SAlan Stern /* Note that the queue has stopped and save 1254b1869000SAlan Stern * the next toggle value */ 1255b1869000SAlan Stern qh->element = UHCI_PTR_TERM; 1256b1869000SAlan Stern qh->is_stopped = 1; 1257b1869000SAlan Stern qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); 1258b1869000SAlan Stern qh->initial_toggle = uhci_toggle(td_token(td)) ^ 1259b1869000SAlan Stern (ret == -EREMOTEIO); 1260b1869000SAlan Stern 1261b1869000SAlan Stern } else /* Short packet received */ 126259e29ed9SAlan Stern ret = uhci_fixup_short_transfer(uhci, qh, urbp); 1263b1869000SAlan Stern return ret; 1264b1869000SAlan Stern } 1265b1869000SAlan Stern 1266b1869000SAlan Stern /* 12671da177e4SLinus Torvalds * Isochronous transfers 12681da177e4SLinus Torvalds */ 1269dccf4a48SAlan Stern static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, 1270dccf4a48SAlan Stern struct uhci_qh *qh) 12711da177e4SLinus Torvalds { 1272dccf4a48SAlan Stern struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ 12730ed8fee1SAlan Stern int i, frame; 1274dccf4a48SAlan Stern unsigned long destination, status; 1275b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 12761da177e4SLinus Torvalds 1277caf3827aSAlan Stern /* Values must not be too big (could overflow below) */ 1278caf3827aSAlan Stern if (urb->interval >= UHCI_NUMFRAMES || 1279caf3827aSAlan Stern urb->number_of_packets >= UHCI_NUMFRAMES) 1280caf3827aSAlan Stern return -EFBIG; 1281caf3827aSAlan Stern 1282caf3827aSAlan Stern /* Check the period and figure out the starting frame number */ 12833ca2a321SAlan Stern if (!qh->bandwidth_reserved) { 12843ca2a321SAlan Stern qh->period = urb->interval; 1285caf3827aSAlan Stern if (urb->transfer_flags & URB_ISO_ASAP) { 12863ca2a321SAlan Stern qh->phase = -1; /* Find the best phase */ 12873ca2a321SAlan Stern i = uhci_check_bandwidth(uhci, qh); 12883ca2a321SAlan Stern if (i) 12893ca2a321SAlan Stern return i; 12903ca2a321SAlan Stern 12913ca2a321SAlan Stern /* Allow a little time to allocate the TDs */ 1292c8155cc5SAlan Stern uhci_get_current_frame_number(uhci); 12933ca2a321SAlan Stern frame = uhci->frame_number + 10; 12943ca2a321SAlan Stern 12953ca2a321SAlan Stern /* Move forward to the first frame having the 12963ca2a321SAlan Stern * correct phase */ 12973ca2a321SAlan Stern urb->start_frame = frame + ((qh->phase - frame) & 12983ca2a321SAlan Stern (qh->period - 1)); 1299caf3827aSAlan Stern } else { 1300c8155cc5SAlan Stern i = urb->start_frame - uhci->last_iso_frame; 1301caf3827aSAlan Stern if (i <= 0 || i >= UHCI_NUMFRAMES) 1302caf3827aSAlan Stern return -EINVAL; 13033ca2a321SAlan Stern qh->phase = urb->start_frame & (qh->period - 1); 13043ca2a321SAlan Stern i = uhci_check_bandwidth(uhci, qh); 13053ca2a321SAlan Stern if (i) 13063ca2a321SAlan Stern return i; 1307caf3827aSAlan Stern } 13083ca2a321SAlan Stern 1309caf3827aSAlan Stern } else if (qh->period != urb->interval) { 1310caf3827aSAlan Stern return -EINVAL; /* Can't change the period */ 1311caf3827aSAlan Stern 1312caf3827aSAlan Stern } else { /* Pick up where the last URB leaves off */ 1313caf3827aSAlan Stern if (list_empty(&qh->queue)) { 1314c8155cc5SAlan Stern frame = qh->iso_frame; 1315caf3827aSAlan Stern } else { 1316caf3827aSAlan Stern struct urb *lurb; 1317caf3827aSAlan Stern 1318caf3827aSAlan Stern lurb = list_entry(qh->queue.prev, 1319caf3827aSAlan Stern struct urb_priv, node)->urb; 1320caf3827aSAlan Stern frame = lurb->start_frame + 1321caf3827aSAlan Stern lurb->number_of_packets * 1322caf3827aSAlan Stern lurb->interval; 1323caf3827aSAlan Stern } 1324caf3827aSAlan Stern if (urb->transfer_flags & URB_ISO_ASAP) 1325caf3827aSAlan Stern urb->start_frame = frame; 1326c8155cc5SAlan Stern else if (urb->start_frame != frame) 1327c8155cc5SAlan Stern return -EINVAL; 1328caf3827aSAlan Stern } 1329caf3827aSAlan Stern 1330caf3827aSAlan Stern /* Make sure we won't have to go too far into the future */ 1331c8155cc5SAlan Stern if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, 1332caf3827aSAlan Stern urb->start_frame + urb->number_of_packets * 1333caf3827aSAlan Stern urb->interval)) 13340ed8fee1SAlan Stern return -EFBIG; 13350ed8fee1SAlan Stern 13361da177e4SLinus Torvalds status = TD_CTRL_ACTIVE | TD_CTRL_IOS; 13371da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 13381da177e4SLinus Torvalds 1339b81d3436SAlan Stern for (i = 0; i < urb->number_of_packets; i++) { 13402532178aSAlan Stern td = uhci_alloc_td(uhci); 13411da177e4SLinus Torvalds if (!td) 13421da177e4SLinus Torvalds return -ENOMEM; 13431da177e4SLinus Torvalds 134404538a25SAlan Stern uhci_add_td_to_urbp(td, urbp); 1345dccf4a48SAlan Stern uhci_fill_td(td, status, destination | 1346dccf4a48SAlan Stern uhci_explen(urb->iso_frame_desc[i].length), 1347dccf4a48SAlan Stern urb->transfer_dma + 1348dccf4a48SAlan Stern urb->iso_frame_desc[i].offset); 1349b81d3436SAlan Stern } 13501da177e4SLinus Torvalds 1351dccf4a48SAlan Stern /* Set the interrupt-on-completion flag on the last packet. */ 1352dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 1353dccf4a48SAlan Stern 1354dccf4a48SAlan Stern /* Add the TDs to the frame list */ 1355b81d3436SAlan Stern frame = urb->start_frame; 1356b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 1357dccf4a48SAlan Stern uhci_insert_td_in_frame_list(uhci, td, frame); 1358c8155cc5SAlan Stern frame += qh->period; 1359c8155cc5SAlan Stern } 1360c8155cc5SAlan Stern 1361c8155cc5SAlan Stern if (list_empty(&qh->queue)) { 1362c8155cc5SAlan Stern qh->iso_packet_desc = &urb->iso_frame_desc[0]; 1363c8155cc5SAlan Stern qh->iso_frame = urb->start_frame; 1364c8155cc5SAlan Stern qh->iso_status = 0; 13651da177e4SLinus Torvalds } 13661da177e4SLinus Torvalds 1367*17230acdSAlan Stern qh->skel = SKEL_ISO; 13683ca2a321SAlan Stern if (!qh->bandwidth_reserved) 13693ca2a321SAlan Stern uhci_reserve_bandwidth(uhci, qh); 1370dccf4a48SAlan Stern return 0; 13711da177e4SLinus Torvalds } 13721da177e4SLinus Torvalds 13731da177e4SLinus Torvalds static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) 13741da177e4SLinus Torvalds { 1375c8155cc5SAlan Stern struct uhci_td *td, *tmp; 1376c8155cc5SAlan Stern struct urb_priv *urbp = urb->hcpriv; 1377c8155cc5SAlan Stern struct uhci_qh *qh = urbp->qh; 1378c8155cc5SAlan Stern 1379c8155cc5SAlan Stern list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 1380c8155cc5SAlan Stern unsigned int ctrlstat; 13811da177e4SLinus Torvalds int status; 13821da177e4SLinus Torvalds int actlength; 13831da177e4SLinus Torvalds 1384c8155cc5SAlan Stern if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame)) 13851da177e4SLinus Torvalds return -EINPROGRESS; 13861da177e4SLinus Torvalds 1387c8155cc5SAlan Stern uhci_remove_tds_from_frame(uhci, qh->iso_frame); 13881da177e4SLinus Torvalds 1389c8155cc5SAlan Stern ctrlstat = td_status(td); 1390c8155cc5SAlan Stern if (ctrlstat & TD_CTRL_ACTIVE) { 1391c8155cc5SAlan Stern status = -EXDEV; /* TD was added too late? */ 1392c8155cc5SAlan Stern } else { 13931da177e4SLinus Torvalds status = uhci_map_status(uhci_status_bits(ctrlstat), 13941da177e4SLinus Torvalds usb_pipeout(urb->pipe)); 1395c8155cc5SAlan Stern actlength = uhci_actual_length(ctrlstat); 1396c8155cc5SAlan Stern 1397c8155cc5SAlan Stern urb->actual_length += actlength; 1398c8155cc5SAlan Stern qh->iso_packet_desc->actual_length = actlength; 1399c8155cc5SAlan Stern qh->iso_packet_desc->status = status; 1400c8155cc5SAlan Stern } 1401c8155cc5SAlan Stern 14021da177e4SLinus Torvalds if (status) { 14031da177e4SLinus Torvalds urb->error_count++; 1404c8155cc5SAlan Stern qh->iso_status = status; 14051da177e4SLinus Torvalds } 14061da177e4SLinus Torvalds 1407c8155cc5SAlan Stern uhci_remove_td_from_urbp(td); 1408c8155cc5SAlan Stern uhci_free_td(uhci, td); 1409c8155cc5SAlan Stern qh->iso_frame += qh->period; 1410c8155cc5SAlan Stern ++qh->iso_packet_desc; 14111da177e4SLinus Torvalds } 1412c8155cc5SAlan Stern return qh->iso_status; 14131da177e4SLinus Torvalds } 14141da177e4SLinus Torvalds 14151da177e4SLinus Torvalds static int uhci_urb_enqueue(struct usb_hcd *hcd, 1416dccf4a48SAlan Stern struct usb_host_endpoint *hep, 141755016f10SAl Viro struct urb *urb, gfp_t mem_flags) 14181da177e4SLinus Torvalds { 14191da177e4SLinus Torvalds int ret; 14201da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 14211da177e4SLinus Torvalds unsigned long flags; 1422dccf4a48SAlan Stern struct urb_priv *urbp; 1423dccf4a48SAlan Stern struct uhci_qh *qh; 14241da177e4SLinus Torvalds 14251da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 14261da177e4SLinus Torvalds 14271da177e4SLinus Torvalds ret = urb->status; 14281da177e4SLinus Torvalds if (ret != -EINPROGRESS) /* URB already unlinked! */ 1429dccf4a48SAlan Stern goto done; 14301da177e4SLinus Torvalds 14311da177e4SLinus Torvalds ret = -ENOMEM; 1432dccf4a48SAlan Stern urbp = uhci_alloc_urb_priv(uhci, urb); 1433dccf4a48SAlan Stern if (!urbp) 1434dccf4a48SAlan Stern goto done; 1435dccf4a48SAlan Stern 1436dccf4a48SAlan Stern if (hep->hcpriv) 1437dccf4a48SAlan Stern qh = (struct uhci_qh *) hep->hcpriv; 1438dccf4a48SAlan Stern else { 1439dccf4a48SAlan Stern qh = uhci_alloc_qh(uhci, urb->dev, hep); 1440dccf4a48SAlan Stern if (!qh) 1441dccf4a48SAlan Stern goto err_no_qh; 14421da177e4SLinus Torvalds } 1443dccf4a48SAlan Stern urbp->qh = qh; 14441da177e4SLinus Torvalds 14454de7d2c2SAlan Stern switch (qh->type) { 14464de7d2c2SAlan Stern case USB_ENDPOINT_XFER_CONTROL: 1447dccf4a48SAlan Stern ret = uhci_submit_control(uhci, urb, qh); 1448dccf4a48SAlan Stern break; 14494de7d2c2SAlan Stern case USB_ENDPOINT_XFER_BULK: 1450dccf4a48SAlan Stern ret = uhci_submit_bulk(uhci, urb, qh); 14511da177e4SLinus Torvalds break; 14524de7d2c2SAlan Stern case USB_ENDPOINT_XFER_INT: 1453dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 14541da177e4SLinus Torvalds break; 14554de7d2c2SAlan Stern case USB_ENDPOINT_XFER_ISOC: 1456c8155cc5SAlan Stern urb->error_count = 0; 1457dccf4a48SAlan Stern ret = uhci_submit_isochronous(uhci, urb, qh); 14581da177e4SLinus Torvalds break; 14591da177e4SLinus Torvalds } 1460dccf4a48SAlan Stern if (ret != 0) 1461dccf4a48SAlan Stern goto err_submit_failed; 14621da177e4SLinus Torvalds 1463dccf4a48SAlan Stern /* Add this URB to the QH */ 1464dccf4a48SAlan Stern urbp->qh = qh; 1465dccf4a48SAlan Stern list_add_tail(&urbp->node, &qh->queue); 14661da177e4SLinus Torvalds 1467dccf4a48SAlan Stern /* If the new URB is the first and only one on this QH then either 1468dccf4a48SAlan Stern * the QH is new and idle or else it's unlinked and waiting to 14692775562aSAlan Stern * become idle, so we can activate it right away. But only if the 14702775562aSAlan Stern * queue isn't stopped. */ 147184afddd7SAlan Stern if (qh->queue.next == &urbp->node && !qh->is_stopped) { 1472dccf4a48SAlan Stern uhci_activate_qh(uhci, qh); 1473c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, urbp); 147484afddd7SAlan Stern } 1475dccf4a48SAlan Stern goto done; 1476dccf4a48SAlan Stern 1477dccf4a48SAlan Stern err_submit_failed: 1478dccf4a48SAlan Stern if (qh->state == QH_STATE_IDLE) 1479dccf4a48SAlan Stern uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ 1480dccf4a48SAlan Stern 1481dccf4a48SAlan Stern err_no_qh: 1482dccf4a48SAlan Stern uhci_free_urb_priv(uhci, urbp); 1483dccf4a48SAlan Stern 1484dccf4a48SAlan Stern done: 14851da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 14861da177e4SLinus Torvalds return ret; 14871da177e4SLinus Torvalds } 14881da177e4SLinus Torvalds 14891da177e4SLinus Torvalds static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) 14901da177e4SLinus Torvalds { 14911da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 14921da177e4SLinus Torvalds unsigned long flags; 14931da177e4SLinus Torvalds struct urb_priv *urbp; 149410b8e47dSAlan Stern struct uhci_qh *qh; 14951da177e4SLinus Torvalds 14961da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 14971da177e4SLinus Torvalds urbp = urb->hcpriv; 14981da177e4SLinus Torvalds if (!urbp) /* URB was never linked! */ 14991da177e4SLinus Torvalds goto done; 150010b8e47dSAlan Stern qh = urbp->qh; 15011da177e4SLinus Torvalds 1502dccf4a48SAlan Stern /* Remove Isochronous TDs from the frame list ASAP */ 150310b8e47dSAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) { 1504dccf4a48SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 150510b8e47dSAlan Stern mb(); 150610b8e47dSAlan Stern 150710b8e47dSAlan Stern /* If the URB has already started, update the QH unlink time */ 150810b8e47dSAlan Stern uhci_get_current_frame_number(uhci); 150910b8e47dSAlan Stern if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number)) 151010b8e47dSAlan Stern qh->unlink_frame = uhci->frame_number; 151110b8e47dSAlan Stern } 151210b8e47dSAlan Stern 151310b8e47dSAlan Stern uhci_unlink_qh(uhci, qh); 15141da177e4SLinus Torvalds 15151da177e4SLinus Torvalds done: 15161da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 15171da177e4SLinus Torvalds return 0; 15181da177e4SLinus Torvalds } 15191da177e4SLinus Torvalds 15200ed8fee1SAlan Stern /* 15210ed8fee1SAlan Stern * Finish unlinking an URB and give it back 15220ed8fee1SAlan Stern */ 15230ed8fee1SAlan Stern static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, 15247d12e780SDavid Howells struct urb *urb) 15250ed8fee1SAlan Stern __releases(uhci->lock) 15260ed8fee1SAlan Stern __acquires(uhci->lock) 15271da177e4SLinus Torvalds { 15281da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 15291da177e4SLinus Torvalds 1530c8155cc5SAlan Stern /* When giving back the first URB in an Isochronous queue, 1531c8155cc5SAlan Stern * reinitialize the QH's iso-related members for the next URB. */ 1532c8155cc5SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC && 1533c8155cc5SAlan Stern urbp->node.prev == &qh->queue && 1534c8155cc5SAlan Stern urbp->node.next != &qh->queue) { 1535c8155cc5SAlan Stern struct urb *nurb = list_entry(urbp->node.next, 1536c8155cc5SAlan Stern struct urb_priv, node)->urb; 1537c8155cc5SAlan Stern 1538c8155cc5SAlan Stern qh->iso_packet_desc = &nurb->iso_frame_desc[0]; 1539c8155cc5SAlan Stern qh->iso_frame = nurb->start_frame; 1540c8155cc5SAlan Stern qh->iso_status = 0; 1541c8155cc5SAlan Stern } 15421da177e4SLinus Torvalds 15430ed8fee1SAlan Stern /* Take the URB off the QH's queue. If the queue is now empty, 15440ed8fee1SAlan Stern * this is a perfect time for a toggle fixup. */ 15450ed8fee1SAlan Stern list_del_init(&urbp->node); 15460ed8fee1SAlan Stern if (list_empty(&qh->queue) && qh->needs_fixup) { 15470ed8fee1SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 15480ed8fee1SAlan Stern usb_pipeout(urb->pipe), qh->initial_toggle); 15490ed8fee1SAlan Stern qh->needs_fixup = 0; 15500ed8fee1SAlan Stern } 15510ed8fee1SAlan Stern 15520ed8fee1SAlan Stern uhci_free_urb_priv(uhci, urbp); 15530ed8fee1SAlan Stern 15540ed8fee1SAlan Stern spin_unlock(&uhci->lock); 15557d12e780SDavid Howells usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb); 15560ed8fee1SAlan Stern spin_lock(&uhci->lock); 15570ed8fee1SAlan Stern 15580ed8fee1SAlan Stern /* If the queue is now empty, we can unlink the QH and give up its 15590ed8fee1SAlan Stern * reserved bandwidth. */ 15600ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 15610ed8fee1SAlan Stern uhci_unlink_qh(uhci, qh); 15623ca2a321SAlan Stern if (qh->bandwidth_reserved) 15633ca2a321SAlan Stern uhci_release_bandwidth(uhci, qh); 15640ed8fee1SAlan Stern } 15650ed8fee1SAlan Stern } 15660ed8fee1SAlan Stern 15670ed8fee1SAlan Stern /* 15680ed8fee1SAlan Stern * Scan the URBs in a QH's queue 15690ed8fee1SAlan Stern */ 15700ed8fee1SAlan Stern #define QH_FINISHED_UNLINKING(qh) \ 15710ed8fee1SAlan Stern (qh->state == QH_STATE_UNLINKING && \ 15720ed8fee1SAlan Stern uhci->frame_number + uhci->is_stopped != qh->unlink_frame) 15730ed8fee1SAlan Stern 15747d12e780SDavid Howells static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 15750ed8fee1SAlan Stern { 15760ed8fee1SAlan Stern struct urb_priv *urbp; 15770ed8fee1SAlan Stern struct urb *urb; 15780ed8fee1SAlan Stern int status; 15790ed8fee1SAlan Stern 15800ed8fee1SAlan Stern while (!list_empty(&qh->queue)) { 15810ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 15820ed8fee1SAlan Stern urb = urbp->urb; 15830ed8fee1SAlan Stern 1584b1869000SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 15850ed8fee1SAlan Stern status = uhci_result_isochronous(uhci, urb); 1586b1869000SAlan Stern else 15870ed8fee1SAlan Stern status = uhci_result_common(uhci, urb); 15880ed8fee1SAlan Stern if (status == -EINPROGRESS) 15890ed8fee1SAlan Stern break; 15900ed8fee1SAlan Stern 15910ed8fee1SAlan Stern spin_lock(&urb->lock); 15920ed8fee1SAlan Stern if (urb->status == -EINPROGRESS) /* Not dequeued */ 15930ed8fee1SAlan Stern urb->status = status; 15940ed8fee1SAlan Stern else 15952775562aSAlan Stern status = ECONNRESET; /* Not -ECONNRESET */ 15960ed8fee1SAlan Stern spin_unlock(&urb->lock); 15970ed8fee1SAlan Stern 15980ed8fee1SAlan Stern /* Dequeued but completed URBs can't be given back unless 15990ed8fee1SAlan Stern * the QH is stopped or has finished unlinking. */ 16002775562aSAlan Stern if (status == ECONNRESET) { 16012775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 16022775562aSAlan Stern qh->is_stopped = 1; 16032775562aSAlan Stern else if (!qh->is_stopped) 16040ed8fee1SAlan Stern return; 16052775562aSAlan Stern } 16060ed8fee1SAlan Stern 16077d12e780SDavid Howells uhci_giveback_urb(uhci, qh, urb); 16087ceb932fSAlan Stern if (status < 0 && qh->type != USB_ENDPOINT_XFER_ISOC) 16090ed8fee1SAlan Stern break; 16100ed8fee1SAlan Stern } 16110ed8fee1SAlan Stern 16120ed8fee1SAlan Stern /* If the QH is neither stopped nor finished unlinking (normal case), 16130ed8fee1SAlan Stern * our work here is done. */ 16142775562aSAlan Stern if (QH_FINISHED_UNLINKING(qh)) 16152775562aSAlan Stern qh->is_stopped = 1; 16162775562aSAlan Stern else if (!qh->is_stopped) 16170ed8fee1SAlan Stern return; 16180ed8fee1SAlan Stern 16190ed8fee1SAlan Stern /* Otherwise give back each of the dequeued URBs */ 16202775562aSAlan Stern restart: 16210ed8fee1SAlan Stern list_for_each_entry(urbp, &qh->queue, node) { 16220ed8fee1SAlan Stern urb = urbp->urb; 16230ed8fee1SAlan Stern if (urb->status != -EINPROGRESS) { 162410b8e47dSAlan Stern 162510b8e47dSAlan Stern /* Fix up the TD links and save the toggles for 162610b8e47dSAlan Stern * non-Isochronous queues. For Isochronous queues, 162710b8e47dSAlan Stern * test for too-recent dequeues. */ 162810b8e47dSAlan Stern if (!uhci_cleanup_queue(uhci, qh, urb)) { 162910b8e47dSAlan Stern qh->is_stopped = 0; 163010b8e47dSAlan Stern return; 163110b8e47dSAlan Stern } 16327d12e780SDavid Howells uhci_giveback_urb(uhci, qh, urb); 16330ed8fee1SAlan Stern goto restart; 16340ed8fee1SAlan Stern } 16350ed8fee1SAlan Stern } 16360ed8fee1SAlan Stern qh->is_stopped = 0; 16370ed8fee1SAlan Stern 16380ed8fee1SAlan Stern /* There are no more dequeued URBs. If there are still URBs on the 16390ed8fee1SAlan Stern * queue, the QH can now be re-activated. */ 16400ed8fee1SAlan Stern if (!list_empty(&qh->queue)) { 16410ed8fee1SAlan Stern if (qh->needs_fixup) 16420ed8fee1SAlan Stern uhci_fixup_toggles(qh, 0); 164384afddd7SAlan Stern 164484afddd7SAlan Stern /* If the first URB on the queue wants FSBR but its time 164584afddd7SAlan Stern * limit has expired, set the next TD to interrupt on 164684afddd7SAlan Stern * completion before reactivating the QH. */ 164784afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 164884afddd7SAlan Stern if (urbp->fsbr && qh->wait_expired) { 164984afddd7SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 165084afddd7SAlan Stern struct uhci_td, list); 165184afddd7SAlan Stern 165284afddd7SAlan Stern td->status |= __cpu_to_le32(TD_CTRL_IOC); 165384afddd7SAlan Stern } 165484afddd7SAlan Stern 16550ed8fee1SAlan Stern uhci_activate_qh(uhci, qh); 16560ed8fee1SAlan Stern } 16570ed8fee1SAlan Stern 16580ed8fee1SAlan Stern /* The queue is empty. The QH can become idle if it is fully 16590ed8fee1SAlan Stern * unlinked. */ 16600ed8fee1SAlan Stern else if (QH_FINISHED_UNLINKING(qh)) 16610ed8fee1SAlan Stern uhci_make_qh_idle(uhci, qh); 16621da177e4SLinus Torvalds } 16631da177e4SLinus Torvalds 16640ed8fee1SAlan Stern /* 166584afddd7SAlan Stern * Check for queues that have made some forward progress. 166684afddd7SAlan Stern * Returns 0 if the queue is not Isochronous, is ACTIVE, and 166784afddd7SAlan Stern * has not advanced since last examined; 1 otherwise. 1668b761d9d8SAlan Stern * 1669b761d9d8SAlan Stern * Early Intel controllers have a bug which causes qh->element sometimes 1670b761d9d8SAlan Stern * not to advance when a TD completes successfully. The queue remains 1671b761d9d8SAlan Stern * stuck on the inactive completed TD. We detect such cases and advance 1672b761d9d8SAlan Stern * the element pointer by hand. 167384afddd7SAlan Stern */ 167484afddd7SAlan Stern static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) 167584afddd7SAlan Stern { 167684afddd7SAlan Stern struct urb_priv *urbp = NULL; 167784afddd7SAlan Stern struct uhci_td *td; 167884afddd7SAlan Stern int ret = 1; 167984afddd7SAlan Stern unsigned status; 168084afddd7SAlan Stern 168184afddd7SAlan Stern if (qh->type == USB_ENDPOINT_XFER_ISOC) 1682c5e3b741SAlan Stern goto done; 168384afddd7SAlan Stern 168484afddd7SAlan Stern /* Treat an UNLINKING queue as though it hasn't advanced. 168584afddd7SAlan Stern * This is okay because reactivation will treat it as though 168684afddd7SAlan Stern * it has advanced, and if it is going to become IDLE then 168784afddd7SAlan Stern * this doesn't matter anyway. Furthermore it's possible 168884afddd7SAlan Stern * for an UNLINKING queue not to have any URBs at all, or 168984afddd7SAlan Stern * for its first URB not to have any TDs (if it was dequeued 169084afddd7SAlan Stern * just as it completed). So it's not easy in any case to 169184afddd7SAlan Stern * test whether such queues have advanced. */ 169284afddd7SAlan Stern if (qh->state != QH_STATE_ACTIVE) { 169384afddd7SAlan Stern urbp = NULL; 169484afddd7SAlan Stern status = 0; 169584afddd7SAlan Stern 169684afddd7SAlan Stern } else { 169784afddd7SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 169884afddd7SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 169984afddd7SAlan Stern status = td_status(td); 170084afddd7SAlan Stern if (!(status & TD_CTRL_ACTIVE)) { 170184afddd7SAlan Stern 170284afddd7SAlan Stern /* We're okay, the queue has advanced */ 170384afddd7SAlan Stern qh->wait_expired = 0; 170484afddd7SAlan Stern qh->advance_jiffies = jiffies; 1705c5e3b741SAlan Stern goto done; 170684afddd7SAlan Stern } 170784afddd7SAlan Stern ret = 0; 170884afddd7SAlan Stern } 170984afddd7SAlan Stern 171084afddd7SAlan Stern /* The queue hasn't advanced; check for timeout */ 1711c5e3b741SAlan Stern if (qh->wait_expired) 1712c5e3b741SAlan Stern goto done; 1713c5e3b741SAlan Stern 1714c5e3b741SAlan Stern if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { 1715b761d9d8SAlan Stern 1716b761d9d8SAlan Stern /* Detect the Intel bug and work around it */ 171728b9325eSAlan Stern if (qh->post_td && qh_element(qh) == LINK_TO_TD(qh->post_td)) { 1718b761d9d8SAlan Stern qh->element = qh->post_td->link; 1719b761d9d8SAlan Stern qh->advance_jiffies = jiffies; 1720c5e3b741SAlan Stern ret = 1; 1721c5e3b741SAlan Stern goto done; 1722b761d9d8SAlan Stern } 1723b761d9d8SAlan Stern 172484afddd7SAlan Stern qh->wait_expired = 1; 172584afddd7SAlan Stern 172684afddd7SAlan Stern /* If the current URB wants FSBR, unlink it temporarily 172784afddd7SAlan Stern * so that we can safely set the next TD to interrupt on 172884afddd7SAlan Stern * completion. That way we'll know as soon as the queue 172984afddd7SAlan Stern * starts moving again. */ 173084afddd7SAlan Stern if (urbp && urbp->fsbr && !(status & TD_CTRL_IOC)) 173184afddd7SAlan Stern uhci_unlink_qh(uhci, qh); 1732c5e3b741SAlan Stern 1733c5e3b741SAlan Stern } else { 1734c5e3b741SAlan Stern /* Unmoving but not-yet-expired queues keep FSBR alive */ 1735c5e3b741SAlan Stern if (urbp) 1736c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, urbp); 173784afddd7SAlan Stern } 1738c5e3b741SAlan Stern 1739c5e3b741SAlan Stern done: 174084afddd7SAlan Stern return ret; 174184afddd7SAlan Stern } 174284afddd7SAlan Stern 174384afddd7SAlan Stern /* 17440ed8fee1SAlan Stern * Process events in the schedule, but only in one thread at a time 17450ed8fee1SAlan Stern */ 17467d12e780SDavid Howells static void uhci_scan_schedule(struct uhci_hcd *uhci) 17471da177e4SLinus Torvalds { 17480ed8fee1SAlan Stern int i; 17490ed8fee1SAlan Stern struct uhci_qh *qh; 17501da177e4SLinus Torvalds 17511da177e4SLinus Torvalds /* Don't allow re-entrant calls */ 17521da177e4SLinus Torvalds if (uhci->scan_in_progress) { 17531da177e4SLinus Torvalds uhci->need_rescan = 1; 17541da177e4SLinus Torvalds return; 17551da177e4SLinus Torvalds } 17561da177e4SLinus Torvalds uhci->scan_in_progress = 1; 17571da177e4SLinus Torvalds rescan: 17581da177e4SLinus Torvalds uhci->need_rescan = 0; 1759c5e3b741SAlan Stern uhci->fsbr_is_wanted = 0; 17601da177e4SLinus Torvalds 17616c1b445cSAlan Stern uhci_clear_next_interrupt(uhci); 17621da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 1763c8155cc5SAlan Stern uhci->cur_iso_frame = uhci->frame_number; 17641da177e4SLinus Torvalds 17650ed8fee1SAlan Stern /* Go through all the QH queues and process the URBs in each one */ 17660ed8fee1SAlan Stern for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) { 17670ed8fee1SAlan Stern uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, 17680ed8fee1SAlan Stern struct uhci_qh, node); 17690ed8fee1SAlan Stern while ((qh = uhci->next_qh) != uhci->skelqh[i]) { 17700ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, 17710ed8fee1SAlan Stern struct uhci_qh, node); 177284afddd7SAlan Stern 177384afddd7SAlan Stern if (uhci_advance_check(uhci, qh)) { 17747d12e780SDavid Howells uhci_scan_qh(uhci, qh); 1775c5e3b741SAlan Stern if (qh->state == QH_STATE_ACTIVE) { 1776c5e3b741SAlan Stern uhci_urbp_wants_fsbr(uhci, 1777c5e3b741SAlan Stern list_entry(qh->queue.next, struct urb_priv, node)); 1778c5e3b741SAlan Stern } 177984afddd7SAlan Stern } 17801da177e4SLinus Torvalds } 17810ed8fee1SAlan Stern } 17821da177e4SLinus Torvalds 1783c8155cc5SAlan Stern uhci->last_iso_frame = uhci->cur_iso_frame; 17841da177e4SLinus Torvalds if (uhci->need_rescan) 17851da177e4SLinus Torvalds goto rescan; 17861da177e4SLinus Torvalds uhci->scan_in_progress = 0; 17871da177e4SLinus Torvalds 1788c5e3b741SAlan Stern if (uhci->fsbr_is_on && !uhci->fsbr_is_wanted && 1789c5e3b741SAlan Stern !uhci->fsbr_expiring) { 1790c5e3b741SAlan Stern uhci->fsbr_expiring = 1; 1791c5e3b741SAlan Stern mod_timer(&uhci->fsbr_timer, jiffies + FSBR_OFF_DELAY); 1792c5e3b741SAlan Stern } 179384afddd7SAlan Stern 179404538a25SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 17951da177e4SLinus Torvalds uhci_clear_next_interrupt(uhci); 17961da177e4SLinus Torvalds else 17971da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 17981da177e4SLinus Torvalds } 1799