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