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