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) 16dccf4a48SAlan Stern * (C) Copyright 2004-2005 Alan Stern, stern@rowland.harvard.edu 171da177e4SLinus Torvalds */ 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds static void uhci_free_pending_tds(struct uhci_hcd *uhci); 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds /* 221da177e4SLinus Torvalds * Technically, updating td->status here is a race, but it's not really a 231da177e4SLinus Torvalds * problem. The worst that can happen is that we set the IOC bit again 241da177e4SLinus Torvalds * generating a spurious interrupt. We could fix this by creating another 251da177e4SLinus Torvalds * QH and leaving the IOC bit always set, but then we would have to play 261da177e4SLinus Torvalds * games with the FSBR code to make sure we get the correct order in all 271da177e4SLinus Torvalds * the cases. I don't think it's worth the effort 281da177e4SLinus Torvalds */ 29dccf4a48SAlan Stern static void uhci_set_next_interrupt(struct uhci_hcd *uhci) 301da177e4SLinus Torvalds { 316c1b445cSAlan Stern if (uhci->is_stopped) 321f09df8bSAlan Stern mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); 331da177e4SLinus Torvalds uhci->term_td->status |= cpu_to_le32(TD_CTRL_IOC); 341da177e4SLinus Torvalds } 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) 371da177e4SLinus Torvalds { 381da177e4SLinus Torvalds uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC); 391da177e4SLinus Torvalds } 401da177e4SLinus Torvalds 412532178aSAlan Stern static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) 421da177e4SLinus Torvalds { 431da177e4SLinus Torvalds dma_addr_t dma_handle; 441da177e4SLinus Torvalds struct uhci_td *td; 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle); 471da177e4SLinus Torvalds if (!td) 481da177e4SLinus Torvalds return NULL; 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds td->dma_handle = dma_handle; 511da177e4SLinus Torvalds td->frame = -1; 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds INIT_LIST_HEAD(&td->list); 541da177e4SLinus Torvalds INIT_LIST_HEAD(&td->remove_list); 551da177e4SLinus Torvalds INIT_LIST_HEAD(&td->fl_list); 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds return td; 581da177e4SLinus Torvalds } 591da177e4SLinus Torvalds 60dccf4a48SAlan Stern static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) 61dccf4a48SAlan Stern { 62dccf4a48SAlan Stern if (!list_empty(&td->list)) 63dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in list!\n", td); 64dccf4a48SAlan Stern if (!list_empty(&td->remove_list)) 65dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in remove_list!\n", td); 66dccf4a48SAlan Stern if (!list_empty(&td->fl_list)) 67dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td); 68dccf4a48SAlan Stern 69dccf4a48SAlan Stern dma_pool_free(uhci->td_pool, td, td->dma_handle); 70dccf4a48SAlan Stern } 71dccf4a48SAlan Stern 721da177e4SLinus Torvalds static inline void uhci_fill_td(struct uhci_td *td, u32 status, 731da177e4SLinus Torvalds u32 token, u32 buffer) 741da177e4SLinus Torvalds { 751da177e4SLinus Torvalds td->status = cpu_to_le32(status); 761da177e4SLinus Torvalds td->token = cpu_to_le32(token); 771da177e4SLinus Torvalds td->buffer = cpu_to_le32(buffer); 781da177e4SLinus Torvalds } 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds /* 81687f5f34SAlan Stern * We insert Isochronous URBs directly into the frame list at the beginning 821da177e4SLinus Torvalds */ 83dccf4a48SAlan Stern static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, 84dccf4a48SAlan Stern struct uhci_td *td, unsigned framenum) 851da177e4SLinus Torvalds { 861da177e4SLinus Torvalds framenum &= (UHCI_NUMFRAMES - 1); 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds td->frame = framenum; 891da177e4SLinus Torvalds 901da177e4SLinus Torvalds /* Is there a TD already mapped there? */ 91a1d59ce8SAlan Stern if (uhci->frame_cpu[framenum]) { 921da177e4SLinus Torvalds struct uhci_td *ftd, *ltd; 931da177e4SLinus Torvalds 94a1d59ce8SAlan Stern ftd = uhci->frame_cpu[framenum]; 951da177e4SLinus Torvalds ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds list_add_tail(&td->fl_list, &ftd->fl_list); 981da177e4SLinus Torvalds 991da177e4SLinus Torvalds td->link = ltd->link; 1001da177e4SLinus Torvalds wmb(); 1011da177e4SLinus Torvalds ltd->link = cpu_to_le32(td->dma_handle); 1021da177e4SLinus Torvalds } else { 103a1d59ce8SAlan Stern td->link = uhci->frame[framenum]; 1041da177e4SLinus Torvalds wmb(); 105a1d59ce8SAlan Stern uhci->frame[framenum] = cpu_to_le32(td->dma_handle); 106a1d59ce8SAlan Stern uhci->frame_cpu[framenum] = td; 1071da177e4SLinus Torvalds } 1081da177e4SLinus Torvalds } 1091da177e4SLinus Torvalds 110dccf4a48SAlan Stern static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, 111b81d3436SAlan Stern struct uhci_td *td) 1121da177e4SLinus Torvalds { 1131da177e4SLinus Torvalds /* If it's not inserted, don't remove it */ 114b81d3436SAlan Stern if (td->frame == -1) { 115b81d3436SAlan Stern WARN_ON(!list_empty(&td->fl_list)); 1161da177e4SLinus Torvalds return; 117b81d3436SAlan Stern } 1181da177e4SLinus Torvalds 119b81d3436SAlan Stern if (uhci->frame_cpu[td->frame] == td) { 1201da177e4SLinus Torvalds if (list_empty(&td->fl_list)) { 121a1d59ce8SAlan Stern uhci->frame[td->frame] = td->link; 122a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = NULL; 1231da177e4SLinus Torvalds } else { 1241da177e4SLinus Torvalds struct uhci_td *ntd; 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds ntd = list_entry(td->fl_list.next, struct uhci_td, fl_list); 127a1d59ce8SAlan Stern uhci->frame[td->frame] = cpu_to_le32(ntd->dma_handle); 128a1d59ce8SAlan Stern uhci->frame_cpu[td->frame] = ntd; 1291da177e4SLinus Torvalds } 1301da177e4SLinus Torvalds } else { 1311da177e4SLinus Torvalds struct uhci_td *ptd; 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvalds ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list); 1341da177e4SLinus Torvalds ptd->link = td->link; 1351da177e4SLinus Torvalds } 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds list_del_init(&td->fl_list); 1381da177e4SLinus Torvalds td->frame = -1; 1391da177e4SLinus Torvalds } 1401da177e4SLinus Torvalds 141dccf4a48SAlan Stern /* 142dccf4a48SAlan Stern * Remove all the TDs for an Isochronous URB from the frame list 143dccf4a48SAlan Stern */ 144dccf4a48SAlan Stern static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) 145b81d3436SAlan Stern { 146b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 147b81d3436SAlan Stern struct uhci_td *td; 148b81d3436SAlan Stern 149b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) 150dccf4a48SAlan Stern uhci_remove_td_from_frame_list(uhci, td); 151b81d3436SAlan Stern wmb(); 152b81d3436SAlan Stern } 153b81d3436SAlan Stern 154dccf4a48SAlan Stern static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, 155dccf4a48SAlan Stern struct usb_device *udev, struct usb_host_endpoint *hep) 1561da177e4SLinus Torvalds { 1571da177e4SLinus Torvalds dma_addr_t dma_handle; 1581da177e4SLinus Torvalds struct uhci_qh *qh; 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle); 1611da177e4SLinus Torvalds if (!qh) 1621da177e4SLinus Torvalds return NULL; 1631da177e4SLinus Torvalds 1641da177e4SLinus Torvalds qh->dma_handle = dma_handle; 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds qh->element = UHCI_PTR_TERM; 1671da177e4SLinus Torvalds qh->link = UHCI_PTR_TERM; 1681da177e4SLinus Torvalds 169dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->queue); 170dccf4a48SAlan Stern INIT_LIST_HEAD(&qh->node); 1711da177e4SLinus Torvalds 172dccf4a48SAlan Stern if (udev) { /* Normal QH */ 173af0bb599SAlan Stern qh->dummy_td = uhci_alloc_td(uhci); 174af0bb599SAlan Stern if (!qh->dummy_td) { 175af0bb599SAlan Stern dma_pool_free(uhci->qh_pool, qh, dma_handle); 176af0bb599SAlan Stern return NULL; 177af0bb599SAlan Stern } 178dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 179dccf4a48SAlan Stern qh->hep = hep; 180dccf4a48SAlan Stern qh->udev = udev; 181dccf4a48SAlan Stern hep->hcpriv = qh; 182dccf4a48SAlan Stern usb_get_dev(udev); 1831da177e4SLinus Torvalds 184dccf4a48SAlan Stern } else { /* Skeleton QH */ 185dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 186dccf4a48SAlan Stern qh->udev = NULL; 187dccf4a48SAlan Stern } 1881da177e4SLinus Torvalds return qh; 1891da177e4SLinus Torvalds } 1901da177e4SLinus Torvalds 1911da177e4SLinus Torvalds static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 1921da177e4SLinus Torvalds { 193dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_IDLE && qh->udev); 194dccf4a48SAlan Stern if (!list_empty(&qh->queue)) 1951da177e4SLinus Torvalds dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh); 1961da177e4SLinus Torvalds 197dccf4a48SAlan Stern list_del(&qh->node); 198dccf4a48SAlan Stern if (qh->udev) { 199dccf4a48SAlan Stern qh->hep->hcpriv = NULL; 200dccf4a48SAlan Stern usb_put_dev(qh->udev); 201af0bb599SAlan Stern uhci_free_td(uhci, qh->dummy_td); 202dccf4a48SAlan Stern } 2031da177e4SLinus Torvalds dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); 2041da177e4SLinus Torvalds } 2051da177e4SLinus Torvalds 2061da177e4SLinus Torvalds /* 207*0ed8fee1SAlan Stern * When the currently executing URB is dequeued, save its current toggle value 208*0ed8fee1SAlan Stern */ 209*0ed8fee1SAlan Stern static void uhci_save_toggle(struct uhci_qh *qh, struct urb *urb) 210*0ed8fee1SAlan Stern { 211*0ed8fee1SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 212*0ed8fee1SAlan Stern struct uhci_td *td; 213*0ed8fee1SAlan Stern 214*0ed8fee1SAlan Stern /* If the QH element pointer is UHCI_PTR_TERM then then currently 215*0ed8fee1SAlan Stern * executing URB has already been unlinked, so this one isn't it. */ 216*0ed8fee1SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM || 217*0ed8fee1SAlan Stern qh->queue.next != &urbp->node) 218*0ed8fee1SAlan Stern return; 219*0ed8fee1SAlan Stern qh->element = UHCI_PTR_TERM; 220*0ed8fee1SAlan Stern 221*0ed8fee1SAlan Stern /* Only bulk and interrupt pipes have to worry about toggles */ 222*0ed8fee1SAlan Stern if (!(usb_pipetype(urb->pipe) == PIPE_BULK || 223*0ed8fee1SAlan Stern usb_pipetype(urb->pipe) == PIPE_INTERRUPT)) 224*0ed8fee1SAlan Stern return; 225*0ed8fee1SAlan Stern 226*0ed8fee1SAlan Stern /* Find the first active TD; that's the device's toggle state */ 227*0ed8fee1SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 228*0ed8fee1SAlan Stern if (td_status(td) & TD_CTRL_ACTIVE) { 229*0ed8fee1SAlan Stern qh->needs_fixup = 1; 230*0ed8fee1SAlan Stern qh->initial_toggle = uhci_toggle(td_token(td)); 231*0ed8fee1SAlan Stern return; 232*0ed8fee1SAlan Stern } 233*0ed8fee1SAlan Stern } 234*0ed8fee1SAlan Stern 235*0ed8fee1SAlan Stern WARN_ON(1); 236*0ed8fee1SAlan Stern } 237*0ed8fee1SAlan Stern 238*0ed8fee1SAlan Stern /* 239*0ed8fee1SAlan Stern * Fix up the data toggles for URBs in a queue, when one of them 240*0ed8fee1SAlan Stern * terminates early (short transfer, error, or dequeued). 241*0ed8fee1SAlan Stern */ 242*0ed8fee1SAlan Stern static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) 243*0ed8fee1SAlan Stern { 244*0ed8fee1SAlan Stern struct urb_priv *urbp = NULL; 245*0ed8fee1SAlan Stern struct uhci_td *td; 246*0ed8fee1SAlan Stern unsigned int toggle = qh->initial_toggle; 247*0ed8fee1SAlan Stern unsigned int pipe; 248*0ed8fee1SAlan Stern 249*0ed8fee1SAlan Stern /* Fixups for a short transfer start with the second URB in the 250*0ed8fee1SAlan Stern * queue (the short URB is the first). */ 251*0ed8fee1SAlan Stern if (skip_first) 252*0ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 253*0ed8fee1SAlan Stern 254*0ed8fee1SAlan Stern /* When starting with the first URB, if the QH element pointer is 255*0ed8fee1SAlan Stern * still valid then we know the URB's toggles are okay. */ 256*0ed8fee1SAlan Stern else if (qh_element(qh) != UHCI_PTR_TERM) 257*0ed8fee1SAlan Stern toggle = 2; 258*0ed8fee1SAlan Stern 259*0ed8fee1SAlan Stern /* Fix up the toggle for the URBs in the queue. Normally this 260*0ed8fee1SAlan Stern * loop won't run more than once: When an error or short transfer 261*0ed8fee1SAlan Stern * occurs, the queue usually gets emptied. */ 262*0ed8fee1SAlan Stern list_prepare_entry(urbp, &qh->queue, node); 263*0ed8fee1SAlan Stern list_for_each_entry_continue(urbp, &qh->queue, node) { 264*0ed8fee1SAlan Stern 265*0ed8fee1SAlan Stern /* If the first TD has the right toggle value, we don't 266*0ed8fee1SAlan Stern * need to change any toggles in this URB */ 267*0ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, list); 268*0ed8fee1SAlan Stern if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { 269*0ed8fee1SAlan Stern td = list_entry(urbp->td_list.next, struct uhci_td, 270*0ed8fee1SAlan Stern list); 271*0ed8fee1SAlan Stern toggle = uhci_toggle(td_token(td)) ^ 1; 272*0ed8fee1SAlan Stern 273*0ed8fee1SAlan Stern /* Otherwise all the toggles in the URB have to be switched */ 274*0ed8fee1SAlan Stern } else { 275*0ed8fee1SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 276*0ed8fee1SAlan Stern td->token ^= __constant_cpu_to_le32( 277*0ed8fee1SAlan Stern TD_TOKEN_TOGGLE); 278*0ed8fee1SAlan Stern toggle ^= 1; 279*0ed8fee1SAlan Stern } 280*0ed8fee1SAlan Stern } 281*0ed8fee1SAlan Stern } 282*0ed8fee1SAlan Stern 283*0ed8fee1SAlan Stern wmb(); 284*0ed8fee1SAlan Stern pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe; 285*0ed8fee1SAlan Stern usb_settoggle(qh->udev, usb_pipeendpoint(pipe), 286*0ed8fee1SAlan Stern usb_pipeout(pipe), toggle); 287*0ed8fee1SAlan Stern qh->needs_fixup = 0; 288*0ed8fee1SAlan Stern } 289*0ed8fee1SAlan Stern 290*0ed8fee1SAlan Stern /* 291dccf4a48SAlan Stern * Put a QH on the schedule in both hardware and software 2921da177e4SLinus Torvalds */ 293dccf4a48SAlan Stern static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 2941da177e4SLinus Torvalds { 2951da177e4SLinus Torvalds struct uhci_qh *pqh; 2961da177e4SLinus Torvalds 297dccf4a48SAlan Stern WARN_ON(list_empty(&qh->queue)); 298dccf4a48SAlan Stern 299dccf4a48SAlan Stern /* Set the element pointer if it isn't set already. 300dccf4a48SAlan Stern * This isn't needed for Isochronous queues, but it doesn't hurt. */ 301dccf4a48SAlan Stern if (qh_element(qh) == UHCI_PTR_TERM) { 302dccf4a48SAlan Stern struct urb_priv *urbp = list_entry(qh->queue.next, 303dccf4a48SAlan Stern struct urb_priv, node); 304dccf4a48SAlan Stern struct uhci_td *td = list_entry(urbp->td_list.next, 305dccf4a48SAlan Stern struct uhci_td, list); 306dccf4a48SAlan Stern 307dccf4a48SAlan Stern qh->element = cpu_to_le32(td->dma_handle); 308dccf4a48SAlan Stern } 309dccf4a48SAlan Stern 310dccf4a48SAlan Stern if (qh->state == QH_STATE_ACTIVE) 3111da177e4SLinus Torvalds return; 312dccf4a48SAlan Stern qh->state = QH_STATE_ACTIVE; 313dccf4a48SAlan Stern 314dccf4a48SAlan Stern /* Move the QH from its old list to the end of the appropriate 315dccf4a48SAlan Stern * skeleton's list */ 316*0ed8fee1SAlan Stern if (qh == uhci->next_qh) 317*0ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 318*0ed8fee1SAlan Stern node); 319dccf4a48SAlan Stern list_move_tail(&qh->node, &qh->skel->node); 320dccf4a48SAlan Stern 321dccf4a48SAlan Stern /* Link it into the schedule */ 322dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 323dccf4a48SAlan Stern qh->link = pqh->link; 324dccf4a48SAlan Stern wmb(); 325dccf4a48SAlan Stern pqh->link = UHCI_PTR_QH | cpu_to_le32(qh->dma_handle); 326dccf4a48SAlan Stern } 3271da177e4SLinus Torvalds 3281da177e4SLinus Torvalds /* 329dccf4a48SAlan Stern * Take a QH off the hardware schedule 3301da177e4SLinus Torvalds */ 331dccf4a48SAlan Stern static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) 332dccf4a48SAlan Stern { 333dccf4a48SAlan Stern struct uhci_qh *pqh; 3341da177e4SLinus Torvalds 335dccf4a48SAlan Stern if (qh->state == QH_STATE_UNLINKING) 336dccf4a48SAlan Stern return; 337dccf4a48SAlan Stern WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev); 338dccf4a48SAlan Stern qh->state = QH_STATE_UNLINKING; 3391da177e4SLinus Torvalds 340dccf4a48SAlan Stern /* Unlink the QH from the schedule and record when we did it */ 341dccf4a48SAlan Stern pqh = list_entry(qh->node.prev, struct uhci_qh, node); 342dccf4a48SAlan Stern pqh->link = qh->link; 343dccf4a48SAlan Stern mb(); 3441da177e4SLinus Torvalds 3451da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 346dccf4a48SAlan Stern qh->unlink_frame = uhci->frame_number; 3471da177e4SLinus Torvalds 348dccf4a48SAlan Stern /* Force an interrupt so we know when the QH is fully unlinked */ 349dccf4a48SAlan Stern if (list_empty(&uhci->skel_unlink_qh->node)) 3501da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 3511da177e4SLinus Torvalds 352dccf4a48SAlan Stern /* Move the QH from its old list to the end of the unlinking list */ 353*0ed8fee1SAlan Stern if (qh == uhci->next_qh) 354*0ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 355*0ed8fee1SAlan Stern node); 356dccf4a48SAlan Stern list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); 3571da177e4SLinus Torvalds } 3581da177e4SLinus Torvalds 3591da177e4SLinus Torvalds /* 360dccf4a48SAlan Stern * When we and the controller are through with a QH, it becomes IDLE. 361dccf4a48SAlan Stern * This happens when a QH has been off the schedule (on the unlinking 362dccf4a48SAlan Stern * list) for more than one frame, or when an error occurs while adding 363dccf4a48SAlan Stern * the first URB onto a new QH. 3641da177e4SLinus Torvalds */ 365dccf4a48SAlan Stern static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) 366dccf4a48SAlan Stern { 367dccf4a48SAlan Stern WARN_ON(qh->state == QH_STATE_ACTIVE); 368dccf4a48SAlan Stern 369*0ed8fee1SAlan Stern if (qh == uhci->next_qh) 370*0ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, 371*0ed8fee1SAlan Stern node); 372dccf4a48SAlan Stern list_move(&qh->node, &uhci->idle_qh_list); 373dccf4a48SAlan Stern qh->state = QH_STATE_IDLE; 374dccf4a48SAlan Stern 375dccf4a48SAlan Stern /* If anyone is waiting for a QH to become idle, wake them up */ 376dccf4a48SAlan Stern if (uhci->num_waiting) 377dccf4a48SAlan Stern wake_up_all(&uhci->waitqh); 3781da177e4SLinus Torvalds } 3791da177e4SLinus Torvalds 380dccf4a48SAlan Stern static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, 381dccf4a48SAlan Stern struct urb *urb) 3821da177e4SLinus Torvalds { 3831da177e4SLinus Torvalds struct urb_priv *urbp; 3841da177e4SLinus Torvalds 3851da177e4SLinus Torvalds urbp = kmem_cache_alloc(uhci_up_cachep, SLAB_ATOMIC); 3861da177e4SLinus Torvalds if (!urbp) 3871da177e4SLinus Torvalds return NULL; 3881da177e4SLinus Torvalds 3891da177e4SLinus Torvalds memset((void *)urbp, 0, sizeof(*urbp)); 3901da177e4SLinus Torvalds 3911da177e4SLinus Torvalds urbp->urb = urb; 3921da177e4SLinus Torvalds urb->hcpriv = urbp; 393dccf4a48SAlan Stern 394dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->node); 395dccf4a48SAlan Stern INIT_LIST_HEAD(&urbp->td_list); 3961da177e4SLinus Torvalds 3971da177e4SLinus Torvalds return urbp; 3981da177e4SLinus Torvalds } 3991da177e4SLinus Torvalds 4001da177e4SLinus Torvalds static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td) 4011da177e4SLinus Torvalds { 4021da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 4031da177e4SLinus Torvalds 4041da177e4SLinus Torvalds list_add_tail(&td->list, &urbp->td_list); 4051da177e4SLinus Torvalds } 4061da177e4SLinus Torvalds 4071da177e4SLinus Torvalds static void uhci_remove_td_from_urb(struct uhci_td *td) 4081da177e4SLinus Torvalds { 4091da177e4SLinus Torvalds if (list_empty(&td->list)) 4101da177e4SLinus Torvalds return; 4111da177e4SLinus Torvalds 4121da177e4SLinus Torvalds list_del_init(&td->list); 4131da177e4SLinus Torvalds } 4141da177e4SLinus Torvalds 415dccf4a48SAlan Stern static void uhci_free_urb_priv(struct uhci_hcd *uhci, 416dccf4a48SAlan Stern struct urb_priv *urbp) 4171da177e4SLinus Torvalds { 4181da177e4SLinus Torvalds struct uhci_td *td, *tmp; 4191da177e4SLinus Torvalds 420dccf4a48SAlan Stern if (!list_empty(&urbp->node)) 421dccf4a48SAlan Stern dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n", 422dccf4a48SAlan Stern urbp->urb); 4231da177e4SLinus Torvalds 4241da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 4251da177e4SLinus Torvalds if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) { 4261da177e4SLinus Torvalds uhci_free_pending_tds(uhci); 4271da177e4SLinus Torvalds uhci->td_remove_age = uhci->frame_number; 4281da177e4SLinus Torvalds } 4291da177e4SLinus Torvalds 4301da177e4SLinus Torvalds /* Check to see if the remove list is empty. Set the IOC bit */ 431dccf4a48SAlan Stern /* to force an interrupt so we can remove the TDs. */ 4321da177e4SLinus Torvalds if (list_empty(&uhci->td_remove_list)) 4331da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 4341da177e4SLinus Torvalds 4351da177e4SLinus Torvalds list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { 4361da177e4SLinus Torvalds uhci_remove_td_from_urb(td); 4371da177e4SLinus Torvalds list_add(&td->remove_list, &uhci->td_remove_list); 4381da177e4SLinus Torvalds } 4391da177e4SLinus Torvalds 440dccf4a48SAlan Stern urbp->urb->hcpriv = NULL; 4411da177e4SLinus Torvalds kmem_cache_free(uhci_up_cachep, urbp); 4421da177e4SLinus Torvalds } 4431da177e4SLinus Torvalds 4441da177e4SLinus Torvalds static void uhci_inc_fsbr(struct uhci_hcd *uhci, struct urb *urb) 4451da177e4SLinus Torvalds { 4461da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 4471da177e4SLinus Torvalds 4481da177e4SLinus Torvalds if ((!(urb->transfer_flags & URB_NO_FSBR)) && !urbp->fsbr) { 4491da177e4SLinus Torvalds urbp->fsbr = 1; 4501da177e4SLinus Torvalds if (!uhci->fsbr++ && !uhci->fsbrtimeout) 4511da177e4SLinus Torvalds uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH; 4521da177e4SLinus Torvalds } 4531da177e4SLinus Torvalds } 4541da177e4SLinus Torvalds 4551da177e4SLinus Torvalds static void uhci_dec_fsbr(struct uhci_hcd *uhci, struct urb *urb) 4561da177e4SLinus Torvalds { 4571da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 4581da177e4SLinus Torvalds 4591da177e4SLinus Torvalds if ((!(urb->transfer_flags & URB_NO_FSBR)) && urbp->fsbr) { 4601da177e4SLinus Torvalds urbp->fsbr = 0; 4611da177e4SLinus Torvalds if (!--uhci->fsbr) 4621da177e4SLinus Torvalds uhci->fsbrtimeout = jiffies + FSBR_DELAY; 4631da177e4SLinus Torvalds } 4641da177e4SLinus Torvalds } 4651da177e4SLinus Torvalds 4661da177e4SLinus Torvalds /* 4671da177e4SLinus Torvalds * Map status to standard result codes 4681da177e4SLinus Torvalds * 4691da177e4SLinus Torvalds * <status> is (td_status(td) & 0xF60000), a.k.a. 4701da177e4SLinus Torvalds * uhci_status_bits(td_status(td)). 4711da177e4SLinus Torvalds * Note: <status> does not include the TD_CTRL_NAK bit. 4721da177e4SLinus Torvalds * <dir_out> is True for output TDs and False for input TDs. 4731da177e4SLinus Torvalds */ 4741da177e4SLinus Torvalds static int uhci_map_status(int status, int dir_out) 4751da177e4SLinus Torvalds { 4761da177e4SLinus Torvalds if (!status) 4771da177e4SLinus Torvalds return 0; 4781da177e4SLinus Torvalds if (status & TD_CTRL_BITSTUFF) /* Bitstuff error */ 4791da177e4SLinus Torvalds return -EPROTO; 4801da177e4SLinus Torvalds if (status & TD_CTRL_CRCTIMEO) { /* CRC/Timeout */ 4811da177e4SLinus Torvalds if (dir_out) 4821da177e4SLinus Torvalds return -EPROTO; 4831da177e4SLinus Torvalds else 4841da177e4SLinus Torvalds return -EILSEQ; 4851da177e4SLinus Torvalds } 4861da177e4SLinus Torvalds if (status & TD_CTRL_BABBLE) /* Babble */ 4871da177e4SLinus Torvalds return -EOVERFLOW; 4881da177e4SLinus Torvalds if (status & TD_CTRL_DBUFERR) /* Buffer error */ 4891da177e4SLinus Torvalds return -ENOSR; 4901da177e4SLinus Torvalds if (status & TD_CTRL_STALLED) /* Stalled */ 4911da177e4SLinus Torvalds return -EPIPE; 4921da177e4SLinus Torvalds WARN_ON(status & TD_CTRL_ACTIVE); /* Active */ 4931da177e4SLinus Torvalds return 0; 4941da177e4SLinus Torvalds } 4951da177e4SLinus Torvalds 4961da177e4SLinus Torvalds /* 4971da177e4SLinus Torvalds * Control transfers 4981da177e4SLinus Torvalds */ 499dccf4a48SAlan Stern static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, 500dccf4a48SAlan Stern struct uhci_qh *qh) 5011da177e4SLinus Torvalds { 5021da177e4SLinus Torvalds struct uhci_td *td; 5031da177e4SLinus Torvalds unsigned long destination, status; 504dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 5051da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 5061da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 507dccf4a48SAlan Stern __le32 *plink; 5081da177e4SLinus Torvalds 5091da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 5101da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP; 5111da177e4SLinus Torvalds 512af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 513af0bb599SAlan Stern status = uhci_maxerr(3); 5141da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 5151da177e4SLinus Torvalds status |= TD_CTRL_LS; 5161da177e4SLinus Torvalds 5171da177e4SLinus Torvalds /* 5181da177e4SLinus Torvalds * Build the TD for the control request setup packet 5191da177e4SLinus Torvalds */ 520af0bb599SAlan Stern td = qh->dummy_td; 5211da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 522fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(8), 5231da177e4SLinus Torvalds urb->setup_dma); 524dccf4a48SAlan Stern plink = &td->link; 525af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 5261da177e4SLinus Torvalds 5271da177e4SLinus Torvalds /* 5281da177e4SLinus Torvalds * If direction is "send", change the packet ID from SETUP (0x2D) 5291da177e4SLinus Torvalds * to OUT (0xE1). Else change it from SETUP to IN (0x69) and 5301da177e4SLinus Torvalds * set Short Packet Detect (SPD) for all data packets. 5311da177e4SLinus Torvalds */ 5321da177e4SLinus Torvalds if (usb_pipeout(urb->pipe)) 5331da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_OUT); 5341da177e4SLinus Torvalds else { 5351da177e4SLinus Torvalds destination ^= (USB_PID_SETUP ^ USB_PID_IN); 5361da177e4SLinus Torvalds status |= TD_CTRL_SPD; 5371da177e4SLinus Torvalds } 5381da177e4SLinus Torvalds 5391da177e4SLinus Torvalds /* 540687f5f34SAlan Stern * Build the DATA TDs 5411da177e4SLinus Torvalds */ 5421da177e4SLinus Torvalds while (len > 0) { 543dccf4a48SAlan Stern int pktsze = min(len, maxsze); 5441da177e4SLinus Torvalds 5452532178aSAlan Stern td = uhci_alloc_td(uhci); 5461da177e4SLinus Torvalds if (!td) 547af0bb599SAlan Stern goto nomem; 548dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 5491da177e4SLinus Torvalds 5501da177e4SLinus Torvalds /* Alternate Data0/1 (start with Data1) */ 5511da177e4SLinus Torvalds destination ^= TD_TOKEN_TOGGLE; 5521da177e4SLinus Torvalds 5531da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 554fa346568SAlan Stern uhci_fill_td(td, status, destination | uhci_explen(pktsze), 5551da177e4SLinus Torvalds data); 556dccf4a48SAlan Stern plink = &td->link; 5571da177e4SLinus Torvalds 5581da177e4SLinus Torvalds data += pktsze; 5591da177e4SLinus Torvalds len -= pktsze; 5601da177e4SLinus Torvalds } 5611da177e4SLinus Torvalds 5621da177e4SLinus Torvalds /* 5631da177e4SLinus Torvalds * Build the final TD for control status 5641da177e4SLinus Torvalds */ 5652532178aSAlan Stern td = uhci_alloc_td(uhci); 5661da177e4SLinus Torvalds if (!td) 567af0bb599SAlan Stern goto nomem; 568dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 5691da177e4SLinus Torvalds 5701da177e4SLinus Torvalds /* 5711da177e4SLinus Torvalds * It's IN if the pipe is an output pipe or we're not expecting 5721da177e4SLinus Torvalds * data back. 5731da177e4SLinus Torvalds */ 5741da177e4SLinus Torvalds destination &= ~TD_TOKEN_PID_MASK; 5751da177e4SLinus Torvalds if (usb_pipeout(urb->pipe) || !urb->transfer_buffer_length) 5761da177e4SLinus Torvalds destination |= USB_PID_IN; 5771da177e4SLinus Torvalds else 5781da177e4SLinus Torvalds destination |= USB_PID_OUT; 5791da177e4SLinus Torvalds 5801da177e4SLinus Torvalds destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ 5811da177e4SLinus Torvalds 5821da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 5831da177e4SLinus Torvalds 5841da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 5851da177e4SLinus Torvalds uhci_fill_td(td, status | TD_CTRL_IOC, 586fa346568SAlan Stern destination | uhci_explen(0), 0); 587af0bb599SAlan Stern plink = &td->link; 588af0bb599SAlan Stern 589af0bb599SAlan Stern /* 590af0bb599SAlan Stern * Build the new dummy TD and activate the old one 591af0bb599SAlan Stern */ 592af0bb599SAlan Stern td = uhci_alloc_td(uhci); 593af0bb599SAlan Stern if (!td) 594af0bb599SAlan Stern goto nomem; 595af0bb599SAlan Stern *plink = cpu_to_le32(td->dma_handle); 596af0bb599SAlan Stern 597af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 598af0bb599SAlan Stern wmb(); 599af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 600af0bb599SAlan Stern qh->dummy_td = td; 6011da177e4SLinus Torvalds 6021da177e4SLinus Torvalds /* Low-speed transfers get a different queue, and won't hog the bus. 6031da177e4SLinus Torvalds * Also, some devices enumerate better without FSBR; the easiest way 6041da177e4SLinus Torvalds * to do that is to put URBs on the low-speed queue while the device 605630aa3cfSAlan Stern * isn't in the CONFIGURED state. */ 6061da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW || 607630aa3cfSAlan Stern urb->dev->state != USB_STATE_CONFIGURED) 608dccf4a48SAlan Stern qh->skel = uhci->skel_ls_control_qh; 6091da177e4SLinus Torvalds else { 610dccf4a48SAlan Stern qh->skel = uhci->skel_fs_control_qh; 6111da177e4SLinus Torvalds uhci_inc_fsbr(uhci, urb); 6121da177e4SLinus Torvalds } 613dccf4a48SAlan Stern return 0; 614af0bb599SAlan Stern 615af0bb599SAlan Stern nomem: 616af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 617af0bb599SAlan Stern uhci_remove_td_from_urb(qh->dummy_td); 618af0bb599SAlan Stern return -ENOMEM; 6191da177e4SLinus Torvalds } 6201da177e4SLinus Torvalds 6211da177e4SLinus Torvalds /* 6221da177e4SLinus Torvalds * If control-IN transfer was short, the status packet wasn't sent. 6231da177e4SLinus Torvalds * This routine changes the element pointer in the QH to point at the 6241da177e4SLinus Torvalds * status TD. It's safe to do this even while the QH is live, because 6251da177e4SLinus Torvalds * the hardware only updates the element pointer following a successful 6261da177e4SLinus Torvalds * transfer. The inactive TD for the short packet won't cause an update, 6271da177e4SLinus Torvalds * so the pointer won't get overwritten. The next time the controller 6281da177e4SLinus Torvalds * sees this QH, it will send the status packet. 6291da177e4SLinus Torvalds */ 6301da177e4SLinus Torvalds static int usb_control_retrigger_status(struct uhci_hcd *uhci, struct urb *urb) 6311da177e4SLinus Torvalds { 6321da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 6331da177e4SLinus Torvalds struct uhci_td *td; 6341da177e4SLinus Torvalds 635dccf4a48SAlan Stern urbp->short_transfer = 1; 6361da177e4SLinus Torvalds 6371da177e4SLinus Torvalds td = list_entry(urbp->td_list.prev, struct uhci_td, list); 6381da177e4SLinus Torvalds urbp->qh->element = cpu_to_le32(td->dma_handle); 6391da177e4SLinus Torvalds 6401da177e4SLinus Torvalds return -EINPROGRESS; 6411da177e4SLinus Torvalds } 6421da177e4SLinus Torvalds 6431da177e4SLinus Torvalds 6441da177e4SLinus Torvalds static int uhci_result_control(struct uhci_hcd *uhci, struct urb *urb) 6451da177e4SLinus Torvalds { 6461da177e4SLinus Torvalds struct list_head *tmp, *head; 6471da177e4SLinus Torvalds struct urb_priv *urbp = urb->hcpriv; 6481da177e4SLinus Torvalds struct uhci_td *td; 6491da177e4SLinus Torvalds unsigned int status; 6501da177e4SLinus Torvalds int ret = 0; 6511da177e4SLinus Torvalds 6521da177e4SLinus Torvalds head = &urbp->td_list; 653dccf4a48SAlan Stern if (urbp->short_transfer) { 6541da177e4SLinus Torvalds tmp = head->prev; 6551da177e4SLinus Torvalds goto status_stage; 6561da177e4SLinus Torvalds } 6571da177e4SLinus Torvalds 658dccf4a48SAlan Stern urb->actual_length = 0; 659dccf4a48SAlan Stern 6601da177e4SLinus Torvalds tmp = head->next; 6611da177e4SLinus Torvalds td = list_entry(tmp, struct uhci_td, list); 6621da177e4SLinus Torvalds 6631da177e4SLinus Torvalds /* The first TD is the SETUP stage, check the status, but skip */ 6641da177e4SLinus Torvalds /* the count */ 6651da177e4SLinus Torvalds status = uhci_status_bits(td_status(td)); 6661da177e4SLinus Torvalds if (status & TD_CTRL_ACTIVE) 6671da177e4SLinus Torvalds return -EINPROGRESS; 6681da177e4SLinus Torvalds 6691da177e4SLinus Torvalds if (status) 6701da177e4SLinus Torvalds goto td_error; 6711da177e4SLinus Torvalds 672687f5f34SAlan Stern /* The rest of the TDs (but the last) are data */ 6731da177e4SLinus Torvalds tmp = tmp->next; 6741da177e4SLinus Torvalds while (tmp != head && tmp->next != head) { 6751da177e4SLinus Torvalds unsigned int ctrlstat; 6761da177e4SLinus Torvalds 6771da177e4SLinus Torvalds td = list_entry(tmp, struct uhci_td, list); 6781da177e4SLinus Torvalds tmp = tmp->next; 6791da177e4SLinus Torvalds 6801da177e4SLinus Torvalds ctrlstat = td_status(td); 6811da177e4SLinus Torvalds status = uhci_status_bits(ctrlstat); 6821da177e4SLinus Torvalds if (status & TD_CTRL_ACTIVE) 6831da177e4SLinus Torvalds return -EINPROGRESS; 6841da177e4SLinus Torvalds 6851da177e4SLinus Torvalds urb->actual_length += uhci_actual_length(ctrlstat); 6861da177e4SLinus Torvalds 6871da177e4SLinus Torvalds if (status) 6881da177e4SLinus Torvalds goto td_error; 6891da177e4SLinus Torvalds 6901da177e4SLinus Torvalds /* Check to see if we received a short packet */ 6911da177e4SLinus Torvalds if (uhci_actual_length(ctrlstat) < 6921da177e4SLinus Torvalds uhci_expected_length(td_token(td))) { 6931da177e4SLinus Torvalds if (urb->transfer_flags & URB_SHORT_NOT_OK) { 6941da177e4SLinus Torvalds ret = -EREMOTEIO; 6951da177e4SLinus Torvalds goto err; 6961da177e4SLinus Torvalds } 6971da177e4SLinus Torvalds 6981da177e4SLinus Torvalds return usb_control_retrigger_status(uhci, urb); 6991da177e4SLinus Torvalds } 7001da177e4SLinus Torvalds } 7011da177e4SLinus Torvalds 7021da177e4SLinus Torvalds status_stage: 7031da177e4SLinus Torvalds td = list_entry(tmp, struct uhci_td, list); 7041da177e4SLinus Torvalds 7051da177e4SLinus Torvalds /* Control status stage */ 7061da177e4SLinus Torvalds status = td_status(td); 7071da177e4SLinus Torvalds 7081da177e4SLinus Torvalds #ifdef I_HAVE_BUGGY_APC_BACKUPS 7091da177e4SLinus Torvalds /* APC BackUPS Pro kludge */ 7101da177e4SLinus Torvalds /* It tries to send all of the descriptor instead of the amount */ 7111da177e4SLinus Torvalds /* we requested */ 7121da177e4SLinus Torvalds if (status & TD_CTRL_IOC && /* IOC is masked out by uhci_status_bits */ 7131da177e4SLinus Torvalds status & TD_CTRL_ACTIVE && 7141da177e4SLinus Torvalds status & TD_CTRL_NAK) 7151da177e4SLinus Torvalds return 0; 7161da177e4SLinus Torvalds #endif 7171da177e4SLinus Torvalds 7181da177e4SLinus Torvalds status = uhci_status_bits(status); 7191da177e4SLinus Torvalds if (status & TD_CTRL_ACTIVE) 7201da177e4SLinus Torvalds return -EINPROGRESS; 7211da177e4SLinus Torvalds 7221da177e4SLinus Torvalds if (status) 7231da177e4SLinus Torvalds goto td_error; 7241da177e4SLinus Torvalds 7251da177e4SLinus Torvalds return 0; 7261da177e4SLinus Torvalds 7271da177e4SLinus Torvalds td_error: 7281da177e4SLinus Torvalds ret = uhci_map_status(status, uhci_packetout(td_token(td))); 7291da177e4SLinus Torvalds 7301da177e4SLinus Torvalds err: 7311da177e4SLinus Torvalds if ((debug == 1 && ret != -EPIPE) || debug > 1) { 7321da177e4SLinus Torvalds /* Some debugging code */ 7331da177e4SLinus Torvalds dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n", 7341da177e4SLinus Torvalds __FUNCTION__, status); 7351da177e4SLinus Torvalds 7361da177e4SLinus Torvalds if (errbuf) { 7371da177e4SLinus Torvalds /* Print the chain for debugging purposes */ 7381da177e4SLinus Torvalds uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0); 7391da177e4SLinus Torvalds 7401da177e4SLinus Torvalds lprintk(errbuf); 7411da177e4SLinus Torvalds } 7421da177e4SLinus Torvalds } 7431da177e4SLinus Torvalds 744*0ed8fee1SAlan Stern /* Note that the queue has stopped */ 745*0ed8fee1SAlan Stern urbp->qh->element = UHCI_PTR_TERM; 746*0ed8fee1SAlan Stern urbp->qh->is_stopped = 1; 7471da177e4SLinus Torvalds return ret; 7481da177e4SLinus Torvalds } 7491da177e4SLinus Torvalds 7501da177e4SLinus Torvalds /* 7511da177e4SLinus Torvalds * Common submit for bulk and interrupt 7521da177e4SLinus Torvalds */ 753dccf4a48SAlan Stern static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, 754dccf4a48SAlan Stern struct uhci_qh *qh) 7551da177e4SLinus Torvalds { 7561da177e4SLinus Torvalds struct uhci_td *td; 7571da177e4SLinus Torvalds unsigned long destination, status; 758dccf4a48SAlan Stern int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); 7591da177e4SLinus Torvalds int len = urb->transfer_buffer_length; 7601da177e4SLinus Torvalds dma_addr_t data = urb->transfer_dma; 761af0bb599SAlan Stern __le32 *plink; 762af0bb599SAlan Stern unsigned int toggle; 7631da177e4SLinus Torvalds 7641da177e4SLinus Torvalds if (len < 0) 7651da177e4SLinus Torvalds return -EINVAL; 7661da177e4SLinus Torvalds 7671da177e4SLinus Torvalds /* The "pipe" thing contains the destination in bits 8--18 */ 7681da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 769af0bb599SAlan Stern toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), 770af0bb599SAlan Stern usb_pipeout(urb->pipe)); 7711da177e4SLinus Torvalds 772af0bb599SAlan Stern /* 3 errors, dummy TD remains inactive */ 773af0bb599SAlan Stern status = uhci_maxerr(3); 7741da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 7751da177e4SLinus Torvalds status |= TD_CTRL_LS; 7761da177e4SLinus Torvalds if (usb_pipein(urb->pipe)) 7771da177e4SLinus Torvalds status |= TD_CTRL_SPD; 7781da177e4SLinus Torvalds 7791da177e4SLinus Torvalds /* 780687f5f34SAlan Stern * Build the DATA TDs 7811da177e4SLinus Torvalds */ 782af0bb599SAlan Stern plink = NULL; 783af0bb599SAlan Stern td = qh->dummy_td; 7841da177e4SLinus Torvalds do { /* Allow zero length packets */ 7851da177e4SLinus Torvalds int pktsze = maxsze; 7861da177e4SLinus Torvalds 787dccf4a48SAlan Stern if (len <= pktsze) { /* The last packet */ 7881da177e4SLinus Torvalds pktsze = len; 7891da177e4SLinus Torvalds if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) 7901da177e4SLinus Torvalds status &= ~TD_CTRL_SPD; 7911da177e4SLinus Torvalds } 7921da177e4SLinus Torvalds 793af0bb599SAlan Stern if (plink) { 7942532178aSAlan Stern td = uhci_alloc_td(uhci); 7951da177e4SLinus Torvalds if (!td) 796af0bb599SAlan Stern goto nomem; 797dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 798af0bb599SAlan Stern } 7991da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 800dccf4a48SAlan Stern uhci_fill_td(td, status, 801dccf4a48SAlan Stern destination | uhci_explen(pktsze) | 802af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 8031da177e4SLinus Torvalds data); 804dccf4a48SAlan Stern plink = &td->link; 805af0bb599SAlan Stern status |= TD_CTRL_ACTIVE; 8061da177e4SLinus Torvalds 8071da177e4SLinus Torvalds data += pktsze; 8081da177e4SLinus Torvalds len -= maxsze; 809af0bb599SAlan Stern toggle ^= 1; 8101da177e4SLinus Torvalds } while (len > 0); 8111da177e4SLinus Torvalds 8121da177e4SLinus Torvalds /* 8131da177e4SLinus Torvalds * URB_ZERO_PACKET means adding a 0-length packet, if direction 8141da177e4SLinus Torvalds * is OUT and the transfer_length was an exact multiple of maxsze, 8151da177e4SLinus Torvalds * hence (len = transfer_length - N * maxsze) == 0 8161da177e4SLinus Torvalds * however, if transfer_length == 0, the zero packet was already 8171da177e4SLinus Torvalds * prepared above. 8181da177e4SLinus Torvalds */ 819dccf4a48SAlan Stern if ((urb->transfer_flags & URB_ZERO_PACKET) && 820dccf4a48SAlan Stern usb_pipeout(urb->pipe) && len == 0 && 821dccf4a48SAlan Stern urb->transfer_buffer_length > 0) { 8222532178aSAlan Stern td = uhci_alloc_td(uhci); 8231da177e4SLinus Torvalds if (!td) 824af0bb599SAlan Stern goto nomem; 825dccf4a48SAlan Stern *plink = cpu_to_le32(td->dma_handle); 8261da177e4SLinus Torvalds 8271da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 828af0bb599SAlan Stern uhci_fill_td(td, status, 829af0bb599SAlan Stern destination | uhci_explen(0) | 830af0bb599SAlan Stern (toggle << TD_TOKEN_TOGGLE_SHIFT), 8311da177e4SLinus Torvalds data); 832af0bb599SAlan Stern plink = &td->link; 8331da177e4SLinus Torvalds 834af0bb599SAlan Stern toggle ^= 1; 8351da177e4SLinus Torvalds } 8361da177e4SLinus Torvalds 8371da177e4SLinus Torvalds /* Set the interrupt-on-completion flag on the last packet. 8381da177e4SLinus Torvalds * A more-or-less typical 4 KB URB (= size of one memory page) 8391da177e4SLinus Torvalds * will require about 3 ms to transfer; that's a little on the 8401da177e4SLinus Torvalds * fast side but not enough to justify delaying an interrupt 8411da177e4SLinus Torvalds * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT 8421da177e4SLinus Torvalds * flag setting. */ 843dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 8441da177e4SLinus Torvalds 845af0bb599SAlan Stern /* 846af0bb599SAlan Stern * Build the new dummy TD and activate the old one 847af0bb599SAlan Stern */ 848af0bb599SAlan Stern td = uhci_alloc_td(uhci); 849af0bb599SAlan Stern if (!td) 850af0bb599SAlan Stern goto nomem; 851af0bb599SAlan Stern *plink = cpu_to_le32(td->dma_handle); 852af0bb599SAlan Stern 853af0bb599SAlan Stern uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); 854af0bb599SAlan Stern wmb(); 855af0bb599SAlan Stern qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); 856af0bb599SAlan Stern qh->dummy_td = td; 857af0bb599SAlan Stern 858af0bb599SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 859af0bb599SAlan Stern usb_pipeout(urb->pipe), toggle); 860dccf4a48SAlan Stern return 0; 861af0bb599SAlan Stern 862af0bb599SAlan Stern nomem: 863af0bb599SAlan Stern /* Remove the dummy TD from the td_list so it doesn't get freed */ 864af0bb599SAlan Stern uhci_remove_td_from_urb(qh->dummy_td); 865af0bb599SAlan Stern return -ENOMEM; 8661da177e4SLinus Torvalds } 8671da177e4SLinus Torvalds 8681da177e4SLinus Torvalds /* 8691da177e4SLinus Torvalds * Common result for bulk and interrupt 8701da177e4SLinus Torvalds */ 8711da177e4SLinus Torvalds static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) 8721da177e4SLinus Torvalds { 8731da177e4SLinus Torvalds struct urb_priv *urbp = urb->hcpriv; 8741da177e4SLinus Torvalds struct uhci_td *td; 8751da177e4SLinus Torvalds unsigned int status = 0; 8761da177e4SLinus Torvalds int ret = 0; 8771da177e4SLinus Torvalds 8781da177e4SLinus Torvalds urb->actual_length = 0; 8791da177e4SLinus Torvalds 8801da177e4SLinus Torvalds list_for_each_entry(td, &urbp->td_list, list) { 8811da177e4SLinus Torvalds unsigned int ctrlstat = td_status(td); 8821da177e4SLinus Torvalds 8831da177e4SLinus Torvalds status = uhci_status_bits(ctrlstat); 8841da177e4SLinus Torvalds if (status & TD_CTRL_ACTIVE) 8851da177e4SLinus Torvalds return -EINPROGRESS; 8861da177e4SLinus Torvalds 8871da177e4SLinus Torvalds urb->actual_length += uhci_actual_length(ctrlstat); 8881da177e4SLinus Torvalds 8891da177e4SLinus Torvalds if (status) 8901da177e4SLinus Torvalds goto td_error; 8911da177e4SLinus Torvalds 8921da177e4SLinus Torvalds if (uhci_actual_length(ctrlstat) < 8931da177e4SLinus Torvalds uhci_expected_length(td_token(td))) { 8941da177e4SLinus Torvalds if (urb->transfer_flags & URB_SHORT_NOT_OK) { 8951da177e4SLinus Torvalds ret = -EREMOTEIO; 8961da177e4SLinus Torvalds goto err; 897dccf4a48SAlan Stern } 898dccf4a48SAlan Stern 899dccf4a48SAlan Stern /* 900dccf4a48SAlan Stern * This URB stopped short of its end. We have to 901dccf4a48SAlan Stern * fix up the toggles of the following URBs on the 902dccf4a48SAlan Stern * queue and restart the queue. 903dccf4a48SAlan Stern * 904dccf4a48SAlan Stern * Do this only the first time we encounter the 905dccf4a48SAlan Stern * short URB. 906dccf4a48SAlan Stern */ 907dccf4a48SAlan Stern if (!urbp->short_transfer) { 908dccf4a48SAlan Stern urbp->short_transfer = 1; 909*0ed8fee1SAlan Stern urbp->qh->initial_toggle = 910*0ed8fee1SAlan Stern uhci_toggle(td_token(td)) ^ 1; 911*0ed8fee1SAlan Stern uhci_fixup_toggles(urbp->qh, 1); 912*0ed8fee1SAlan Stern 913dccf4a48SAlan Stern td = list_entry(urbp->td_list.prev, 914dccf4a48SAlan Stern struct uhci_td, list); 915dccf4a48SAlan Stern urbp->qh->element = td->link; 916dccf4a48SAlan Stern } 917dccf4a48SAlan Stern break; 9181da177e4SLinus Torvalds } 9191da177e4SLinus Torvalds } 9201da177e4SLinus Torvalds 9211da177e4SLinus Torvalds return 0; 9221da177e4SLinus Torvalds 9231da177e4SLinus Torvalds td_error: 9241da177e4SLinus Torvalds ret = uhci_map_status(status, uhci_packetout(td_token(td))); 9251da177e4SLinus Torvalds 9261da177e4SLinus Torvalds err: 9271da177e4SLinus Torvalds /* 9281da177e4SLinus Torvalds * Enable this chunk of code if you want to see some more debugging. 9291da177e4SLinus Torvalds * But be careful, it has the tendancy to starve out khubd and prevent 9301da177e4SLinus Torvalds * disconnects from happening successfully if you have a slow debug 9311da177e4SLinus Torvalds * log interface (like a serial console. 9321da177e4SLinus Torvalds */ 9331da177e4SLinus Torvalds #if 0 9341da177e4SLinus Torvalds if ((debug == 1 && ret != -EPIPE) || debug > 1) { 9351da177e4SLinus Torvalds /* Some debugging code */ 9361da177e4SLinus Torvalds dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n", 9371da177e4SLinus Torvalds __FUNCTION__, status); 9381da177e4SLinus Torvalds 9391da177e4SLinus Torvalds if (errbuf) { 9401da177e4SLinus Torvalds /* Print the chain for debugging purposes */ 9411da177e4SLinus Torvalds uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0); 9421da177e4SLinus Torvalds 9431da177e4SLinus Torvalds lprintk(errbuf); 9441da177e4SLinus Torvalds } 9451da177e4SLinus Torvalds } 9461da177e4SLinus Torvalds #endif 947*0ed8fee1SAlan Stern 948*0ed8fee1SAlan Stern /* Note that the queue has stopped and save the next toggle value */ 949*0ed8fee1SAlan Stern urbp->qh->element = UHCI_PTR_TERM; 950*0ed8fee1SAlan Stern urbp->qh->is_stopped = 1; 951*0ed8fee1SAlan Stern urbp->qh->needs_fixup = 1; 952*0ed8fee1SAlan Stern urbp->qh->initial_toggle = uhci_toggle(td_token(td)) ^ 953*0ed8fee1SAlan Stern (ret == -EREMOTEIO); 9541da177e4SLinus Torvalds return ret; 9551da177e4SLinus Torvalds } 9561da177e4SLinus Torvalds 957dccf4a48SAlan Stern static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, 958dccf4a48SAlan Stern struct uhci_qh *qh) 9591da177e4SLinus Torvalds { 9601da177e4SLinus Torvalds int ret; 9611da177e4SLinus Torvalds 9621da177e4SLinus Torvalds /* Can't have low-speed bulk transfers */ 9631da177e4SLinus Torvalds if (urb->dev->speed == USB_SPEED_LOW) 9641da177e4SLinus Torvalds return -EINVAL; 9651da177e4SLinus Torvalds 966dccf4a48SAlan Stern qh->skel = uhci->skel_bulk_qh; 967dccf4a48SAlan Stern ret = uhci_submit_common(uhci, urb, qh); 968dccf4a48SAlan Stern if (ret == 0) 9691da177e4SLinus Torvalds uhci_inc_fsbr(uhci, urb); 9701da177e4SLinus Torvalds return ret; 9711da177e4SLinus Torvalds } 9721da177e4SLinus Torvalds 973dccf4a48SAlan Stern static inline int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, 974dccf4a48SAlan Stern struct uhci_qh *qh) 9751da177e4SLinus Torvalds { 976dccf4a48SAlan Stern /* USB 1.1 interrupt transfers only involve one packet per interval. 977dccf4a48SAlan Stern * Drivers can submit URBs of any length, but longer ones will need 978dccf4a48SAlan Stern * multiple intervals to complete. 9791da177e4SLinus Torvalds */ 980dccf4a48SAlan Stern qh->skel = uhci->skelqh[__interval_to_skel(urb->interval)]; 981dccf4a48SAlan Stern return uhci_submit_common(uhci, urb, qh); 9821da177e4SLinus Torvalds } 9831da177e4SLinus Torvalds 9841da177e4SLinus Torvalds /* 9851da177e4SLinus Torvalds * Isochronous transfers 9861da177e4SLinus Torvalds */ 987dccf4a48SAlan Stern static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, 988dccf4a48SAlan Stern struct uhci_qh *qh) 9891da177e4SLinus Torvalds { 990dccf4a48SAlan Stern struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ 991*0ed8fee1SAlan Stern int i, frame; 992dccf4a48SAlan Stern unsigned long destination, status; 993b81d3436SAlan Stern struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 9941da177e4SLinus Torvalds 995*0ed8fee1SAlan Stern if (urb->number_of_packets > 900) /* 900? Why? */ 996*0ed8fee1SAlan Stern return -EFBIG; 997*0ed8fee1SAlan Stern 9981da177e4SLinus Torvalds status = TD_CTRL_ACTIVE | TD_CTRL_IOS; 9991da177e4SLinus Torvalds destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); 10001da177e4SLinus Torvalds 1001*0ed8fee1SAlan Stern /* Figure out the starting frame number */ 1002*0ed8fee1SAlan Stern if (urb->transfer_flags & URB_ISO_ASAP) { 1003*0ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 1004*0ed8fee1SAlan Stern uhci_get_current_frame_number(uhci); 1005*0ed8fee1SAlan Stern urb->start_frame = (uhci->frame_number + 10); 1006*0ed8fee1SAlan Stern 1007*0ed8fee1SAlan Stern } else { /* Go right after the last one */ 1008*0ed8fee1SAlan Stern struct urb *last_urb; 1009*0ed8fee1SAlan Stern 1010*0ed8fee1SAlan Stern last_urb = list_entry(qh->queue.prev, 1011*0ed8fee1SAlan Stern struct urb_priv, node)->urb; 1012*0ed8fee1SAlan Stern urb->start_frame = (last_urb->start_frame + 1013*0ed8fee1SAlan Stern last_urb->number_of_packets * 1014*0ed8fee1SAlan Stern last_urb->interval); 1015*0ed8fee1SAlan Stern } 1016*0ed8fee1SAlan Stern } else { 1017*0ed8fee1SAlan Stern /* FIXME: Sanity check */ 1018*0ed8fee1SAlan Stern } 1019*0ed8fee1SAlan Stern urb->start_frame &= (UHCI_NUMFRAMES - 1); 10201da177e4SLinus Torvalds 1021b81d3436SAlan Stern for (i = 0; i < urb->number_of_packets; i++) { 10222532178aSAlan Stern td = uhci_alloc_td(uhci); 10231da177e4SLinus Torvalds if (!td) 10241da177e4SLinus Torvalds return -ENOMEM; 10251da177e4SLinus Torvalds 10261da177e4SLinus Torvalds uhci_add_td_to_urb(urb, td); 1027dccf4a48SAlan Stern uhci_fill_td(td, status, destination | 1028dccf4a48SAlan Stern uhci_explen(urb->iso_frame_desc[i].length), 1029dccf4a48SAlan Stern urb->transfer_dma + 1030dccf4a48SAlan Stern urb->iso_frame_desc[i].offset); 1031b81d3436SAlan Stern } 10321da177e4SLinus Torvalds 1033dccf4a48SAlan Stern /* Set the interrupt-on-completion flag on the last packet. */ 1034dccf4a48SAlan Stern td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); 1035dccf4a48SAlan Stern 1036dccf4a48SAlan Stern qh->skel = uhci->skel_iso_qh; 1037dccf4a48SAlan Stern 1038dccf4a48SAlan Stern /* Add the TDs to the frame list */ 1039b81d3436SAlan Stern frame = urb->start_frame; 1040b81d3436SAlan Stern list_for_each_entry(td, &urbp->td_list, list) { 1041dccf4a48SAlan Stern uhci_insert_td_in_frame_list(uhci, td, frame); 1042b81d3436SAlan Stern frame += urb->interval; 10431da177e4SLinus Torvalds } 10441da177e4SLinus Torvalds 1045dccf4a48SAlan Stern return 0; 10461da177e4SLinus Torvalds } 10471da177e4SLinus Torvalds 10481da177e4SLinus Torvalds static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) 10491da177e4SLinus Torvalds { 10501da177e4SLinus Torvalds struct uhci_td *td; 10511da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; 10521da177e4SLinus Torvalds int status; 10531da177e4SLinus Torvalds int i, ret = 0; 10541da177e4SLinus Torvalds 1055b81d3436SAlan Stern urb->actual_length = urb->error_count = 0; 10561da177e4SLinus Torvalds 10571da177e4SLinus Torvalds i = 0; 10581da177e4SLinus Torvalds list_for_each_entry(td, &urbp->td_list, list) { 10591da177e4SLinus Torvalds int actlength; 10601da177e4SLinus Torvalds unsigned int ctrlstat = td_status(td); 10611da177e4SLinus Torvalds 10621da177e4SLinus Torvalds if (ctrlstat & TD_CTRL_ACTIVE) 10631da177e4SLinus Torvalds return -EINPROGRESS; 10641da177e4SLinus Torvalds 10651da177e4SLinus Torvalds actlength = uhci_actual_length(ctrlstat); 10661da177e4SLinus Torvalds urb->iso_frame_desc[i].actual_length = actlength; 10671da177e4SLinus Torvalds urb->actual_length += actlength; 10681da177e4SLinus Torvalds 10691da177e4SLinus Torvalds status = uhci_map_status(uhci_status_bits(ctrlstat), 10701da177e4SLinus Torvalds usb_pipeout(urb->pipe)); 10711da177e4SLinus Torvalds urb->iso_frame_desc[i].status = status; 10721da177e4SLinus Torvalds if (status) { 10731da177e4SLinus Torvalds urb->error_count++; 10741da177e4SLinus Torvalds ret = status; 10751da177e4SLinus Torvalds } 10761da177e4SLinus Torvalds 10771da177e4SLinus Torvalds i++; 10781da177e4SLinus Torvalds } 10791da177e4SLinus Torvalds 10801da177e4SLinus Torvalds return ret; 10811da177e4SLinus Torvalds } 10821da177e4SLinus Torvalds 10831da177e4SLinus Torvalds static int uhci_urb_enqueue(struct usb_hcd *hcd, 1084dccf4a48SAlan Stern struct usb_host_endpoint *hep, 108555016f10SAl Viro struct urb *urb, gfp_t mem_flags) 10861da177e4SLinus Torvalds { 10871da177e4SLinus Torvalds int ret; 10881da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 10891da177e4SLinus Torvalds unsigned long flags; 1090dccf4a48SAlan Stern struct urb_priv *urbp; 1091dccf4a48SAlan Stern struct uhci_qh *qh; 10921da177e4SLinus Torvalds int bustime; 10931da177e4SLinus Torvalds 10941da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 10951da177e4SLinus Torvalds 10961da177e4SLinus Torvalds ret = urb->status; 10971da177e4SLinus Torvalds if (ret != -EINPROGRESS) /* URB already unlinked! */ 1098dccf4a48SAlan Stern goto done; 10991da177e4SLinus Torvalds 11001da177e4SLinus Torvalds ret = -ENOMEM; 1101dccf4a48SAlan Stern urbp = uhci_alloc_urb_priv(uhci, urb); 1102dccf4a48SAlan Stern if (!urbp) 1103dccf4a48SAlan Stern goto done; 1104dccf4a48SAlan Stern 1105dccf4a48SAlan Stern if (hep->hcpriv) 1106dccf4a48SAlan Stern qh = (struct uhci_qh *) hep->hcpriv; 1107dccf4a48SAlan Stern else { 1108dccf4a48SAlan Stern qh = uhci_alloc_qh(uhci, urb->dev, hep); 1109dccf4a48SAlan Stern if (!qh) 1110dccf4a48SAlan Stern goto err_no_qh; 11111da177e4SLinus Torvalds } 1112dccf4a48SAlan Stern urbp->qh = qh; 11131da177e4SLinus Torvalds 11141da177e4SLinus Torvalds switch (usb_pipetype(urb->pipe)) { 11151da177e4SLinus Torvalds case PIPE_CONTROL: 1116dccf4a48SAlan Stern ret = uhci_submit_control(uhci, urb, qh); 1117dccf4a48SAlan Stern break; 1118dccf4a48SAlan Stern case PIPE_BULK: 1119dccf4a48SAlan Stern ret = uhci_submit_bulk(uhci, urb, qh); 11201da177e4SLinus Torvalds break; 11211da177e4SLinus Torvalds case PIPE_INTERRUPT: 1122dccf4a48SAlan Stern if (list_empty(&qh->queue)) { 11231da177e4SLinus Torvalds bustime = usb_check_bandwidth(urb->dev, urb); 11241da177e4SLinus Torvalds if (bustime < 0) 11251da177e4SLinus Torvalds ret = bustime; 11261da177e4SLinus Torvalds else { 1127dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 1128dccf4a48SAlan Stern if (ret == 0) 11291da177e4SLinus Torvalds usb_claim_bandwidth(urb->dev, urb, bustime, 0); 11301da177e4SLinus Torvalds } 11311da177e4SLinus Torvalds } else { /* inherit from parent */ 1132dccf4a48SAlan Stern struct urb_priv *eurbp; 1133dccf4a48SAlan Stern 1134dccf4a48SAlan Stern eurbp = list_entry(qh->queue.prev, struct urb_priv, 1135dccf4a48SAlan Stern node); 1136dccf4a48SAlan Stern urb->bandwidth = eurbp->urb->bandwidth; 1137dccf4a48SAlan Stern ret = uhci_submit_interrupt(uhci, urb, qh); 11381da177e4SLinus Torvalds } 11391da177e4SLinus Torvalds break; 11401da177e4SLinus Torvalds case PIPE_ISOCHRONOUS: 11411da177e4SLinus Torvalds bustime = usb_check_bandwidth(urb->dev, urb); 11421da177e4SLinus Torvalds if (bustime < 0) { 11431da177e4SLinus Torvalds ret = bustime; 11441da177e4SLinus Torvalds break; 11451da177e4SLinus Torvalds } 11461da177e4SLinus Torvalds 1147dccf4a48SAlan Stern ret = uhci_submit_isochronous(uhci, urb, qh); 1148dccf4a48SAlan Stern if (ret == 0) 11491da177e4SLinus Torvalds usb_claim_bandwidth(urb->dev, urb, bustime, 1); 11501da177e4SLinus Torvalds break; 11511da177e4SLinus Torvalds } 1152dccf4a48SAlan Stern if (ret != 0) 1153dccf4a48SAlan Stern goto err_submit_failed; 11541da177e4SLinus Torvalds 1155dccf4a48SAlan Stern /* Add this URB to the QH */ 1156dccf4a48SAlan Stern urbp->qh = qh; 1157dccf4a48SAlan Stern list_add_tail(&urbp->node, &qh->queue); 11581da177e4SLinus Torvalds 1159dccf4a48SAlan Stern /* If the new URB is the first and only one on this QH then either 1160dccf4a48SAlan Stern * the QH is new and idle or else it's unlinked and waiting to 1161dccf4a48SAlan Stern * become idle, so we can activate it right away. */ 1162dccf4a48SAlan Stern if (qh->queue.next == &urbp->node) 1163dccf4a48SAlan Stern uhci_activate_qh(uhci, qh); 1164dccf4a48SAlan Stern goto done; 1165dccf4a48SAlan Stern 1166dccf4a48SAlan Stern err_submit_failed: 1167dccf4a48SAlan Stern if (qh->state == QH_STATE_IDLE) 1168dccf4a48SAlan Stern uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ 1169dccf4a48SAlan Stern 1170dccf4a48SAlan Stern err_no_qh: 1171dccf4a48SAlan Stern uhci_free_urb_priv(uhci, urbp); 1172dccf4a48SAlan Stern 1173dccf4a48SAlan Stern done: 11741da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 11751da177e4SLinus Torvalds return ret; 11761da177e4SLinus Torvalds } 11771da177e4SLinus Torvalds 11781da177e4SLinus Torvalds static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) 11791da177e4SLinus Torvalds { 11801da177e4SLinus Torvalds struct uhci_hcd *uhci = hcd_to_uhci(hcd); 11811da177e4SLinus Torvalds unsigned long flags; 11821da177e4SLinus Torvalds struct urb_priv *urbp; 11831da177e4SLinus Torvalds 11841da177e4SLinus Torvalds spin_lock_irqsave(&uhci->lock, flags); 11851da177e4SLinus Torvalds urbp = urb->hcpriv; 11861da177e4SLinus Torvalds if (!urbp) /* URB was never linked! */ 11871da177e4SLinus Torvalds goto done; 11881da177e4SLinus Torvalds 1189dccf4a48SAlan Stern /* Remove Isochronous TDs from the frame list ASAP */ 1190b81d3436SAlan Stern if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) 1191dccf4a48SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 1192dccf4a48SAlan Stern uhci_unlink_qh(uhci, urbp->qh); 11931da177e4SLinus Torvalds 11941da177e4SLinus Torvalds done: 11951da177e4SLinus Torvalds spin_unlock_irqrestore(&uhci->lock, flags); 11961da177e4SLinus Torvalds return 0; 11971da177e4SLinus Torvalds } 11981da177e4SLinus Torvalds 1199*0ed8fee1SAlan Stern /* 1200*0ed8fee1SAlan Stern * Finish unlinking an URB and give it back 1201*0ed8fee1SAlan Stern */ 1202*0ed8fee1SAlan Stern static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, 1203*0ed8fee1SAlan Stern struct urb *urb, struct pt_regs *regs) 1204*0ed8fee1SAlan Stern __releases(uhci->lock) 1205*0ed8fee1SAlan Stern __acquires(uhci->lock) 12061da177e4SLinus Torvalds { 12071da177e4SLinus Torvalds struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; 12081da177e4SLinus Torvalds 1209*0ed8fee1SAlan Stern /* Isochronous TDs get unlinked directly from the frame list */ 1210*0ed8fee1SAlan Stern if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) 1211*0ed8fee1SAlan Stern uhci_unlink_isochronous_tds(uhci, urb); 12121da177e4SLinus Torvalds 1213*0ed8fee1SAlan Stern /* If the URB isn't first on its queue, adjust the link pointer 1214*0ed8fee1SAlan Stern * of the last TD in the previous URB. */ 1215*0ed8fee1SAlan Stern else if (qh->queue.next != &urbp->node) { 1216*0ed8fee1SAlan Stern struct urb_priv *purbp; 1217*0ed8fee1SAlan Stern struct uhci_td *ptd, *ltd; 12181da177e4SLinus Torvalds 1219*0ed8fee1SAlan Stern purbp = list_entry(urbp->node.prev, struct urb_priv, node); 1220*0ed8fee1SAlan Stern ptd = list_entry(purbp->td_list.prev, struct uhci_td, 1221*0ed8fee1SAlan Stern list); 1222*0ed8fee1SAlan Stern ltd = list_entry(urbp->td_list.prev, struct uhci_td, 1223*0ed8fee1SAlan Stern list); 1224*0ed8fee1SAlan Stern ptd->link = ltd->link; 12251da177e4SLinus Torvalds } 12261da177e4SLinus Torvalds 1227*0ed8fee1SAlan Stern /* Take the URB off the QH's queue. If the queue is now empty, 1228*0ed8fee1SAlan Stern * this is a perfect time for a toggle fixup. */ 1229*0ed8fee1SAlan Stern list_del_init(&urbp->node); 1230*0ed8fee1SAlan Stern if (list_empty(&qh->queue) && qh->needs_fixup) { 1231*0ed8fee1SAlan Stern usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 1232*0ed8fee1SAlan Stern usb_pipeout(urb->pipe), qh->initial_toggle); 1233*0ed8fee1SAlan Stern qh->needs_fixup = 0; 1234*0ed8fee1SAlan Stern } 1235*0ed8fee1SAlan Stern 1236*0ed8fee1SAlan Stern uhci_dec_fsbr(uhci, urb); /* Safe since it checks */ 1237*0ed8fee1SAlan Stern uhci_free_urb_priv(uhci, urbp); 1238*0ed8fee1SAlan Stern 1239*0ed8fee1SAlan Stern switch (usb_pipetype(urb->pipe)) { 1240*0ed8fee1SAlan Stern case PIPE_ISOCHRONOUS: 1241*0ed8fee1SAlan Stern /* Release bandwidth for Interrupt or Isoc. transfers */ 1242*0ed8fee1SAlan Stern if (urb->bandwidth) 1243*0ed8fee1SAlan Stern usb_release_bandwidth(urb->dev, urb, 1); 1244*0ed8fee1SAlan Stern break; 1245*0ed8fee1SAlan Stern case PIPE_INTERRUPT: 1246*0ed8fee1SAlan Stern /* Release bandwidth for Interrupt or Isoc. transfers */ 1247*0ed8fee1SAlan Stern /* Make sure we don't release if we have a queued URB */ 1248*0ed8fee1SAlan Stern if (list_empty(&qh->queue) && urb->bandwidth) 1249*0ed8fee1SAlan Stern usb_release_bandwidth(urb->dev, urb, 0); 1250*0ed8fee1SAlan Stern else 1251*0ed8fee1SAlan Stern /* bandwidth was passed on to queued URB, */ 1252*0ed8fee1SAlan Stern /* so don't let usb_unlink_urb() release it */ 1253*0ed8fee1SAlan Stern urb->bandwidth = 0; 1254*0ed8fee1SAlan Stern break; 1255*0ed8fee1SAlan Stern } 1256*0ed8fee1SAlan Stern 1257*0ed8fee1SAlan Stern spin_unlock(&uhci->lock); 1258*0ed8fee1SAlan Stern usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, regs); 1259*0ed8fee1SAlan Stern spin_lock(&uhci->lock); 1260*0ed8fee1SAlan Stern 1261*0ed8fee1SAlan Stern /* If the queue is now empty, we can unlink the QH and give up its 1262*0ed8fee1SAlan Stern * reserved bandwidth. */ 1263*0ed8fee1SAlan Stern if (list_empty(&qh->queue)) { 1264*0ed8fee1SAlan Stern uhci_unlink_qh(uhci, qh); 1265*0ed8fee1SAlan Stern 1266*0ed8fee1SAlan Stern /* Bandwidth stuff not yet implemented */ 1267*0ed8fee1SAlan Stern } 1268*0ed8fee1SAlan Stern } 1269*0ed8fee1SAlan Stern 1270*0ed8fee1SAlan Stern /* 1271*0ed8fee1SAlan Stern * Scan the URBs in a QH's queue 1272*0ed8fee1SAlan Stern */ 1273*0ed8fee1SAlan Stern #define QH_FINISHED_UNLINKING(qh) \ 1274*0ed8fee1SAlan Stern (qh->state == QH_STATE_UNLINKING && \ 1275*0ed8fee1SAlan Stern uhci->frame_number + uhci->is_stopped != qh->unlink_frame) 1276*0ed8fee1SAlan Stern 1277*0ed8fee1SAlan Stern static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, 1278*0ed8fee1SAlan Stern struct pt_regs *regs) 1279*0ed8fee1SAlan Stern { 1280*0ed8fee1SAlan Stern struct urb_priv *urbp; 1281*0ed8fee1SAlan Stern struct urb *urb; 1282*0ed8fee1SAlan Stern int status; 1283*0ed8fee1SAlan Stern 1284*0ed8fee1SAlan Stern while (!list_empty(&qh->queue)) { 1285*0ed8fee1SAlan Stern urbp = list_entry(qh->queue.next, struct urb_priv, node); 1286*0ed8fee1SAlan Stern urb = urbp->urb; 1287*0ed8fee1SAlan Stern 1288*0ed8fee1SAlan Stern switch (usb_pipetype(urb->pipe)) { 1289*0ed8fee1SAlan Stern case PIPE_CONTROL: 1290*0ed8fee1SAlan Stern status = uhci_result_control(uhci, urb); 1291*0ed8fee1SAlan Stern break; 1292*0ed8fee1SAlan Stern case PIPE_ISOCHRONOUS: 1293*0ed8fee1SAlan Stern status = uhci_result_isochronous(uhci, urb); 1294*0ed8fee1SAlan Stern break; 1295*0ed8fee1SAlan Stern default: /* PIPE_BULK or PIPE_INTERRUPT */ 1296*0ed8fee1SAlan Stern status = uhci_result_common(uhci, urb); 1297*0ed8fee1SAlan Stern break; 1298*0ed8fee1SAlan Stern } 1299*0ed8fee1SAlan Stern if (status == -EINPROGRESS) 1300*0ed8fee1SAlan Stern break; 1301*0ed8fee1SAlan Stern 1302*0ed8fee1SAlan Stern spin_lock(&urb->lock); 1303*0ed8fee1SAlan Stern if (urb->status == -EINPROGRESS) /* Not dequeued */ 1304*0ed8fee1SAlan Stern urb->status = status; 1305*0ed8fee1SAlan Stern else 1306*0ed8fee1SAlan Stern status = -ECONNRESET; 1307*0ed8fee1SAlan Stern spin_unlock(&urb->lock); 1308*0ed8fee1SAlan Stern 1309*0ed8fee1SAlan Stern /* Dequeued but completed URBs can't be given back unless 1310*0ed8fee1SAlan Stern * the QH is stopped or has finished unlinking. */ 1311*0ed8fee1SAlan Stern if (status == -ECONNRESET && 1312*0ed8fee1SAlan Stern !(qh->is_stopped || QH_FINISHED_UNLINKING(qh))) 1313*0ed8fee1SAlan Stern return; 1314*0ed8fee1SAlan Stern 1315*0ed8fee1SAlan Stern uhci_giveback_urb(uhci, qh, urb, regs); 1316*0ed8fee1SAlan Stern if (qh->is_stopped) 1317*0ed8fee1SAlan Stern break; 1318*0ed8fee1SAlan Stern } 1319*0ed8fee1SAlan Stern 1320*0ed8fee1SAlan Stern /* If the QH is neither stopped nor finished unlinking (normal case), 1321*0ed8fee1SAlan Stern * our work here is done. */ 1322*0ed8fee1SAlan Stern restart: 1323*0ed8fee1SAlan Stern if (!(qh->is_stopped || QH_FINISHED_UNLINKING(qh))) 1324*0ed8fee1SAlan Stern return; 1325*0ed8fee1SAlan Stern 1326*0ed8fee1SAlan Stern /* Otherwise give back each of the dequeued URBs */ 1327*0ed8fee1SAlan Stern list_for_each_entry(urbp, &qh->queue, node) { 1328*0ed8fee1SAlan Stern urb = urbp->urb; 1329*0ed8fee1SAlan Stern if (urb->status != -EINPROGRESS) { 1330*0ed8fee1SAlan Stern uhci_save_toggle(qh, urb); 1331*0ed8fee1SAlan Stern uhci_giveback_urb(uhci, qh, urb, regs); 1332*0ed8fee1SAlan Stern goto restart; 1333*0ed8fee1SAlan Stern } 1334*0ed8fee1SAlan Stern } 1335*0ed8fee1SAlan Stern qh->is_stopped = 0; 1336*0ed8fee1SAlan Stern 1337*0ed8fee1SAlan Stern /* There are no more dequeued URBs. If there are still URBs on the 1338*0ed8fee1SAlan Stern * queue, the QH can now be re-activated. */ 1339*0ed8fee1SAlan Stern if (!list_empty(&qh->queue)) { 1340*0ed8fee1SAlan Stern if (qh->needs_fixup) 1341*0ed8fee1SAlan Stern uhci_fixup_toggles(qh, 0); 1342*0ed8fee1SAlan Stern uhci_activate_qh(uhci, qh); 1343*0ed8fee1SAlan Stern } 1344*0ed8fee1SAlan Stern 1345*0ed8fee1SAlan Stern /* The queue is empty. The QH can become idle if it is fully 1346*0ed8fee1SAlan Stern * unlinked. */ 1347*0ed8fee1SAlan Stern else if (QH_FINISHED_UNLINKING(qh)) 1348*0ed8fee1SAlan Stern uhci_make_qh_idle(uhci, qh); 13491da177e4SLinus Torvalds } 13501da177e4SLinus Torvalds 13511da177e4SLinus Torvalds static void uhci_free_pending_tds(struct uhci_hcd *uhci) 13521da177e4SLinus Torvalds { 13531da177e4SLinus Torvalds struct uhci_td *td, *tmp; 13541da177e4SLinus Torvalds 13551da177e4SLinus Torvalds list_for_each_entry_safe(td, tmp, &uhci->td_remove_list, remove_list) { 13561da177e4SLinus Torvalds list_del_init(&td->remove_list); 13571da177e4SLinus Torvalds 13581da177e4SLinus Torvalds uhci_free_td(uhci, td); 13591da177e4SLinus Torvalds } 13601da177e4SLinus Torvalds } 13611da177e4SLinus Torvalds 1362*0ed8fee1SAlan Stern /* 1363*0ed8fee1SAlan Stern * Process events in the schedule, but only in one thread at a time 1364*0ed8fee1SAlan Stern */ 13651da177e4SLinus Torvalds static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs) 13661da177e4SLinus Torvalds { 1367*0ed8fee1SAlan Stern int i; 1368*0ed8fee1SAlan Stern struct uhci_qh *qh; 13691da177e4SLinus Torvalds 13701da177e4SLinus Torvalds /* Don't allow re-entrant calls */ 13711da177e4SLinus Torvalds if (uhci->scan_in_progress) { 13721da177e4SLinus Torvalds uhci->need_rescan = 1; 13731da177e4SLinus Torvalds return; 13741da177e4SLinus Torvalds } 13751da177e4SLinus Torvalds uhci->scan_in_progress = 1; 13761da177e4SLinus Torvalds rescan: 13771da177e4SLinus Torvalds uhci->need_rescan = 0; 13781da177e4SLinus Torvalds 13796c1b445cSAlan Stern uhci_clear_next_interrupt(uhci); 13801da177e4SLinus Torvalds uhci_get_current_frame_number(uhci); 13811da177e4SLinus Torvalds 13821da177e4SLinus Torvalds if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) 13831da177e4SLinus Torvalds uhci_free_pending_tds(uhci); 13841da177e4SLinus Torvalds 1385*0ed8fee1SAlan Stern /* Go through all the QH queues and process the URBs in each one */ 1386*0ed8fee1SAlan Stern for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) { 1387*0ed8fee1SAlan Stern uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, 1388*0ed8fee1SAlan Stern struct uhci_qh, node); 1389*0ed8fee1SAlan Stern while ((qh = uhci->next_qh) != uhci->skelqh[i]) { 1390*0ed8fee1SAlan Stern uhci->next_qh = list_entry(qh->node.next, 1391*0ed8fee1SAlan Stern struct uhci_qh, node); 1392*0ed8fee1SAlan Stern uhci_scan_qh(uhci, qh, regs); 13931da177e4SLinus Torvalds } 1394*0ed8fee1SAlan Stern } 13951da177e4SLinus Torvalds 13961da177e4SLinus Torvalds if (uhci->need_rescan) 13971da177e4SLinus Torvalds goto rescan; 13981da177e4SLinus Torvalds uhci->scan_in_progress = 0; 13991da177e4SLinus Torvalds 1400*0ed8fee1SAlan Stern /* If the controller is stopped, we can finish these off right now */ 1401*0ed8fee1SAlan Stern if (uhci->is_stopped) 1402*0ed8fee1SAlan Stern uhci_free_pending_tds(uhci); 1403dccf4a48SAlan Stern 1404dccf4a48SAlan Stern if (list_empty(&uhci->td_remove_list) && 1405dccf4a48SAlan Stern list_empty(&uhci->skel_unlink_qh->node)) 14061da177e4SLinus Torvalds uhci_clear_next_interrupt(uhci); 14071da177e4SLinus Torvalds else 14081da177e4SLinus Torvalds uhci_set_next_interrupt(uhci); 14091da177e4SLinus Torvalds } 1410f5946f82SAlan Stern 1411f5946f82SAlan Stern static void check_fsbr(struct uhci_hcd *uhci) 1412f5946f82SAlan Stern { 1413*0ed8fee1SAlan Stern /* For now, don't scan URBs for FSBR timeouts. 1414*0ed8fee1SAlan Stern * Add it back in later... */ 1415f5946f82SAlan Stern 1416f5946f82SAlan Stern /* Really disable FSBR */ 1417f5946f82SAlan Stern if (!uhci->fsbr && uhci->fsbrtimeout && time_after_eq(jiffies, uhci->fsbrtimeout)) { 1418f5946f82SAlan Stern uhci->fsbrtimeout = 0; 1419f5946f82SAlan Stern uhci->skel_term_qh->link = UHCI_PTR_TERM; 1420f5946f82SAlan Stern } 1421f5946f82SAlan Stern } 1422