xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvHCD.c (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 #include <MsCommon.h>
82 #ifdef CONFIG_USB_DEBUG
83 #define DEBUG
84 #endif
85 
86 
87 #include  "include/drvConfig.h"
88 #include  "include/drvCompiler.h"
89 #include  "include/drvErrno.h"
90 #include  "include/drvPorts.h"
91 #include  "include/drvPCIMEM.h"
92 #include  "include/drvIO.h"
93 #include  "include/drvTimer.h"
94 #include  "include/drvList.h"
95 #include  "include/drvCompletion.h"
96 #include  "include/drvOSAPI.h"
97 #include  "include/drvKernel.h"
98 #include  "include/drvBitops.h"
99 #include <cyg/hal/hal_if.h>
100 #include <cyg/hal/hal_cache.h>
101 
102 // USB related header files
103 #include "include/drvUSB.h"
104 #include "drvHCD.h"
105 #include "drvEHCI.h"
106 #include "drvMassStor.h"
107 
108 extern void Chip_Flush_Memory(void);
109 
110 
111 #if 1
112 
113 
114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
115 
116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
117 LIST_HEAD (usb_bus_list);
118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
119 
120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
121 #define USB_MAXBUS    32
122 struct usb_busmap {
123   U32 busmap [USB_MAXBUS / (8*sizeof (U32))];
124 };
125 static struct usb_busmap busmap;
126 
127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
128 
129 /*-------------------------------------------------------------------------*/
130 
131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132 
133 /*-------------------------------------------------------------------------*/
134 
135 #define KERNEL_REL  1
136 #define KERNEL_VER  10
137 
138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139 static const unsigned char usb2_rh_dev_descriptor [18] = {
140   0x12,
141   0x01,
142   0x00, 0x02,
143 
144   0x09,
145   0x00,
146   0x01,
147   0x08,
148 
149   0x00, 0x00,
150    0x00, 0x00,
151   KERNEL_VER, KERNEL_REL,
152 
153   0x03,
154   0x02,
155   0x01,
156   0x01
157 };
158 
159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160 static const unsigned char usb11_rh_dev_descriptor [18] = {
161   0x12,
162   0x01,
163   0x10, 0x01,
164 
165   0x09,
166   0x00,
167   0x00,
168   0x08,
169 
170   0x00, 0x00,
171    0x00, 0x00,
172   KERNEL_VER, KERNEL_REL,
173 
174   0x03,
175   0x02,
176   0x01,
177   0x01
178 };
179 
180 
181 
182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
183 static const unsigned char fs_rh_config_descriptor [] = {
184 
185   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
186   0x09,
187   0x02,
188   0x19, 0x00,
189   0x01,
190   0x01,
191   0x00,
192   0x40,
193          /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194   0x00,
195 
196   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
197   0x09,
198   0x04,
199   0x00,
200   0x00,
201   0x01,
202   0x09,
203   0x00,
204   0x00,
205   0x00,
206 
207   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
208   0x07,
209   0x05,
210   0x81,
211    0x03,
212    0x02, 0x00,
213   0xff
214 };
215 
216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
217 static const unsigned char hs_rh_config_descriptor [] = {
218 
219   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
220   0x09,
221   0x02,
222   0x19, 0x00,
223   0x01,
224   0x01,
225   0x00,
226   0x40,
227        /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
228 
229 
230 
231   0x00,
232 
233   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234   0x09,
235   0x04,
236   0x00,
237   0x00,
238   0x01,
239   0x09,
240   0x00,
241   0x00,
242   0x00,
243 
244   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
245   0x07,
246   0x05,
247   0x81,
248    0x03,
249    0x02, 0x00,
250   0x0c
251 };
252 
253 /*-------------------------------------------------------------------------*/
254 
255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
ascii2utf(char * s,unsigned char * utf,int utfmax)256 static int ascii2utf (char *s, unsigned char *utf, int utfmax)
257 {
258   int retval;
259 
260   for (retval = 0; *s && utfmax > 1; utfmax -= 2, retval += 2) {
261     *utf++ = *s++;
262     *utf++ = 0;
263   }
264   return retval;
265 }
266 
267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
rh_string(int id,struct usb_hcd * hcd,unsigned char * data,int len)268 static int rh_string (
269   int    id,
270   struct usb_hcd  *hcd,
271   unsigned char    *data,
272   int    len
273 ) {
274   char buf [100];
275 
276   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
277   if (id == 0) {
278     *data++ = 4; *data++ = 3;
279     *data++ = 0x09; *data++ = 0x04;
280     return 4;
281 
282  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
283   } else if (id == 1) {
284     strncpy(buf, hcd->self.bus_name, sizeof(buf));
285 
286  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
287   } else if (id == 2) {
288                 strncpy(buf, hcd->product_desc, sizeof(buf));
289   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290   } else if (id == 3) {
291       USB_sprintf(buf,"%s %s %s", "Non-OS", "1.0",
292       hcd->description);
293   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
294   } else
295       return 0;
296   data [0] = 2 * (strlen(buf) + 1);
297   data [1] = 3;  /* type == string */
298   return 2 + ascii2utf (buf, data + 2, len - 2);
299 }
300 
301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
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 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
rh_call_control(struct usb_hcd * hcd,struct urb * urb)322 static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
323 {
324   struct usb_ctrlrequest *cmd = (struct usb_ctrlrequest *) urb->setup_packet;
325    U16    typeReq, wValue, wIndex, wLength;
326   const unsigned char  *bufp = 0;
327   unsigned char    *ubuf = (unsigned char*) urb->transfer_buffer;
328   int    len = 0;
329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
330 
331   urb->hcpriv = hcd;
332 
333   typeReq  = (cmd->bRequestType << 8) | cmd->bRequest;
334   wValue   = LE16ToCPU (cmd->wValue);
335   wIndex   = LE16ToCPU (cmd->wIndex);
336   wLength  = LE16ToCPU (cmd->wLength);
337 
338   if (wLength > urb->transfer_buffer_length)
339     goto error;
340 
341   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
342   urb->status = 0;
343   urb->actual_length = wLength;
344   switch (typeReq) {
345 
346   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
347   case DeviceRequest | USB_REQ_GET_STATUS:
348     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
349     ubuf [0] = 1;
350     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
351     ubuf [1] = 0;
352   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
353   case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
354   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
355   case DeviceOutRequest | USB_REQ_SET_FEATURE:
356   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
357     dev_dbg (hcd->controller, "no device features set yet%s","\n");
358     break;
359   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
360   case DeviceRequest | USB_REQ_GET_CONFIGURATION:
361     ubuf [0] = 1;
362       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
363   case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
364     break;
365   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
366   case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
367     switch (wValue & 0xff00) {
368     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
369     case USB_DT_DEVICE << 8:
370     	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
371       if (hcd->driver->flags & HCD_USB2)
372         bufp = usb2_rh_dev_descriptor;
373       else if (hcd->driver->flags & HCD_USB11)
374         bufp = usb11_rh_dev_descriptor;
375       else
376         goto error;
377       len = 18;
378       break;
379     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
409     case USB_DT_CONFIG << 8:
410       if (hcd->driver->flags & HCD_USB2) {
411         bufp = hs_rh_config_descriptor;
412         len = sizeof hs_rh_config_descriptor;
413       } else {
414         bufp = fs_rh_config_descriptor;
415         len = sizeof fs_rh_config_descriptor;
416       }
417       break;
418     case USB_DT_STRING << 8:
419       urb->actual_length = rh_string (
420         wValue & 0xff, hcd,
421         ubuf, wLength);
422       break;
423     default:
424       goto error;
425     }
426     break;
427   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
457   case DeviceRequest | USB_REQ_GET_INTERFACE:
458   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
459     ubuf [0] = 0;
460       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
461   case DeviceOutRequest | USB_REQ_SET_INTERFACE:
462   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
463     break;
464     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
465   case DeviceOutRequest | USB_REQ_SET_ADDRESS:
466     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
467     dev_dbg (hcd->controller, "[root hub] device address %d\n",
468       wValue);
469     break;
470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
500   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
501   case EndpointRequest | USB_REQ_GET_STATUS:
502     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
503     ubuf [0] = 0;
504     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
505     ubuf [1] = 0;
506       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
507   case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
508   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
509   case EndpointOutRequest | USB_REQ_SET_FEATURE:
510   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
511     dev_dbg (hcd->controller, "[no endpoint features yet]%s","\n");
512     break;
513 
514   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515   default:
516     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517     urb->status = hcd->driver->hub_control (hcd,
518       typeReq, wValue, wIndex,
519       (char*) ubuf, wLength);
520     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521     break;
522 error:
523     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524     urb->status = -EPIPE;
525     dev_dbg (hcd->controller, "[unsupported hub control message] (maxchild %d)\n",
526         urb->dev->maxchild);
527   }
528   if (urb->status) {
529   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
530     urb->actual_length = 0;
531     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
532     dev_dbg (hcd->controller, "CTRL: TypeReq=0x%x val=0x%x idx=0x%x len=%d ==> %d\n",
533       typeReq, wValue, wIndex, wLength, urb->status);
534   }
535   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
536   if (bufp) {
537     if (urb->transfer_buffer_length < len)
538       len = urb->transfer_buffer_length;
539     urb->actual_length = len;
540     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
541     memcpy(ubuf, bufp, len);
542   }
543 
544  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
545   local_irq_save (flags);
546   usb_hcd_giveback_urb (hcd, urb, NULL);
547   local_irq_restore (flags);
548   return 0;
549 }
550 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
551 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
555 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
564 
565 #ifndef ROOTHUB_INTERRUPT_MODE
566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
567 
568 static void rh_report_status (U32 ptr);
569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
rh_status_urb(struct usb_hcd * hcd,struct urb * urb)586 static int rh_status_urb (struct usb_hcd *hcd, struct urb *urb)
587 {
588 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
589   int  len = 1 + (urb->dev->maxchild / 8);
590 
591   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
592   if (hcd->rh_timer.data
593       || urb->status != -EINPROGRESS
594       || urb->transfer_buffer_length < len
595       || !HCD_IS_RUNNING (hcd->state)) {
596     dev_dbg (hcd->controller,
597         "not queuing rh status urb, stat %d\n",
598         urb->status);
599     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
600     return -EINVAL;
601   }
602 
603   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
604   init_timer (&hcd->rh_timer);
605   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
606   hcd->rh_timer.function = rh_report_status;
607   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
608   hcd->rh_timer.data = (U32) &hcd->rh_timer;
609   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
610   hcd->rh_timer.data_ex = (U32) urb;
611   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
612   hcd->rh_timer.tmout_value = ROOTHUB_TIMER_INTERVAL;
613   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
614   add_timer (&hcd->rh_timer);
615   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
616   urb->hcpriv = hcd;
617   return 0;
618 }
619 
620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
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*/
rh_report_status(U32 ptr)631 static void rh_report_status (U32 ptr)
632 {
633   struct timer_list *pTimer = (struct timer_list *) ptr;
634   struct urb  *urb;
635   struct usb_hcd  *hcd;
636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
637   int length = 0;
638   //U32  flags;
639   urb = (struct urb *) pTimer->data_ex;
640   local_irq_save (flags);
641   spin_lock (&urb->lock);
642 
643  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
644 
645   if (!urb->dev
646       || urb->status != -EINPROGRESS
647       || (hcd = (struct usb_hcd*) urb->dev->bus->hcpriv) == 0) {
648     spin_unlock (&urb->lock);
649     local_irq_restore (flags);
650 	diag_printf("rh_report_status: it's unlinked. urb->status: 0x%\n", urb->status);
651     return;
652   }
653 
654   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
655   #if 1
656   length = hcd->driver->hub_status_data (hcd, (char*) urb->transfer_buffer);
657   #else
658   if (!HCD_IS_SUSPENDED (hcd->state))
659     length = hcd->driver->hub_status_data (hcd, urb->transfer_buffer);
660   #endif
661   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
662   spin_lock (&hcd_data_lock);
663   if (length > 0) {
664     hcd->rh_timer.data = 0;
665     urb->actual_length = length;
666     urb->status = 0;
667     urb->hcpriv = 0;
668   }
669   else
670     mod_timer (&hcd->rh_timer, ROOTHUB_TIMER_INTERVAL, 0);
671   spin_unlock (&hcd_data_lock);
672   spin_unlock (&urb->lock);
673 
674   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
675   if (length > 0)
676     usb_hcd_giveback_urb (hcd, urb, NULL);
677   local_irq_restore (flags);
678 }
679 
680 /*-------------------------------------------------------------------------*/
681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
689 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
690 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
691 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
rh_urb_enqueue(struct usb_hcd * hcd,struct urb * urb)701 static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb)
702 {
703   if (usb_pipeint (urb->pipe)) {
704     int    retval;
705     U32  flags;
706 
707     spin_lock_irqsave (&hcd_data_lock, flags);
708     retval = rh_status_urb (hcd, urb);
709     spin_unlock_irqrestore (&hcd_data_lock, flags);
710     return retval;
711   }
712   if (usb_pipecontrol (urb->pipe))
713     return rh_call_control (hcd, urb);
714   else
715     return -EINVAL;
716 }
717 
718 /*-------------------------------------------------------------------------*/
719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_rh_status_dequeue(struct usb_hcd * hcd,struct urb * urb)729 void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb)
730 {
731   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
732   del_timer_sync (&hcd->rh_timer);
733   hcd->rh_timer.data = 0;
734 
735   local_irq_save (flags);
736   urb->hcpriv = 0;
737   usb_hcd_giveback_urb (hcd, urb, NULL);
738   local_irq_restore (flags);
739 }
740 
741 #endif
742 /*-------------------------------------------------------------------------*/
743 #ifdef   ROOTHUB_INTERRUPT_MODE
744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_hcd_poll_rh_status(struct usb_hcd * hcd)755 void usb_hcd_poll_rh_status(struct usb_hcd *hcd)
756 {
757 	struct urb	*urb;
758 	int		length;
759 	unsigned long	flags;
760 	char		buffer[4];
761 
762 	if (unlikely(!hcd->rh_registered))
763 		return;
764 	if (!hcd->uses_new_polling && !hcd->status_urb)
765 		return;
766 
767 	length = hcd->driver->hub_status_data(hcd, buffer);
768 	if (length > 0) {
769 
770 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
771 		spin_lock_irqsave(&hcd_root_hub_lock, flags);
772 		urb = hcd->status_urb;
773 		if (urb) {
774 			hcd->poll_pending = 0;
775 			hcd->status_urb = NULL;
776 			urb->actual_length = length;
777                         urb->status = 0; // update status
778                         urb->hcpriv = 0;
779 			memcpy(urb->transfer_buffer, buffer, length);
780 
781       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
782 			spin_unlock(&hcd_root_hub_lock);
783 			usb_hcd_giveback_urb(hcd, urb, NULL);
784 			spin_lock(&hcd_root_hub_lock);
785 		} else {
786 			length = 0;
787 			hcd->poll_pending = 1;
788 		}
789 		spin_unlock_irqrestore(&hcd_root_hub_lock, flags);
790 	}
791 
792 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
793 	if (hcd->uses_new_polling ? hcd->poll_rh :
794 			(length == 0 && hcd->status_urb != NULL))
795 		mod_timer (&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4), 0);
796 }
797 
798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
rh_timer_func(unsigned long _hcd)799 void rh_timer_func (unsigned long _hcd)
800 {
801 	usb_hcd_poll_rh_status((struct usb_hcd *) _hcd);
802 }
803 
804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
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 /*-------------------------------------------------------------------------*/
835 
rh_queue_status(struct usb_hcd * hcd,struct urb * urb)836 static int rh_queue_status (struct usb_hcd *hcd, struct urb *urb)
837 {
838 	int		retval;
839 	unsigned long	flags;
840 	int		len = 1 + (urb->dev->maxchild / 8);
841 
842 	spin_lock_irqsave (&hcd_root_hub_lock, flags);
843 	if (hcd->status_urb || urb->transfer_buffer_length < len) {
844 		dev_dbg (hcd->self.controller, "not queuing rh status urb\n");
845 		retval = -EINVAL;
846 		goto done;
847 	}
848 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
849 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
868   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
869 
870 	hcd->status_urb = urb;
871 	urb->hcpriv = hcd;	/* indicate it's queued */
872 	if (!hcd->uses_new_polling)
873 		mod_timer(&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4), 0);
874 
875 	/* If a status change has already occurred, report it ASAP */
876 	else if (hcd->poll_pending)
877 		mod_timer(&hcd->rh_timer, jiffies, 0);
878 	retval = 0;
879  done:
880 	spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
881 	return retval;
882 }
883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
913 /*-------------------------------------------------------------------------*/
914 
rh_urb_enqueue(struct usb_hcd * hcd,struct urb * urb)915 static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb)
916 {
917   if (usb_pipeint (urb->pipe)) {
918     int    retval;
919     U32  flags;
920 
921 //diag_printf("<rh_urb_enqueue>...\n");
922     spin_lock_irqsave (&hcd_data_lock, flags);
923     retval = rh_queue_status (hcd, urb);
924     spin_unlock_irqrestore (&hcd_data_lock, flags);
925     return retval;
926   }
927   else if (usb_pipecontrol (urb->pipe))
928     return rh_call_control (hcd, urb);
929   else
930     return -EINVAL;
931 }
932 
933 /*-------------------------------------------------------------------------*/
934 
usb_rh_status_dequeue(struct usb_hcd * hcd,struct urb * urb)935 void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb)
936 {
937    unsigned long   flags;
938    //int     rc;
939 
940 diag_printf("<usb_rh_status_dequeue>\n");
941    spin_lock_irqsave(&hcd_root_hub_lock, flags);
942    /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
943    if (usb_pipecontrol (urb->pipe)) {    /* Control URB */
944        ;   /* Do nothing */
945 
946    } else {                /* Status URB */
947        if (!hcd->uses_new_polling)
948            del_timer (&hcd->rh_timer);
949        if (urb == hcd->status_urb) {
950            hcd->status_urb = NULL;
951            // TODO: FIXME
952            //usb_hcd_unlink_urb_from_ep(hcd, urb);
953 
954            spin_unlock(&hcd_root_hub_lock);
955            usb_hcd_giveback_urb(hcd, urb, NULL);
956            spin_lock(&hcd_root_hub_lock);
957        }
958    }
959 //done:
960    spin_unlock_irqrestore(&hcd_root_hub_lock, flags);
961    //return rc;
962 }
963 #endif
964 
965 /*-------------------------------------------------------------------------*/
966 
967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
968 
usb_bus_get(struct usb_bus * bus)969 struct usb_bus *usb_bus_get (struct usb_bus *bus)
970 {
971   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
972   return bus;
973 }
974 
975 
976 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
977 
usb_bus_put(struct usb_bus * bus)978 void usb_bus_put (struct usb_bus *bus)
979 {
980   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
981 }
982 
983 /*-------------------------------------------------------------------------*/
984 
985 
986 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
987 
usb_host_init(void)988 void usb_host_init(void)
989 {
990   //class_register(&usb_host_class);
991 }
992 
usb_host_cleanup(void)993 void usb_host_cleanup(void)
994 {
995   //class_unregister(&usb_host_class);
996 }
997 
998 
999 
1000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_bus_init(struct usb_bus * bus)1001 void usb_bus_init (struct usb_bus *bus)
1002 {
1003   memset (&bus->devmap, 0, sizeof(struct usb_devmap));
1004 
1005   bus->devnum_next = 1;
1006 
1007   bus->root_hub = NULL;
1008   bus->hcpriv = NULL;
1009   bus->otgpriv = NULL;
1010   bus->busnum = -1;
1011   bus->bandwidth_allocated = 0;
1012   bus->bandwidth_int_reqs  = 0;
1013   bus->bandwidth_isoc_reqs = 0;
1014 
1015   INIT_LIST_HEAD (&bus->bus_list);
1016 }
1017 
1018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_alloc_bus(struct usb_operations * op)1049 struct usb_bus *usb_alloc_bus (struct usb_operations *op)
1050 {
1051   struct usb_bus *bus;
1052 
1053   bus = (struct usb_bus*) kmalloc (sizeof *bus, GFP_KERNEL);
1054   if (!bus)
1055     return NULL;
1056   memset(bus, 0, sizeof(struct usb_bus));
1057   usb_bus_init (bus);
1058   bus->op = op;
1059   return bus;
1060 }
1061 //EXPORT_SYMBOL (usb_alloc_bus);
1062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_register_bus(struct usb_bus * bus)1093 int usb_register_bus(struct usb_bus *bus)
1094 {
1095   int busnum;
1096   //int retval;
1097 
1098   down (&usb_bus_list_lock);
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   busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
1110   if (busnum < USB_MAXBUS) {
1111     set_bit (busnum, busmap.busmap, U32);
1112     bus->busnum = busnum;
1113     dbg("The busnum is %d",busnum);
1114   } else
1115     usb_warn ("too many buses%s","");
1116   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1117   list_add (&bus->bus_list, &usb_bus_list);
1118   up (&usb_bus_list_lock);
1119 
1120   usbfs_add_bus (bus);
1121 
1122   dev_info (bus->controller, "new USB bus registered, assigned bus number %d\n", bus->busnum);
1123   return 0;
1124 }
1125 
1126 
1127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_deregister_bus(struct usb_bus * bus)1128 void usb_deregister_bus (struct usb_bus *bus)
1129 {
1130   dev_info (bus->controller, "USB bus %d deregistered\n", bus->busnum);
1131 
1132   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1133   down (&usb_bus_list_lock);
1134   list_del (&bus->bus_list);
1135   up (&usb_bus_list_lock);
1136 
1137   usbfs_remove_bus (bus);
1138 
1139   clear_bit (bus->busnum, busmap.busmap, U32);
1140 
1141   //class_device_unregister(&bus->class_dev);
1142 }
1143 //EXPORT_SYMBOL (usb_deregister_bus);
1144 
1145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_register_root_hub(struct usb_device * usb_dev,struct device_s * parent_dev)1146 int usb_register_root_hub (struct usb_device *usb_dev, struct device_s *parent_dev)
1147 {
1148   const int devnum = 1;
1149   int retval;
1150 
1151   USB_sprintf (&usb_dev->dev.bus_id[0],
1152      		/*sizeof(usb_dev->dev.bus_id), */ "usb%ld-rh", usb_dev->bus->busnum);
1153   usb_dev->state = USB_STATE_DEFAULT;
1154 
1155   usb_dev->devnum = devnum;
1156   usb_dev->bus->devnum_next = devnum + 1;
1157   set_bit (devnum, usb_dev->bus->devmap.devicemap, U32);
1158 
1159   retval = usb_new_device (usb_dev, parent_dev);
1160   if (retval)
1161     dev_err (parent_dev, "can't register root hub for %s, %d\n",
1162         usb_dev->dev.bus_id, retval);
1163   return retval;
1164 }
1165 //EXPORT_SYMBOL (usb_register_root_hub);
1166 
1167 #ifdef ROOTHUB_INTERRUPT_MODE
1168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
register_root_hub(struct usb_hcd * hcd)1169 int register_root_hub(struct usb_hcd *hcd)
1170 {
1171 	//struct device *parent_dev = hcd->self.controller;
1172         struct device_s *parent_dev = hcd->controller;
1173 	struct usb_device *usb_dev = hcd->self.root_hub;
1174 	const int devnum = 1;
1175 	int retval;
1176 
1177         usb_dev->state = USB_STATE_DEFAULT;
1178 
1179         usb_dev->devnum = devnum;
1180         usb_dev->bus->devnum_next = devnum + 1;
1181         set_bit (devnum, usb_dev->bus->devmap.devicemap, U32);
1182 
1183         retval = usb_new_device (usb_dev, parent_dev);
1184         if (retval)
1185           dev_err (parent_dev, "can't register root hub for %s, %d\n",
1186               usb_dev->dev.bus_id, retval);
1187 
1188 	if (retval == 0) {
1189                 diag_printf("<register_root_hub> hcd->rh_registered = 1\n");
1190 		spin_lock_irq (&hcd_root_hub_lock);
1191 		hcd->rh_registered = 1;
1192 		spin_unlock_irq (&hcd_root_hub_lock);
1193 
1194 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1195 	}
1196 
1197 	return retval;
1198 }
1199 #endif
1200 /*-------------------------------------------------------------------------*/
1201 
1202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_calc_bus_time(int speed,int is_input,int isoc,int bytecount)1223 int usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount)
1224 {
1225 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1226   U32  tmp;
1227 
1228   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1229   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1259   switch (speed) {
1260   case USB_SPEED_LOW:
1261     if (is_input) {
1262       tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L;
1263       return (64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);
1264     } else {
1265       tmp = (66700L * (31L + 10L * BitTime (bytecount))) / 1000L;
1266       return (64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);
1267     }
1268   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1269   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1299   case USB_SPEED_FULL:
1300   	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1301     if (isoc) {
1302       tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L;
1303       return (((is_input) ? 7268L : 6265L) + BW_HOST_DELAY + tmp);
1304     } else {
1305       tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L;
1306       return (9107L + BW_HOST_DELAY + tmp);
1307     }
1308     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1318   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1339   case USB_SPEED_HIGH:
1340     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1341     if (isoc)
1342       tmp = HS_USECS (bytecount);
1343     else
1344       tmp = HS_USECS_ISO (bytecount);
1345     return tmp;
1346   default:
1347     dbg ("bogus device speed!%s","");
1348     return -1;
1349   }
1350 }
1351 
1352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_claim_bandwidth(struct usb_device * dev,struct urb * urb,int bustime,int isoc)1373 void usb_claim_bandwidth (struct usb_device *dev, struct urb *urb, int bustime, int isoc)
1374 {
1375   dev->bus->bandwidth_allocated += bustime;
1376   if (isoc)
1377     dev->bus->bandwidth_isoc_reqs++;
1378   else
1379     dev->bus->bandwidth_int_reqs++;
1380   urb->bandwidth = bustime;
1381 
1382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1412 #ifdef USB_BANDWIDTH_MESSAGES
1413   dev_dbg (&dev->dev, "bandwidth alloc increased by %d (%s) to %d for %d requesters\n",
1414     bustime,
1415     isoc ? "ISOC" : "INTR",
1416     dev->bus->bandwidth_allocated,
1417     dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs);
1418 #endif
1419 }
1420 
1421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_release_bandwidth(struct usb_device * dev,struct urb * urb,int isoc)1452 void usb_release_bandwidth (struct usb_device *dev, struct urb *urb, int isoc)
1453 {
1454   dev->bus->bandwidth_allocated -= urb->bandwidth;
1455   if (isoc)
1456     dev->bus->bandwidth_isoc_reqs--;
1457   else
1458     dev->bus->bandwidth_int_reqs--;
1459 
1460 #ifdef USB_BANDWIDTH_MESSAGES
1461   dev_dbg (&dev->dev, "bandwidth alloc reduced by %d (%s) to %d for %d requesters\n",
1462     urb->bandwidth,
1463     isoc ? "ISOC" : "INTR",
1464     dev->bus->bandwidth_allocated,
1465     dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs);
1466 #endif
1467   urb->bandwidth = 0;
1468 }
1469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1470 
1471 /*-------------------------------------------------------------------------*/
1472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
hcd_alloc_dev(struct usb_device * udev)1503 static int hcd_alloc_dev (struct usb_device *udev)
1504 {
1505   struct hcd_dev    *dev;
1506   struct usb_hcd    *hcd;
1507   U32    flags;
1508 
1509   if (!udev || udev->hcpriv)
1510     return -EINVAL;
1511   if (!udev->bus || !udev->bus->hcpriv)
1512     return -ENODEV;
1513   hcd = (struct usb_hcd*) udev->bus->hcpriv;
1514   if (hcd->state == USB_STATE_QUIESCING)
1515     return -ENOLINK;
1516 
1517   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1537 
1538   dev = (struct hcd_dev *) kmalloc (sizeof *dev, GFP_KERNEL);
1539   if (dev == NULL)
1540     return -ENOMEM;
1541   memset (dev, 0, sizeof *dev);
1542 
1543   INIT_LIST_HEAD (&dev->dev_list);
1544   INIT_LIST_HEAD (&dev->urb_list);
1545 
1546   spin_lock_irqsave (&hcd_data_lock, flags);
1547   list_add (&dev->dev_list, &hcd->dev_list);
1548 
1549   udev->hcpriv = dev;
1550   spin_unlock_irqrestore (&hcd_data_lock, flags);
1551 
1552   return 0;
1553 }
1554 
1555 /*-------------------------------------------------------------------------*/
1556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
urb_unlink(struct urb * urb)1586 static void urb_unlink (struct urb *urb)
1587 {
1588   U32    flags;
1589   struct usb_device  *dev;
1590 
1591   /* Release any periodic transfer bandwidth */
1592   if (urb->bandwidth)
1593     usb_release_bandwidth (urb->dev, urb,
1594       usb_pipeisoc (urb->pipe));
1595 
1596   /* clear all state linking urb to this dev (and hcd) */
1597 
1598   spin_lock_irqsave (&hcd_data_lock, flags);
1599   list_del_init (&urb->urb_list);
1600   dev = urb->dev;
1601   spin_unlock_irqrestore (&hcd_data_lock, flags);
1602   usb_put_dev (dev);
1603 }
1604 
1605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
hcd_submit_urb(struct urb * urb,int mem_flags)1606 static int hcd_submit_urb (struct urb *urb, int mem_flags)
1607 {
1608   int      status;
1609   struct usb_hcd    *hcd = (struct usb_hcd*) urb->dev->bus->hcpriv;
1610   struct hcd_dev    *dev = (struct hcd_dev*) urb->dev->hcpriv;
1611   struct ehci_hcd    *ehci = hcd_to_ehci (hcd);
1612   U32    flags;
1613 
1614   if (mem_flags == ASYNC_SUBMIT_QTD)
1615     return (hcd->driver->urb_enqueue (hcd, urb, mem_flags));
1616 
1617   if (!hcd || !dev)
1618     return -ENODEV;
1619 
1620   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1621 
1622   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1623 
1624   ehci->uDontSendIAA = 0;	//Set IAA interrupt (default)
1625 
1626   spin_lock_irqsave (&hcd_data_lock, flags);
1627   if (HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_QUIESCING) {
1628     usb_get_dev (urb->dev);
1629     list_add_tail (&urb->urb_list, &dev->urb_list);
1630     status = 0;
1631   } else {
1632     INIT_LIST_HEAD (&urb->urb_list);
1633     diag_printf("hcd_submit_urb return ESHUTDOWN !!! hcd->state = %x\n", hcd->state);
1634     status = -ESHUTDOWN;
1635   }
1636   spin_unlock_irqrestore (&hcd_data_lock, flags);
1637   if (status)
1638     return status;
1639 
1640   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1641   urb = usb_get_urb (urb);
1642   if (urb->dev == hcd->self.root_hub) {
1643     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1644     urb->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
1645           | URB_NO_SETUP_DMA_MAP);
1646     status = rh_urb_enqueue (hcd, urb);
1647     goto done;
1648   }
1649 
1650   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1651 
1652 
1653   if (hcd->controller->dma_mask) {
1654     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1655   }
1656   else
1657   {
1658     // Non DMA support
1659     if (usb_pipecontrol (urb->pipe))
1660     {
1661         //if ((((U32) urb->setup_packet) & 0xF) != 0 || ((sizeof(struct usb_ctrlrequest)  & 0xF) != 0) )
1662         if ((((U32) urb->setup_packet) & CPU_L1_CACHE_BOUND) != 0 || ((sizeof(struct usb_ctrlrequest)  & CPU_L1_CACHE_BOUND) != 0) ) // J
1663         {
1664             //diag_printf("Setup address %p, length %x\n", urb->setup_packet, sizeof(struct usb_ctrlrequest));
1665             urb->SetDMALen = sizeof(struct usb_ctrlrequest);
1666             //urb->SetDMABuf = LIB_MemoryAllocate(urb->SetDMALen | 0xF, MALLOC_UNCACHED_ADDR);
1667             //urb->SetDMABuf = MsOS_AllocateMemory(((urb->SetDMALen+15) & ~0xF), gs32NonCachedPoolID_MIU0 );
1668             //urb->SetDMABuf = Usb_AllocateNonCachedMemory(((urb->SetDMALen+15) & ~0xF));
1669             urb->SetDMABuf = Usb_AllocateNonCachedMemory(((urb->SetDMALen+CPU_L1_CACHE_BOUND) & ~CPU_L1_CACHE_BOUND)); // J
1670 
1671             USB_ASSERT(urb->SetDMABuf != NULL, "Allocate SetDMABuf error\n");
1672 
1673             memcpy(urb->SetDMABuf, urb->setup_packet, urb->SetDMALen);
1674             //HAL_DCACHE_FLUSH((void*) urb->SetDMABuf, urb->SetDMALen);
1675 
1676             urb->setup_dma = (dma_addr_t) USB_VA2PA((U32)urb->SetDMABuf);
1677             //diag_printf("SetDMA address %x SetDMA length %x\n", urb->setup_dma, urb->SetDMALen);
1678             Chip_Flush_Memory();
1679         }
1680 	    else
1681 	    {
1682             if ( urb->setup_packet != KSEG02KSEG1(urb->setup_packet) )
1683 			    //HAL_DCACHE_FLUSH((void*) urb->setup_packet, sizeof(struct usb_ctrlrequest));
1684 			    MsOS_Dcache_Flush((U32) urb->setup_packet, sizeof(struct usb_ctrlrequest));
1685 
1686             urb->setup_dma = (dma_addr_t) USB_VA2PA((U32)urb->setup_packet);
1687 	        //diag_printf("Setup DMA address %x DMA length %x\n", urb->setup_dma, sizeof(struct usb_ctrlrequest));
1688             Chip_Flush_Memory();
1689 	    }
1690 	    USB_ASSERT((urb->setup_dma & 0xF) == 0, "DMA address is not 16 bytes aligned\n");
1691 	//OS_Assert((sizeof(struct usb_ctrlrequest) & 0xF) == 0, "DMA length is not 16 bytes aligned\n");
1692 
1693    }
1694 
1695     if (urb->transfer_buffer_length != 0)
1696     {
1697 #if 0			//yuwen, mass storage //USB_2 remove
1698 	  if ((Mass_stor_us!=NULL)&& ( urb->transfer_buffer == Mass_stor_us->iobuf ))
1699         {
1700 		urb->transfer_dma= (dma_addr_t) USB_VA2PA((U32)urb->transfer_buffer);
1701         }
1702         else
1703 #endif
1704         {
1705             //if ((((U32) urb->transfer_buffer) & 0xF) != 0 || ((urb->transfer_buffer_length  & 0xF) != 0) )
1706             if ((((U32) urb->transfer_buffer) & CPU_L1_CACHE_BOUND) != 0 || ((urb->transfer_buffer_length  & CPU_L1_CACHE_BOUND) != 0) ) // J
1707             {
1708                 //diag_printf("<hcd_submit_urb> bouncing A[%x], L[%d]\n", urb->transfer_buffer, urb->transfer_buffer_length);
1709                 #ifdef DEBUG_PERFORMANCE
1710                 if (urb->transfer_buffer_length >= 512)
1711                     diag_printf("DMA address %x DMA length %x\n", urb->transfer_buffer, urb->transfer_buffer_length);
1712                 #endif
1713                 urb->TxDMALen= urb->transfer_buffer_length;
1714                 //urb->TxDMABuf = LIB_MemoryAllocate(urb->TxDMALen | 0xF, MALLOC_UNCACHED_ADDR);
1715                 //urb->TxDMABuf = MsOS_AllocateMemory(((urb->TxDMALen+15) & ~0xF), gs32NonCachedPoolID_MIU0 );
1716                 //urb->TxDMABuf = Usb_AllocateNonCachedMemory(((urb->TxDMALen+15) & ~0xF));
1717                 urb->TxDMABuf = Usb_AllocateNonCachedMemory(((urb->TxDMALen+CPU_L1_CACHE_BOUND) & ~CPU_L1_CACHE_BOUND)); // J
1718                 USB_ASSERT(urb->TxDMABuf != NULL, "Allocate TxDMABuf error\n");
1719 
1720                 if (!usb_pipein(urb->pipe))
1721                 {
1722                     memcpy(urb->TxDMABuf, urb->transfer_buffer, urb->transfer_buffer_length);
1723                 }
1724 
1725                 urb->transfer_dma= (dma_addr_t) USB_VA2PA((U32)urb->TxDMABuf);
1726                 //diag_printf("TxDMA address %x TxDMA length %x\n", urb->transfer_dma, urb->TxDMALen);
1727             }
1728             else
1729             {
1730                 if (  urb->transfer_buffer != KSEG02KSEG1(urb->transfer_buffer) )
1731                 {
1732                     if (usb_pipein(urb->pipe))
1733                         //HAL_DCACHE_INVALIDATE((void*) urb->transfer_buffer, urb->transfer_buffer_length);
1734                         //MsOS_Dcache_Invalidate((U32) urb->transfer_buffer, urb->transfer_buffer_length);
1735                         MsOS_Dcache_Flush((U32) urb->transfer_buffer, urb->transfer_buffer_length);
1736                         //MsOS_Dcache_Invalidate seems to cause stack crashed... , change to MsOS_Dcache_Flush temporiarly
1737 
1738                     else
1739                         //HAL_DCACHE_FLUSH((void*) urb->transfer_buffer, urb->transfer_buffer_length);
1740                         MsOS_Dcache_Flush((U32) urb->transfer_buffer, urb->transfer_buffer_length);
1741 
1742                 }
1743 
1744                 urb->transfer_dma= (dma_addr_t) USB_VA2PA((U32)urb->transfer_buffer);
1745                 //diag_printf("DMA address %x DMA length %x\n", urb->transfer_dma, urb->transfer_buffer_length);
1746             }
1747         }
1748         USB_ASSERT((urb->transfer_dma & 0xF) == 0, "DMA address is not 16 bytes aligned\n");
1749         //OS_Assert((urb->transfer_buffer_length & 0xF) == 0, "DMA length is not 16 bytes aligned\n");
1750     }
1751   }
1752 
1753 
1754   status = hcd->driver->urb_enqueue (hcd, urb, mem_flags);
1755 done:
1756   if (status) {
1757     usb_put_urb (urb);
1758     urb_unlink (urb);
1759   }
1760   return status;
1761 }
1762 
1763 /*-------------------------------------------------------------------------*/
1764 
1765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
hcd_get_frame_number(struct usb_device * udev)1766 static int hcd_get_frame_number (struct usb_device *udev)
1767 {
1768   struct usb_hcd  *hcd = (struct usb_hcd *)udev->bus->hcpriv;
1769   if (!HCD_IS_RUNNING (hcd->state))
1770   {
1771     diag_printf("hcd_get_frame_number return ESHUTDOWN !!!\n");
1772     return -ESHUTDOWN;
1773   }
1774   return hcd->driver->get_frame_number (hcd);
1775 }
1776 
1777 /*-------------------------------------------------------------------------*/
1778 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1779 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1780 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1781 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1809 static void
unlink1(struct usb_hcd * hcd,struct urb * urb)1810 unlink1 (struct usb_hcd *hcd, struct urb *urb)
1811 {
1812   if (urb == (struct urb *) hcd->rh_timer.data)
1813     usb_rh_status_dequeue (hcd, urb);
1814   else {
1815     int    value;
1816 
1817     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1818     value = hcd->driver->urb_dequeue (hcd, urb);
1819     if (value != 0)
1820       dev_dbg (hcd->controller,
1821         "dequeue %p --> %d\n",
1822         urb, value);
1823   }
1824 }
1825 
1826 struct completion_splice {    // modified urb context:
1827   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1828   struct completion  done;
1829 
1830   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1831   usb_complete_t    complete;
1832   void      *context;
1833 };
1834 
unlink_complete(struct urb * urb,struct pt_regs * regs)1835 static void unlink_complete (struct urb *urb, struct pt_regs *regs)
1836 {
1837   struct completion_splice  *splice;
1838 
1839   splice = (struct completion_splice *) urb->context;
1840 
1841   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1842   urb->complete = splice->complete;
1843   urb->context = splice->context;
1844   urb->complete (urb, regs);  //Callback function
1845 
1846   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1847   complete (&splice->done);
1848 }
1849 
1850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1851 extern void USB_HW_Reset(struct usb_hcd* pUsbHcd/*, struct usb_device *pUsbDev*/);
hcd_unlink_urb(struct urb * urb)1852 static int hcd_unlink_urb (struct urb *urb)
1853 {
1854   struct hcd_dev      *dev;
1855   struct usb_hcd      *hcd = 0;
1856   struct device_s      *sys = 0;
1857   U32      flags;
1858   struct completion_splice  splice;
1859   int        retval;
1860   U32    d_cnt = 0;
1861 
1862   if (!urb)
1863     return -EINVAL;
1864 
1865   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1866   spin_lock_irqsave (&urb->lock, flags);
1867   spin_lock (&hcd_data_lock);
1868 
1869   if (!urb->dev || !urb->dev->bus) {
1870     retval = -ENODEV;
1871     goto done;
1872   }
1873 
1874   dev = (struct hcd_dev*) urb->dev->hcpriv;
1875   sys = &urb->dev->dev;
1876   hcd = (struct usb_hcd*) urb->dev->bus->hcpriv;
1877   if (!dev || !hcd) {
1878     retval = -ENODEV;
1879     goto done;
1880   }
1881 
1882   if (!urb->hcpriv) {
1883     retval = -EINVAL;
1884     goto done;
1885   }
1886 
1887   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1888   if (urb->status != -EINPROGRESS) {
1889     retval = -EBUSY;
1890     goto done;
1891   }
1892 
1893   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1894   if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {
1895     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1896     init_completion (&splice.done);
1897     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1898     splice.complete = urb->complete;
1899     splice.context = urb->context;
1900     urb->complete = unlink_complete;
1901     urb->context = &splice;
1902     urb->status = -ENOENT;
1903   } else {
1904     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1905     urb->status = -ECONNRESET;
1906   }
1907   spin_unlock (&hcd_data_lock);
1908   spin_unlock_irqrestore (&urb->lock, flags);
1909 
1910   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1911   if (urb == (struct urb *) hcd->rh_timer.data) {
1912     usb_rh_status_dequeue (hcd, urb);
1913     retval = 0;
1914   } else {
1915     retval = hcd->driver->urb_dequeue (hcd, urb);
1916 
1917     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1918     if (retval) {
1919       dev_dbg (sys, "dequeue %p --> %d\n", urb, retval);
1920       if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {
1921         spin_lock_irqsave (&urb->lock, flags);
1922         urb->complete = splice.complete;
1923         urb->context = splice.context;
1924         spin_unlock_irqrestore (&urb->lock, flags);
1925       }
1926       goto bye;
1927     }
1928   }
1929 
1930       /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1931   if (urb->transfer_flags & URB_ASYNC_UNLINK)
1932     return -EINPROGRESS;
1933 
1934   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1935   while ( splice.done.done == 0 )
1936   {
1937     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1938     if ( d_cnt > (U32) 3000)
1939     {
1940       break;
1941     }
1942     else
1943     {
1944       HAL_DELAY_US(1000);//tick base is 1 ms
1945       d_cnt+=1;
1946     }
1947   }
1948 
1949   if (d_cnt > (U32) 3000)
1950   {
1951      diag_printf("hcd_unlink_urb timeout\n");
1952      // TODO: Review the flow
1953      diag_printf("Reset USB HW\n");
1954      USB_HW_Reset(hcd);
1955      //USB_HW_Reset((struct usb_hcd*) urb->dev->bus->hcpriv, urb->dev);
1956         return -ETIMEDOUT;
1957   }
1958   return 0;
1959 
1960 done:
1961   spin_unlock (&hcd_data_lock);
1962   spin_unlock_irqrestore (&urb->lock, flags);
1963 bye:
1964   if (retval && sys && sys->driver)
1965     dev_dbg (sys, "hcd_unlink_urb %p fail %d\n", urb, retval);
1966   return retval;
1967 }
1968 
1969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
hcd_endpoint_disable(struct usb_device * udev,int endpoint)1970 static void hcd_endpoint_disable (struct usb_device *udev, int endpoint)
1971 {
1972   struct list_head *__mptr;
1973   struct hcd_dev  *dev;
1974   struct usb_hcd  *hcd;
1975   struct urb  *urb;
1976   char s[10];
1977   U32  epnum = endpoint & USB_ENDPOINT_NUMBER_MASK;
1978 
1979   dev = (struct hcd_dev*) udev->hcpriv;
1980   hcd = (struct usb_hcd*) udev->bus->hcpriv;
1981 
1982   local_irq_disable ();
1983 
1984 hcd_rescan:
1985   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1986   if (endpoint & USB_DIR_IN) {
1987     usb_endpoint_halt (udev, epnum, 0);
1988     udev->epmaxpacketin [epnum] = 0;
1989   } else {
1990     usb_endpoint_halt (udev, epnum, 1);
1991     udev->epmaxpacketout [epnum] = 0;
1992   }
1993 
1994   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1995   spin_lock (&hcd_data_lock);
1996 
1997   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1998 
1999   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2000   urb = list_entry((&dev->urb_list)->next, struct urb, urb_list);
2001   for( ; &(urb->urb_list) != &(dev->urb_list);
2002     __mptr = urb->urb_list.next,
2003     urb = (struct urb *)( (char *)__mptr - (char *)offsetof(struct urb,urb_list) )
2004   )
2005   {
2006     int  tmp = urb->pipe;
2007 
2008     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2009     if ((U32)usb_pipeendpoint (tmp) != epnum)
2010       continue;
2011     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2012     if (epnum != 0 && ((tmp ^ endpoint) & USB_DIR_IN))
2013       continue;
2014 
2015     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2016     if (urb->status != -EINPROGRESS)
2017       continue;
2018     usb_get_urb (urb);
2019     spin_unlock (&hcd_data_lock);
2020 
2021     spin_lock (&urb->lock);
2022     tmp = urb->status;
2023     if (tmp == -EINPROGRESS)
2024     {
2025       diag_printf("hcd_endpoint_disable return ESHUTDOWN !!!\n");
2026       urb->status = -ESHUTDOWN;
2027     }
2028     spin_unlock (&urb->lock);
2029 
2030     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2031     if (tmp == -EINPROGRESS) {
2032       tmp = urb->pipe;
2033       unlink1 (hcd, urb);
2034       switch (usb_pipetype (tmp)) {
2035          case PIPE_CONTROL:
2036           strncpy(s,"", 1);
2037           break;
2038          case PIPE_BULK:
2039           strncpy(s,"-bulk", strlen("-bulk"));
2040           break;
2041          case PIPE_INTERRUPT:
2042           strncpy(s,"-intr", strlen("-intr"));
2043           break;
2044          default:
2045           strncpy(s,"-iso", strlen("-iso"));
2046           break;
2047       }
2048 
2049       dev_dbg (hcd->controller,
2050         "shutdown urb %p pipe %08x ep%d%s%s\n",
2051         urb, tmp, usb_pipeendpoint (tmp),
2052         (tmp & USB_DIR_IN) ? "in" : "out",
2053          s);
2054     }
2055     usb_put_urb (urb);
2056 
2057     /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2058     goto hcd_rescan;
2059   }
2060   spin_unlock (&hcd_data_lock);
2061   local_irq_enable();
2062 
2063   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2064   //might_sleep ();
2065   if (hcd->driver->endpoint_disable)
2066     hcd->driver->endpoint_disable (hcd, dev, endpoint);
2067 }
2068 
2069 /*-------------------------------------------------------------------------*/
2070 
2071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
hcd_free_dev(struct usb_device * udev)2092 static int hcd_free_dev (struct usb_device *udev)
2093 {
2094   struct hcd_dev    *dev;
2095   struct usb_hcd    *hcd;
2096   U32    flags;
2097 
2098   if (!udev || !udev->hcpriv)
2099     return -EINVAL;
2100 
2101   if (!udev->bus || !udev->bus->hcpriv)
2102     return -ENODEV;
2103 
2104   // should udev->devnum == -1 ??
2105 
2106   dev = (struct hcd_dev*) udev->hcpriv;
2107   hcd = (struct usb_hcd*) udev->bus->hcpriv;
2108 
2109   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2110   if (!list_empty (&dev->urb_list)) {
2111     dev_dbg (hcd->controller, "free busy dev, %s devnum %d (bug!)\n",
2112       hcd->self.bus_name, udev->devnum);
2113     return -EINVAL;
2114   }
2115 
2116   spin_lock_irqsave (&hcd_data_lock, flags);
2117   list_del (&dev->dev_list);
2118   udev->hcpriv = NULL;
2119   spin_unlock_irqrestore (&hcd_data_lock, flags);
2120 
2121   kfree (dev);
2122   return 0;
2123 }
2124 
2125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2126 
2127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2147 struct usb_operations usb_hcd_operations = {
2148   hcd_alloc_dev,
2149   hcd_free_dev,
2150   hcd_get_frame_number,
2151   hcd_submit_urb,
2152   hcd_unlink_urb,
2153   hcd_buffer_alloc,
2154   hcd_buffer_free,
2155   hcd_endpoint_disable,
2156 };
2157 
2158 /*-------------------------------------------------------------------------*/
2159 
2160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_hcd_giveback_urb(struct usb_hcd * hcd,struct urb * urb,struct pt_regs * regs)2161 void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs)
2162 {
2163   urb_unlink (urb);
2164   urb->complete (urb, regs);
2165   usb_put_urb (urb);
2166 }
2167 
2168 /*-------------------------------------------------------------------------*/
2169 
2170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2171  #if 0
2172 irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs * r)
2173 {
2174   struct usb_hcd    *hcd = (struct usb_hcd*) __hcd;
2175   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2176   hcd->driver->irq (hcd, r,0);
2177 }
2178 #endif
2179 /*-------------------------------------------------------------------------*/
2180 
2181 #if 0
2182 static void hcd_panic (void *_hcd)
2183 {
2184   struct usb_hcd    *hcd = (struct usb_hcd*) _hcd;
2185   struct usb_device  *hub = (struct usb_device*) hcd->self.root_hub;
2186   U32    i;
2187 
2188   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2189   hub->state = USB_STATE_NOTATTACHED;
2190   for (i = 0; i < (U32) hub->maxchild; i++) {
2191     if (hub->children [i])
2192       usb_disconnect (&hub->children [i]);
2193   }
2194 
2195 }
2196 #endif
2197 
2198 #endif    //#ifdef
2199 
2200 #ifdef CONFIG_OTG
2201 
usb_otgd_irq(int irq,void * __otgd,struct pt_regs * r)2202 irqreturn_t usb_otgd_irq (int irq, void *__otgd, struct pt_regs * r)
2203 {
2204   struct usb_otgd    *otgd = (struct usb_otgd*) __otgd;
2205   otgd->driver->irq (otgd, r);
2206 }
2207 
2208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2209 
usb_register_otg_to_bus(struct usb_otgd * otgd,struct device * hc)2210 int usb_register_otg_to_bus(struct usb_otgd *otgd, struct device *hc)
2211 {
2212   struct list_head *buslist;
2213   struct usb_bus *bus;
2214 
2215   for (buslist = usb_bus_list.next;
2216        buslist != &usb_bus_list;
2217        buslist = buslist->next) {
2218     const struct list_head *mptr = buslist;
2219     bus = (struct usb_bus *)( (char *)mptr - offsetof( struct usb_bus, bus_list) );
2220     if ( bus->controller == hc )
2221     {
2222       bus->otgpriv = otgd;
2223       otgd->bus = bus;
2224       dbg("Found bus (%p), device name is %s",bus,bus->controller->name);
2225       return 0;
2226     }
2227   }
2228   return -ENODEV;
2229 }
2230 
2231 
2232 #endif
2233 
2234 
2235