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