1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/config.h>
30#include <linux/module.h>
31#include <linux/pci.h>
32#include <linux/kernel.h>
33#include <linux/init.h>
34#include <linux/delay.h>
35#include <linux/ioport.h>
36#include <linux/sched.h>
37#include <linux/slab.h>
38#include <linux/smp_lock.h>
39#include <linux/errno.h>
40#include <linux/unistd.h>
41#include <linux/interrupt.h>
42#include <linux/spinlock.h>
43#include <linux/proc_fs.h>
44#ifdef CONFIG_USB_DEBUG
45#define DEBUG
46#else
47#undef DEBUG
48#endif
49#include <linux/usb.h>
50
51#include <asm/uaccess.h>
52#include <asm/io.h>
53#include <asm/irq.h>
54#include <asm/system.h>
55
56#include "uhci.h"
57
58#include <linux/pm.h>
59
60#include "../hcd.h"
61
62
63
64
65#define DRIVER_VERSION "v1.1"
66#define DRIVER_AUTHOR "Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber"
67#define DRIVER_DESC "USB Universal Host Controller Interface driver"
68
69
70
71
72
73
74
75
76#ifdef DEBUG
77static int debug = 1;
78#else
79static int debug = 0;
80#endif
81MODULE_PARM(debug, "i");
82MODULE_PARM_DESC(debug, "Debug level");
83static char *errbuf;
84#define ERRBUF_LEN (PAGE_SIZE * 8)
85
86#include "uhci-debug.h"
87
88static kmem_cache_t *uhci_up_cachep;
89
90static int rh_submit_urb(struct urb *urb);
91static int rh_unlink_urb(struct urb *urb);
92static int uhci_get_current_frame_number(struct usb_device *dev);
93static int uhci_unlink_urb(struct urb *urb);
94static void uhci_unlink_generic(struct uhci *uhci, struct urb *urb);
95static void uhci_call_completion(struct urb *urb);
96
97static int ports_active(struct uhci *uhci);
98static void suspend_hc(struct uhci *uhci);
99static void wakeup_hc(struct uhci *uhci);
100
101
102#define IDLE_TIMEOUT (HZ / 20)
103#define FSBR_DELAY (HZ / 20)
104
105
106
107
108#define DEPTH_INTERVAL 5
109
110#define MAX_URB_LOOP 2048
111
112
113
114
115static int uhci_alloc_dev(struct usb_device *dev)
116{
117 return 0;
118}
119
120static int uhci_free_dev(struct usb_device *dev)
121{
122 return 0;
123}
124
125
126
127
128
129
130
131
132
133static inline void uhci_set_next_interrupt(struct uhci *uhci)
134{
135 unsigned long flags;
136
137 spin_lock_irqsave(&uhci->frame_list_lock, flags);
138 uhci->skel_term_td->status |= TD_CTRL_IOC;
139 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
140}
141
142static inline void uhci_clear_next_interrupt(struct uhci *uhci)
143{
144 unsigned long flags;
145
146 spin_lock_irqsave(&uhci->frame_list_lock, flags);
147 uhci->skel_term_td->status &= ~TD_CTRL_IOC;
148 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
149}
150
151static inline void uhci_add_complete(struct urb *urb)
152{
153 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
154 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
155 unsigned long flags;
156
157 spin_lock_irqsave(&uhci->complete_list_lock, flags);
158 list_add_tail(&urbp->complete_list, &uhci->complete_list);
159 spin_unlock_irqrestore(&uhci->complete_list_lock, flags);
160}
161
162static struct uhci_td *uhci_alloc_td(struct uhci *uhci, struct usb_device *dev)
163{
164 dma_addr_t dma_handle;
165 struct uhci_td *td;
166
167 td = pci_pool_alloc(uhci->td_pool, GFP_DMA | GFP_ATOMIC, &dma_handle);
168 if (!td)
169 return NULL;
170
171 td->dma_handle = dma_handle;
172
173 td->link = UHCI_PTR_TERM;
174 td->buffer = 0;
175
176 td->frame = -1;
177 td->dev = dev;
178
179 INIT_LIST_HEAD(&td->list);
180 INIT_LIST_HEAD(&td->fl_list);
181
182 usb_inc_dev_use(dev);
183
184 return td;
185}
186
187static void inline uhci_fill_td(struct uhci_td *td, __u32 status,
188 __u32 info, __u32 buffer)
189{
190 td->status = status;
191 td->info = info;
192 td->buffer = buffer;
193}
194
195static void uhci_insert_td(struct uhci *uhci, struct uhci_td *skeltd, struct uhci_td *td)
196{
197 unsigned long flags;
198 struct uhci_td *ltd;
199
200 spin_lock_irqsave(&uhci->frame_list_lock, flags);
201
202 ltd = list_entry(skeltd->fl_list.prev, struct uhci_td, fl_list);
203
204 td->link = ltd->link;
205 mb();
206 ltd->link = td->dma_handle;
207
208 list_add_tail(&td->fl_list, &skeltd->fl_list);
209
210 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
211}
212
213
214
215
216
217
218
219
220static void uhci_insert_td_frame_list(struct uhci *uhci, struct uhci_td *td, unsigned framenum)
221{
222 unsigned long flags;
223
224 framenum %= UHCI_NUMFRAMES;
225
226 spin_lock_irqsave(&uhci->frame_list_lock, flags);
227
228 td->frame = framenum;
229
230
231 if (uhci->fl->frame_cpu[framenum]) {
232 struct uhci_td *ftd, *ltd;
233
234 ftd = uhci->fl->frame_cpu[framenum];
235 ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list);
236
237 list_add_tail(&td->fl_list, &ftd->fl_list);
238
239 td->link = ltd->link;
240 mb();
241 ltd->link = td->dma_handle;
242 } else {
243 td->link = uhci->fl->frame[framenum];
244 mb();
245 uhci->fl->frame[framenum] = td->dma_handle;
246 uhci->fl->frame_cpu[framenum] = td;
247 }
248
249 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
250}
251
252static void uhci_remove_td(struct uhci *uhci, struct uhci_td *td)
253{
254 unsigned long flags;
255
256
257 spin_lock_irqsave(&uhci->frame_list_lock, flags);
258 if (td->frame == -1 && list_empty(&td->fl_list))
259 goto out;
260
261 if (td->frame != -1 && uhci->fl->frame_cpu[td->frame] == td) {
262 if (list_empty(&td->fl_list)) {
263 uhci->fl->frame[td->frame] = td->link;
264 uhci->fl->frame_cpu[td->frame] = NULL;
265 } else {
266 struct uhci_td *ntd;
267
268 ntd = list_entry(td->fl_list.next, struct uhci_td, fl_list);
269 uhci->fl->frame[td->frame] = ntd->dma_handle;
270 uhci->fl->frame_cpu[td->frame] = ntd;
271 }
272 } else {
273 struct uhci_td *ptd;
274
275 ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list);
276 ptd->link = td->link;
277 }
278
279 mb();
280 td->link = UHCI_PTR_TERM;
281
282 list_del_init(&td->fl_list);
283 td->frame = -1;
284
285out:
286 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
287}
288
289
290
291
292static void uhci_insert_tds_in_qh(struct uhci_qh *qh, struct urb *urb, int breadth)
293{
294 struct list_head *tmp, *head;
295 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
296 struct uhci_td *td, *ptd;
297
298 if (list_empty(&urbp->td_list))
299 return;
300
301 head = &urbp->td_list;
302 tmp = head->next;
303
304
305
306 td = list_entry(tmp, struct uhci_td, list);
307
308
309 qh->element = td->dma_handle | (breadth ? 0 : UHCI_PTR_DEPTH);
310
311 ptd = td;
312
313
314 tmp = tmp->next;
315 while (tmp != head) {
316 td = list_entry(tmp, struct uhci_td, list);
317
318 tmp = tmp->next;
319
320 ptd->link = td->dma_handle | (breadth ? 0 : UHCI_PTR_DEPTH);
321
322 ptd = td;
323 }
324
325 ptd->link = UHCI_PTR_TERM;
326}
327
328static void uhci_free_td(struct uhci *uhci, struct uhci_td *td)
329{
330 if (!list_empty(&td->list) || !list_empty(&td->fl_list))
331 dbg("td is still in URB list!");
332
333 if (td->dev)
334 usb_dec_dev_use(td->dev);
335
336 pci_pool_free(uhci->td_pool, td, td->dma_handle);
337}
338
339static struct uhci_qh *uhci_alloc_qh(struct uhci *uhci, struct usb_device *dev)
340{
341 dma_addr_t dma_handle;
342 struct uhci_qh *qh;
343
344 qh = pci_pool_alloc(uhci->qh_pool, GFP_DMA | GFP_ATOMIC, &dma_handle);
345 if (!qh)
346 return NULL;
347
348 qh->dma_handle = dma_handle;
349
350 qh->element = UHCI_PTR_TERM;
351 qh->link = UHCI_PTR_TERM;
352
353 qh->dev = dev;
354 qh->urbp = NULL;
355
356 INIT_LIST_HEAD(&qh->list);
357 INIT_LIST_HEAD(&qh->remove_list);
358
359 usb_inc_dev_use(dev);
360
361 return qh;
362}
363
364static void uhci_free_qh(struct uhci *uhci, struct uhci_qh *qh)
365{
366 if (!list_empty(&qh->list))
367 dbg("qh list not empty!");
368 if (!list_empty(&qh->remove_list))
369 dbg("qh still in remove_list!");
370
371 if (qh->dev)
372 usb_dec_dev_use(qh->dev);
373
374 pci_pool_free(uhci->qh_pool, qh, qh->dma_handle);
375}
376
377
378
379
380static void _uhci_insert_qh(struct uhci *uhci, struct uhci_qh *skelqh, struct urb *urb)
381{
382 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
383 struct list_head *head, *tmp;
384 struct uhci_qh *lqh;
385
386
387 lqh = list_entry(skelqh->list.prev, struct uhci_qh, list);
388
389 if (lqh->urbp) {
390 head = &lqh->urbp->queue_list;
391 tmp = head->next;
392 while (head != tmp) {
393 struct urb_priv *turbp =
394 list_entry(tmp, struct urb_priv, queue_list);
395
396 tmp = tmp->next;
397
398 turbp->qh->link = urbp->qh->dma_handle | UHCI_PTR_QH;
399 }
400 }
401
402 head = &urbp->queue_list;
403 tmp = head->next;
404 while (head != tmp) {
405 struct urb_priv *turbp =
406 list_entry(tmp, struct urb_priv, queue_list);
407
408 tmp = tmp->next;
409
410 turbp->qh->link = lqh->link;
411 }
412
413 urbp->qh->link = lqh->link;
414 mb();
415 lqh->link = urbp->qh->dma_handle | UHCI_PTR_QH;
416
417 list_add_tail(&urbp->qh->list, &skelqh->list);
418}
419
420static void uhci_insert_qh(struct uhci *uhci, struct uhci_qh *skelqh, struct urb *urb)
421{
422 unsigned long flags;
423
424 spin_lock_irqsave(&uhci->frame_list_lock, flags);
425 _uhci_insert_qh(uhci, skelqh, urb);
426 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
427}
428
429static void uhci_remove_qh(struct uhci *uhci, struct uhci_qh *qh)
430{
431 unsigned long flags;
432 struct uhci_qh *pqh;
433
434 if (!qh)
435 return;
436
437 qh->urbp = NULL;
438
439
440 spin_lock_irqsave(&uhci->frame_list_lock, flags);
441 if (!list_empty(&qh->list)) {
442 pqh = list_entry(qh->list.prev, struct uhci_qh, list);
443
444 if (pqh->urbp) {
445 struct list_head *head, *tmp;
446
447 head = &pqh->urbp->queue_list;
448 tmp = head->next;
449 while (head != tmp) {
450 struct urb_priv *turbp =
451 list_entry(tmp, struct urb_priv, queue_list);
452
453 tmp = tmp->next;
454
455 turbp->qh->link = qh->link;
456 }
457 }
458
459 pqh->link = qh->link;
460 mb();
461 qh->element = qh->link = UHCI_PTR_TERM;
462
463 list_del_init(&qh->list);
464 }
465 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
466
467 spin_lock_irqsave(&uhci->qh_remove_list_lock, flags);
468
469
470
471 if (list_empty(&uhci->qh_remove_list))
472 uhci_set_next_interrupt(uhci);
473
474 list_add(&qh->remove_list, &uhci->qh_remove_list);
475
476 spin_unlock_irqrestore(&uhci->qh_remove_list_lock, flags);
477}
478
479static int uhci_fixup_toggle(struct urb *urb, unsigned int toggle)
480{
481 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
482 struct list_head *head, *tmp;
483
484 head = &urbp->td_list;
485 tmp = head->next;
486 while (head != tmp) {
487 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
488
489 tmp = tmp->next;
490
491 if (toggle)
492 td->info |= TD_TOKEN_TOGGLE;
493 else
494 td->info &= ~TD_TOKEN_TOGGLE;
495
496 toggle ^= 1;
497 }
498
499 return toggle;
500}
501
502
503
504
505static void uhci_append_queued_urb(struct uhci *uhci, struct urb *eurb, struct urb *urb)
506{
507 struct urb_priv *eurbp, *urbp, *furbp, *lurbp;
508 struct list_head *tmp;
509 struct uhci_td *lltd;
510 unsigned long flags;
511
512 eurbp = eurb->hcpriv;
513 urbp = urb->hcpriv;
514
515 spin_lock_irqsave(&uhci->frame_list_lock, flags);
516
517
518 if (eurbp->queued) {
519 struct list_head *head = &eurbp->queue_list;
520
521 tmp = head->next;
522 while (tmp != head) {
523 struct urb_priv *turbp =
524 list_entry(tmp, struct urb_priv, queue_list);
525
526 if (!turbp->queued)
527 break;
528
529 tmp = tmp->next;
530 }
531 } else
532 tmp = &eurbp->queue_list;
533
534 furbp = list_entry(tmp, struct urb_priv, queue_list);
535 lurbp = list_entry(furbp->queue_list.prev, struct urb_priv, queue_list);
536
537 lltd = list_entry(lurbp->td_list.prev, struct uhci_td, list);
538
539 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe),
540 uhci_fixup_toggle(urb, uhci_toggle(lltd->info) ^ 1));
541
542
543 urbp->qh->link = eurbp->qh->link;
544
545 mb();
546
547 lltd->link = urbp->qh->dma_handle | UHCI_PTR_QH;
548
549 list_add_tail(&urbp->queue_list, &furbp->queue_list);
550
551 urbp->queued = 1;
552
553 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
554}
555
556static void uhci_delete_queued_urb(struct uhci *uhci, struct urb *urb)
557{
558 struct urb_priv *urbp, *nurbp;
559 struct list_head *head, *tmp;
560 struct urb_priv *purbp;
561 struct uhci_td *pltd;
562 unsigned int toggle;
563 unsigned long flags;
564
565 urbp = urb->hcpriv;
566
567 spin_lock_irqsave(&uhci->frame_list_lock, flags);
568
569 if (list_empty(&urbp->queue_list))
570 goto out;
571
572 nurbp = list_entry(urbp->queue_list.next, struct urb_priv, queue_list);
573
574
575 if (!urbp->queued)
576
577 toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe));
578 else {
579
580
581 purbp = list_entry(urbp->queue_list.prev, struct urb_priv,
582 queue_list);
583
584 pltd = list_entry(purbp->td_list.prev, struct uhci_td, list);
585
586 toggle = uhci_toggle(pltd->info) ^ 1;
587 }
588
589 head = &urbp->queue_list;
590 tmp = head->next;
591 while (head != tmp) {
592 struct urb_priv *turbp;
593
594 turbp = list_entry(tmp, struct urb_priv, queue_list);
595
596 tmp = tmp->next;
597
598 if (!turbp->queued)
599 break;
600
601 toggle = uhci_fixup_toggle(turbp->urb, toggle);
602 }
603
604 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
605 usb_pipeout(urb->pipe), toggle);
606
607 if (!urbp->queued) {
608 nurbp->queued = 0;
609
610 _uhci_insert_qh(uhci, uhci->skel_bulk_qh, nurbp->urb);
611 } else {
612
613
614 purbp = list_entry(urbp->queue_list.prev, struct urb_priv,
615 queue_list);
616
617 pltd = list_entry(purbp->td_list.prev, struct uhci_td, list);
618 if (nurbp->queued)
619 pltd->link = nurbp->qh->dma_handle | UHCI_PTR_QH;
620 else
621
622
623 pltd->link = UHCI_PTR_TERM;
624 }
625
626 list_del_init(&urbp->queue_list);
627
628out:
629 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
630}
631
632static struct urb_priv *uhci_alloc_urb_priv(struct uhci *uhci, struct urb *urb)
633{
634 struct urb_priv *urbp;
635
636 urbp = kmem_cache_alloc(uhci_up_cachep, SLAB_ATOMIC);
637 if (!urbp) {
638 err("uhci_alloc_urb_priv: couldn't allocate memory for urb_priv\n");
639 return NULL;
640 }
641
642 memset((void *)urbp, 0, sizeof(*urbp));
643
644 urbp->inserttime = jiffies;
645 urbp->fsbrtime = jiffies;
646 urbp->urb = urb;
647 urbp->dev = urb->dev;
648
649 INIT_LIST_HEAD(&urbp->td_list);
650 INIT_LIST_HEAD(&urbp->queue_list);
651 INIT_LIST_HEAD(&urbp->complete_list);
652
653 urb->hcpriv = urbp;
654
655 if (urb->dev != uhci->rh.dev) {
656 if (urb->transfer_buffer_length) {
657 urbp->transfer_buffer_dma_handle = pci_map_single(uhci->dev,
658 urb->transfer_buffer, urb->transfer_buffer_length,
659 usb_pipein(urb->pipe) ? PCI_DMA_FROMDEVICE :
660 PCI_DMA_TODEVICE);
661 if (!urbp->transfer_buffer_dma_handle)
662 return NULL;
663 }
664
665 if (usb_pipetype(urb->pipe) == PIPE_CONTROL && urb->setup_packet) {
666 urbp->setup_packet_dma_handle = pci_map_single(uhci->dev,
667 urb->setup_packet, sizeof(struct usb_ctrlrequest),
668 PCI_DMA_TODEVICE);
669 if (!urbp->setup_packet_dma_handle)
670 return NULL;
671 }
672 }
673
674 return urbp;
675}
676
677
678
679
680static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td)
681{
682 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
683
684 td->urb = urb;
685
686 list_add_tail(&td->list, &urbp->td_list);
687}
688
689
690
691
692static void uhci_remove_td_from_urb(struct uhci_td *td)
693{
694 if (list_empty(&td->list))
695 return;
696
697 list_del_init(&td->list);
698
699 td->urb = NULL;
700}
701
702
703
704
705static void uhci_destroy_urb_priv(struct urb *urb)
706{
707 struct list_head *head, *tmp;
708 struct urb_priv *urbp;
709 struct uhci *uhci;
710
711 urbp = (struct urb_priv *)urb->hcpriv;
712 if (!urbp)
713 return;
714
715 if (!urbp->dev || !urbp->dev->bus || !urbp->dev->bus->hcpriv) {
716 warn("uhci_destroy_urb_priv: urb %p belongs to disconnected device or bus?", urb);
717 return;
718 }
719
720 if (!list_empty(&urb->urb_list))
721 warn("uhci_destroy_urb_priv: urb %p still on uhci->urb_list or uhci->remove_list", urb);
722
723 if (!list_empty(&urbp->complete_list))
724 warn("uhci_destroy_urb_priv: urb %p still on uhci->complete_list", urb);
725
726 uhci = urbp->dev->bus->hcpriv;
727
728 head = &urbp->td_list;
729 tmp = head->next;
730 while (tmp != head) {
731 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
732
733 tmp = tmp->next;
734
735 uhci_remove_td_from_urb(td);
736 uhci_remove_td(uhci, td);
737 uhci_free_td(uhci, td);
738 }
739
740 if (urbp->setup_packet_dma_handle) {
741 pci_unmap_single(uhci->dev, urbp->setup_packet_dma_handle,
742 sizeof(struct usb_ctrlrequest), PCI_DMA_TODEVICE);
743 urbp->setup_packet_dma_handle = 0;
744 }
745
746 if (urbp->transfer_buffer_dma_handle) {
747 pci_unmap_single(uhci->dev, urbp->transfer_buffer_dma_handle,
748 urb->transfer_buffer_length, usb_pipein(urb->pipe) ?
749 PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
750 urbp->transfer_buffer_dma_handle = 0;
751 }
752
753 urb->hcpriv = NULL;
754 kmem_cache_free(uhci_up_cachep, urbp);
755}
756
757static void uhci_inc_fsbr(struct uhci *uhci, struct urb *urb)
758{
759 unsigned long flags;
760 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
761
762 spin_lock_irqsave(&uhci->frame_list_lock, flags);
763
764 if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) {
765 urbp->fsbr = 1;
766 if (!uhci->fsbr++ && !uhci->fsbrtimeout)
767 uhci->skel_term_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH;
768 }
769
770 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
771}
772
773static void uhci_dec_fsbr(struct uhci *uhci, struct urb *urb)
774{
775 unsigned long flags;
776 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
777
778 spin_lock_irqsave(&uhci->frame_list_lock, flags);
779
780 if ((!(urb->transfer_flags & USB_NO_FSBR)) && urbp->fsbr) {
781 urbp->fsbr = 0;
782 if (!--uhci->fsbr)
783 uhci->fsbrtimeout = jiffies + FSBR_DELAY;
784 }
785
786 spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
787}
788
789
790
791
792
793
794
795static int uhci_map_status(int status, int dir_out)
796{
797 if (!status)
798 return 0;
799 if (status & TD_CTRL_BITSTUFF)
800 return -EPROTO;
801 if (status & TD_CTRL_CRCTIMEO) {
802 if (dir_out)
803 return -ETIMEDOUT;
804 else
805 return -EILSEQ;
806 }
807 if (status & TD_CTRL_NAK)
808 return -ETIMEDOUT;
809 if (status & TD_CTRL_BABBLE)
810 return -EOVERFLOW;
811 if (status & TD_CTRL_DBUFERR)
812 return -ENOSR;
813 if (status & TD_CTRL_STALLED)
814 return -EPIPE;
815 if (status & TD_CTRL_ACTIVE)
816 return 0;
817
818 return -EINVAL;
819}
820
821
822
823
824static int uhci_submit_control(struct urb *urb)
825{
826 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
827 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
828 struct uhci_td *td;
829 struct uhci_qh *qh;
830 unsigned long destination, status;
831 int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));
832 int len = urb->transfer_buffer_length;
833 dma_addr_t data = urbp->transfer_buffer_dma_handle;
834
835
836 destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP;
837
838
839 status = (urb->pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE | (3 << 27);
840
841
842
843
844 td = uhci_alloc_td(uhci, urb->dev);
845 if (!td)
846 return -ENOMEM;
847
848 uhci_add_td_to_urb(urb, td);
849 uhci_fill_td(td, status, destination | (7 << 21),
850 urbp->setup_packet_dma_handle);
851
852
853
854
855
856 destination ^= (USB_PID_SETUP ^ usb_packetid(urb->pipe));
857
858 if (!(urb->transfer_flags & USB_DISABLE_SPD))
859 status |= TD_CTRL_SPD;
860
861
862
863
864 while (len > 0) {
865 int pktsze = len;
866
867 if (pktsze > maxsze)
868 pktsze = maxsze;
869
870 td = uhci_alloc_td(uhci, urb->dev);
871 if (!td)
872 return -ENOMEM;
873
874
875 destination ^= TD_TOKEN_TOGGLE;
876
877 uhci_add_td_to_urb(urb, td);
878 uhci_fill_td(td, status, destination | ((pktsze - 1) << 21),
879 data);
880
881 data += pktsze;
882 len -= pktsze;
883 }
884
885
886
887
888 td = uhci_alloc_td(uhci, urb->dev);
889 if (!td)
890 return -ENOMEM;
891
892
893
894
895
896 destination &= ~TD_TOKEN_PID_MASK;
897 if (usb_pipeout(urb->pipe) || !urb->transfer_buffer_length)
898 destination |= USB_PID_IN;
899 else
900 destination |= USB_PID_OUT;
901
902 destination |= TD_TOKEN_TOGGLE;
903
904 status &= ~TD_CTRL_SPD;
905
906 uhci_add_td_to_urb(urb, td);
907 uhci_fill_td(td, status | TD_CTRL_IOC,
908 destination | (UHCI_NULL_DATA_SIZE << 21), 0);
909
910 qh = uhci_alloc_qh(uhci, urb->dev);
911 if (!qh)
912 return -ENOMEM;
913
914 urbp->qh = qh;
915 qh->urbp = urbp;
916
917
918 if (urb->pipe & TD_CTRL_LS) {
919 uhci_insert_tds_in_qh(qh, urb, 0);
920 uhci_insert_qh(uhci, uhci->skel_ls_control_qh, urb);
921 } else {
922 uhci_insert_tds_in_qh(qh, urb, 1);
923 uhci_insert_qh(uhci, uhci->skel_hs_control_qh, urb);
924 uhci_inc_fsbr(uhci, urb);
925 }
926
927 return -EINPROGRESS;
928}
929
930static int usb_control_retrigger_status(struct urb *urb);
931
932static int uhci_result_control(struct urb *urb)
933{
934 struct list_head *tmp, *head;
935 struct urb_priv *urbp = urb->hcpriv;
936 struct uhci_td *td;
937 unsigned int status;
938 int ret = 0;
939
940 if (list_empty(&urbp->td_list))
941 return -EINVAL;
942
943 head = &urbp->td_list;
944
945 if (urbp->short_control_packet) {
946 tmp = head->prev;
947 goto status_phase;
948 }
949
950 tmp = head->next;
951 td = list_entry(tmp, struct uhci_td, list);
952
953
954
955 status = uhci_status_bits(td->status);
956 if (status & TD_CTRL_ACTIVE)
957 return -EINPROGRESS;
958
959 if (status)
960 goto td_error;
961
962 urb->actual_length = 0;
963
964
965 tmp = tmp->next;
966 while (tmp != head && tmp->next != head) {
967 td = list_entry(tmp, struct uhci_td, list);
968
969 tmp = tmp->next;
970
971 status = uhci_status_bits(td->status);
972 if (status & TD_CTRL_ACTIVE)
973 return -EINPROGRESS;
974
975 urb->actual_length += uhci_actual_length(td->status);
976
977 if (status)
978 goto td_error;
979
980
981 if (uhci_actual_length(td->status) < uhci_expected_length(td->info)) {
982 if (urb->transfer_flags & USB_DISABLE_SPD) {
983 ret = -EREMOTEIO;
984 goto err;
985 }
986
987 if (uhci_packetid(td->info) == USB_PID_IN)
988 return usb_control_retrigger_status(urb);
989 else
990 return 0;
991 }
992 }
993
994status_phase:
995 td = list_entry(tmp, struct uhci_td, list);
996
997
998 status = uhci_status_bits(td->status);
999
1000#ifdef I_HAVE_BUGGY_APC_BACKUPS
1001
1002
1003
1004 if (td->status & TD_CTRL_IOC &&
1005 status & TD_CTRL_ACTIVE &&
1006 status & TD_CTRL_NAK)
1007 return 0;
1008#endif
1009
1010 if (status & TD_CTRL_ACTIVE)
1011 return -EINPROGRESS;
1012
1013 if (status)
1014 goto td_error;
1015
1016 return 0;
1017
1018td_error:
1019 ret = uhci_map_status(status, uhci_packetout(td->info));
1020 if (ret == -EPIPE)
1021
1022 usb_endpoint_halt(urb->dev, uhci_endpoint(td->info),
1023 uhci_packetout(td->info));
1024
1025err:
1026 if ((debug == 1 && ret != -EPIPE) || debug > 1) {
1027
1028 dbg("uhci_result_control() failed with status %x", status);
1029
1030 if (errbuf) {
1031
1032 uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0);
1033
1034 lprintk(errbuf);
1035 }
1036 }
1037
1038 return ret;
1039}
1040
1041static int usb_control_retrigger_status(struct urb *urb)
1042{
1043 struct list_head *tmp, *head;
1044 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1045 struct uhci *uhci = urb->dev->bus->hcpriv;
1046
1047 urbp->short_control_packet = 1;
1048
1049
1050 uhci_remove_qh(uhci, urbp->qh);
1051
1052
1053 head = &urbp->td_list;
1054 tmp = head->next;
1055 while (tmp != head && tmp->next != head) {
1056 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
1057
1058 tmp = tmp->next;
1059
1060 uhci_remove_td_from_urb(td);
1061 uhci_remove_td(uhci, td);
1062 uhci_free_td(uhci, td);
1063 }
1064
1065 urbp->qh = uhci_alloc_qh(uhci, urb->dev);
1066 if (!urbp->qh) {
1067 err("unable to allocate new QH for control retrigger");
1068 return -ENOMEM;
1069 }
1070
1071 urbp->qh->urbp = urbp;
1072
1073
1074 uhci_insert_tds_in_qh(urbp->qh, urb, 0);
1075
1076
1077 if (urb->pipe & TD_CTRL_LS)
1078 uhci_insert_qh(uhci, uhci->skel_ls_control_qh, urb);
1079 else
1080 uhci_insert_qh(uhci, uhci->skel_hs_control_qh, urb);
1081
1082 return -EINPROGRESS;
1083}
1084
1085
1086
1087
1088static int uhci_submit_interrupt(struct urb *urb)
1089{
1090 struct uhci_td *td;
1091 unsigned long destination, status;
1092 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1093 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1094
1095 if (urb->transfer_buffer_length > usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)))
1096 return -EINVAL;
1097
1098
1099 destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
1100
1101 status = (urb->pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE | TD_CTRL_IOC;
1102
1103 td = uhci_alloc_td(uhci, urb->dev);
1104 if (!td)
1105 return -ENOMEM;
1106
1107 destination |= (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT);
1108 destination |= ((urb->transfer_buffer_length - 1) << 21);
1109
1110 usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe));
1111
1112 uhci_add_td_to_urb(urb, td);
1113 uhci_fill_td(td, status, destination, urbp->transfer_buffer_dma_handle);
1114
1115 uhci_insert_td(uhci, uhci->skeltd[__interval_to_skel(urb->interval)], td);
1116
1117 return -EINPROGRESS;
1118}
1119
1120static int uhci_result_interrupt(struct urb *urb)
1121{
1122 struct list_head *tmp, *head;
1123 struct urb_priv *urbp = urb->hcpriv;
1124 struct uhci_td *td;
1125 unsigned int status;
1126 int ret = 0;
1127
1128 urb->actual_length = 0;
1129
1130 head = &urbp->td_list;
1131 tmp = head->next;
1132 while (tmp != head) {
1133 td = list_entry(tmp, struct uhci_td, list);
1134
1135 tmp = tmp->next;
1136
1137 status = uhci_status_bits(td->status);
1138 if (status & TD_CTRL_ACTIVE)
1139 return -EINPROGRESS;
1140
1141 urb->actual_length += uhci_actual_length(td->status);
1142
1143 if (status)
1144 goto td_error;
1145
1146 if (uhci_actual_length(td->status) < uhci_expected_length(td->info)) {
1147 if (urb->transfer_flags & USB_DISABLE_SPD) {
1148 ret = -EREMOTEIO;
1149 goto err;
1150 } else
1151 return 0;
1152 }
1153 }
1154
1155 return 0;
1156
1157td_error:
1158 ret = uhci_map_status(status, uhci_packetout(td->info));
1159 if (ret == -EPIPE)
1160
1161 usb_endpoint_halt(urb->dev, uhci_endpoint(td->info),
1162 uhci_packetout(td->info));
1163
1164err:
1165 if ((debug == 1 && ret != -EPIPE) || debug > 1) {
1166
1167 dbg("uhci_result_interrupt/bulk() failed with status %x",
1168 status);
1169
1170 if (errbuf) {
1171
1172 if (urbp->qh)
1173 uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0);
1174 else
1175 uhci_show_td(td, errbuf, ERRBUF_LEN, 0);
1176
1177 lprintk(errbuf);
1178 }
1179 }
1180
1181 return ret;
1182}
1183
1184static void uhci_reset_interrupt(struct urb *urb)
1185{
1186 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1187 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1188 struct uhci_td *td;
1189 unsigned long flags;
1190
1191 spin_lock_irqsave(&urb->lock, flags);
1192
1193
1194 if (urb->dev == uhci->rh.dev)
1195 goto out;
1196
1197 td = list_entry(urbp->td_list.next, struct uhci_td, list);
1198
1199 td->status = (td->status & 0x2F000000) | TD_CTRL_ACTIVE | TD_CTRL_IOC;
1200 td->info &= ~TD_TOKEN_TOGGLE;
1201 td->info |= (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT);
1202 usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe));
1203
1204out:
1205 urb->status = -EINPROGRESS;
1206
1207 spin_unlock_irqrestore(&urb->lock, flags);
1208}
1209
1210
1211
1212
1213static int uhci_submit_bulk(struct urb *urb, struct urb *eurb)
1214{
1215 struct uhci_td *td;
1216 struct uhci_qh *qh;
1217 unsigned long destination, status;
1218 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1219 int maxsze = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));
1220 int len = urb->transfer_buffer_length;
1221 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1222 dma_addr_t data = urbp->transfer_buffer_dma_handle;
1223
1224 if (len < 0 || maxsze <= 0)
1225 return -EINVAL;
1226
1227
1228 if (urb->pipe & TD_CTRL_LS)
1229 return -EINVAL;
1230
1231
1232 destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
1233
1234
1235 status = TD_CTRL_ACTIVE | (3 << TD_CTRL_C_ERR_SHIFT);
1236
1237 if (!(urb->transfer_flags & USB_DISABLE_SPD))
1238 status |= TD_CTRL_SPD;
1239
1240
1241
1242
1243 do {
1244 int pktsze = len;
1245
1246 if (pktsze > maxsze)
1247 pktsze = maxsze;
1248
1249 td = uhci_alloc_td(uhci, urb->dev);
1250 if (!td)
1251 return -ENOMEM;
1252
1253 uhci_add_td_to_urb(urb, td);
1254 uhci_fill_td(td, status, destination |
1255 (((pktsze - 1) & UHCI_NULL_DATA_SIZE) << 21) |
1256 (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1257 usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
1258 data);
1259
1260 data += pktsze;
1261 len -= maxsze;
1262
1263 usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1264 usb_pipeout(urb->pipe));
1265 } while (len > 0);
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275 if (usb_pipeout(urb->pipe) && (urb->transfer_flags & USB_ZERO_PACKET) &&
1276 !len && urb->transfer_buffer_length) {
1277 td = uhci_alloc_td(uhci, urb->dev);
1278 if (!td)
1279 return -ENOMEM;
1280
1281 uhci_add_td_to_urb(urb, td);
1282 uhci_fill_td(td, status, destination |
1283 (UHCI_NULL_DATA_SIZE << 21) |
1284 (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1285 usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
1286 data);
1287
1288 usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1289 usb_pipeout(urb->pipe));
1290 }
1291
1292
1293 td->status |= TD_CTRL_IOC;
1294
1295 qh = uhci_alloc_qh(uhci, urb->dev);
1296 if (!qh)
1297 return -ENOMEM;
1298
1299 urbp->qh = qh;
1300 qh->urbp = urbp;
1301
1302
1303 uhci_insert_tds_in_qh(qh, urb, 1);
1304
1305 if (urb->transfer_flags & USB_QUEUE_BULK && eurb)
1306 uhci_append_queued_urb(uhci, eurb, urb);
1307 else
1308 uhci_insert_qh(uhci, uhci->skel_bulk_qh, urb);
1309
1310 uhci_inc_fsbr(uhci, urb);
1311
1312 return -EINPROGRESS;
1313}
1314
1315
1316#define uhci_result_bulk uhci_result_interrupt
1317
1318
1319
1320
1321static int isochronous_find_limits(struct urb *urb, unsigned int *start, unsigned int *end)
1322{
1323 struct urb *last_urb = NULL;
1324 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1325 struct list_head *tmp, *head;
1326 int ret = 0;
1327
1328 head = &uhci->urb_list;
1329 tmp = head->next;
1330 while (tmp != head) {
1331 struct urb *u = list_entry(tmp, struct urb, urb_list);
1332
1333 tmp = tmp->next;
1334
1335
1336 if ((urb->pipe == u->pipe) && (urb->dev == u->dev) &&
1337 (u->status == -EINPROGRESS) && (u != urb)) {
1338 if (!last_urb)
1339 *start = u->start_frame;
1340 last_urb = u;
1341 }
1342 }
1343
1344 if (last_urb) {
1345 *end = (last_urb->start_frame + last_urb->number_of_packets) & 1023;
1346 ret = 0;
1347 } else
1348 ret = -1;
1349
1350 return ret;
1351}
1352
1353static int isochronous_find_start(struct urb *urb)
1354{
1355 int limits;
1356 unsigned int start = 0, end = 0;
1357
1358 if (urb->number_of_packets > 900)
1359 return -EFBIG;
1360
1361 limits = isochronous_find_limits(urb, &start, &end);
1362
1363 if (urb->transfer_flags & USB_ISO_ASAP) {
1364 if (limits) {
1365 int curframe;
1366
1367 curframe = uhci_get_current_frame_number(urb->dev) % UHCI_NUMFRAMES;
1368 urb->start_frame = (curframe + 10) % UHCI_NUMFRAMES;
1369 } else
1370 urb->start_frame = end;
1371 } else {
1372 urb->start_frame %= UHCI_NUMFRAMES;
1373
1374 }
1375
1376 return 0;
1377}
1378
1379
1380
1381
1382static int uhci_submit_isochronous(struct urb *urb)
1383{
1384 struct uhci_td *td;
1385 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1386 int i, ret, framenum;
1387 int status, destination;
1388 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1389
1390 status = TD_CTRL_ACTIVE | TD_CTRL_IOS;
1391 destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
1392
1393 ret = isochronous_find_start(urb);
1394 if (ret)
1395 return ret;
1396
1397 framenum = urb->start_frame;
1398 for (i = 0; i < urb->number_of_packets; i++, framenum++) {
1399 if (!urb->iso_frame_desc[i].length)
1400 continue;
1401
1402 td = uhci_alloc_td(uhci, urb->dev);
1403 if (!td)
1404 return -ENOMEM;
1405
1406 uhci_add_td_to_urb(urb, td);
1407 uhci_fill_td(td, status, destination | ((urb->iso_frame_desc[i].length - 1) << 21),
1408 urbp->transfer_buffer_dma_handle + urb->iso_frame_desc[i].offset);
1409
1410 if (i + 1 >= urb->number_of_packets)
1411 td->status |= TD_CTRL_IOC;
1412
1413 uhci_insert_td_frame_list(uhci, td, framenum);
1414 }
1415
1416 return -EINPROGRESS;
1417}
1418
1419static int uhci_result_isochronous(struct urb *urb)
1420{
1421 struct list_head *tmp, *head;
1422 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1423 int status;
1424 int i, ret = 0;
1425
1426 urb->actual_length = 0;
1427
1428 i = 0;
1429 head = &urbp->td_list;
1430 tmp = head->next;
1431 while (tmp != head) {
1432 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
1433 int actlength;
1434
1435 tmp = tmp->next;
1436
1437 if (td->status & TD_CTRL_ACTIVE)
1438 return -EINPROGRESS;
1439
1440 actlength = uhci_actual_length(td->status);
1441 urb->iso_frame_desc[i].actual_length = actlength;
1442 urb->actual_length += actlength;
1443
1444 status = uhci_map_status(uhci_status_bits(td->status), usb_pipeout(urb->pipe));
1445 urb->iso_frame_desc[i].status = status;
1446 if (status) {
1447 urb->error_count++;
1448 ret = status;
1449 }
1450
1451 i++;
1452 }
1453
1454 return ret;
1455}
1456
1457
1458
1459
1460static struct urb *uhci_find_urb_ep(struct uhci *uhci, struct urb *urb)
1461{
1462 struct list_head *tmp, *head;
1463
1464
1465 if (usb_pipeisoc(urb->pipe))
1466 return NULL;
1467
1468 head = &uhci->urb_list;
1469 tmp = head->next;
1470 while (tmp != head) {
1471 struct urb *u = list_entry(tmp, struct urb, urb_list);
1472
1473 tmp = tmp->next;
1474
1475 if (u->dev == urb->dev && u->pipe == urb->pipe &&
1476 u->status == -EINPROGRESS)
1477 return u;
1478 }
1479
1480 return NULL;
1481}
1482
1483static int uhci_submit_urb(struct urb *urb)
1484{
1485 int ret = -EINVAL;
1486 struct uhci *uhci;
1487 unsigned long flags;
1488 struct urb *eurb;
1489 int bustime;
1490
1491 if (!urb)
1492 return -EINVAL;
1493
1494 if (!urb->dev || !urb->dev->bus || !urb->dev->bus->hcpriv) {
1495 warn("uhci_submit_urb: urb %p belongs to disconnected device or bus?", urb);
1496 return -ENODEV;
1497 }
1498
1499 uhci = (struct uhci *)urb->dev->bus->hcpriv;
1500
1501 usb_inc_dev_use(urb->dev);
1502
1503 spin_lock_irqsave(&uhci->urb_list_lock, flags);
1504 spin_lock(&urb->lock);
1505
1506 if (urb->status == -EINPROGRESS || urb->status == -ECONNRESET ||
1507 urb->status == -ECONNABORTED) {
1508 dbg("uhci_submit_urb: urb not available to submit (status = %d)", urb->status);
1509
1510 spin_unlock(&urb->lock);
1511 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1512 usb_dec_dev_use(urb->dev);
1513
1514 return ret;
1515 }
1516
1517 INIT_LIST_HEAD(&urb->urb_list);
1518 if (!uhci_alloc_urb_priv(uhci, urb)) {
1519 ret = -ENOMEM;
1520
1521 goto out;
1522 }
1523
1524 eurb = uhci_find_urb_ep(uhci, urb);
1525 if (eurb && !(urb->transfer_flags & USB_QUEUE_BULK)) {
1526 ret = -ENXIO;
1527
1528 goto out;
1529 }
1530
1531
1532 if (urb->dev == uhci->rh.dev) {
1533 ret = rh_submit_urb(urb);
1534
1535 goto out;
1536 }
1537
1538 switch (usb_pipetype(urb->pipe)) {
1539 case PIPE_CONTROL:
1540 ret = uhci_submit_control(urb);
1541 break;
1542 case PIPE_INTERRUPT:
1543 if (urb->bandwidth == 0) {
1544 bustime = usb_check_bandwidth(urb->dev, urb);
1545 if (bustime < 0)
1546 ret = bustime;
1547 else {
1548 ret = uhci_submit_interrupt(urb);
1549 if (ret == -EINPROGRESS)
1550 usb_claim_bandwidth(urb->dev, urb, bustime, 0);
1551 }
1552 } else
1553 ret = uhci_submit_interrupt(urb);
1554 break;
1555 case PIPE_BULK:
1556 ret = uhci_submit_bulk(urb, eurb);
1557 break;
1558 case PIPE_ISOCHRONOUS:
1559 if (urb->bandwidth == 0) {
1560 if (urb->number_of_packets <= 0) {
1561 ret = -EINVAL;
1562 break;
1563 }
1564 bustime = usb_check_bandwidth(urb->dev, urb);
1565 if (bustime < 0) {
1566 ret = bustime;
1567 break;
1568 }
1569
1570 ret = uhci_submit_isochronous(urb);
1571 if (ret == -EINPROGRESS)
1572 usb_claim_bandwidth(urb->dev, urb, bustime, 1);
1573 } else
1574 ret = uhci_submit_isochronous(urb);
1575 break;
1576 }
1577
1578out:
1579 urb->status = ret;
1580
1581 if (ret == -EINPROGRESS) {
1582
1583 list_add_tail(&urb->urb_list, &uhci->urb_list);
1584
1585 spin_unlock(&urb->lock);
1586 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1587
1588 return 0;
1589 }
1590
1591 uhci_unlink_generic(uhci, urb);
1592
1593 spin_unlock(&urb->lock);
1594 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1595
1596
1597 if (!ret)
1598 uhci_call_completion(urb);
1599
1600 return ret;
1601}
1602
1603
1604
1605
1606
1607
1608static void uhci_transfer_result(struct uhci *uhci, struct urb *urb)
1609{
1610 int ret = -EINVAL;
1611 unsigned long flags;
1612 struct urb_priv *urbp;
1613
1614
1615 if (urb->dev == uhci->rh.dev)
1616 return;
1617
1618 spin_lock_irqsave(&urb->lock, flags);
1619
1620 urbp = (struct urb_priv *)urb->hcpriv;
1621
1622 if (urb->status != -EINPROGRESS) {
1623 info("uhci_transfer_result: called for URB %p not in flight?", urb);
1624 goto out;
1625 }
1626
1627 switch (usb_pipetype(urb->pipe)) {
1628 case PIPE_CONTROL:
1629 ret = uhci_result_control(urb);
1630 break;
1631 case PIPE_INTERRUPT:
1632 ret = uhci_result_interrupt(urb);
1633 break;
1634 case PIPE_BULK:
1635 ret = uhci_result_bulk(urb);
1636 break;
1637 case PIPE_ISOCHRONOUS:
1638 ret = uhci_result_isochronous(urb);
1639 break;
1640 }
1641
1642 urbp->status = ret;
1643
1644 if (ret == -EINPROGRESS)
1645 goto out;
1646
1647 switch (usb_pipetype(urb->pipe)) {
1648 case PIPE_CONTROL:
1649 case PIPE_BULK:
1650 case PIPE_ISOCHRONOUS:
1651
1652
1653 if (urb->bandwidth)
1654 usb_release_bandwidth(urb->dev, urb, 1);
1655 uhci_unlink_generic(uhci, urb);
1656 break;
1657 case PIPE_INTERRUPT:
1658
1659 if (urb->interval)
1660 goto out_complete;
1661
1662
1663
1664 if (urb->bandwidth)
1665 usb_release_bandwidth(urb->dev, urb, 0);
1666 uhci_unlink_generic(uhci, urb);
1667 break;
1668 default:
1669 info("uhci_transfer_result: unknown pipe type %d for urb %p\n",
1670 usb_pipetype(urb->pipe), urb);
1671 }
1672
1673
1674 list_del_init(&urb->urb_list);
1675
1676out_complete:
1677 uhci_add_complete(urb);
1678
1679out:
1680 spin_unlock_irqrestore(&urb->lock, flags);
1681}
1682
1683
1684
1685
1686static void uhci_unlink_generic(struct uhci *uhci, struct urb *urb)
1687{
1688 struct list_head *head, *tmp;
1689 struct urb_priv *urbp = urb->hcpriv;
1690 int prevactive = 1;
1691
1692
1693 if (!urbp)
1694 return;
1695
1696 uhci_dec_fsbr(uhci, urb);
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711 head = &urbp->td_list;
1712 tmp = head->next;
1713 while (tmp != head) {
1714 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
1715
1716 tmp = tmp->next;
1717
1718 if (!(td->status & TD_CTRL_ACTIVE) &&
1719 (uhci_actual_length(td->status) < uhci_expected_length(td->info) ||
1720 tmp == head))
1721 usb_settoggle(urb->dev, uhci_endpoint(td->info),
1722 uhci_packetout(td->info),
1723 uhci_toggle(td->info) ^ 1);
1724 else if ((td->status & TD_CTRL_ACTIVE) && !prevactive)
1725 usb_settoggle(urb->dev, uhci_endpoint(td->info),
1726 uhci_packetout(td->info),
1727 uhci_toggle(td->info));
1728
1729 prevactive = td->status & TD_CTRL_ACTIVE;
1730 }
1731
1732 uhci_delete_queued_urb(uhci, urb);
1733
1734
1735 uhci_remove_qh(uhci, urbp->qh);
1736 urbp->qh = NULL;
1737}
1738
1739static int uhci_unlink_urb(struct urb *urb)
1740{
1741 struct uhci *uhci;
1742 unsigned long flags;
1743 struct urb_priv *urbp = urb->hcpriv;
1744
1745 if (!urb)
1746 return -EINVAL;
1747
1748 if (!urb->dev || !urb->dev->bus || !urb->dev->bus->hcpriv)
1749 return -ENODEV;
1750
1751 uhci = (struct uhci *)urb->dev->bus->hcpriv;
1752
1753 spin_lock_irqsave(&uhci->urb_list_lock, flags);
1754 spin_lock(&urb->lock);
1755
1756
1757
1758 if (urb->bandwidth) {
1759 switch (usb_pipetype(urb->pipe)) {
1760 case PIPE_INTERRUPT:
1761 usb_release_bandwidth(urb->dev, urb, 0);
1762 break;
1763 case PIPE_ISOCHRONOUS:
1764 usb_release_bandwidth(urb->dev, urb, 1);
1765 break;
1766 default:
1767 break;
1768 }
1769 }
1770
1771 if (urb->status != -EINPROGRESS) {
1772 spin_unlock(&urb->lock);
1773 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1774 return 0;
1775 }
1776
1777 list_del_init(&urb->urb_list);
1778
1779 uhci_unlink_generic(uhci, urb);
1780
1781
1782 if (urb->dev == uhci->rh.dev) {
1783 rh_unlink_urb(urb);
1784
1785 spin_unlock(&urb->lock);
1786 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1787
1788 uhci_call_completion(urb);
1789 } else {
1790 if (urb->transfer_flags & USB_ASYNC_UNLINK) {
1791 urbp->status = urb->status = -ECONNABORTED;
1792
1793 spin_lock(&uhci->urb_remove_list_lock);
1794
1795
1796 if (list_empty(&uhci->urb_remove_list))
1797 uhci_set_next_interrupt(uhci);
1798
1799 list_add(&urb->urb_list, &uhci->urb_remove_list);
1800
1801 spin_unlock(&uhci->urb_remove_list_lock);
1802
1803 spin_unlock(&urb->lock);
1804 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1805
1806 } else {
1807 urb->status = -ENOENT;
1808
1809 spin_unlock(&urb->lock);
1810 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
1811
1812 if (in_interrupt()) {
1813 static int errorcount = 10;
1814
1815 if (errorcount--)
1816 dbg("uhci_unlink_urb called from interrupt for urb %p", urb);
1817 udelay(1000);
1818 } else
1819 schedule_timeout(1+1*HZ/1000);
1820
1821 uhci_call_completion(urb);
1822 }
1823 }
1824
1825 return 0;
1826}
1827
1828static int uhci_fsbr_timeout(struct uhci *uhci, struct urb *urb)
1829{
1830 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1831 struct list_head *head, *tmp;
1832 int count = 0;
1833
1834 uhci_dec_fsbr(uhci, urb);
1835
1836 urbp->fsbr_timeout = 1;
1837
1838
1839
1840
1841
1842
1843
1844 head = &urbp->td_list;
1845 tmp = head->next;
1846 while (tmp != head) {
1847 struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
1848
1849 tmp = tmp->next;
1850
1851
1852
1853
1854
1855
1856 if (tmp != head && (count % DEPTH_INTERVAL) == (DEPTH_INTERVAL - 1))
1857 td->link |= UHCI_PTR_DEPTH;
1858
1859 count++;
1860 }
1861
1862 return 0;
1863}
1864
1865
1866
1867
1868
1869
1870static int uhci_get_current_frame_number(struct usb_device *dev)
1871{
1872 struct uhci *uhci = (struct uhci *)dev->bus->hcpriv;
1873
1874 return inw(uhci->io_addr + USBFRNUM);
1875}
1876
1877struct usb_operations uhci_device_operations = {
1878 uhci_alloc_dev,
1879 uhci_free_dev,
1880 uhci_get_current_frame_number,
1881 uhci_submit_urb,
1882 uhci_unlink_urb
1883};
1884
1885
1886
1887static __u8 root_hub_dev_des[] =
1888{
1889 0x12,
1890 0x01,
1891 0x00,
1892 0x01,
1893 0x09,
1894 0x00,
1895 0x00,
1896 0x08,
1897 0x00,
1898 0x00,
1899 0x00,
1900 0x00,
1901 0x00,
1902 0x00,
1903 0x00,
1904 0x02,
1905 0x01,
1906 0x01
1907};
1908
1909
1910
1911static __u8 root_hub_config_des[] =
1912{
1913 0x09,
1914 0x02,
1915 0x19,
1916 0x00,
1917 0x01,
1918 0x01,
1919 0x00,
1920 0x40,
1921
1922
1923 0x00,
1924
1925
1926 0x09,
1927 0x04,
1928 0x00,
1929 0x00,
1930 0x01,
1931 0x09,
1932 0x00,
1933 0x00,
1934 0x00,
1935
1936
1937 0x07,
1938 0x05,
1939 0x81,
1940 0x03,
1941 0x08,
1942 0x00,
1943 0xff
1944};
1945
1946static __u8 root_hub_hub_des[] =
1947{
1948 0x09,
1949 0x29,
1950 0x02,
1951 0x00,
1952 0x00,
1953 0x01,
1954 0x00,
1955 0x00,
1956 0xff
1957};
1958
1959
1960static int rh_send_irq(struct urb *urb)
1961{
1962 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1963 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
1964 unsigned int io_addr = uhci->io_addr;
1965 unsigned long flags;
1966 int i, len = 1;
1967 __u16 data = 0;
1968
1969 spin_lock_irqsave(&urb->lock, flags);
1970 for (i = 0; i < uhci->rh.numports; i++) {
1971 data |= ((inw(io_addr + USBPORTSC1 + i * 2) & 0xa) > 0 ? (1 << (i + 1)) : 0);
1972 len = (i + 1) / 8 + 1;
1973 }
1974
1975 *(__u16 *) urb->transfer_buffer = cpu_to_le16(data);
1976 urb->actual_length = len;
1977 urbp->status = 0;
1978
1979 spin_unlock_irqrestore(&urb->lock, flags);
1980
1981 if ((data > 0) && (uhci->rh.send != 0)) {
1982 dbg("root-hub INT complete: port1: %x port2: %x data: %x",
1983 inw(io_addr + USBPORTSC1), inw(io_addr + USBPORTSC2), data);
1984 uhci_call_completion(urb);
1985 }
1986
1987 return 0;
1988}
1989
1990
1991static int rh_init_int_timer(struct urb *urb);
1992
1993static void rh_int_timer_do(unsigned long ptr)
1994{
1995 struct urb *urb = (struct urb *)ptr;
1996 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
1997 struct list_head list, *tmp, *head;
1998 unsigned long flags;
1999
2000 if (uhci->rh.send)
2001 rh_send_irq(urb);
2002
2003 INIT_LIST_HEAD(&list);
2004
2005 spin_lock_irqsave(&uhci->urb_list_lock, flags);
2006 head = &uhci->urb_list;
2007 tmp = head->next;
2008 while (tmp != head) {
2009 struct urb *u = list_entry(tmp, struct urb, urb_list);
2010 struct urb_priv *up = (struct urb_priv *)u->hcpriv;
2011
2012 tmp = tmp->next;
2013
2014 spin_lock(&u->lock);
2015
2016
2017 if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies, up->fsbrtime + IDLE_TIMEOUT))
2018 uhci_fsbr_timeout(uhci, u);
2019
2020
2021 if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout)) {
2022 list_del(&u->urb_list);
2023 list_add_tail(&u->urb_list, &list);
2024 }
2025
2026 spin_unlock(&u->lock);
2027 }
2028 spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
2029
2030 head = &list;
2031 tmp = head->next;
2032 while (tmp != head) {
2033 struct urb *u = list_entry(tmp, struct urb, urb_list);
2034
2035 tmp = tmp->next;
2036
2037 u->transfer_flags |= USB_ASYNC_UNLINK | USB_TIMEOUT_KILLED;
2038 uhci_unlink_urb(u);
2039 }
2040
2041
2042 if (!uhci->fsbr && uhci->fsbrtimeout && time_after_eq(jiffies, uhci->fsbrtimeout)) {
2043 uhci->fsbrtimeout = 0;
2044 uhci->skel_term_qh->link = UHCI_PTR_TERM;
2045 }
2046
2047
2048 if (!uhci->is_suspended && !ports_active(uhci))
2049 suspend_hc(uhci);
2050
2051 rh_init_int_timer(urb);
2052}
2053
2054
2055static int rh_init_int_timer(struct urb *urb)
2056{
2057 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
2058
2059 uhci->rh.interval = urb->interval;
2060 init_timer(&uhci->rh.rh_int_timer);
2061 uhci->rh.rh_int_timer.function = rh_int_timer_do;
2062 uhci->rh.rh_int_timer.data = (unsigned long)urb;
2063 uhci->rh.rh_int_timer.expires = jiffies + (HZ * (urb->interval < 30 ? 30 : urb->interval)) / 1000;
2064 add_timer(&uhci->rh.rh_int_timer);
2065
2066 return 0;
2067}
2068
2069#define OK(x) len = (x); break
2070
2071#define CLR_RH_PORTSTAT(x) \
2072 status = inw(io_addr + USBPORTSC1 + 2 * (wIndex-1)); \
2073 status = (status & 0xfff5) & ~(x); \
2074 outw(status, io_addr + USBPORTSC1 + 2 * (wIndex-1))
2075
2076#define SET_RH_PORTSTAT(x) \
2077 status = inw(io_addr + USBPORTSC1 + 2 * (wIndex-1)); \
2078 status = (status & 0xfff5) | (x); \
2079 outw(status, io_addr + USBPORTSC1 + 2 * (wIndex-1))
2080
2081
2082
2083static int rh_submit_urb(struct urb *urb)
2084{
2085 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
2086 unsigned int pipe = urb->pipe;
2087 struct usb_ctrlrequest *cmd = (struct usb_ctrlrequest *)urb->setup_packet;
2088 void *data = urb->transfer_buffer;
2089 int leni = urb->transfer_buffer_length;
2090 int len = 0;
2091 int status = 0;
2092 int stat = 0;
2093 int i;
2094 unsigned int io_addr = uhci->io_addr;
2095 __u16 cstatus;
2096 __u16 bmRType_bReq;
2097 __u16 wValue;
2098 __u16 wIndex;
2099 __u16 wLength;
2100
2101 if (usb_pipetype(pipe) == PIPE_INTERRUPT) {
2102 uhci->rh.urb = urb;
2103 uhci->rh.send = 1;
2104 uhci->rh.interval = urb->interval;
2105 rh_init_int_timer(urb);
2106
2107 return -EINPROGRESS;
2108 }
2109
2110 bmRType_bReq = cmd->bRequestType | cmd->bRequest << 8;
2111 wValue = le16_to_cpu(cmd->wValue);
2112 wIndex = le16_to_cpu(cmd->wIndex);
2113 wLength = le16_to_cpu(cmd->wLength);
2114
2115 for (i = 0; i < 8; i++)
2116 uhci->rh.c_p_r[i] = 0;
2117
2118 switch (bmRType_bReq) {
2119
2120
2121
2122
2123
2124
2125
2126
2127 case RH_GET_STATUS:
2128 *(__u16 *)data = cpu_to_le16(1);
2129 OK(2);
2130 case RH_GET_STATUS | RH_INTERFACE:
2131 *(__u16 *)data = cpu_to_le16(0);
2132 OK(2);
2133 case RH_GET_STATUS | RH_ENDPOINT:
2134 *(__u16 *)data = cpu_to_le16(0);
2135 OK(2);
2136 case RH_GET_STATUS | RH_CLASS:
2137 *(__u32 *)data = cpu_to_le32(0);
2138 OK(4);
2139 case RH_GET_STATUS | RH_OTHER | RH_CLASS:
2140 status = inw(io_addr + USBPORTSC1 + 2 * (wIndex - 1));
2141 cstatus = ((status & USBPORTSC_CSC) >> (1 - 0)) |
2142 ((status & USBPORTSC_PEC) >> (3 - 1)) |
2143 (uhci->rh.c_p_r[wIndex - 1] << (0 + 4));
2144 status = (status & USBPORTSC_CCS) |
2145 ((status & USBPORTSC_PE) >> (2 - 1)) |
2146 ((status & USBPORTSC_SUSP) >> (12 - 2)) |
2147 ((status & USBPORTSC_PR) >> (9 - 4)) |
2148 (1 << 8) |
2149 ((status & USBPORTSC_LSDA) << (-8 + 9));
2150
2151 *(__u16 *)data = cpu_to_le16(status);
2152 *(__u16 *)(data + 2) = cpu_to_le16(cstatus);
2153 OK(4);
2154 case RH_CLEAR_FEATURE | RH_ENDPOINT:
2155 switch (wValue) {
2156 case RH_ENDPOINT_STALL:
2157 OK(0);
2158 }
2159 break;
2160 case RH_CLEAR_FEATURE | RH_CLASS:
2161 switch (wValue) {
2162 case RH_C_HUB_OVER_CURRENT:
2163 OK(0);
2164 }
2165 break;
2166 case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
2167 switch (wValue) {
2168 case RH_PORT_ENABLE:
2169 CLR_RH_PORTSTAT(USBPORTSC_PE);
2170 OK(0);
2171 case RH_PORT_SUSPEND:
2172 CLR_RH_PORTSTAT(USBPORTSC_SUSP);
2173 OK(0);
2174 case RH_PORT_POWER:
2175 OK(0);
2176 case RH_C_PORT_CONNECTION:
2177 SET_RH_PORTSTAT(USBPORTSC_CSC);
2178 OK(0);
2179 case RH_C_PORT_ENABLE:
2180 SET_RH_PORTSTAT(USBPORTSC_PEC);
2181 OK(0);
2182 case RH_C_PORT_SUSPEND:
2183
2184 OK(0);
2185 case RH_C_PORT_OVER_CURRENT:
2186 OK(0);
2187 case RH_C_PORT_RESET:
2188 uhci->rh.c_p_r[wIndex - 1] = 0;
2189 OK(0);
2190 }
2191 break;
2192 case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
2193 switch (wValue) {
2194 case RH_PORT_SUSPEND:
2195 SET_RH_PORTSTAT(USBPORTSC_SUSP);
2196 OK(0);
2197 case RH_PORT_RESET:
2198 SET_RH_PORTSTAT(USBPORTSC_PR);
2199 mdelay(50);
2200 uhci->rh.c_p_r[wIndex - 1] = 1;
2201 CLR_RH_PORTSTAT(USBPORTSC_PR);
2202 udelay(10);
2203 SET_RH_PORTSTAT(USBPORTSC_PE);
2204 mdelay(10);
2205 SET_RH_PORTSTAT(0xa);
2206 OK(0);
2207 case RH_PORT_POWER:
2208 OK(0);
2209 case RH_PORT_ENABLE:
2210 SET_RH_PORTSTAT(USBPORTSC_PE);
2211 OK(0);
2212 }
2213 break;
2214 case RH_SET_ADDRESS:
2215 uhci->rh.devnum = wValue;
2216 OK(0);
2217 case RH_GET_DESCRIPTOR:
2218 switch ((wValue & 0xff00) >> 8) {
2219 case 0x01:
2220 len = min_t(unsigned int, leni,
2221 min_t(unsigned int,
2222 sizeof(root_hub_dev_des), wLength));
2223 memcpy(data, root_hub_dev_des, len);
2224 OK(len);
2225 case 0x02:
2226 len = min_t(unsigned int, leni,
2227 min_t(unsigned int,
2228 sizeof(root_hub_config_des), wLength));
2229 memcpy (data, root_hub_config_des, len);
2230 OK(len);
2231 case 0x03:
2232 len = usb_root_hub_string (wValue & 0xff,
2233 uhci->io_addr, "UHCI-alt",
2234 data, wLength);
2235 if (len > 0) {
2236 OK(min_t(int, leni, len));
2237 } else
2238 stat = -EPIPE;
2239 }
2240 break;
2241 case RH_GET_DESCRIPTOR | RH_CLASS:
2242 root_hub_hub_des[2] = uhci->rh.numports;
2243 len = min_t(unsigned int, leni,
2244 min_t(unsigned int, sizeof(root_hub_hub_des), wLength));
2245 memcpy(data, root_hub_hub_des, len);
2246 OK(len);
2247 case RH_GET_CONFIGURATION:
2248 *(__u8 *)data = 0x01;
2249 OK(1);
2250 case RH_SET_CONFIGURATION:
2251 OK(0);
2252 case RH_GET_INTERFACE | RH_INTERFACE:
2253 *(__u8 *)data = 0x00;
2254 OK(1);
2255 case RH_SET_INTERFACE | RH_INTERFACE:
2256 OK(0);
2257 default:
2258 stat = -EPIPE;
2259 }
2260
2261 urb->actual_length = len;
2262
2263 return stat;
2264}
2265
2266
2267
2268
2269static int rh_unlink_urb(struct urb *urb)
2270{
2271 struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
2272
2273 if (uhci->rh.urb == urb) {
2274 urb->status = -ENOENT;
2275 uhci->rh.send = 0;
2276 uhci->rh.urb = NULL;
2277 del_timer(&uhci->rh.rh_int_timer);
2278 }
2279 return 0;
2280}
2281
2282static void uhci_free_pending_qhs(struct uhci *uhci)
2283{
2284 struct list_head *tmp, *head;
2285 unsigned long flags;
2286
2287 spin_lock_irqsave(&uhci->qh_remove_list_lock, flags);
2288 head = &uhci->qh_remove_list;
2289 tmp = head->next;
2290 while (tmp != head) {
2291 struct uhci_qh *qh = list_entry(tmp, struct uhci_qh, remove_list);
2292
2293 tmp = tmp->next;
2294
2295 list_del_init(&qh->remove_list);
2296
2297 uhci_free_qh(uhci, qh);
2298 }
2299 spin_unlock_irqrestore(&uhci->qh_remove_list_lock, flags);
2300}
2301
2302static void uhci_call_completion(struct urb *urb)
2303{
2304 struct urb_priv *urbp;
2305 struct usb_device *dev = urb->dev;
2306 struct uhci *uhci = (struct uhci *)dev->bus->hcpriv;
2307 int is_ring = 0, killed, resubmit_interrupt, status;
2308 struct urb *nurb;
2309 unsigned long flags;
2310
2311 spin_lock_irqsave(&urb->lock, flags);
2312
2313 urbp = (struct urb_priv *)urb->hcpriv;
2314 if (!urbp || !urb->dev) {
2315 spin_unlock_irqrestore(&urb->lock, flags);
2316 return;
2317 }
2318
2319 killed = (urb->status == -ENOENT || urb->status == -ECONNABORTED ||
2320 urb->status == -ECONNRESET);
2321 resubmit_interrupt = (usb_pipetype(urb->pipe) == PIPE_INTERRUPT &&
2322 urb->interval);
2323
2324 nurb = urb->next;
2325 if (nurb && !killed) {
2326 int count = 0;
2327
2328 while (nurb && nurb != urb && count < MAX_URB_LOOP) {
2329 if (nurb->status == -ENOENT ||
2330 nurb->status == -ECONNABORTED ||
2331 nurb->status == -ECONNRESET) {
2332 killed = 1;
2333 break;
2334 }
2335
2336 nurb = nurb->next;
2337 count++;
2338 }
2339
2340 if (count == MAX_URB_LOOP)
2341 err("uhci_call_completion: too many linked URB's, loop? (first loop)");
2342
2343
2344 is_ring = (nurb == urb);
2345 }
2346
2347 if (urbp->transfer_buffer_dma_handle)
2348 pci_dma_sync_single(uhci->dev, urbp->transfer_buffer_dma_handle,
2349 urb->transfer_buffer_length, usb_pipein(urb->pipe) ?
2350 PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
2351
2352 if (urbp->setup_packet_dma_handle)
2353 pci_dma_sync_single(uhci->dev, urbp->setup_packet_dma_handle,
2354 sizeof(struct usb_ctrlrequest), PCI_DMA_TODEVICE);
2355
2356 status = urbp->status;
2357 if (!resubmit_interrupt || killed)
2358
2359 uhci_destroy_urb_priv(urb);
2360
2361 if (!killed)
2362 urb->status = status;
2363
2364 urb->dev = NULL;
2365 spin_unlock_irqrestore(&urb->lock, flags);
2366
2367 if (urb->complete)
2368 urb->complete(urb);
2369
2370 if (resubmit_interrupt)
2371
2372
2373 killed = (urb->status == -ENOENT ||
2374 urb->status == -ECONNABORTED ||
2375 urb->status == -ECONNRESET);
2376
2377 if (resubmit_interrupt && !killed) {
2378 urb->dev = dev;
2379 uhci_reset_interrupt(urb);
2380 } else {
2381 if (is_ring && !killed) {
2382 urb->dev = dev;
2383 uhci_submit_urb(urb);
2384 } else {
2385
2386
2387 usb_dec_dev_use(dev);
2388 }
2389 }
2390}
2391
2392static void uhci_finish_completion(struct uhci *uhci)
2393{
2394 struct list_head *tmp, *head;
2395 unsigned long flags;
2396
2397 spin_lock_irqsave(&uhci->complete_list_lock, flags);
2398 head = &uhci->complete_list;
2399 tmp = head->next;
2400 while (tmp != head) {
2401 struct urb_priv *urbp = list_entry(tmp, struct urb_priv, complete_list);
2402 struct urb *urb = urbp->urb;
2403
2404 list_del_init(&urbp->complete_list);
2405 spin_unlock_irqrestore(&uhci->complete_list_lock, flags);
2406
2407 uhci_call_completion(urb);
2408
2409 spin_lock_irqsave(&uhci->complete_list_lock, flags);
2410 head = &uhci->complete_list;
2411 tmp = head->next;
2412 }
2413 spin_unlock_irqrestore(&uhci->complete_list_lock, flags);
2414}
2415
2416static void uhci_remove_pending_qhs(struct uhci *uhci)
2417{
2418 struct list_head *tmp, *head;
2419 unsigned long flags;
2420
2421 spin_lock_irqsave(&uhci->urb_remove_list_lock, flags);
2422 head = &uhci->urb_remove_list;
2423 tmp = head->next;
2424 while (tmp != head) {
2425 struct urb *urb = list_entry(tmp, struct urb, urb_list);
2426 struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
2427
2428 tmp = tmp->next;
2429
2430 list_del_init(&urb->urb_list);
2431
2432 urbp->status = urb->status = -ECONNRESET;
2433
2434 uhci_add_complete(urb);
2435 }
2436 spin_unlock_irqrestore(&uhci->urb_remove_list_lock, flags);
2437}
2438
2439static void uhci_interrupt(int irq, void *__uhci, struct pt_regs *regs)
2440{
2441 struct uhci *uhci = __uhci;
2442 unsigned int io_addr = uhci->io_addr;
2443 unsigned short status;
2444 struct list_head *tmp, *head;
2445
2446
2447
2448
2449
2450 status = inw(io_addr + USBSTS);
2451 if (!status)
2452 return;
2453 outw(status, io_addr + USBSTS);
2454
2455 if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) {
2456 if (status & USBSTS_HSE)
2457 err("%x: host system error, PCI problems?", io_addr);
2458 if (status & USBSTS_HCPE)
2459 err("%x: host controller process error. something bad happened", io_addr);
2460 if ((status & USBSTS_HCH) && !uhci->is_suspended) {
2461 err("%x: host controller halted. very bad", io_addr);
2462
2463 }
2464 }
2465
2466 if (status & USBSTS_RD)
2467 wakeup_hc(uhci);
2468
2469 uhci_free_pending_qhs(uhci);
2470
2471 uhci_remove_pending_qhs(uhci);
2472
2473 uhci_clear_next_interrupt(uhci);
2474
2475
2476 spin_lock(&uhci->urb_list_lock);
2477 head = &uhci->urb_list;
2478 tmp = head->next;
2479 while (tmp != head) {
2480 struct urb *urb = list_entry(tmp, struct urb, urb_list);
2481
2482 tmp = tmp->next;
2483
2484
2485 uhci_transfer_result(uhci, urb);
2486 }
2487 spin_unlock(&uhci->urb_list_lock);
2488
2489 uhci_finish_completion(uhci);
2490}
2491
2492static void reset_hc(struct uhci *uhci)
2493{
2494 unsigned int io_addr = uhci->io_addr;
2495
2496
2497 outw(USBCMD_GRESET, io_addr + USBCMD);
2498 wait_ms(50);
2499 outw(0, io_addr + USBCMD);
2500 wait_ms(10);
2501}
2502
2503static void suspend_hc(struct uhci *uhci)
2504{
2505 unsigned int io_addr = uhci->io_addr;
2506
2507 dbg("%x: suspend_hc", io_addr);
2508
2509 outw(USBCMD_EGSM, io_addr + USBCMD);
2510
2511 uhci->is_suspended = 1;
2512}
2513
2514static void wakeup_hc(struct uhci *uhci)
2515{
2516 unsigned int io_addr = uhci->io_addr;
2517 unsigned int status;
2518
2519 dbg("%x: wakeup_hc", io_addr);
2520
2521 outw(0, io_addr + USBCMD);
2522
2523
2524 status = inw(io_addr + USBCMD);
2525 while (status & USBCMD_FGR)
2526 status = inw(io_addr + USBCMD);
2527
2528 uhci->is_suspended = 0;
2529
2530
2531 outw(USBCMD_RS | USBCMD_CF | USBCMD_MAXP, io_addr + USBCMD);
2532}
2533
2534static int ports_active(struct uhci *uhci)
2535{
2536 unsigned int io_addr = uhci->io_addr;
2537 int connection = 0;
2538 int i;
2539
2540 for (i = 0; i < uhci->rh.numports; i++)
2541 connection |= (inw(io_addr + USBPORTSC1 + i * 2) & 0x1);
2542
2543 return connection;
2544}
2545
2546static void start_hc(struct uhci *uhci)
2547{
2548 unsigned int io_addr = uhci->io_addr;
2549 int timeout = 1000;
2550
2551
2552
2553
2554
2555
2556
2557 outw(USBCMD_HCRESET, io_addr + USBCMD);
2558 while (inw(io_addr + USBCMD) & USBCMD_HCRESET) {
2559 if (!--timeout) {
2560 printk(KERN_ERR "uhci: USBCMD_HCRESET timed out!\n");
2561 break;
2562 }
2563 }
2564
2565
2566 outw(USBINTR_TIMEOUT | USBINTR_RESUME | USBINTR_IOC | USBINTR_SP,
2567 io_addr + USBINTR);
2568
2569
2570 outw(0, io_addr + USBFRNUM);
2571 outl(uhci->fl->dma_handle, io_addr + USBFLBASEADD);
2572
2573
2574 outw(USBCMD_RS | USBCMD_CF | USBCMD_MAXP, io_addr + USBCMD);
2575}
2576
2577#ifdef CONFIG_PROC_FS
2578static int uhci_num = 0;
2579#endif
2580
2581static void free_uhci(struct uhci *uhci)
2582{
2583 kfree(uhci);
2584}
2585
2586
2587
2588
2589static void release_uhci(struct uhci *uhci)
2590{
2591 int i;
2592#ifdef CONFIG_PROC_FS
2593 char buf[8];
2594#endif
2595
2596 if (uhci->irq >= 0) {
2597 free_irq(uhci->irq, uhci);
2598 uhci->irq = -1;
2599 }
2600
2601 for (i = 0; i < UHCI_NUM_SKELQH; i++)
2602 if (uhci->skelqh[i]) {
2603 uhci_free_qh(uhci, uhci->skelqh[i]);
2604 uhci->skelqh[i] = NULL;
2605 }
2606
2607 for (i = 0; i < UHCI_NUM_SKELTD; i++)
2608 if (uhci->skeltd[i]) {
2609 uhci_free_td(uhci, uhci->skeltd[i]);
2610 uhci->skeltd[i] = NULL;
2611 }
2612
2613 if (uhci->qh_pool) {
2614 pci_pool_destroy(uhci->qh_pool);
2615 uhci->qh_pool = NULL;
2616 }
2617
2618 if (uhci->td_pool) {
2619 pci_pool_destroy(uhci->td_pool);
2620 uhci->td_pool = NULL;
2621 }
2622
2623 if (uhci->fl) {
2624 pci_free_consistent(uhci->dev, sizeof(*uhci->fl), uhci->fl, uhci->fl->dma_handle);
2625 uhci->fl = NULL;
2626 }
2627
2628 if (uhci->bus) {
2629 usb_free_bus(uhci->bus);
2630 uhci->bus = NULL;
2631 }
2632
2633#ifdef CONFIG_PROC_FS
2634 if (uhci->proc_entry) {
2635 sprintf(buf, "hc%d", uhci->num);
2636
2637 remove_proc_entry(buf, uhci_proc_root);
2638 uhci->proc_entry = NULL;
2639 }
2640#endif
2641
2642 free_uhci(uhci);
2643}
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io_size)
2662{
2663 struct uhci *uhci;
2664 int retval;
2665 char buf[8], *bufp = buf;
2666 int i, port;
2667 struct usb_bus *bus;
2668 dma_addr_t dma_handle;
2669#ifdef CONFIG_PROC_FS
2670 struct proc_dir_entry *ent;
2671#endif
2672
2673 retval = -ENODEV;
2674 if (pci_enable_device(dev) < 0) {
2675 err("couldn't enable PCI device");
2676 goto err_enable_device;
2677 }
2678
2679 if (!dev->irq) {
2680 err("found UHCI device with no IRQ assigned. check BIOS settings!");
2681 goto err_invalid_irq;
2682 }
2683
2684 if (!pci_dma_supported(dev, 0xFFFFFFFF)) {
2685 err("PCI subsystem doesn't support 32 bit addressing?");
2686 goto err_pci_dma_supported;
2687 }
2688
2689 retval = -EBUSY;
2690 if (!request_region(io_addr, io_size, "usb-uhci")) {
2691 err("couldn't allocate I/O range %x - %x", io_addr,
2692 io_addr + io_size - 1);
2693 goto err_request_region;
2694 }
2695
2696 pci_set_master(dev);
2697
2698#ifndef __sparc__
2699 sprintf(buf, "%d", dev->irq);
2700#else
2701 bufp = __irq_itoa(dev->irq);
2702#endif
2703 printk(KERN_INFO __FILE__ ": USB UHCI at I/O 0x%x, IRQ %s\n",
2704 io_addr, bufp);
2705
2706 if (pci_set_dma_mask(dev, 0xFFFFFFFF)) {
2707 err("couldn't set PCI dma mask");
2708 retval = -ENODEV;
2709 goto err_pci_set_dma_mask;
2710 }
2711
2712 uhci = kmalloc(sizeof(*uhci), GFP_KERNEL);
2713 if (!uhci) {
2714 err("couldn't allocate uhci structure");
2715 retval = -ENOMEM;
2716 goto err_alloc_uhci;
2717 }
2718
2719 uhci->dev = dev;
2720 uhci->irq = dev->irq;
2721 uhci->io_addr = io_addr;
2722 uhci->io_size = io_size;
2723 pci_set_drvdata(dev, uhci);
2724
2725#ifdef CONFIG_PROC_FS
2726 uhci->num = uhci_num++;
2727
2728 sprintf(buf, "hc%d", uhci->num);
2729
2730 ent = create_proc_entry(buf, S_IFREG|S_IRUGO|S_IWUSR, uhci_proc_root);
2731 if (!ent) {
2732 err("couldn't create uhci proc entry");
2733 retval = -ENOMEM;
2734 goto err_create_proc_entry;
2735 }
2736
2737 ent->data = uhci;
2738 ent->proc_fops = &uhci_proc_operations;
2739 ent->size = 0;
2740 uhci->proc_entry = ent;
2741#endif
2742
2743
2744
2745 reset_hc(uhci);
2746
2747 uhci->fsbr = 0;
2748 uhci->fsbrtimeout = 0;
2749
2750 uhci->is_suspended = 0;
2751
2752 spin_lock_init(&uhci->qh_remove_list_lock);
2753 INIT_LIST_HEAD(&uhci->qh_remove_list);
2754
2755 spin_lock_init(&uhci->urb_remove_list_lock);
2756 INIT_LIST_HEAD(&uhci->urb_remove_list);
2757
2758 spin_lock_init(&uhci->urb_list_lock);
2759 INIT_LIST_HEAD(&uhci->urb_list);
2760
2761 spin_lock_init(&uhci->complete_list_lock);
2762 INIT_LIST_HEAD(&uhci->complete_list);
2763
2764 spin_lock_init(&uhci->frame_list_lock);
2765
2766
2767
2768#if PAGE_SIZE < (4 * 1024)
2769#error PAGE_SIZE is not atleast 4k
2770#endif
2771 uhci->fl = pci_alloc_consistent(uhci->dev, sizeof(*uhci->fl), &dma_handle);
2772 if (!uhci->fl) {
2773 err("unable to allocate consistent memory for frame list");
2774 goto err_alloc_fl;
2775 }
2776
2777 memset((void *)uhci->fl, 0, sizeof(*uhci->fl));
2778
2779 uhci->fl->dma_handle = dma_handle;
2780
2781 uhci->td_pool = pci_pool_create("uhci_td", uhci->dev,
2782 sizeof(struct uhci_td), 16, 0, GFP_DMA | GFP_ATOMIC);
2783 if (!uhci->td_pool) {
2784 err("unable to create td pci_pool");
2785 goto err_create_td_pool;
2786 }
2787
2788 uhci->qh_pool = pci_pool_create("uhci_qh", uhci->dev,
2789 sizeof(struct uhci_qh), 16, 0, GFP_DMA | GFP_ATOMIC);
2790 if (!uhci->qh_pool) {
2791 err("unable to create qh pci_pool");
2792 goto err_create_qh_pool;
2793 }
2794
2795 bus = usb_alloc_bus(&uhci_device_operations);
2796 if (!bus) {
2797 err("unable to allocate bus");
2798 goto err_alloc_bus;
2799 }
2800
2801 uhci->bus = bus;
2802 bus->bus_name = dev->slot_name;
2803 bus->hcpriv = uhci;
2804
2805 usb_register_bus(uhci->bus);
2806
2807
2808
2809
2810
2811
2812
2813 for (port = 0; port < (uhci->io_size - 0x10) / 2; port++) {
2814 unsigned int portstatus;
2815
2816 portstatus = inw(uhci->io_addr + 0x10 + (port * 2));
2817 if (!(portstatus & 0x0080))
2818 break;
2819 }
2820 if (debug)
2821 info("detected %d ports", port);
2822
2823
2824
2825 if (port < 2 || port > 8) {
2826 info("port count misdetected? forcing to 2 ports");
2827 port = 2;
2828 }
2829
2830 uhci->rh.numports = port;
2831
2832 uhci->bus->root_hub = uhci->rh.dev = usb_alloc_dev(NULL, uhci->bus);
2833 if (!uhci->rh.dev) {
2834 err("unable to allocate root hub");
2835 goto err_alloc_root_hub;
2836 }
2837
2838 uhci->skeltd[0] = uhci_alloc_td(uhci, uhci->rh.dev);
2839 if (!uhci->skeltd[0]) {
2840 err("unable to allocate TD 0");
2841 goto err_alloc_skeltd;
2842 }
2843
2844
2845
2846
2847
2848 for (i = 1; i < 9; i++) {
2849 struct uhci_td *td;
2850
2851 td = uhci->skeltd[i] = uhci_alloc_td(uhci, uhci->rh.dev);
2852 if (!td) {
2853 err("unable to allocate TD %d", i);
2854 goto err_alloc_skeltd;
2855 }
2856
2857 uhci_fill_td(td, 0, (UHCI_NULL_DATA_SIZE << 21) | (0x7f << 8) | USB_PID_IN, 0);
2858 td->link = uhci->skeltd[i - 1]->dma_handle;
2859 }
2860
2861 uhci->skel_term_td = uhci_alloc_td(uhci, uhci->rh.dev);
2862 if (!uhci->skel_term_td) {
2863 err("unable to allocate skel TD term");
2864 goto err_alloc_skeltd;
2865 }
2866
2867 for (i = 0; i < UHCI_NUM_SKELQH; i++) {
2868 uhci->skelqh[i] = uhci_alloc_qh(uhci, uhci->rh.dev);
2869 if (!uhci->skelqh[i]) {
2870 err("unable to allocate QH %d", i);
2871 goto err_alloc_skelqh;
2872 }
2873 }
2874
2875 uhci_fill_td(uhci->skel_int1_td, 0, (UHCI_NULL_DATA_SIZE << 21) | (0x7f << 8) | USB_PID_IN, 0);
2876 uhci->skel_int1_td->link = uhci->skel_ls_control_qh->dma_handle | UHCI_PTR_QH;
2877
2878 uhci->skel_ls_control_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH;
2879 uhci->skel_ls_control_qh->element = UHCI_PTR_TERM;
2880
2881 uhci->skel_hs_control_qh->link = uhci->skel_bulk_qh->dma_handle | UHCI_PTR_QH;
2882 uhci->skel_hs_control_qh->element = UHCI_PTR_TERM;
2883
2884 uhci->skel_bulk_qh->link = uhci->skel_term_qh->dma_handle | UHCI_PTR_QH;
2885 uhci->skel_bulk_qh->element = UHCI_PTR_TERM;
2886
2887
2888 uhci_fill_td(uhci->skel_term_td, 0, (UHCI_NULL_DATA_SIZE << 21) | (0x7f << 8) | USB_PID_IN, 0);
2889 uhci->skel_term_td->link = uhci->skel_term_td->dma_handle;
2890
2891 uhci->skel_term_qh->link = UHCI_PTR_TERM;
2892 uhci->skel_term_qh->element = uhci->skel_term_td->dma_handle;
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902 for (i = 0; i < UHCI_NUMFRAMES; i++) {
2903 int irq = 0;
2904
2905 if (i & 1) {
2906 irq++;
2907 if (i & 2) {
2908 irq++;
2909 if (i & 4) {
2910 irq++;
2911 if (i & 8) {
2912 irq++;
2913 if (i & 16) {
2914 irq++;
2915 if (i & 32) {
2916 irq++;
2917 if (i & 64)
2918 irq++;
2919 }
2920 }
2921 }
2922 }
2923 }
2924 }
2925
2926
2927 uhci->fl->frame[i] = uhci->skeltd[irq]->dma_handle;
2928 }
2929
2930 start_hc(uhci);
2931
2932 if (request_irq(dev->irq, uhci_interrupt, SA_SHIRQ, "usb-uhci", uhci))
2933 goto err_request_irq;
2934
2935
2936 pci_write_config_word(uhci->dev, USBLEGSUP, USBLEGSUP_DEFAULT);
2937
2938 usb_connect(uhci->rh.dev);
2939
2940 if (usb_new_device(uhci->rh.dev) != 0) {
2941 err("unable to start root hub");
2942 retval = -ENOMEM;
2943 goto err_start_root_hub;
2944 }
2945
2946 return 0;
2947
2948
2949
2950
2951err_start_root_hub:
2952 free_irq(uhci->irq, uhci);
2953 uhci->irq = -1;
2954
2955err_request_irq:
2956 for (i = 0; i < UHCI_NUM_SKELQH; i++)
2957 if (uhci->skelqh[i]) {
2958 uhci_free_qh(uhci, uhci->skelqh[i]);
2959 uhci->skelqh[i] = NULL;
2960 }
2961
2962err_alloc_skelqh:
2963 for (i = 0; i < UHCI_NUM_SKELTD; i++)
2964 if (uhci->skeltd[i]) {
2965 uhci_free_td(uhci, uhci->skeltd[i]);
2966 uhci->skeltd[i] = NULL;
2967 }
2968
2969err_alloc_skeltd:
2970 usb_free_dev(uhci->rh.dev);
2971 uhci->rh.dev = NULL;
2972
2973err_alloc_root_hub:
2974 usb_free_bus(uhci->bus);
2975 uhci->bus = NULL;
2976
2977err_alloc_bus:
2978 pci_pool_destroy(uhci->qh_pool);
2979 uhci->qh_pool = NULL;
2980
2981err_create_qh_pool:
2982 pci_pool_destroy(uhci->td_pool);
2983 uhci->td_pool = NULL;
2984
2985err_create_td_pool:
2986 pci_free_consistent(uhci->dev, sizeof(*uhci->fl), uhci->fl, uhci->fl->dma_handle);
2987 uhci->fl = NULL;
2988
2989err_alloc_fl:
2990#ifdef CONFIG_PROC_FS
2991 remove_proc_entry(buf, uhci_proc_root);
2992 uhci->proc_entry = NULL;
2993
2994err_create_proc_entry:
2995 free_uhci(uhci);
2996#endif
2997
2998err_alloc_uhci:
2999
3000err_pci_set_dma_mask:
3001 release_region(io_addr, io_size);
3002
3003err_request_region:
3004
3005err_pci_dma_supported:
3006
3007err_invalid_irq:
3008
3009err_enable_device:
3010
3011 return retval;
3012}
3013
3014static int __devinit uhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
3015{
3016 int i;
3017
3018
3019 for (i = 0; i < 6; i++) {
3020 unsigned int io_addr = pci_resource_start(dev, i);
3021 unsigned int io_size = pci_resource_len(dev, i);
3022
3023
3024 if (!(pci_resource_flags(dev, i) & IORESOURCE_IO))
3025 continue;
3026
3027 return alloc_uhci(dev, io_addr, io_size);
3028 }
3029
3030 return -ENODEV;
3031}
3032
3033static void __devexit uhci_pci_remove(struct pci_dev *dev)
3034{
3035 struct uhci *uhci = pci_get_drvdata(dev);
3036
3037 if (uhci->bus->root_hub)
3038 usb_disconnect(&uhci->bus->root_hub);
3039
3040 usb_deregister_bus(uhci->bus);
3041
3042
3043
3044
3045
3046 uhci_free_pending_qhs(uhci);
3047 uhci_remove_pending_qhs(uhci);
3048
3049 reset_hc(uhci);
3050 release_region(uhci->io_addr, uhci->io_size);
3051
3052 uhci_free_pending_qhs(uhci);
3053
3054 release_uhci(uhci);
3055}
3056
3057#ifdef CONFIG_PM
3058static int uhci_pci_suspend(struct pci_dev *dev, u32 state)
3059{
3060 suspend_hc((struct uhci *) pci_get_drvdata(dev));
3061 return 0;
3062}
3063
3064static int uhci_pci_resume(struct pci_dev *dev)
3065{
3066 reset_hc((struct uhci *) pci_get_drvdata(dev));
3067 start_hc((struct uhci *) pci_get_drvdata(dev));
3068 return 0;
3069}
3070#endif
3071
3072static const struct pci_device_id __devinitdata uhci_pci_ids[] = { {
3073
3074
3075 class: ((PCI_CLASS_SERIAL_USB << 8) | 0x00),
3076 class_mask: ~0,
3077
3078
3079 vendor: PCI_ANY_ID,
3080 device: PCI_ANY_ID,
3081 subvendor: PCI_ANY_ID,
3082 subdevice: PCI_ANY_ID,
3083
3084 }, { }
3085};
3086
3087MODULE_DEVICE_TABLE(pci, uhci_pci_ids);
3088
3089static struct pci_driver uhci_pci_driver = {
3090 name: "usb-uhci",
3091 id_table: uhci_pci_ids,
3092
3093 probe: uhci_pci_probe,
3094 remove: __devexit_p(uhci_pci_remove),
3095
3096#ifdef CONFIG_PM
3097 suspend: uhci_pci_suspend,
3098 resume: uhci_pci_resume,
3099#endif
3100};
3101
3102
3103static int __init uhci_hcd_init(void)
3104{
3105 int retval = -ENOMEM;
3106
3107 info(DRIVER_DESC " " DRIVER_VERSION);
3108
3109 if (debug) {
3110 errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);
3111 if (!errbuf)
3112 goto errbuf_failed;
3113 }
3114
3115#ifdef CONFIG_PROC_FS
3116 uhci_proc_root = create_proc_entry("driver/uhci", S_IFDIR, 0);
3117 if (!uhci_proc_root)
3118 goto proc_failed;
3119#endif
3120
3121 uhci_up_cachep = kmem_cache_create("uhci_urb_priv",
3122 sizeof(struct urb_priv), 0, 0, NULL, NULL);
3123 if (!uhci_up_cachep)
3124 goto up_failed;
3125
3126 retval = pci_module_init(&uhci_pci_driver);
3127 if (retval)
3128 goto init_failed;
3129
3130 return 0;
3131
3132init_failed:
3133 if (kmem_cache_destroy(uhci_up_cachep))
3134 printk(KERN_INFO "uhci: not all urb_priv's were freed\n");
3135
3136up_failed:
3137
3138#ifdef CONFIG_PROC_FS
3139 remove_proc_entry("driver/uhci", 0);
3140
3141proc_failed:
3142#endif
3143 if (errbuf)
3144 kfree(errbuf);
3145
3146errbuf_failed:
3147
3148 return retval;
3149}
3150
3151static void __exit uhci_hcd_cleanup(void)
3152{
3153 pci_unregister_driver(&uhci_pci_driver);
3154
3155 if (kmem_cache_destroy(uhci_up_cachep))
3156 printk(KERN_INFO "uhci: not all urb_priv's were freed\n");
3157
3158#ifdef CONFIG_PROC_FS
3159 remove_proc_entry("driver/uhci", 0);
3160#endif
3161
3162 if (errbuf)
3163 kfree(errbuf);
3164}
3165
3166module_init(uhci_hcd_init);
3167module_exit(uhci_hcd_cleanup);
3168
3169MODULE_AUTHOR(DRIVER_AUTHOR);
3170MODULE_DESCRIPTION(DRIVER_DESC);
3171MODULE_LICENSE("GPL");
3172
3173