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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#include <common.h>
49#include <asm/byteorder.h>
50
51#if defined(CONFIG_PCI_OHCI)
52# include <pci.h>
53#if !defined(CONFIG_PCI_OHCI_DEVNO)
54#define CONFIG_PCI_OHCI_DEVNO 0
55#endif
56#endif
57
58#include <malloc.h>
59#include <usb.h>
60
61#include "ohci.h"
62
63#ifdef CONFIG_AT91RM9200
64#include <asm/arch/hardware.h>
65#endif
66
67#if defined(CONFIG_ARM920T) || \
68 defined(CONFIG_S3C24X0) || \
69 defined(CONFIG_S3C6400) || \
70 defined(CONFIG_440EP) || \
71 defined(CONFIG_PCI_OHCI) || \
72 defined(CONFIG_MPC5200) || \
73 defined(CONFIG_SYS_OHCI_USE_NPS)
74# define OHCI_USE_NPS
75#endif
76
77#undef OHCI_VERBOSE_DEBUG
78#undef DEBUG
79#undef SHOW_INFO
80#undef OHCI_FILL_TRACE
81
82
83#define OHCI_CONTROL_INIT \
84 (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE
85
86
87
88
89#ifdef CONFIG_SYS_OHCI_SWAP_REG_ACCESS
90# define readl(a) __swap_32(*((volatile u32 *)(a)))
91# define writel(a, b) (*((volatile u32 *)(b)) = __swap_32((volatile u32)a))
92#else
93# define readl(a) (*((volatile u32 *)(a)))
94# define writel(a, b) (*((volatile u32 *)(b)) = ((volatile u32)a))
95#endif
96
97#define min_t(type, x, y) \
98 ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
99
100#ifdef CONFIG_PCI_OHCI
101static struct pci_device_id ohci_pci_ids[] = {
102 {0x10b9, 0x5237},
103 {0x1033, 0x0035},
104 {0x1131, 0x1561},
105
106 {0, 0}
107};
108#endif
109
110#ifdef CONFIG_PCI_EHCI_DEVNO
111static struct pci_device_id ehci_pci_ids[] = {
112 {0x1131, 0x1562},
113
114 {0, 0}
115};
116#endif
117
118#ifdef DEBUG
119#define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg)
120#else
121#define dbg(format, arg...) do {} while (0)
122#endif
123#define err(format, arg...) printf("ERROR: " format "\n", ## arg)
124#ifdef SHOW_INFO
125#define info(format, arg...) printf("INFO: " format "\n", ## arg)
126#else
127#define info(format, arg...) do {} while (0)
128#endif
129
130#ifdef CONFIG_SYS_OHCI_BE_CONTROLLER
131# define m16_swap(x) cpu_to_be16(x)
132# define m32_swap(x) cpu_to_be32(x)
133#else
134# define m16_swap(x) cpu_to_le16(x)
135# define m32_swap(x) cpu_to_le32(x)
136#endif
137
138
139static ohci_t gohci;
140
141struct ohci_hcca ghcca[1];
142
143struct ohci_hcca *phcca;
144
145struct ohci_device ohci_dev;
146
147struct usb_device *devgone;
148
149static inline u32 roothub_a(struct ohci *hc)
150 { return readl(&hc->regs->roothub.a); }
151static inline u32 roothub_b(struct ohci *hc)
152 { return readl(&hc->regs->roothub.b); }
153static inline u32 roothub_status(struct ohci *hc)
154 { return readl(&hc->regs->roothub.status); }
155static inline u32 roothub_portstatus(struct ohci *hc, int i)
156 { return readl(&hc->regs->roothub.portstatus[i]); }
157
158
159static int hc_interrupt(void);
160static void td_submit_job(struct usb_device *dev, unsigned long pipe,
161 void *buffer, int transfer_len,
162 struct devrequest *setup, urb_priv_t *urb,
163 int interval);
164
165
166
167
168
169
170
171static void urb_free_priv(urb_priv_t *urb)
172{
173 int i;
174 int last;
175 struct td *td;
176
177 last = urb->length - 1;
178 if (last >= 0) {
179 for (i = 0; i <= last; i++) {
180 td = urb->td[i];
181 if (td) {
182 td->usb_dev = NULL;
183 urb->td[i] = NULL;
184 }
185 }
186 }
187 free(urb);
188}
189
190
191
192#ifdef DEBUG
193static int sohci_get_current_frame_number(struct usb_device *dev);
194
195
196
197
198static void pkt_print(urb_priv_t *purb, struct usb_device *dev,
199 unsigned long pipe, void *buffer, int transfer_len,
200 struct devrequest *setup, char *str, int small)
201{
202 dbg("%s URB:[%4x] dev:%2lu,ep:%2lu-%c,type:%s,len:%d/%d stat:%#lx",
203 str,
204 sohci_get_current_frame_number(dev),
205 usb_pipedevice(pipe),
206 usb_pipeendpoint(pipe),
207 usb_pipeout(pipe)? 'O': 'I',
208 usb_pipetype(pipe) < 2 ? \
209 (usb_pipeint(pipe)? "INTR": "ISOC"): \
210 (usb_pipecontrol(pipe)? "CTRL": "BULK"),
211 (purb ? purb->actual_length : 0),
212 transfer_len, dev->status);
213#ifdef OHCI_VERBOSE_DEBUG
214 if (!small) {
215 int i, len;
216
217 if (usb_pipecontrol(pipe)) {
218 printf(__FILE__ ": cmd(8):");
219 for (i = 0; i < 8 ; i++)
220 printf(" %02x", ((__u8 *) setup) [i]);
221 printf("\n");
222 }
223 if (transfer_len > 0 && buffer) {
224 printf(__FILE__ ": data(%d/%d):",
225 (purb ? purb->actual_length : 0),
226 transfer_len);
227 len = usb_pipeout(pipe)? transfer_len:
228 (purb ? purb->actual_length : 0);
229 for (i = 0; i < 16 && i < len; i++)
230 printf(" %02x", ((__u8 *) buffer) [i]);
231 printf("%s\n", i < len? "...": "");
232 }
233 }
234#endif
235}
236
237
238
239void ep_print_int_eds(ohci_t *ohci, char *str)
240{
241 int i, j;
242 __u32 *ed_p;
243 for (i = 0; i < 32; i++) {
244 j = 5;
245 ed_p = &(ohci->hcca->int_table [i]);
246 if (*ed_p == 0)
247 continue;
248 printf(__FILE__ ": %s branch int %2d(%2x):", str, i, i);
249 while (*ed_p != 0 && j--) {
250 ed_t *ed = (ed_t *)m32_swap(ed_p);
251 printf(" ed: %4x;", ed->hwINFO);
252 ed_p = &ed->hwNextED;
253 }
254 printf("\n");
255 }
256}
257
258static void ohci_dump_intr_mask(char *label, __u32 mask)
259{
260 dbg("%s: 0x%08x%s%s%s%s%s%s%s%s%s",
261 label,
262 mask,
263 (mask & OHCI_INTR_MIE) ? " MIE" : "",
264 (mask & OHCI_INTR_OC) ? " OC" : "",
265 (mask & OHCI_INTR_RHSC) ? " RHSC" : "",
266 (mask & OHCI_INTR_FNO) ? " FNO" : "",
267 (mask & OHCI_INTR_UE) ? " UE" : "",
268 (mask & OHCI_INTR_RD) ? " RD" : "",
269 (mask & OHCI_INTR_SF) ? " SF" : "",
270 (mask & OHCI_INTR_WDH) ? " WDH" : "",
271 (mask & OHCI_INTR_SO) ? " SO" : ""
272 );
273}
274
275static void maybe_print_eds(char *label, __u32 value)
276{
277 ed_t *edp = (ed_t *)value;
278
279 if (value) {
280 dbg("%s %08x", label, value);
281 dbg("%08x", edp->hwINFO);
282 dbg("%08x", edp->hwTailP);
283 dbg("%08x", edp->hwHeadP);
284 dbg("%08x", edp->hwNextED);
285 }
286}
287
288static char *hcfs2string(int state)
289{
290 switch (state) {
291 case OHCI_USB_RESET: return "reset";
292 case OHCI_USB_RESUME: return "resume";
293 case OHCI_USB_OPER: return "operational";
294 case OHCI_USB_SUSPEND: return "suspend";
295 }
296 return "?";
297}
298
299
300static void ohci_dump_status(ohci_t *controller)
301{
302 struct ohci_regs *regs = controller->regs;
303 __u32 temp;
304
305 temp = readl(®s->revision) & 0xff;
306 if (temp != 0x10)
307 dbg("spec %d.%d", (temp >> 4), (temp & 0x0f));
308
309 temp = readl(®s->control);
310 dbg("control: 0x%08x%s%s%s HCFS=%s%s%s%s%s CBSR=%d", temp,
311 (temp & OHCI_CTRL_RWE) ? " RWE" : "",
312 (temp & OHCI_CTRL_RWC) ? " RWC" : "",
313 (temp & OHCI_CTRL_IR) ? " IR" : "",
314 hcfs2string(temp & OHCI_CTRL_HCFS),
315 (temp & OHCI_CTRL_BLE) ? " BLE" : "",
316 (temp & OHCI_CTRL_CLE) ? " CLE" : "",
317 (temp & OHCI_CTRL_IE) ? " IE" : "",
318 (temp & OHCI_CTRL_PLE) ? " PLE" : "",
319 temp & OHCI_CTRL_CBSR
320 );
321
322 temp = readl(®s->cmdstatus);
323 dbg("cmdstatus: 0x%08x SOC=%d%s%s%s%s", temp,
324 (temp & OHCI_SOC) >> 16,
325 (temp & OHCI_OCR) ? " OCR" : "",
326 (temp & OHCI_BLF) ? " BLF" : "",
327 (temp & OHCI_CLF) ? " CLF" : "",
328 (temp & OHCI_HCR) ? " HCR" : ""
329 );
330
331 ohci_dump_intr_mask("intrstatus", readl(®s->intrstatus));
332 ohci_dump_intr_mask("intrenable", readl(®s->intrenable));
333
334 maybe_print_eds("ed_periodcurrent", readl(®s->ed_periodcurrent));
335
336 maybe_print_eds("ed_controlhead", readl(®s->ed_controlhead));
337 maybe_print_eds("ed_controlcurrent", readl(®s->ed_controlcurrent));
338
339 maybe_print_eds("ed_bulkhead", readl(®s->ed_bulkhead));
340 maybe_print_eds("ed_bulkcurrent", readl(®s->ed_bulkcurrent));
341
342 maybe_print_eds("donehead", readl(®s->donehead));
343}
344
345static void ohci_dump_roothub(ohci_t *controller, int verbose)
346{
347 __u32 temp, ndp, i;
348
349 temp = roothub_a(controller);
350 ndp = (temp & RH_A_NDP);
351#ifdef CONFIG_AT91C_PQFP_UHPBUG
352 ndp = (ndp == 2) ? 1:0;
353#endif
354 if (verbose) {
355 dbg("roothub.a: %08x POTPGT=%d%s%s%s%s%s NDP=%d", temp,
356 ((temp & RH_A_POTPGT) >> 24) & 0xff,
357 (temp & RH_A_NOCP) ? " NOCP" : "",
358 (temp & RH_A_OCPM) ? " OCPM" : "",
359 (temp & RH_A_DT) ? " DT" : "",
360 (temp & RH_A_NPS) ? " NPS" : "",
361 (temp & RH_A_PSM) ? " PSM" : "",
362 ndp
363 );
364 temp = roothub_b(controller);
365 dbg("roothub.b: %08x PPCM=%04x DR=%04x",
366 temp,
367 (temp & RH_B_PPCM) >> 16,
368 (temp & RH_B_DR)
369 );
370 temp = roothub_status(controller);
371 dbg("roothub.status: %08x%s%s%s%s%s%s",
372 temp,
373 (temp & RH_HS_CRWE) ? " CRWE" : "",
374 (temp & RH_HS_OCIC) ? " OCIC" : "",
375 (temp & RH_HS_LPSC) ? " LPSC" : "",
376 (temp & RH_HS_DRWE) ? " DRWE" : "",
377 (temp & RH_HS_OCI) ? " OCI" : "",
378 (temp & RH_HS_LPS) ? " LPS" : ""
379 );
380 }
381
382 for (i = 0; i < ndp; i++) {
383 temp = roothub_portstatus(controller, i);
384 dbg("roothub.portstatus [%d] = 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s",
385 i,
386 temp,
387 (temp & RH_PS_PRSC) ? " PRSC" : "",
388 (temp & RH_PS_OCIC) ? " OCIC" : "",
389 (temp & RH_PS_PSSC) ? " PSSC" : "",
390 (temp & RH_PS_PESC) ? " PESC" : "",
391 (temp & RH_PS_CSC) ? " CSC" : "",
392
393 (temp & RH_PS_LSDA) ? " LSDA" : "",
394 (temp & RH_PS_PPS) ? " PPS" : "",
395 (temp & RH_PS_PRS) ? " PRS" : "",
396 (temp & RH_PS_POCI) ? " POCI" : "",
397 (temp & RH_PS_PSS) ? " PSS" : "",
398
399 (temp & RH_PS_PES) ? " PES" : "",
400 (temp & RH_PS_CCS) ? " CCS" : ""
401 );
402 }
403}
404
405static void ohci_dump(ohci_t *controller, int verbose)
406{
407 dbg("OHCI controller usb-%s state", controller->slot_name);
408
409
410 ohci_dump_status(controller);
411 if (verbose)
412 ep_print_int_eds(controller, "hcca");
413 dbg("hcca frame #%04x", controller->hcca->frame_no);
414 ohci_dump_roothub(controller, 1);
415}
416#endif
417
418
419
420
421
422
423
424int sohci_submit_job(urb_priv_t *urb, struct devrequest *setup)
425{
426 ohci_t *ohci;
427 ed_t *ed;
428 urb_priv_t *purb_priv = urb;
429 int i, size = 0;
430 struct usb_device *dev = urb->dev;
431 unsigned long pipe = urb->pipe;
432 void *buffer = urb->transfer_buffer;
433 int transfer_len = urb->transfer_buffer_length;
434 int interval = urb->interval;
435
436 ohci = &gohci;
437
438
439
440 if (ohci->disabled) {
441 err("sohci_submit_job: EPIPE");
442 return -1;
443 }
444
445
446
447 urb->finished = 0;
448
449
450 ed = ep_add_ed(dev, pipe, interval, 1);
451 if (!ed) {
452 err("sohci_submit_job: ENOMEM");
453 return -1;
454 }
455
456
457 switch (usb_pipetype(pipe)) {
458 case PIPE_BULK:
459 size = (transfer_len - 1) / 4096 + 1;
460 break;
461 case PIPE_CONTROL:
462 size = (transfer_len == 0)? 2:
463 (transfer_len - 1) / 4096 + 3;
464 break;
465 case PIPE_INTERRUPT:
466 size = 1;
467 break;
468 }
469
470 ed->purb = urb;
471
472 if (size >= (N_URB_TD - 1)) {
473 err("need %d TDs, only have %d", size, N_URB_TD);
474 return -1;
475 }
476 purb_priv->pipe = pipe;
477
478
479 purb_priv->length = size;
480 purb_priv->ed = ed;
481 purb_priv->actual_length = 0;
482
483
484
485 for (i = 0; i < size; i++) {
486 purb_priv->td[i] = td_alloc(dev);
487 if (!purb_priv->td[i]) {
488 purb_priv->length = i;
489 urb_free_priv(purb_priv);
490 err("sohci_submit_job: ENOMEM");
491 return -1;
492 }
493 }
494
495 if (ed->state == ED_NEW || (ed->state & ED_DEL)) {
496 urb_free_priv(purb_priv);
497 err("sohci_submit_job: EINVAL");
498 return -1;
499 }
500
501
502 if (ed->state != ED_OPER)
503 ep_link(ohci, ed);
504
505
506 td_submit_job(dev, pipe, buffer, transfer_len,
507 setup, purb_priv, interval);
508
509 return 0;
510}
511
512static inline int sohci_return_job(struct ohci *hc, urb_priv_t *urb)
513{
514 struct ohci_regs *regs = hc->regs;
515
516 switch (usb_pipetype(urb->pipe)) {
517 case PIPE_INTERRUPT:
518
519 if (urb->dev->irq_handle &&
520 (urb->dev->irq_act_len = urb->actual_length)) {
521 writel(OHCI_INTR_WDH, ®s->intrenable);
522 readl(®s->intrenable);
523 urb->dev->irq_handle(urb->dev);
524 writel(OHCI_INTR_WDH, ®s->intrdisable);
525 readl(®s->intrdisable);
526 }
527 urb->actual_length = 0;
528 td_submit_job(
529 urb->dev,
530 urb->pipe,
531 urb->transfer_buffer,
532 urb->transfer_buffer_length,
533 NULL,
534 urb,
535 urb->interval);
536 break;
537 case PIPE_CONTROL:
538 case PIPE_BULK:
539 break;
540 default:
541 return 0;
542 }
543 return 1;
544}
545
546
547
548#ifdef DEBUG
549
550
551static int sohci_get_current_frame_number(struct usb_device *usb_dev)
552{
553 ohci_t *ohci = &gohci;
554
555 return m16_swap(ohci->hcca->frame_no);
556}
557#endif
558
559
560
561
562
563
564
565
566
567
568static int ep_int_ballance(ohci_t *ohci, int interval, int load)
569{
570 int i, branch = 0;
571
572
573
574
575 for (i = 0; i < 32; i++)
576 if (ohci->ohci_int_load [branch] > ohci->ohci_int_load [i])
577 branch = i;
578
579 branch = branch % interval;
580 for (i = branch; i < 32; i += interval)
581 ohci->ohci_int_load [i] += load;
582
583 return branch;
584}
585
586
587
588
589
590static int ep_2_n_interval(int inter)
591{
592 int i;
593 for (i = 0; ((inter >> i) > 1) && (i < 5); i++);
594 return 1 << i;
595}
596
597
598
599
600
601
602static int ep_rev(int num_bits, int word)
603{
604 int i, wout = 0;
605
606 for (i = 0; i < num_bits; i++)
607 wout |= (((word >> i) & 1) << (num_bits - i - 1));
608 return wout;
609}
610
611
612
613
614
615
616
617static int ep_link(ohci_t *ohci, ed_t *edi)
618{
619 volatile ed_t *ed = edi;
620 int int_branch;
621 int i;
622 int inter;
623 int interval;
624 int load;
625 __u32 *ed_p;
626
627 ed->state = ED_OPER;
628 ed->int_interval = 0;
629
630 switch (ed->type) {
631 case PIPE_CONTROL:
632 ed->hwNextED = 0;
633 if (ohci->ed_controltail == NULL)
634 writel(ed, &ohci->regs->ed_controlhead);
635 else
636 ohci->ed_controltail->hwNextED =
637 m32_swap((unsigned long)ed);
638
639 ed->ed_prev = ohci->ed_controltail;
640 if (!ohci->ed_controltail && !ohci->ed_rm_list[0] &&
641 !ohci->ed_rm_list[1] && !ohci->sleeping) {
642 ohci->hc_control |= OHCI_CTRL_CLE;
643 writel(ohci->hc_control, &ohci->regs->control);
644 }
645 ohci->ed_controltail = edi;
646 break;
647
648 case PIPE_BULK:
649 ed->hwNextED = 0;
650 if (ohci->ed_bulktail == NULL)
651 writel(ed, &ohci->regs->ed_bulkhead);
652 else
653 ohci->ed_bulktail->hwNextED =
654 m32_swap((unsigned long)ed);
655
656 ed->ed_prev = ohci->ed_bulktail;
657 if (!ohci->ed_bulktail && !ohci->ed_rm_list[0] &&
658 !ohci->ed_rm_list[1] && !ohci->sleeping) {
659 ohci->hc_control |= OHCI_CTRL_BLE;
660 writel(ohci->hc_control, &ohci->regs->control);
661 }
662 ohci->ed_bulktail = edi;
663 break;
664
665 case PIPE_INTERRUPT:
666 load = ed->int_load;
667 interval = ep_2_n_interval(ed->int_period);
668 ed->int_interval = interval;
669 int_branch = ep_int_ballance(ohci, interval, load);
670 ed->int_branch = int_branch;
671
672 for (i = 0; i < ep_rev(6, interval); i += inter) {
673 inter = 1;
674 for (ed_p = &(ohci->hcca->int_table[\
675 ep_rev(5, i) + int_branch]);
676 (*ed_p != 0) &&
677 (((ed_t *)ed_p)->int_interval >= interval);
678 ed_p = &(((ed_t *)ed_p)->hwNextED))
679 inter = ep_rev(6,
680 ((ed_t *)ed_p)->int_interval);
681 ed->hwNextED = *ed_p;
682 *ed_p = m32_swap((unsigned long)ed);
683 }
684 break;
685 }
686 return 0;
687}
688
689
690
691
692static void periodic_unlink(struct ohci *ohci, volatile struct ed *ed,
693 unsigned index, unsigned period)
694{
695 for (; index < NUM_INTS; index += period) {
696 __u32 *ed_p = &ohci->hcca->int_table [index];
697
698
699 while (*ed_p != 0) {
700 if (((struct ed *)
701 m32_swap((unsigned long)ed_p)) == ed) {
702 *ed_p = ed->hwNextED;
703 break;
704 }
705 ed_p = &(((struct ed *)
706 m32_swap((unsigned long)ed_p))->hwNextED);
707 }
708 }
709}
710
711
712
713
714
715
716static int ep_unlink(ohci_t *ohci, ed_t *edi)
717{
718 volatile ed_t *ed = edi;
719 int i;
720
721 ed->hwINFO |= m32_swap(OHCI_ED_SKIP);
722
723 switch (ed->type) {
724 case PIPE_CONTROL:
725 if (ed->ed_prev == NULL) {
726 if (!ed->hwNextED) {
727 ohci->hc_control &= ~OHCI_CTRL_CLE;
728 writel(ohci->hc_control, &ohci->regs->control);
729 }
730 writel(m32_swap(*((__u32 *)&ed->hwNextED)),
731 &ohci->regs->ed_controlhead);
732 } else {
733 ed->ed_prev->hwNextED = ed->hwNextED;
734 }
735 if (ohci->ed_controltail == ed) {
736 ohci->ed_controltail = ed->ed_prev;
737 } else {
738 ((ed_t *)m32_swap(
739 *((__u32 *)&ed->hwNextED)))->ed_prev = ed->ed_prev;
740 }
741 break;
742
743 case PIPE_BULK:
744 if (ed->ed_prev == NULL) {
745 if (!ed->hwNextED) {
746 ohci->hc_control &= ~OHCI_CTRL_BLE;
747 writel(ohci->hc_control, &ohci->regs->control);
748 }
749 writel(m32_swap(*((__u32 *)&ed->hwNextED)),
750 &ohci->regs->ed_bulkhead);
751 } else {
752 ed->ed_prev->hwNextED = ed->hwNextED;
753 }
754 if (ohci->ed_bulktail == ed) {
755 ohci->ed_bulktail = ed->ed_prev;
756 } else {
757 ((ed_t *)m32_swap(
758 *((__u32 *)&ed->hwNextED)))->ed_prev = ed->ed_prev;
759 }
760 break;
761
762 case PIPE_INTERRUPT:
763 periodic_unlink(ohci, ed, 0, 1);
764 for (i = ed->int_branch; i < 32; i += ed->int_interval)
765 ohci->ohci_int_load[i] -= ed->int_load;
766 break;
767 }
768 ed->state = ED_UNLINK;
769 return 0;
770}
771
772
773
774
775
776
777
778
779
780
781
782static ed_t *ep_add_ed(struct usb_device *usb_dev, unsigned long pipe,
783 int interval, int load)
784{
785 td_t *td;
786 ed_t *ed_ret;
787 volatile ed_t *ed;
788
789 ed = ed_ret = &ohci_dev.ed[(usb_pipeendpoint(pipe) << 1) |
790 (usb_pipecontrol(pipe)? 0: usb_pipeout(pipe))];
791
792 if ((ed->state & ED_DEL) || (ed->state & ED_URB_DEL)) {
793 err("ep_add_ed: pending delete");
794
795 return NULL;
796 }
797
798 if (ed->state == ED_NEW) {
799
800 td = td_alloc(usb_dev);
801 ed->hwTailP = m32_swap((unsigned long)td);
802 ed->hwHeadP = ed->hwTailP;
803 ed->state = ED_UNLINK;
804 ed->type = usb_pipetype(pipe);
805 ohci_dev.ed_cnt++;
806 }
807
808 ed->hwINFO = m32_swap(usb_pipedevice(pipe)
809 | usb_pipeendpoint(pipe) << 7
810 | (usb_pipeisoc(pipe)? 0x8000: 0)
811 | (usb_pipecontrol(pipe)? 0: \
812 (usb_pipeout(pipe)? 0x800: 0x1000))
813 | usb_pipeslow(pipe) << 13
814 | usb_maxpacket(usb_dev, pipe) << 16);
815
816 if (ed->type == PIPE_INTERRUPT && ed->state == ED_UNLINK) {
817 ed->int_period = interval;
818 ed->int_load = load;
819 }
820
821 return ed_ret;
822}
823
824
825
826
827
828
829
830static void td_fill(ohci_t *ohci, unsigned int info,
831 void *data, int len,
832 struct usb_device *dev, int index, urb_priv_t *urb_priv)
833{
834 volatile td_t *td, *td_pt;
835#ifdef OHCI_FILL_TRACE
836 int i;
837#endif
838
839 if (index > urb_priv->length) {
840 err("index > length");
841 return;
842 }
843
844 td_pt = urb_priv->td [index];
845 td_pt->hwNextTD = 0;
846
847
848 td = urb_priv->td [index] =
849 (td_t *)(m32_swap(urb_priv->ed->hwTailP) & ~0xf);
850
851 td->ed = urb_priv->ed;
852 td->next_dl_td = NULL;
853 td->index = index;
854 td->data = (__u32)data;
855#ifdef OHCI_FILL_TRACE
856 if (usb_pipebulk(urb_priv->pipe) && usb_pipeout(urb_priv->pipe)) {
857 for (i = 0; i < len; i++)
858 printf("td->data[%d] %#2x ", i, ((unsigned char *)td->data)[i]);
859 printf("\n");
860 }
861#endif
862 if (!len)
863 data = 0;
864
865 td->hwINFO = m32_swap(info);
866 td->hwCBP = m32_swap((unsigned long)data);
867 if (data)
868 td->hwBE = m32_swap((unsigned long)(data + len - 1));
869 else
870 td->hwBE = 0;
871
872 td->hwNextTD = m32_swap((unsigned long)td_pt);
873
874
875 td->ed->hwTailP = td->hwNextTD;
876}
877
878
879
880
881
882static void td_submit_job(struct usb_device *dev, unsigned long pipe,
883 void *buffer, int transfer_len,
884 struct devrequest *setup, urb_priv_t *urb,
885 int interval)
886{
887 ohci_t *ohci = &gohci;
888 int data_len = transfer_len;
889 void *data;
890 int cnt = 0;
891 __u32 info = 0;
892 unsigned int toggle = 0;
893
894
895
896 if (usb_gettoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe))) {
897 toggle = TD_T_TOGGLE;
898 } else {
899 toggle = TD_T_DATA0;
900 usb_settoggle(dev, usb_pipeendpoint(pipe),
901 usb_pipeout(pipe), 1);
902 }
903 urb->td_cnt = 0;
904 if (data_len)
905 data = buffer;
906 else
907 data = 0;
908
909 switch (usb_pipetype(pipe)) {
910 case PIPE_BULK:
911 info = usb_pipeout(pipe)?
912 TD_CC | TD_DP_OUT : TD_CC | TD_DP_IN ;
913 while (data_len > 4096) {
914 td_fill(ohci, info | (cnt? TD_T_TOGGLE:toggle),
915 data, 4096, dev, cnt, urb);
916 data += 4096; data_len -= 4096; cnt++;
917 }
918 info = usb_pipeout(pipe)?
919 TD_CC | TD_DP_OUT : TD_CC | TD_R | TD_DP_IN ;
920 td_fill(ohci, info | (cnt? TD_T_TOGGLE:toggle), data,
921 data_len, dev, cnt, urb);
922 cnt++;
923
924 if (!ohci->sleeping) {
925
926 writel(OHCI_BLF, &ohci->regs->cmdstatus);
927 }
928 break;
929
930 case PIPE_CONTROL:
931
932 info = TD_CC | TD_DP_SETUP | TD_T_DATA0;
933 td_fill(ohci, info, setup, 8, dev, cnt++, urb);
934
935
936 if (data_len > 0) {
937 info = usb_pipeout(pipe)?
938 TD_CC | TD_R | TD_DP_OUT | TD_T_DATA1 :
939 TD_CC | TD_R | TD_DP_IN | TD_T_DATA1;
940
941 td_fill(ohci, info, data, data_len, dev, cnt++, urb);
942 }
943
944
945 info = usb_pipeout(pipe)?
946 TD_CC | TD_DP_IN | TD_T_DATA1:
947 TD_CC | TD_DP_OUT | TD_T_DATA1;
948 td_fill(ohci, info, data, 0, dev, cnt++, urb);
949
950 if (!ohci->sleeping) {
951
952 writel(OHCI_CLF, &ohci->regs->cmdstatus);
953 }
954 break;
955
956 case PIPE_INTERRUPT:
957 info = usb_pipeout(urb->pipe)?
958 TD_CC | TD_DP_OUT | toggle:
959 TD_CC | TD_R | TD_DP_IN | toggle;
960 td_fill(ohci, info, data, data_len, dev, cnt++, urb);
961 break;
962 }
963 if (urb->length != cnt)
964 dbg("TD LENGTH %d != CNT %d", urb->length, cnt);
965}
966
967
968
969
970
971
972
973static void dl_transfer_length(td_t *td)
974{
975 __u32 tdINFO, tdBE, tdCBP;
976 urb_priv_t *lurb_priv = td->ed->purb;
977
978 tdINFO = m32_swap(td->hwINFO);
979 tdBE = m32_swap(td->hwBE);
980 tdCBP = m32_swap(td->hwCBP);
981
982 if (!(usb_pipecontrol(lurb_priv->pipe) &&
983 ((td->index == 0) || (td->index == lurb_priv->length - 1)))) {
984 if (tdBE != 0) {
985 if (td->hwCBP == 0)
986 lurb_priv->actual_length += tdBE - td->data + 1;
987 else
988 lurb_priv->actual_length += tdCBP - td->data;
989 }
990 }
991}
992
993
994static void check_status(td_t *td_list)
995{
996 urb_priv_t *lurb_priv = td_list->ed->purb;
997 int urb_len = lurb_priv->length;
998 __u32 *phwHeadP = &td_list->ed->hwHeadP;
999 int cc;
1000
1001 cc = TD_CC_GET(m32_swap(td_list->hwINFO));
1002 if (cc) {
1003 err(" USB-error: %s (%x)", cc_to_string[cc], cc);
1004
1005 if (*phwHeadP & m32_swap(0x1)) {
1006 if (lurb_priv &&
1007 ((td_list->index + 1) < urb_len)) {
1008 *phwHeadP =
1009 (lurb_priv->td[urb_len - 1]->hwNextTD &\
1010 m32_swap(0xfffffff0)) |
1011 (*phwHeadP & m32_swap(0x2));
1012
1013 lurb_priv->td_cnt += urb_len -
1014 td_list->index - 1;
1015 } else
1016 *phwHeadP &= m32_swap(0xfffffff2);
1017 }
1018#ifdef CONFIG_MPC5200
1019 td_list->hwNextTD = 0;
1020#endif
1021 }
1022}
1023
1024
1025
1026static td_t *dl_reverse_done_list(ohci_t *ohci)
1027{
1028 __u32 td_list_hc;
1029 td_t *td_rev = NULL;
1030 td_t *td_list = NULL;
1031
1032 td_list_hc = m32_swap(ohci->hcca->done_head) & 0xfffffff0;
1033 ohci->hcca->done_head = 0;
1034
1035 while (td_list_hc) {
1036 td_list = (td_t *)td_list_hc;
1037 check_status(td_list);
1038 td_list->next_dl_td = td_rev;
1039 td_rev = td_list;
1040 td_list_hc = m32_swap(td_list->hwNextTD) & 0xfffffff0;
1041 }
1042 return td_list;
1043}
1044
1045
1046
1047
1048static void finish_urb(ohci_t *ohci, urb_priv_t *urb, int status)
1049{
1050 if ((status & (ED_OPER | ED_UNLINK)) && (urb->state != URB_DEL))
1051 urb->finished = sohci_return_job(ohci, urb);
1052 else
1053 dbg("finish_urb: strange.., ED state %x, \n", status);
1054}
1055
1056
1057
1058
1059
1060
1061
1062static int takeback_td(ohci_t *ohci, td_t *td_list)
1063{
1064 ed_t *ed;
1065 int cc;
1066 int stat = 0;
1067
1068 urb_priv_t *lurb_priv;
1069 __u32 tdINFO, edHeadP, edTailP;
1070
1071 tdINFO = m32_swap(td_list->hwINFO);
1072
1073 ed = td_list->ed;
1074 lurb_priv = ed->purb;
1075
1076 dl_transfer_length(td_list);
1077
1078 lurb_priv->td_cnt++;
1079
1080
1081 cc = TD_CC_GET(tdINFO);
1082 if (cc) {
1083 err("USB-error: %s (%x)", cc_to_string[cc], cc);
1084 stat = cc_to_error[cc];
1085 }
1086
1087
1088
1089 if (lurb_priv->td_cnt == lurb_priv->length)
1090 finish_urb(ohci, lurb_priv, ed->state);
1091
1092 dbg("dl_done_list: processing TD %x, len %x\n",
1093 lurb_priv->td_cnt, lurb_priv->length);
1094
1095 if (ed->state != ED_NEW && (!usb_pipeint(lurb_priv->pipe))) {
1096 edHeadP = m32_swap(ed->hwHeadP) & 0xfffffff0;
1097 edTailP = m32_swap(ed->hwTailP);
1098
1099
1100 if ((edHeadP == edTailP) && (ed->state == ED_OPER))
1101 ep_unlink(ohci, ed);
1102 }
1103 return stat;
1104}
1105
1106static int dl_done_list(ohci_t *ohci)
1107{
1108 int stat = 0;
1109 td_t *td_list = dl_reverse_done_list(ohci);
1110
1111 while (td_list) {
1112 td_t *td_next = td_list->next_dl_td;
1113 stat = takeback_td(ohci, td_list);
1114 td_list = td_next;
1115 }
1116 return stat;
1117}
1118
1119
1120
1121
1122
1123
1124static __u8 root_hub_dev_des[] =
1125{
1126 0x12,
1127 0x01,
1128 0x10,
1129 0x01,
1130 0x09,
1131 0x00,
1132 0x00,
1133 0x08,
1134 0x00,
1135 0x00,
1136 0x00,
1137 0x00,
1138 0x00,
1139 0x00,
1140 0x00,
1141 0x01,
1142 0x00,
1143 0x01
1144};
1145
1146
1147static __u8 root_hub_config_des[] =
1148{
1149 0x09,
1150 0x02,
1151 0x19,
1152 0x00,
1153 0x01,
1154 0x01,
1155 0x00,
1156 0x40,
1157
1158 0x00,
1159
1160
1161 0x09,
1162 0x04,
1163 0x00,
1164 0x00,
1165 0x01,
1166 0x09,
1167 0x00,
1168 0x00,
1169 0x00,
1170
1171
1172 0x07,
1173 0x05,
1174 0x81,
1175 0x03,
1176 0x02,
1177 0x00,
1178 0xff
1179};
1180
1181static unsigned char root_hub_str_index0[] =
1182{
1183 0x04,
1184 0x03,
1185 0x09,
1186 0x04,
1187};
1188
1189static unsigned char root_hub_str_index1[] =
1190{
1191 28,
1192 0x03,
1193 'O',
1194 0,
1195 'H',
1196 0,
1197 'C',
1198 0,
1199 'I',
1200 0,
1201 ' ',
1202 0,
1203 'R',
1204 0,
1205 'o',
1206 0,
1207 'o',
1208 0,
1209 't',
1210 0,
1211 ' ',
1212 0,
1213 'H',
1214 0,
1215 'u',
1216 0,
1217 'b',
1218 0,
1219};
1220
1221
1222
1223
1224
1225#define OK(x) len = (x); break
1226#ifdef DEBUG
1227#define WR_RH_STAT(x) {info("WR:status %#8x", (x)); writel((x), \
1228 &gohci.regs->roothub.status); }
1229#define WR_RH_PORTSTAT(x) {info("WR:portstatus[%d] %#8x", wIndex-1, \
1230 (x)); writel((x), &gohci.regs->roothub.portstatus[wIndex-1]); }
1231#else
1232#define WR_RH_STAT(x) writel((x), &gohci.regs->roothub.status)
1233#define WR_RH_PORTSTAT(x) writel((x), \
1234 &gohci.regs->roothub.portstatus[wIndex-1])
1235#endif
1236#define RD_RH_STAT roothub_status(&gohci)
1237#define RD_RH_PORTSTAT roothub_portstatus(&gohci, wIndex-1)
1238
1239
1240
1241int rh_check_port_status(ohci_t *controller)
1242{
1243 __u32 temp, ndp, i;
1244 int res;
1245
1246 res = -1;
1247 temp = roothub_a(controller);
1248 ndp = (temp & RH_A_NDP);
1249#ifdef CONFIG_AT91C_PQFP_UHPBUG
1250 ndp = (ndp == 2) ? 1:0;
1251#endif
1252 for (i = 0; i < ndp; i++) {
1253 temp = roothub_portstatus(controller, i);
1254
1255 if (((temp & (RH_PS_PESC | RH_PS_CSC)) ==
1256 (RH_PS_PESC | RH_PS_CSC)) &&
1257 ((temp & RH_PS_CCS) == 0)) {
1258 res = i;
1259 break;
1260 }
1261 }
1262 return res;
1263}
1264
1265static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
1266 void *buffer, int transfer_len, struct devrequest *cmd)
1267{
1268 void *data = buffer;
1269 int leni = transfer_len;
1270 int len = 0;
1271 int stat = 0;
1272 __u32 datab[4];
1273 __u8 *data_buf = (__u8 *)datab;
1274 __u16 bmRType_bReq;
1275 __u16 wValue;
1276 __u16 wIndex;
1277 __u16 wLength;
1278
1279#ifdef DEBUG
1280pkt_print(NULL, dev, pipe, buffer, transfer_len,
1281 cmd, "SUB(rh)", usb_pipein(pipe));
1282#else
1283 wait_ms(1);
1284#endif
1285 if (usb_pipeint(pipe)) {
1286 info("Root-Hub submit IRQ: NOT implemented");
1287 return 0;
1288 }
1289
1290 bmRType_bReq = cmd->requesttype | (cmd->request << 8);
1291 wValue = le16_to_cpu(cmd->value);
1292 wIndex = le16_to_cpu(cmd->index);
1293 wLength = le16_to_cpu(cmd->length);
1294
1295 info("Root-Hub: adr: %2x cmd(%1x): %08x %04x %04x %04x",
1296 dev->devnum, 8, bmRType_bReq, wValue, wIndex, wLength);
1297
1298 switch (bmRType_bReq) {
1299
1300
1301
1302
1303
1304
1305
1306
1307 case RH_GET_STATUS:
1308 *(__u16 *) data_buf = cpu_to_le16(1);
1309 OK(2);
1310 case RH_GET_STATUS | RH_INTERFACE:
1311 *(__u16 *) data_buf = cpu_to_le16(0);
1312 OK(2);
1313 case RH_GET_STATUS | RH_ENDPOINT:
1314 *(__u16 *) data_buf = cpu_to_le16(0);
1315 OK(2);
1316 case RH_GET_STATUS | RH_CLASS:
1317 *(__u32 *) data_buf = cpu_to_le32(
1318 RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));
1319 OK(4);
1320 case RH_GET_STATUS | RH_OTHER | RH_CLASS:
1321 *(__u32 *) data_buf = cpu_to_le32(RD_RH_PORTSTAT);
1322 OK(4);
1323
1324 case RH_CLEAR_FEATURE | RH_ENDPOINT:
1325 switch (wValue) {
1326 case (RH_ENDPOINT_STALL):
1327 OK(0);
1328 }
1329 break;
1330
1331 case RH_CLEAR_FEATURE | RH_CLASS:
1332 switch (wValue) {
1333 case RH_C_HUB_LOCAL_POWER:
1334 OK(0);
1335 case (RH_C_HUB_OVER_CURRENT):
1336 WR_RH_STAT(RH_HS_OCIC);
1337 OK(0);
1338 }
1339 break;
1340
1341 case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
1342 switch (wValue) {
1343 case (RH_PORT_ENABLE): WR_RH_PORTSTAT(RH_PS_CCS); OK(0);
1344 case (RH_PORT_SUSPEND): WR_RH_PORTSTAT(RH_PS_POCI); OK(0);
1345 case (RH_PORT_POWER): WR_RH_PORTSTAT(RH_PS_LSDA); OK(0);
1346 case (RH_C_PORT_CONNECTION): WR_RH_PORTSTAT(RH_PS_CSC); OK(0);
1347 case (RH_C_PORT_ENABLE): WR_RH_PORTSTAT(RH_PS_PESC); OK(0);
1348 case (RH_C_PORT_SUSPEND): WR_RH_PORTSTAT(RH_PS_PSSC); OK(0);
1349 case (RH_C_PORT_OVER_CURRENT):WR_RH_PORTSTAT(RH_PS_OCIC); OK(0);
1350 case (RH_C_PORT_RESET): WR_RH_PORTSTAT(RH_PS_PRSC); OK(0);
1351 }
1352 break;
1353
1354 case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
1355 switch (wValue) {
1356 case (RH_PORT_SUSPEND):
1357 WR_RH_PORTSTAT(RH_PS_PSS); OK(0);
1358 case (RH_PORT_RESET):
1359 if (RD_RH_PORTSTAT & RH_PS_CCS)
1360 WR_RH_PORTSTAT(RH_PS_PRS);
1361 OK(0);
1362 case (RH_PORT_POWER):
1363 WR_RH_PORTSTAT(RH_PS_PPS);
1364 wait_ms(100);
1365 OK(0);
1366 case (RH_PORT_ENABLE):
1367 if (RD_RH_PORTSTAT & RH_PS_CCS)
1368 WR_RH_PORTSTAT(RH_PS_PES);
1369 OK(0);
1370 }
1371 break;
1372
1373 case RH_SET_ADDRESS:
1374 gohci.rh.devnum = wValue;
1375 OK(0);
1376
1377 case RH_GET_DESCRIPTOR:
1378 switch ((wValue & 0xff00) >> 8) {
1379 case (0x01):
1380 len = min_t(unsigned int,
1381 leni,
1382 min_t(unsigned int,
1383 sizeof(root_hub_dev_des),
1384 wLength));
1385 data_buf = root_hub_dev_des; OK(len);
1386 case (0x02):
1387 len = min_t(unsigned int,
1388 leni,
1389 min_t(unsigned int,
1390 sizeof(root_hub_config_des),
1391 wLength));
1392 data_buf = root_hub_config_des; OK(len);
1393 case (0x03):
1394 if (wValue == 0x0300) {
1395 len = min_t(unsigned int,
1396 leni,
1397 min_t(unsigned int,
1398 sizeof(root_hub_str_index0),
1399 wLength));
1400 data_buf = root_hub_str_index0;
1401 OK(len);
1402 }
1403 if (wValue == 0x0301) {
1404 len = min_t(unsigned int,
1405 leni,
1406 min_t(unsigned int,
1407 sizeof(root_hub_str_index1),
1408 wLength));
1409 data_buf = root_hub_str_index1;
1410 OK(len);
1411 }
1412 default:
1413 stat = USB_ST_STALLED;
1414 }
1415 break;
1416
1417 case RH_GET_DESCRIPTOR | RH_CLASS:
1418 {
1419 __u32 temp = roothub_a(&gohci);
1420
1421 data_buf [0] = 9;
1422 data_buf [1] = 0x29;
1423 data_buf [2] = temp & RH_A_NDP;
1424#ifdef CONFIG_AT91C_PQFP_UHPBUG
1425 data_buf [2] = (data_buf [2] == 2) ? 1:0;
1426#endif
1427 data_buf [3] = 0;
1428 if (temp & RH_A_PSM)
1429 data_buf [3] |= 0x1;
1430 if (temp & RH_A_NOCP)
1431 data_buf [3] |= 0x10;
1432 else if (temp & RH_A_OCPM)
1433 data_buf [3] |= 0x8;
1434
1435
1436 datab [1] = 0;
1437 data_buf [5] = (temp & RH_A_POTPGT) >> 24;
1438 temp = roothub_b(&gohci);
1439 data_buf [7] = temp & RH_B_DR;
1440 if (data_buf [2] < 7) {
1441 data_buf [8] = 0xff;
1442 } else {
1443 data_buf [0] += 2;
1444 data_buf [8] = (temp & RH_B_DR) >> 8;
1445 data_buf [10] = data_buf [9] = 0xff;
1446 }
1447
1448 len = min_t(unsigned int, leni,
1449 min_t(unsigned int, data_buf [0], wLength));
1450 OK(len);
1451 }
1452
1453 case RH_GET_CONFIGURATION: *(__u8 *) data_buf = 0x01; OK(1);
1454
1455 case RH_SET_CONFIGURATION: WR_RH_STAT(0x10000); OK(0);
1456
1457 default:
1458 dbg("unsupported root hub command");
1459 stat = USB_ST_STALLED;
1460 }
1461
1462#ifdef DEBUG
1463 ohci_dump_roothub(&gohci, 1);
1464#else
1465 wait_ms(1);
1466#endif
1467
1468 len = min_t(int, len, leni);
1469 if (data != data_buf)
1470 memcpy(data, data_buf, len);
1471 dev->act_len = len;
1472 dev->status = stat;
1473
1474#ifdef DEBUG
1475 pkt_print(NULL, dev, pipe, buffer,
1476 transfer_len, cmd, "RET(rh)", 0);
1477#else
1478 wait_ms(1);
1479#endif
1480
1481 return stat;
1482}
1483
1484
1485
1486
1487
1488int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
1489 int transfer_len, struct devrequest *setup, int interval)
1490{
1491 int stat = 0;
1492 int maxsize = usb_maxpacket(dev, pipe);
1493 int timeout;
1494 urb_priv_t *urb;
1495
1496 urb = malloc(sizeof(urb_priv_t));
1497 memset(urb, 0, sizeof(urb_priv_t));
1498
1499 urb->dev = dev;
1500 urb->pipe = pipe;
1501 urb->transfer_buffer = buffer;
1502 urb->transfer_buffer_length = transfer_len;
1503 urb->interval = interval;
1504
1505
1506 if (devgone == dev) {
1507 dev->status = USB_ST_CRC_ERR;
1508 return 0;
1509 }
1510
1511#ifdef DEBUG
1512 urb->actual_length = 0;
1513 pkt_print(urb, dev, pipe, buffer, transfer_len,
1514 setup, "SUB", usb_pipein(pipe));
1515#else
1516 wait_ms(1);
1517#endif
1518 if (!maxsize) {
1519 err("submit_common_message: pipesize for pipe %lx is zero",
1520 pipe);
1521 return -1;
1522 }
1523
1524 if (sohci_submit_job(urb, setup) < 0) {
1525 err("sohci_submit_job failed");
1526 return -1;
1527 }
1528
1529#if 0
1530 wait_ms(10);
1531
1532#endif
1533
1534
1535#define BULK_TO 5000
1536 if (usb_pipebulk(pipe))
1537 timeout = BULK_TO;
1538 else
1539 timeout = 100;
1540
1541
1542 for (;;) {
1543
1544 stat = hc_interrupt();
1545 if (stat < 0) {
1546 stat = USB_ST_CRC_ERR;
1547 break;
1548 }
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559 if ((stat >= 0) && (stat != 0xff) && (urb->finished)) {
1560
1561 break;
1562 }
1563
1564 if (--timeout) {
1565 wait_ms(1);
1566 if (!urb->finished)
1567 dbg("*");
1568
1569 } else {
1570 err("CTL:TIMEOUT ");
1571 dbg("submit_common_msg: TO status %x\n", stat);
1572 urb->finished = 1;
1573 stat = USB_ST_CRC_ERR;
1574 break;
1575 }
1576 }
1577
1578 dev->status = stat;
1579 dev->act_len = transfer_len;
1580
1581#ifdef DEBUG
1582 pkt_print(urb, dev, pipe, buffer, transfer_len,
1583 setup, "RET(ctlr)", usb_pipein(pipe));
1584#else
1585 wait_ms(1);
1586#endif
1587
1588
1589 if (!usb_pipeint(pipe))
1590 urb_free_priv(urb);
1591 return 0;
1592}
1593
1594
1595int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
1596 int transfer_len)
1597{
1598 info("submit_bulk_msg");
1599 return submit_common_msg(dev, pipe, buffer, transfer_len, NULL, 0);
1600}
1601
1602int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
1603 int transfer_len, struct devrequest *setup)
1604{
1605 int maxsize = usb_maxpacket(dev, pipe);
1606
1607 info("submit_control_msg");
1608#ifdef DEBUG
1609 pkt_print(NULL, dev, pipe, buffer, transfer_len,
1610 setup, "SUB", usb_pipein(pipe));
1611#else
1612 wait_ms(1);
1613#endif
1614 if (!maxsize) {
1615 err("submit_control_message: pipesize for pipe %lx is zero",
1616 pipe);
1617 return -1;
1618 }
1619 if (((pipe >> 8) & 0x7f) == gohci.rh.devnum) {
1620 gohci.rh.dev = dev;
1621
1622 return ohci_submit_rh_msg(dev, pipe, buffer, transfer_len,
1623 setup);
1624 }
1625
1626 return submit_common_msg(dev, pipe, buffer, transfer_len, setup, 0);
1627}
1628
1629int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
1630 int transfer_len, int interval)
1631{
1632 info("submit_int_msg");
1633 return submit_common_msg(dev, pipe, buffer, transfer_len, NULL,
1634 interval);
1635}
1636
1637
1638
1639
1640
1641
1642
1643static int hc_reset(ohci_t *ohci)
1644{
1645#ifdef CONFIG_PCI_EHCI_DEVNO
1646 pci_dev_t pdev;
1647#endif
1648 int timeout = 30;
1649 int smm_timeout = 50;
1650
1651 dbg("%s\n", __FUNCTION__);
1652
1653#ifdef CONFIG_PCI_EHCI_DEVNO
1654
1655
1656
1657
1658 pdev = pci_find_devices(ehci_pci_ids, CONFIG_PCI_EHCI_DEVNO);
1659 if (pdev != -1) {
1660 u32 base;
1661 int timeout = 1000;
1662
1663 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &base);
1664 writel(readl(base + EHCI_USBCMD_OFF) | EHCI_USBCMD_HCRESET,
1665 base + EHCI_USBCMD_OFF);
1666
1667 while (readl(base + EHCI_USBCMD_OFF) & EHCI_USBCMD_HCRESET) {
1668 if (timeout-- <= 0) {
1669 printf("USB RootHub reset timed out!");
1670 break;
1671 }
1672 udelay(1);
1673 }
1674 } else
1675 printf("No EHCI func at %d index!\n", CONFIG_PCI_EHCI_DEVNO);
1676#endif
1677 if (readl(&ohci->regs->control) & OHCI_CTRL_IR) {
1678
1679 writel(OHCI_OCR, &ohci->regs->cmdstatus);
1680 info("USB HC TakeOver from SMM");
1681 while (readl(&ohci->regs->control) & OHCI_CTRL_IR) {
1682 wait_ms(10);
1683 if (--smm_timeout == 0) {
1684 err("USB HC TakeOver failed!");
1685 return -1;
1686 }
1687 }
1688 }
1689
1690
1691 writel(OHCI_INTR_MIE, &ohci->regs->intrdisable);
1692
1693 dbg("USB HC reset_hc usb-%s: ctrl = 0x%X ;\n",
1694 ohci->slot_name,
1695 readl(&ohci->regs->control));
1696
1697
1698 ohci->hc_control = 0;
1699 writel(ohci->hc_control, &ohci->regs->control);
1700
1701
1702 writel(OHCI_HCR, &ohci->regs->cmdstatus);
1703 while ((readl(&ohci->regs->cmdstatus) & OHCI_HCR) != 0) {
1704 if (--timeout == 0) {
1705 err("USB HC reset timed out!");
1706 return -1;
1707 }
1708 udelay(1);
1709 }
1710 return 0;
1711}
1712
1713
1714
1715
1716
1717
1718
1719static int hc_start(ohci_t *ohci)
1720{
1721 __u32 mask;
1722 unsigned int fminterval;
1723
1724 ohci->disabled = 1;
1725
1726
1727
1728
1729 writel(0, &ohci->regs->ed_controlhead);
1730 writel(0, &ohci->regs->ed_bulkhead);
1731
1732 writel((__u32)ohci->hcca, &ohci->regs->hcca);
1733
1734 fminterval = 0x2edf;
1735 writel((fminterval * 9) / 10, &ohci->regs->periodicstart);
1736 fminterval |= ((((fminterval - 210) * 6) / 7) << 16);
1737 writel(fminterval, &ohci->regs->fminterval);
1738 writel(0x628, &ohci->regs->lsthresh);
1739
1740
1741 ohci->hc_control = OHCI_CONTROL_INIT | OHCI_USB_OPER;
1742 ohci->disabled = 0;
1743 writel(ohci->hc_control, &ohci->regs->control);
1744
1745
1746 mask = (OHCI_INTR_SO | OHCI_INTR_WDH | OHCI_INTR_SF | OHCI_INTR_RD |
1747 OHCI_INTR_UE | OHCI_INTR_FNO | OHCI_INTR_RHSC |
1748 OHCI_INTR_OC | OHCI_INTR_MIE);
1749 writel(mask, &ohci->regs->intrdisable);
1750
1751 mask &= ~OHCI_INTR_MIE;
1752 writel(mask, &ohci->regs->intrstatus);
1753
1754 mask = OHCI_INTR_RHSC | OHCI_INTR_UE | OHCI_INTR_WDH | OHCI_INTR_SO;
1755 writel(mask, &ohci->regs->intrenable);
1756
1757#ifdef OHCI_USE_NPS
1758
1759 writel((roothub_a(ohci) | RH_A_NPS) & ~RH_A_PSM,
1760 &ohci->regs->roothub.a);
1761 writel(RH_HS_LPSC, &ohci->regs->roothub.status);
1762#endif
1763
1764#define mdelay(n) ({unsigned long msec = (n); while (msec--) udelay(1000); })
1765
1766 mdelay((roothub_a(ohci) >> 23) & 0x1fe);
1767
1768
1769 ohci->rh.devnum = 0;
1770
1771 return 0;
1772}
1773
1774
1775
1776
1777void usb_event_poll(void)
1778{
1779 hc_interrupt();
1780}
1781
1782
1783
1784static int hc_interrupt(void)
1785{
1786 ohci_t *ohci = &gohci;
1787 struct ohci_regs *regs = ohci->regs;
1788 int ints;
1789 int stat = -1;
1790
1791 if ((ohci->hcca->done_head != 0) &&
1792 !(m32_swap(ohci->hcca->done_head) & 0x01)) {
1793 ints = OHCI_INTR_WDH;
1794 } else {
1795 ints = readl(®s->intrstatus);
1796 if (ints == ~(u32)0) {
1797 ohci->disabled++;
1798 err("%s device removed!", ohci->slot_name);
1799 return -1;
1800 } else {
1801 ints &= readl(®s->intrenable);
1802 if (ints == 0) {
1803 dbg("hc_interrupt: returning..\n");
1804 return 0xff;
1805 }
1806 }
1807 }
1808
1809
1810
1811
1812 if (ints & OHCI_INTR_RHSC)
1813 stat = 0xff;
1814
1815 if (ints & OHCI_INTR_UE) {
1816 ohci->disabled++;
1817 err("OHCI Unrecoverable Error, controller usb-%s disabled",
1818 ohci->slot_name);
1819
1820
1821#ifdef DEBUG
1822 ohci_dump(ohci, 1);
1823#else
1824 wait_ms(1);
1825#endif
1826
1827
1828
1829
1830 hc_reset(ohci);
1831 return -1;
1832 }
1833
1834 if (ints & OHCI_INTR_WDH) {
1835 wait_ms(1);
1836 writel(OHCI_INTR_WDH, ®s->intrdisable);
1837 (void)readl(®s->intrdisable);
1838 stat = dl_done_list(&gohci);
1839 writel(OHCI_INTR_WDH, ®s->intrenable);
1840 (void)readl(®s->intrdisable);
1841 }
1842
1843 if (ints & OHCI_INTR_SO) {
1844 dbg("USB Schedule overrun\n");
1845 writel(OHCI_INTR_SO, ®s->intrenable);
1846 stat = -1;
1847 }
1848
1849
1850 if (ints & OHCI_INTR_SF) {
1851 unsigned int frame = m16_swap(ohci->hcca->frame_no) & 1;
1852 wait_ms(1);
1853 writel(OHCI_INTR_SF, ®s->intrdisable);
1854 if (ohci->ed_rm_list[frame] != NULL)
1855 writel(OHCI_INTR_SF, ®s->intrenable);
1856 stat = 0xff;
1857 }
1858
1859 writel(ints, ®s->intrstatus);
1860 return stat;
1861}
1862
1863
1864
1865
1866
1867
1868
1869static void hc_release_ohci(ohci_t *ohci)
1870{
1871 dbg("USB HC release ohci usb-%s", ohci->slot_name);
1872
1873 if (!ohci->disabled)
1874 hc_reset(ohci);
1875}
1876
1877
1878
1879
1880
1881
1882static char ohci_inited = 0;
1883
1884int usb_lowlevel_init(void)
1885{
1886#ifdef CONFIG_PCI_OHCI
1887 pci_dev_t pdev;
1888#endif
1889
1890#ifdef CONFIG_SYS_USB_OHCI_CPU_INIT
1891
1892 if (usb_cpu_init())
1893 return -1;
1894#endif
1895
1896#ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
1897
1898 if (usb_board_init())
1899 return -1;
1900#endif
1901 memset(&gohci, 0, sizeof(ohci_t));
1902
1903
1904 if ((__u32)&ghcca[0] & 0xff) {
1905 err("HCCA not aligned!!");
1906 return -1;
1907 }
1908 phcca = &ghcca[0];
1909 info("aligned ghcca %p", phcca);
1910 memset(&ohci_dev, 0, sizeof(struct ohci_device));
1911 if ((__u32)&ohci_dev.ed[0] & 0x7) {
1912 err("EDs not aligned!!");
1913 return -1;
1914 }
1915 memset(gtd, 0, sizeof(td_t) * (NUM_TD + 1));
1916 if ((__u32)gtd & 0x7) {
1917 err("TDs not aligned!!");
1918 return -1;
1919 }
1920 ptd = gtd;
1921 gohci.hcca = phcca;
1922 memset(phcca, 0, sizeof(struct ohci_hcca));
1923
1924 gohci.disabled = 1;
1925 gohci.sleeping = 0;
1926 gohci.irq = -1;
1927#ifdef CONFIG_PCI_OHCI
1928 pdev = pci_find_devices(ohci_pci_ids, CONFIG_PCI_OHCI_DEVNO);
1929
1930 if (pdev != -1) {
1931 u16 vid, did;
1932 u32 base;
1933 pci_read_config_word(pdev, PCI_VENDOR_ID, &vid);
1934 pci_read_config_word(pdev, PCI_DEVICE_ID, &did);
1935 printf("OHCI pci controller (%04x, %04x) found @(%d:%d:%d)\n",
1936 vid, did, (pdev >> 16) & 0xff,
1937 (pdev >> 11) & 0x1f, (pdev >> 8) & 0x7);
1938 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &base);
1939 printf("OHCI regs address 0x%08x\n", base);
1940 gohci.regs = (struct ohci_regs *)base;
1941 } else
1942 return -1;
1943#else
1944 gohci.regs = (struct ohci_regs *)CONFIG_SYS_USB_OHCI_REGS_BASE;
1945#endif
1946
1947 gohci.flags = 0;
1948 gohci.slot_name = CONFIG_SYS_USB_OHCI_SLOT_NAME;
1949
1950 if (hc_reset (&gohci) < 0) {
1951 hc_release_ohci (&gohci);
1952 err ("can't reset usb-%s", gohci.slot_name);
1953#ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
1954
1955 usb_board_init_fail();
1956#endif
1957
1958#ifdef CONFIG_SYS_USB_OHCI_CPU_INIT
1959
1960 usb_cpu_init_fail();
1961#endif
1962 return -1;
1963 }
1964
1965 if (hc_start(&gohci) < 0) {
1966 err("can't start usb-%s", gohci.slot_name);
1967 hc_release_ohci(&gohci);
1968
1969#ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
1970
1971 usb_board_stop();
1972#endif
1973
1974#ifdef CONFIG_SYS_USB_OHCI_CPU_INIT
1975
1976 usb_cpu_stop();
1977#endif
1978 return -1;
1979 }
1980
1981#ifdef DEBUG
1982 ohci_dump(&gohci, 1);
1983#else
1984 wait_ms(1);
1985#endif
1986 ohci_inited = 1;
1987 return 0;
1988}
1989
1990int usb_lowlevel_stop(void)
1991{
1992
1993
1994 if (!ohci_inited)
1995 return 0;
1996
1997
1998 hc_reset(&gohci);
1999
2000#ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
2001
2002 if (usb_board_stop())
2003 return -1;
2004#endif
2005
2006#ifdef CONFIG_SYS_USB_OHCI_CPU_INIT
2007
2008 if (usb_cpu_stop())
2009 return -1;
2010#endif
2011
2012
2013 ohci_inited = 0;
2014 return 0;
2015}
2016