xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvEHCI_SCHD.cxx (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 
79 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
80 
81 int ehci_get_frame (struct usb_hcd *hcd);
82 
83 /*-------------------------------------------------------------------------*/
84 
85 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
86 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
87 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
88 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
89 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
90 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
91 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
92 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
93 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
94 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
95 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
96 
97 static union ehci_shadow *
periodic_next_shadow(union ehci_shadow * periodic,int tag)98 periodic_next_shadow (union ehci_shadow *periodic, int tag)
99 {
100   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
101   switch (tag) {
102   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
103   case Q_TYPE_QH:
104     return &periodic->qh->qh_next;
105 #ifdef have_fstn
106   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
107   case Q_TYPE_FSTN:
108     return &periodic->fstn->fstn_next;
109 #endif
110   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
111   case Q_TYPE_ITD:
112     return &periodic->itd->itd_next;
113 #ifdef have_split_iso
114   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
115   case Q_TYPE_SITD:
116     return &periodic->sitd->sitd_next;
117 #endif
118   }
119   dbg ("[periodic_next_shadow] BAD shadow %p tag %d", periodic->ptr, tag);
120   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
121   return 0;
122 }
123 
124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
periodic_unlink(struct ehci_hcd * ehci,U32 frame,void * ptr)125 static int periodic_unlink (struct ehci_hcd *ehci, U32 frame, void *ptr)
126 {
127   union ehci_shadow  *prev_p = &ehci->pshadow [frame];
128   U32      *hw_p = &ehci->periodic [frame];
129   union ehci_shadow  here = *prev_p;
130   union ehci_shadow  *next_p1;
131 
132   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
133   while (here.ptr && here.ptr != ptr) {
134   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
135     prev_p = periodic_next_shadow (prev_p, Q_NEXT_TYPE (*hw_p));
136     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
137     hw_p = &here.qh->hw_next;
138     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139     here = *prev_p;
140   }
141   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
142   if (!here.ptr) {
143     dbg ("[periodic_unlink] entry %p no longer on frame [%d]", ptr, frame);
144     return 0;
145   }
146   // vdbg ("periodic unlink %p from frame %d", ptr, frame);
147 
148   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
149   next_p1 = periodic_next_shadow (&here, Q_NEXT_TYPE (*hw_p));
150   *hw_p = here.qh->hw_next;
151 
152   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
153   *prev_p = *next_p1;
154   next_p1->ptr = 0;
155 
156   return 1;
157 }
158 
159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170 
171 static U16
periodic_usecs(struct ehci_hcd * ehci,U32 frame,U32 uframe)172 periodic_usecs (struct ehci_hcd *ehci, U32 frame, U32 uframe)
173 {
174   U32      *hw_p = &ehci->periodic [frame];
175   union ehci_shadow  *q = &ehci->pshadow [frame];
176   U32    usecs = 0;
177 
178   while (q->ptr) {
179     switch (Q_NEXT_TYPE (*hw_p)) {
180     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
181     case Q_TYPE_QH:
182       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
183       if (q->qh->hw_info2 & CPUToLE32 (1 << uframe))
184         usecs += q->qh->usecs;
185       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
186       if (q->qh->hw_info2 & CPUToLE32 (1 << (8 + uframe)))
187         usecs += q->qh->c_usecs;
188       q = &q->qh->qh_next;
189       break;
190 #ifdef have_fstn
191     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192     case Q_TYPE_FSTN:
193       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194       if (q->fstn->hw_prev != EHCI_LIST_END) {
195         dbg ("not counting FSTN bandwidth yet ...%s","");
196       }
197       q = &q->fstn->fstn_next;
198       break;
199 #endif
200     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
201     case Q_TYPE_ITD:
202       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
203       if (q->itd->hw_transaction [uframe] != 0)
204         usecs += q->itd->usecs;
205       q = &q->itd->itd_next;
206       break;
207 #ifdef have_split_iso
208     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
209     case Q_TYPE_SITD:
210       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
211       temp = q->sitd->hw_fullspeed_ep &
212         CPUToLE32 (1 << 31);
213 
214 
215       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
216       if (q->sitd->hw_uframe & CPUToLE32 (1 << uframe)) {
217         if (temp)
218           usecs += HS_USECS (188);
219         else
220           usecs += HS_USECS (1);
221       }
222 
223       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
224       if (q->sitd->hw_uframe &
225           CPUToLE32 (1 << (8 + uframe))) {
226         if (temp)
227           usecs += HS_USECS (0);
228         else
229           usecs += HS_USECS (188);
230       }
231       q = &q->sitd->sitd_next;
232       break;
233 #endif /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234     default:
235       BUG ();
236     }
237   }
238 #ifdef  DEBUG
239   #ifndef CONFIG_FARADAY_FOTG200
240   if (usecs > 100)
241     err ("overallocated uframe %d, periodic is %d usecs",
242       frame * 8 + uframe, usecs);
243   #endif
244 #endif
245   return usecs;
246 }
247 
248 /*-------------------------------------------------------------------------*/
249 
250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
260 
enable_periodic(struct ehci_hcd * ehci)261 static int enable_periodic (struct ehci_hcd *ehci)
262 {
263   U32  cmd;
264   int  status;
265 
266   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
267   status = handshake (&ehci->regs->status, STS_PSS, 0, 9 * 125);
268   if (status != 0) {
269     ehci->hcd.state = USB_STATE_HALT;
270     return status;
271   }
272 
273   cmd = ehci_readl ((U32)&ehci->regs->command) | CMD_PSE;
274   ehci_writel (cmd, (U32)&ehci->regs->command);
275   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
276   ehci->hcd.state = USB_STATE_RUNNING;
277 
278   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
279   ehci->next_uframe = ehci_readl ((U32)&ehci->regs->frame_index)
280         % (ehci->periodic_size << 3);
281   return 0;
282 }
283 
disable_periodic(struct ehci_hcd * ehci)284 static int disable_periodic (struct ehci_hcd *ehci)
285 {
286   U32  cmd;
287   int  status;
288 
289   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290   status = handshake (&ehci->regs->status, STS_PSS, STS_PSS, 9 * 125);
291   if (status != 0) {
292     //ehci->hcd.state = USB_STATE_HALT; //Note, Fix me
293     return status;
294   }
295 
296   cmd = ehci_readl ((U32)&ehci->regs->command) & ~CMD_PSE;
297   ehci_writel (cmd, (U32)&ehci->regs->command);
298   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
299 
300   ehci->next_uframe = -1;
301   return 0;
302 }
303 
304 /*-------------------------------------------------------------------------*/
305 
306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
317 
intr_deschedule(struct ehci_hcd * ehci,struct ehci_qh * qh1,int wait)318 static void intr_deschedule (
319   struct ehci_hcd  *ehci,
320   struct ehci_qh  *qh1,
321   int    wait
322 ) {
323   int    status;
324   U32  frame = qh1->start;
325 
326   do {
327     periodic_unlink (ehci, frame, qh1);
328     qh_put (ehci, qh1);
329     frame += qh1->period;
330   } while (frame < ehci->periodic_size);
331 
332   qh1->qh_state = QH_STATE_UNLINK;
333   qh1->qh_next.ptr = 0;
334   ehci->periodic_sched--;
335 
336   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
337   if (!ehci->periodic_sched)
338     status = disable_periodic (ehci);
339   else {
340     status = 0;
341     vdbg ("periodic schedule still enabled%s%s","","");
342   }
343 
344   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
345   if (((ehci_get_frame (&ehci->hcd) - frame) % qh1->period) == 0) {
346     if (wait) {
347       udelay (125);
348       qh1->hw_next = EHCI_LIST_END;
349     } else {
350       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
351       vdbg ("intr_deschedule...%s%s","","");
352     }
353   } else
354     qh1->hw_next = EHCI_LIST_END;
355 
356   qh1->qh_state = QH_STATE_IDLE;
357 
358   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
359   hcd_to_bus (&ehci->hcd)->bandwidth_allocated -=
360     (qh1->usecs + qh1->c_usecs) / qh1->period;
361 
362   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
363   dbg ("descheduled qh %p, period = %d frame = %d count = %d, urbs = %d",
364     qh1, qh1->period, frame,
365     atomic_read(&qh1->refcount), ehci->periodic_sched);
366 }
367 
check_period(struct ehci_hcd * ehci,U32 frame,U32 uframe,U32 period,U32 usecs)368 static int check_period (
369   struct ehci_hcd *ehci,
370   U32  frame,
371   U32  uframe,
372   U32  period,
373   U32  usecs
374 ) {
375   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
376   if (uframe >= 8)
377     return 0;
378 
379   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
380   #ifndef CONFIG_FARADAY_FOTG200
381   usecs = 100 - usecs;
382   #else
383   if ( eCurURBSpeed == USB_SPEED_HIGH )
384     usecs = 100 - usecs;
385   else
386     usecs = 900 - usecs;
387   #endif
388 
389   do {
390     int  claimed;
391 
392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
393     if (ehci->pshadow [frame].ptr)
394       return 0;
395 
396     claimed = periodic_usecs (ehci, frame, uframe);
397     if ((U32)claimed > usecs)
398       return 0;
399 
400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401   } while ((frame += period) < ehci->periodic_size);
402 
403   // success!
404   return 1;
405 }
406 
check_intr_schedule(struct ehci_hcd * ehci,U32 frame,U32 uframe,const struct ehci_qh * qh,U32 * c_maskp)407 static int check_intr_schedule (
408   struct ehci_hcd    *ehci,
409   U32    frame,
410   U32    uframe,
411   const struct ehci_qh  *qh,
412   U32      *c_maskp
413 )
414 {
415       int    retval = -ENOSPC;
416 
417   if (!check_period (ehci, frame, uframe, qh->period, qh->usecs))
418     goto done;
419   #ifndef CONFIG_FARADAY_FOTG200
420   if (!qh->c_usecs) {
421     retval = 0;
422     *c_maskp = CPUToLE32 (0);
423     goto done;
424   }
425   #endif
426 
427   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428   #ifndef CONFIG_FARADAY_FOTG200
429   if (!check_period (ehci, frame, uframe + qh->gap_uf + 1,
430         qh->period, qh->c_usecs))
431     goto done;
432   if (!check_period (ehci, frame, uframe + qh->gap_uf,
433         qh->period, qh->c_usecs))
434     goto done;
435 
436   *c_maskp = CPUToLE32 (0x03 << (8 + uframe + qh->gap_uf));
437   #endif
438   retval = 0;
439 done:
440   return retval;
441 }
442 
443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
qh_schedule(struct ehci_hcd * ehci,struct ehci_qh * qh)444 static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh)
445 {
446   int     status;
447   U32  uframe1;
448   U32    c_mask1;
449   U32  frame1;
450 
451   qh->hw_next = EHCI_LIST_END;
452   frame1 = qh->start;
453 
454   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
455   if (frame1 < qh->period) {
456     uframe1 = ffs (LE32ToCPU(qh->hw_info2) & 0x00ff);
457     status = check_intr_schedule (ehci, frame1, --uframe1,
458         qh, &c_mask1);
459   } else {
460     uframe1 = 0;
461     c_mask1 = 0;
462     status = -ENOSPC;
463   }
464 
465   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
466   if (status) {
467     frame1 = qh->period - 1;
468     do {
469       for (uframe1 = 0; uframe1 < 8; uframe1++) {
470         status = check_intr_schedule (ehci,
471             frame1, uframe1, qh,
472             &c_mask1);
473         if (status == 0)
474           break;
475       }
476     } while (status && frame1--);
477     if (status)
478       goto done;
479     qh->start = frame1;
480 
481     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
482     qh->hw_info2 &= ~0xffff;
483     qh->hw_info2 |= CPUToLE32 (1 << uframe1) | c_mask1;
484   } else
485     dbg ("reused previous qh %p schedule", qh);
486 
487   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488   qh->qh_state = QH_STATE_LINKED;
489   dbg ("[qh_schedule] scheduled qh %p usecs %d/%d period %d.0 starting %d.%d (gap %d)",
490     qh, qh->usecs, qh->c_usecs,
491     qh->period, frame1, uframe1, qh->gap_uf);
492   do {
493     if (unlikely (ehci->pshadow [frame1].ptr != 0)) {
494 
495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496 
497       BUG ();
498     } else {
499       ehci->pshadow [frame1].qh = qh_get (qh);
500       ehci->periodic [frame1] =
501         QH_NEXT (qh->qh_dma);
502     }
503     wmb ();
504     frame1 += qh->period;
505   } while (frame1 < ehci->periodic_size);
506 
507   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
508   hcd_to_bus (&ehci->hcd)->bandwidth_allocated +=
509     (qh->usecs + qh->c_usecs) / qh->period;
510 
511   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512   if (!ehci->periodic_sched++)
513     status = enable_periodic (ehci);
514 done:
515   return status;
516 }
517 
518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
528 
intr_submit(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int mem_flags)529 static int intr_submit (
530   struct ehci_hcd    *ehci,
531   struct urb    *urb,
532   struct list_head  *qtd_list,
533   int      mem_flags
534 ) {
535   U32    epnum1;
536   U32    flags;
537   struct ehci_qh    *qh1;
538   struct hcd_dev    *dev;
539   int      is_input;
540   int      status = 0;
541   struct list_head  empty;
542 
543   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
544   epnum1 = usb_pipeendpoint (urb->pipe);
545   is_input = usb_pipein (urb->pipe);
546   if (is_input)
547     epnum1 |= 0x10;
548 
549   spin_lock_irqsave (&ehci->lock, flags);
550   dev = (struct hcd_dev *)urb->dev->hcpriv;
551 
552   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
553   INIT_LIST_HEAD (&empty);
554   qh1 = qh_append_tds (ehci, urb, &empty, epnum1, &dev->ep [epnum1]);
555   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
556   if (qh1 == 0) {
557     status = -ENOMEM;
558     goto done;
559   }
560   if (qh1->qh_state == QH_STATE_IDLE) {
561     if ((status = qh_schedule (ehci, qh1)) != 0)
562       goto done;
563   }
564 
565   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
566   qh1 = qh_append_tds (ehci, urb, qtd_list, epnum1, &dev->ep [epnum1]);
567 
568 
569   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
570   hcd_to_bus (&ehci->hcd)->bandwidth_int_reqs++;
571 
572   //#ifdef ENABLE_PIPE_FLUSH
573   Chip_Flush_Memory();
574   //#endif
575 
576 done:
577 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
578   spin_unlock_irqrestore (&ehci->lock, flags);
579   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
580   if (status)
581     qtd_list_free (ehci, urb, qtd_list);
582 
583   return status;
584 }
585 
586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
597 
598 static U32
intr_complete(struct ehci_hcd * ehci,U32 frame,struct ehci_qh * qh,struct pt_regs * regs)599 intr_complete (
600   struct ehci_hcd  *ehci,
601   U32  frame,
602   struct ehci_qh  *qh,
603   struct pt_regs  *regs
604 ) {
605   U32  count;
606 
607   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
608   if (likely ((qh->hw_token & CPUToLE32 (QTD_STS_ACTIVE))
609       != 0))
610     return 0;
611 
612   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
613   if (unlikely (list_empty (&qh->qtd_list))) {
614     dbg ("[intr qh] %p no TDs?", qh);
615     return 0;
616   }
617 
618   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
619   count = qh_completions (ehci, qh, regs);
620 
621   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
622   if (unlikely (list_empty (&qh->qtd_list)))
623     intr_deschedule (ehci, qh, 0);
624 
625   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
626   return count;
627 }
628 
629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
639 
640 #ifdef have_iso_itd
641 /*-------------------------------------------------------------------------*/
642 static void
itd_free_list(struct ehci_hcd * ehci,struct urb * urb)643 itd_free_list (struct ehci_hcd *ehci, struct urb *urb)
644 {
645 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
646   struct ehci_itd *first_itd = (struct ehci_itd *) urb->hcpriv;
647 
648   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
649   while (!list_empty (&first_itd->itd_list)) {
650     struct ehci_itd  *itd;
651 
652     itd = list_entry (first_itd->itd_list.next,  struct ehci_itd, itd_list);
653     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
654     list_del (&itd->itd_list);
655     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
656     pci_pool_free (ehci->itd_pool, itd, itd->itd_dma);
657   }
658   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
659   pci_pool_free (ehci->itd_pool, first_itd, first_itd->itd_dma);
660   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
661   urb->hcpriv = 0;
662 }
663 
664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
674 
675 static int
itd_fill(struct ehci_hcd * ehci,struct ehci_itd * itd,struct urb * urb,U32 index,dma_addr_t dma)676 itd_fill (
677   struct ehci_hcd  *ehci,
678   struct ehci_itd  *itd,
679   struct urb  *urb,
680   U32  index,
681   dma_addr_t  dma
682 ) {
683   cyg_uint64    temp;
684   U32    buf1;
685   U32  i, epnum, maxp, multi;
686   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
687   int   length;
688   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
689   int    is_input;
690 
691   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
692   itd->hw_next = EHCI_LIST_END;
693   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
694   itd->urb = urb;
695   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
696   itd->index = index;
697 
698   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
699   length = urb->iso_frame_desc [index].length;
700   dma += urb->iso_frame_desc [index].offset;
701   temp = dma & ~0x0fff;
702   for (i = 0; i < 2; i++) {
703     itd->hw_bufp [i] = CPUToLE32 ((U32) temp);
704     itd->hw_bufp_hi [i] = CPUToLE32 ((U32)(temp >> 32));
705     temp += 0x1000;
706   }
707   itd->buf_dma = dma;
708 
709   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
710   epnum = usb_pipeendpoint (urb->pipe);
711   is_input = usb_pipein (urb->pipe);
712   if (is_input) {
713     maxp = urb->dev->epmaxpacketin [epnum];
714     buf1 = (1 << 11);
715   } else {
716     maxp = urb->dev->epmaxpacketout [epnum];
717     buf1 = 0;
718   }
719   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
720   buf1 |= (maxp & 0x03ff);
721   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
722   multi = 1;
723   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
724   multi += (maxp >> 11) & 0x03;
725   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
726   maxp &= 0x03ff;
727   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
728   maxp *= multi;
729 
730   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
731   if ( (length < 0) || (maxp < (U32) length) ) {
732     dbg ("BAD iso packet: %d bytes, max %d, urb %p [%d] (of %d)",
733       length, maxp, urb, index,
734       urb->iso_frame_desc [index].length);
735     return -ENOSPC;
736   }
737   itd->usecs = usb_calc_bus_time (USB_SPEED_HIGH, is_input, 1, length);
738 
739   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
740   itd->hw_bufp [0] |= CPUToLE32 ((epnum << 8) | urb->dev->devnum);
741   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
742   itd->hw_bufp [1] |= CPUToLE32 (buf1);
743   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
744   itd->hw_bufp [2] |= CPUToLE32 (multi);
745 
746   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
747   itd->transaction = EHCI_ISOC_ACTIVE;
748   itd->transaction |= dma & 0x0fff;
749   if ((index + 1) == (U32) urb->number_of_packets)
750     itd->transaction |= EHCI_ITD_IOC;
751   itd->transaction |= length << 16;
752   itd->transaction = CPUToLE32(itd->transaction);
753 
754   return 0;
755 }
756 
757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
766 
767 static int
itd_urb_transaction(struct ehci_hcd * ehci,struct urb * urb,int mem_flags)768 itd_urb_transaction (
769   struct ehci_hcd    *ehci,
770   struct urb    *urb,
771   int      mem_flags
772 ) {
773 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
774   int      frame_index;
775   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
776   struct ehci_itd    *first_itd, *itd;
777   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
778   int      status;
779   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
780   dma_addr_t    itd_dma;
781 
782   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
783   for (frame_index = 0, first_itd = 0;
784       frame_index < urb->number_of_packets;
785       frame_index++) {
786     itd = (struct ehci_itd*) pci_pool_alloc (ehci->itd_pool, mem_flags, &itd_dma);
787     if (!itd) {
788       status = -ENOMEM;
789       goto fail;
790     }
791     memset (itd, 0, sizeof *itd);
792     itd->itd_dma = itd_dma;
793 
794     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
795     status = itd_fill (ehci, itd, urb, frame_index,
796         urb->transfer_dma);
797     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
798     if (status != 0)
799       goto fail;
800 
801     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
802     if (first_itd)
803       list_add_tail (&itd->itd_list,
804           &first_itd->itd_list);
805     else {
806     	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
807       INIT_LIST_HEAD (&itd->itd_list);
808       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
809       urb->hcpriv = first_itd = itd;
810     }
811   }
812   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
813   urb->error_count = 0;
814   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
815   return 0;
816 
817 fail:
818 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
819   if (urb->hcpriv)
820     itd_free_list (ehci, urb);
821   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
822   return status;
823 }
824 
825 /*-------------------------------------------------------------------------*/
826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
832 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
833 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
835 
836 static inline void
itd_link(struct ehci_hcd * ehci,U32 frame,struct ehci_itd * itd)837 itd_link (struct ehci_hcd *ehci, U32 frame, struct ehci_itd *itd)
838 {
839   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
840   itd->itd_next = ehci->pshadow [frame];
841   itd->hw_next = ehci->periodic [frame];
842   ehci->pshadow [frame].itd = itd;
843   ehci->periodic [frame] = CPUToLE32 (itd->itd_dma) | Q_TYPE_ITD;
844 }
845 
846 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
get_iso_range(struct ehci_hcd * ehci,struct urb * urb,U32 * start,U32 * max,U32 mod)847 static int get_iso_range (
848   struct ehci_hcd    *ehci,
849   struct urb    *urb,
850   U32    *start,
851   U32    *max,
852   U32    mod
853 ) {
854   struct list_head  *lh;
855   struct hcd_dev    *dev = (struct hcd_dev*) urb->dev->hcpriv;
856   int      last = -1;
857   U32    now, span, end;
858 
859   span = urb->interval * urb->number_of_packets;
860 
861   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
862   list_for_each (lh, &dev->urb_list) {
863     struct urb  *u;
864     struct ehci_itd  *itd;
865     U32  s;
866 
867     u = list_entry (lh, struct urb, urb_list);
868     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
869     if (u == urb || u->pipe != urb->pipe)
870       continue;
871     if (u->interval != urb->interval) {
872       dbg ("urb %p interval %d ... != %p interval %d",
873         u, u->interval, urb, urb->interval);
874       return -EINVAL;
875     }
876 
877     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
878     itd = (struct ehci_itd*) urb->hcpriv;
879     s = itd->uframe + u->interval * u->number_of_packets;
880     if (last < 0)
881       last = s;
882     else {
883 
884       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
885       dbg ("NYET: queue >2 URBs per ISO endpoint%s%s","","");
886       return -EDOM;
887     }
888   }
889 
890   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
891   now = ehci_readl ((U32)&ehci->regs->frame_index) + 1;
892   if (!ehci->periodic_sched)
893     now += 8;
894   now %= mod;
895   end = now + mod;
896   if (last < 0) {
897     *start = now + ehci->i_thresh +  1;
898     *max = end - span;
899     if (*max < *start + 1)
900       *max = *start + 1;
901   } else {
902     *start = last % mod;
903     *max = (last + 1) % mod;
904   }
905 
906   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
907   if (!(urb->transfer_flags & URB_ISO_ASAP)) {
908     U32  temp;
909 
910     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
911     urb->start_frame %= ehci->periodic_size;
912     temp = urb->start_frame << 3;
913     if (temp < *start)
914       temp += mod;
915     if (temp > *max)
916       return -EDOM;
917 
918     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
919     *start = urb->start_frame << 3;
920     temp += 8;
921     if (temp < *max)
922       *max = temp;
923   }
924 
925   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
926 
927   *max %= ehci->periodic_size;
928   if ((*start + span) < end)
929     return 0;
930   return -EFBIG;
931 }
932 
933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
943 
944 static int
itd_schedule(struct ehci_hcd * ehci,struct urb * urb)945 itd_schedule (struct ehci_hcd *ehci, struct urb *urb)
946 {
947   U32  start, max, i;
948   int    status;
949   U32  mod = ehci->periodic_size << 3;
950 
951   for (i = 0; i < (U32) urb->number_of_packets; i++) {
952     urb->iso_frame_desc [i].status = (U32) -EINPROGRESS;
953     urb->iso_frame_desc [i].actual_length = 0;
954   }
955 
956   if ((status = get_iso_range (ehci, urb, &start, &max, mod)) != 0)
957     return status;
958 
959   do {
960     U32  uframe;
961     U32  usecs;
962     struct ehci_itd  *itd;
963 
964     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
965     itd = (struct ehci_itd*) urb->hcpriv;
966     uframe = start;
967     for (i = 0, uframe = start;
968         i < (U32) urb->number_of_packets;
969         i++, uframe += urb->interval) {
970       uframe %= mod;
971 
972       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
973       if (periodic_usecs (ehci, uframe >> 3, uframe & 0x7)
974           > (100 - itd->usecs)) {
975         itd = 0;
976         break;
977       }
978       itd = list_entry (itd->itd_list.next,  struct ehci_itd, itd_list);
979       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
980     }
981     if (!itd)
982       continue;
983 
984     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
985     itd = (struct ehci_itd*) urb->hcpriv;
986     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
987     urb->start_frame = start >> 3;
988     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
989     vdbg ("[ISO] urb %p (%d packets period %d) starting %d.%d",
990       urb, urb->number_of_packets, urb->interval,
991       urb->start_frame, start & 0x7);
992 
993     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
994     for (i = 0, uframe = start, usecs = 0;
995         i < (U32) urb->number_of_packets;
996         i++, uframe += urb->interval) {
997       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
998       uframe %= mod;
999 
1000       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1001       itd->uframe = uframe;
1002       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1003       itd->hw_transaction [uframe & 0x07] = itd->transaction;
1004       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1005       itd_link (ehci, (uframe >> 3) % ehci->periodic_size,
1006         itd);
1007       wmb ();
1008       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1009       usecs += itd->usecs;
1010 
1011       itd = list_entry (itd->itd_list.next, struct ehci_itd, itd_list);
1012       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1013     }
1014 
1015     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1016     usecs /= urb->number_of_packets;
1017     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1018     usecs /= urb->interval;
1019     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1020     usecs >>= 3;
1021     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1022     if (usecs < 1)
1023       usecs = 1;
1024     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1025     usb_claim_bandwidth (urb->dev, urb, usecs, 1);
1026 
1027     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1028     if (!ehci->periodic_sched++) {
1029       if ((status =  enable_periodic (ehci)) != 0) {
1030         err ("[itd_schedule], enable = %d", status);
1031       }
1032     }
1033     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1034     return 0;
1035     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1036     ++start;
1037     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1038     start  %=  mod;
1039     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1040   } while ((start) != max);
1041 
1042   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1043   dbg ("[urb] %p, CAN'T SCHEDULE", urb);
1044   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1045   return -ENOSPC;
1046 }
1047 
1048 /*-------------------------------------------------------------------------*/
1049 
1050 #define  ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR)
1051 
1052 /*-------------------------------------------------------------------------*/
1053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1063 
itd_submit(struct ehci_hcd * ehci,struct urb * urb,int mem_flags)1064 static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags)
1065 {
1066   int    status;
1067   U32  flags;
1068 
1069   dbg ("itd_submit urb %p", urb);
1070 
1071   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1072   status = itd_urb_transaction (ehci, urb, mem_flags);
1073   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1074   if (status < 0)
1075     return status;
1076 
1077   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1078   spin_lock_irqsave (&ehci->lock, flags);
1079   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1080   status = itd_schedule (ehci, urb);
1081 
1082   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1083   Chip_Flush_Memory();
1084 
1085   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1086   spin_unlock_irqrestore (&ehci->lock, flags);
1087   if (status < 0)
1088     itd_free_list (ehci, urb);
1089 
1090   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1091   return status;
1092 }
1093 #endif
1094 
1095 #ifdef have_split_iso
1096 
1097 /*-------------------------------------------------------------------------*/
1098 
1099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1109 
1110 #endif
1111 
1112 /*-------------------------------------------------------------------------*/
1113 
1114 static void
scan_periodic(struct ehci_hcd * ehci,struct pt_regs * regs)1115 scan_periodic (struct ehci_hcd *ehci, struct pt_regs *regs)
1116 {
1117   U32  frame, clock, now_uframe, mod;
1118   U32  count = 0;
1119 
1120   mod = ehci->periodic_size << 3;
1121 
1122   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1123   frame = ehci->next_uframe >> 3;
1124   if (HCD_IS_RUNNING (ehci->hcd.state))
1125     now_uframe = ehci_readl ((U32)&ehci->regs->frame_index);
1126   else
1127     now_uframe = (frame << 3) - 1;
1128   now_uframe %= mod;
1129   clock = now_uframe >> 3;
1130 
1131   for (;;) {
1132     union ehci_shadow  q, *q_p;
1133     U32      type, *hw_p;
1134     U32    uframes;
1135 
1136 restart:
1137     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1138     if (frame == clock)
1139       uframes = now_uframe & 0x07;
1140     else
1141       uframes = 8;
1142 
1143     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1144     q_p = &ehci->pshadow [frame];
1145     hw_p = &ehci->periodic [frame];
1146     q.ptr = q_p->ptr;
1147     type = Q_NEXT_TYPE (*hw_p);
1148 
1149     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1150     while (q.ptr != 0) {
1151       int      last;
1152       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1153       union ehci_shadow  temp;
1154 
1155       switch (type) {
1156       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1157       case Q_TYPE_QH:
1158       	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1159         last = (q.qh->hw_next == EHCI_LIST_END);
1160         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1161         temp = q.qh->qh_next;
1162         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1163         type = Q_NEXT_TYPE (q.qh->hw_next);
1164         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1165         count += intr_complete (ehci, frame,
1166             qh_get (q.qh), regs);
1167         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1168         qh_put (ehci, q.qh);
1169         q = temp;
1170         break;
1171 #ifdef have_fstn
1172       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1173       case Q_TYPE_FSTN:
1174       	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1175         last = (q.fstn->hw_next == EHCI_LIST_END);
1176         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1177         if (q.fstn->hw_prev != EHCI_LIST_END) {
1178           dbg ("ignoring completions from FSTNs%s%s","","");
1179         }
1180         type = Q_NEXT_TYPE (q.fstn->hw_next);
1181         q = q.fstn->fstn_next;
1182         break;
1183 #endif
1184 #ifdef have_iso
1185       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1186       case Q_TYPE_ITD:
1187       	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1188         last = (q.itd->hw_next == EHCI_LIST_END);
1189 
1190         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1191         for (uf = 0; uf < uframes; uf++) {
1192         	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1193           if (q.itd->hw_transaction [uf] != 0) {
1194           	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1195             temp = q;
1196             *q_p = q.itd->itd_next;
1197             *hw_p = q.itd->hw_next;
1198             type = Q_NEXT_TYPE (*hw_p);
1199 
1200             /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1201             count += itd_complete (ehci,
1202               temp.itd, uf, regs);
1203             break;
1204           }
1205         }
1206         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1207         if (uf == uframes) {
1208           q_p = &q.itd->itd_next;
1209           hw_p = &q.itd->hw_next;
1210           type = Q_NEXT_TYPE (q.itd->hw_next);
1211         }
1212 
1213         q = *q_p;
1214         break;
1215 #endif
1216 #ifdef have_split_iso
1217       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1218       case Q_TYPE_SITD:
1219       	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1220         last = (q.sitd->hw_next == EHCI_LIST_END);
1221         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1222         sitd_complete (ehci, q.sitd);
1223         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1224         type = Q_NEXT_TYPE (q.sitd->hw_next);
1225 
1226         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1227         q = q.sitd->sitd_next;
1228         break;
1229 #endif
1230       default:
1231       	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1232         dbg ("corrupt type %d frame %d shadow %p",
1233           type, frame, q.ptr);
1234         // BUG ();
1235         last = 1;
1236         q.ptr = 0;
1237       }
1238 
1239       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1240       if (unlikely (q.ptr == 0 && !last))
1241         goto restart;
1242     }
1243 
1244     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1245     if (frame == clock) {
1246       U32  now;
1247       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1248       if (!HCD_IS_RUNNING (ehci->hcd.state))
1249         break;
1250       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1251       ehci->next_uframe = now_uframe;
1252       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1253       now = ehci_readl ((U32)&ehci->regs->frame_index) % mod;
1254       if (now_uframe == now)
1255         break;
1256 
1257       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1258       now_uframe = now;
1259       clock = now_uframe >> 3;
1260     } else
1261       frame = (frame + 1) % ehci->periodic_size;
1262   }
1263 }
1264 
1265