]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Bus/Usb/UsbCbi/Dxe/Cbi1/cbi1.c
Make EdkModulePkg pass Intel IPF compiler with /W4 /WX switches, solving warning...
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbCbi / Dxe / Cbi1 / cbi1.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 cbi1.c\r
15\r
16Abstract:\r
17 cbi1 transportation protocol implementation files\r
18\r
19--*/\r
20\r
0898f771 21#include "cbi.h"\r
878ddf1f 22\r
878ddf1f 23//\r
24// CBI Function prototypes\r
25//\r
26STATIC\r
27EFI_STATUS\r
28CBI1CommandPhase (\r
29 IN USB_CBI_DEVICE *UsbCbiDev,\r
30 IN VOID *Command,\r
31 IN UINT8 CommandSize,\r
32 OUT UINT32 *Result\r
33 );\r
34\r
35STATIC\r
36EFI_STATUS\r
37CBI1DataPhase (\r
38 IN USB_CBI_DEVICE *UsbCbiDev,\r
39 IN UINT32 DataSize,\r
40 IN OUT VOID *DataBuffer,\r
41 IN EFI_USB_DATA_DIRECTION Direction,\r
42 IN UINT16 Timeout,\r
43 OUT UINT32 *Result\r
44 );\r
45\r
46//\r
47// USB Atapi implementation\r
48//\r
49STATIC\r
50EFI_STATUS\r
51EFIAPI\r
52CBI1AtapiCommand (\r
53 IN EFI_USB_ATAPI_PROTOCOL *This,\r
54 IN VOID *Command,\r
55 IN UINT8 CommandSize,\r
56 IN VOID *DataBuffer,\r
57 IN UINT32 BufferLength,\r
58 IN EFI_USB_DATA_DIRECTION Direction,\r
59 IN UINT16 TimeOutInMilliSeconds\r
60 );\r
61\r
62STATIC\r
63EFI_STATUS\r
64EFIAPI\r
65CBI1MassStorageReset (\r
66 IN EFI_USB_ATAPI_PROTOCOL *This,\r
67 IN BOOLEAN ExtendedVerification\r
68 );\r
69\r
70//\r
71// CBI1 Driver Binding Protocol\r
72//\r
73STATIC\r
74EFI_STATUS\r
75EFIAPI\r
76CBI1DriverBindingSupported (\r
77 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
78 IN EFI_HANDLE ControllerHandle,\r
79 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
80 );\r
81\r
82STATIC\r
83EFI_STATUS\r
84EFIAPI\r
85CBI1DriverBindingStart (\r
86 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
87 IN EFI_HANDLE ControllerHandle,\r
88 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
89 );\r
90\r
91STATIC\r
92EFI_STATUS\r
93EFIAPI\r
94CBI1DriverBindingStop (\r
95 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
96 IN EFI_HANDLE ControllerHandle,\r
97 IN UINTN NumberOfChildren,\r
98 IN EFI_HANDLE *ChildHandleBuffer\r
99 );\r
100\r
92dda53e 101STATIC\r
878ddf1f 102VOID\r
103Cbi1ReportStatusCode (\r
104 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
105 IN EFI_STATUS_CODE_TYPE CodeType,\r
106 IN EFI_STATUS_CODE_VALUE Value\r
107 );\r
108\r
109\r
c7916981 110EFI_DRIVER_BINDING_PROTOCOL gUsbCbi1DriverBinding = {\r
878ddf1f 111 CBI1DriverBindingSupported,\r
112 CBI1DriverBindingStart,\r
113 CBI1DriverBindingStop,\r
61fb1657 114 0xa,\r
878ddf1f 115 NULL,\r
116 NULL\r
117};\r
118\r
119STATIC EFI_USB_ATAPI_PROTOCOL CBI1AtapiProtocol = {\r
120 CBI1AtapiCommand,\r
121 CBI1MassStorageReset,\r
122 0\r
123};\r
124\r
125//\r
126// CBI1 Driver Binding implementation\r
127//\r
128STATIC\r
129EFI_STATUS\r
130EFIAPI\r
131CBI1DriverBindingSupported (\r
132 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
133 IN EFI_HANDLE ControllerHandle,\r
134 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
135 )\r
136/*++\r
137\r
138 Routine Description:\r
139 Test to see if this driver supports ControllerHandle. Any ControllerHandle \r
140 than contains a BlockIo and DiskIo protocol can be supported.\r
141\r
142 Arguments:\r
143 This - Protocol instance pointer.\r
144 ControllerHandle - Handle of device to test\r
145 RemainingDevicePath - Not used\r
146\r
147 Returns:\r
148 EFI_SUCCESS - This driver supports this device\r
149 EFI_ALREADY_STARTED - This driver is already running on this device\r
150 other - This driver does not support this device\r
151\r
152--*/\r
153{\r
154 EFI_STATUS Status;\r
155 EFI_USB_IO_PROTOCOL *UsbIo;\r
156 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;\r
157\r
158 //\r
159 // Check if the Controller supports USB IO protocol\r
160 //\r
161 Status = gBS->OpenProtocol (\r
162 ControllerHandle,\r
163 &gEfiUsbIoProtocolGuid,\r
164 (VOID **) &UsbIo,\r
165 This->DriverBindingHandle,\r
166 ControllerHandle,\r
167 EFI_OPEN_PROTOCOL_BY_DRIVER\r
168 );\r
169 if (EFI_ERROR (Status)) {\r
170 return Status;\r
171 }\r
172 //\r
173 // Get the Controller interface descriptor\r
174 //\r
175 Status = UsbIo->UsbGetInterfaceDescriptor (\r
176 UsbIo,\r
177 &InterfaceDescriptor\r
178 );\r
179 if (EFI_ERROR (Status)) {\r
180 goto Exit;\r
181 }\r
182 //\r
183 // Bug here: just let Vendor specific CBI protocol get supported\r
184 //\r
185 if (!((InterfaceDescriptor.InterfaceClass == 0xFF) &&\r
186 (InterfaceDescriptor.InterfaceProtocol == 0))) {\r
187 Status = EFI_UNSUPPORTED;\r
188 goto Exit;\r
189 }\r
190\r
191Exit:\r
192 gBS->CloseProtocol (\r
193 ControllerHandle,\r
194 &gEfiUsbIoProtocolGuid,\r
195 This->DriverBindingHandle,\r
196 ControllerHandle\r
197 );\r
198 return Status;\r
199\r
200}\r
201\r
202STATIC\r
203EFI_STATUS\r
204EFIAPI\r
205CBI1DriverBindingStart (\r
206 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
207 IN EFI_HANDLE ControllerHandle,\r
208 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
209 )\r
210/*++\r
211\r
212 Routine Description:\r
213 Start this driver on ControllerHandle by opening a Block IO and Disk IO \r
214 protocol, reading Device Path, and creating a child handle with a \r
215 Disk IO and device path protocol.\r
216\r
217 Arguments:\r
218 This - Protocol instance pointer.\r
219 ControllerHandle - Handle of device to bind driver to\r
220 RemainingDevicePath - Not used\r
221\r
222 Returns:\r
223 EFI_SUCCESS - This driver is added to DeviceHandle\r
224 EFI_ALREADY_STARTED - This driver is already running on DeviceHandle\r
225 other - This driver does not support this device\r
226\r
227--*/\r
228{\r
229 USB_CBI_DEVICE *UsbCbiDev;\r
230 UINT8 Index;\r
231 EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\r
232 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;\r
233 EFI_STATUS Status;\r
234 EFI_USB_IO_PROTOCOL *UsbIo;\r
235 BOOLEAN Found;\r
236\r
237 Found = FALSE;\r
238 //\r
239 // Check if the Controller supports USB IO protocol\r
240 //\r
241 UsbCbiDev = NULL;\r
242\r
243 Status = gBS->OpenProtocol (\r
244 ControllerHandle,\r
245 &gEfiUsbIoProtocolGuid,\r
246 (VOID **) &UsbIo,\r
247 This->DriverBindingHandle,\r
248 ControllerHandle,\r
249 EFI_OPEN_PROTOCOL_BY_DRIVER\r
250 );\r
251 if (EFI_ERROR (Status)) {\r
252 return Status;\r
253 }\r
254 //\r
255 // Get the controller interface descriptor\r
256 //\r
257 Status = UsbIo->UsbGetInterfaceDescriptor (\r
258 UsbIo,\r
259 &InterfaceDescriptor\r
260 );\r
261 if (EFI_ERROR (Status)) {\r
262 goto ErrorExit;\r
263 }\r
264\r
265 CBI1AtapiProtocol.CommandProtocol = InterfaceDescriptor.InterfaceSubClass;\r
266\r
267 UsbCbiDev = AllocateZeroPool (sizeof (USB_CBI_DEVICE));\r
268 if (UsbCbiDev == NULL) {\r
269 Status = EFI_OUT_OF_RESOURCES;\r
270 goto ErrorExit;\r
271 }\r
272\r
273 UsbCbiDev->Signature = USB_CBI_DEVICE_SIGNATURE;\r
274 UsbCbiDev->UsbIo = UsbIo;\r
275 CopyMem (&UsbCbiDev->InterfaceDescriptor, &InterfaceDescriptor, sizeof (InterfaceDescriptor));\r
276 CopyMem (&UsbCbiDev->UsbAtapiProtocol , &CBI1AtapiProtocol, sizeof (CBI1AtapiProtocol));\r
277\r
278 //\r
279 // Get the Device Path Protocol on Controller's handle\r
280 //\r
281 Status = gBS->OpenProtocol (\r
282 ControllerHandle,\r
283 &gEfiDevicePathProtocolGuid,\r
284 (VOID **) &UsbCbiDev->DevicePath,\r
285 This->DriverBindingHandle,\r
286 ControllerHandle,\r
287 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
288 );\r
289\r
290 if (EFI_ERROR (Status)) {\r
291 goto ErrorExit;\r
292 }\r
293\r
294 for (Index = 0; Index < InterfaceDescriptor.NumEndpoints; Index++) {\r
295 UsbIo->UsbGetEndpointDescriptor (\r
296 UsbIo,\r
297 Index,\r
298 &EndpointDescriptor\r
299 );\r
300\r
301 //\r
302 // We parse bulk endpoint\r
303 //\r
304 if (EndpointDescriptor.Attributes == 0x02) {\r
305 if (EndpointDescriptor.EndpointAddress & 0x80) {\r
71a62114 306 CopyMem (&UsbCbiDev->BulkInEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
307 } else {\r
308 CopyMem (&UsbCbiDev->BulkOutEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
309 }\r
878ddf1f 310\r
311 Found = TRUE;\r
312 }\r
313 //\r
314 // We parse interrupt endpoint\r
315 //\r
316 if (EndpointDescriptor.Attributes == 0x03) {\r
71a62114 317 CopyMem (&UsbCbiDev->InterruptEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
878ddf1f 318 Found = TRUE;\r
319 }\r
320\r
321 }\r
322 //\r
323 // Double check we have these\r
324 //\r
325 if (!Found) {\r
326 goto ErrorExit;\r
327 }\r
328 //\r
329 // After installing Usb-Atapi protocol onto this handle\r
330 // it will be called by upper layer drivers such as Fat\r
331 //\r
332 Cbi1ReportStatusCode (\r
333 UsbCbiDev->DevicePath,\r
334 EFI_PROGRESS_CODE,\r
335 (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_ENABLE)\r
336 );\r
337\r
338 Status = gBS->InstallProtocolInterface (\r
339 &ControllerHandle,\r
340 &gEfiUsbAtapiProtocolGuid,\r
341 EFI_NATIVE_INTERFACE,\r
342 &UsbCbiDev->UsbAtapiProtocol\r
343 );\r
344\r
345 if (EFI_ERROR (Status)) {\r
346 goto ErrorExit;\r
347 }\r
348\r
c7916981 349 UsbCbiDev->ControllerNameTable = NULL;\r
350 AddUnicodeString (\r
351 "eng",\r
352 gUsbCbi1ComponentName.SupportedLanguages,\r
353 &UsbCbiDev->ControllerNameTable,\r
354 (CHAR16 *) L"Usb Cbi1 Mass Storage"\r
355 );\r
356\r
878ddf1f 357 return EFI_SUCCESS;\r
358\r
359ErrorExit:\r
360 gBS->CloseProtocol (\r
361 ControllerHandle,\r
362 &gEfiUsbIoProtocolGuid,\r
363 This->DriverBindingHandle,\r
364 ControllerHandle\r
365 );\r
366 if (UsbCbiDev != NULL) {\r
367 gBS->FreePool (UsbCbiDev);\r
368 }\r
369\r
370 return Status;\r
371\r
372}\r
373\r
374STATIC\r
375EFI_STATUS\r
376EFIAPI\r
377CBI1DriverBindingStop (\r
378 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
379 IN EFI_HANDLE ControllerHandle,\r
380 IN UINTN NumberOfChildren,\r
381 IN EFI_HANDLE *ChildHandleBuffer\r
382 )\r
383/*++\r
384\r
385 Routine Description:\r
386 Stop this driver on ControllerHandle. Support stoping any child handles \r
387 created by this driver.\r
388\r
389 Arguments:\r
390 This - Protocol instance pointer.\r
391 ControllerHandle - Handle of device to stop driver on \r
392 NumberOfChildren - Number of Children in the ChildHandleBuffer\r
393 ChildHandleBuffer - List of handles for the children we need to stop.\r
394\r
395 Returns:\r
396 EFI_SUCCESS - This driver is removed DeviceHandle\r
397 EFI_UNSUPPORTED - Can't open the gEfiUsbAtapiProtocolGuid protocol \r
398 other - This driver was not removed from this device\r
399 \r
400--*/\r
401{\r
402 EFI_STATUS Status;\r
403 EFI_USB_ATAPI_PROTOCOL *CBI1AtapiProtocol;\r
404 USB_CBI_DEVICE *UsbCbiDev;\r
878ddf1f 405\r
406 //\r
407 // Get our context back.\r
408 //\r
409 Status = gBS->OpenProtocol (\r
410 ControllerHandle,\r
411 &gEfiUsbAtapiProtocolGuid,\r
412 (VOID **) &CBI1AtapiProtocol,\r
413 This->DriverBindingHandle,\r
414 ControllerHandle,\r
415 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
416 );\r
417 if (EFI_ERROR (Status)) {\r
418 return EFI_UNSUPPORTED;\r
419 }\r
420\r
421 UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (CBI1AtapiProtocol);\r
422\r
878ddf1f 423 Cbi1ReportStatusCode (\r
424 UsbCbiDev->DevicePath,\r
425 EFI_PROGRESS_CODE,\r
426 (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_DISABLE)\r
427 );\r
428\r
429 Status = gBS->UninstallProtocolInterface (\r
430 ControllerHandle,\r
431 &gEfiUsbAtapiProtocolGuid,\r
432 &UsbCbiDev->UsbAtapiProtocol\r
433 );\r
434 if (EFI_ERROR (Status)) {\r
435 return Status;\r
436 }\r
437\r
438 Status = gBS->CloseProtocol (\r
439 ControllerHandle,\r
440 &gEfiUsbIoProtocolGuid,\r
441 This->DriverBindingHandle,\r
442 ControllerHandle\r
443 );\r
444 gBS->FreePool (UsbCbiDev);\r
445\r
446 return Status;\r
447\r
448}\r
449//\r
450// CBI1 command\r
451//\r
452STATIC\r
453EFI_STATUS\r
454CBI1CommandPhase (\r
455 IN USB_CBI_DEVICE *UsbCbiDev,\r
456 IN VOID *Command,\r
457 IN UINT8 CommandSize,\r
458 OUT UINT32 *Result\r
459 )\r
460/*++\r
461\r
462 Routine Description:\r
463 In order to make consistence, CBI transportation protocol does only use\r
464 the first 3 parameters. Other parameters are not used here.\r
465\r
466 Arguments:\r
467 UsbCbiDev - USB_CBI_DEVICE\r
468 Command - Command to send \r
469 CommandSize - Command Size\r
470 Result - Result to return\r
471\r
472 Returns:\r
473 EFI_SUCCESS - This driver is removed DeviceHandle\r
474 other - This driver was not removed from this device \r
475--*/\r
476{\r
477 EFI_STATUS Status;\r
478 EFI_USB_IO_PROTOCOL *UsbIo;\r
479 EFI_USB_DEVICE_REQUEST Request;\r
480 UINT32 TimeOutInMilliSeconds;\r
481\r
482 UsbIo = UsbCbiDev->UsbIo;\r
483\r
484 ZeroMem (&Request, sizeof (EFI_USB_DEVICE_REQUEST));\r
485\r
486 //\r
487 // Device request see CBI specification\r
488 //\r
489 Request.RequestType = 0x21;\r
490 Request.Length = CommandSize;\r
491\r
492 TimeOutInMilliSeconds = 1000;\r
493\r
494 Status = UsbIo->UsbControlTransfer (\r
495 UsbIo,\r
496 &Request,\r
497 EfiUsbDataOut,\r
498 TimeOutInMilliSeconds,\r
499 Command,\r
500 CommandSize,\r
501 Result\r
502 );\r
503\r
504 return Status;\r
505}\r
506\r
507STATIC\r
508EFI_STATUS\r
509CBI1DataPhase (\r
510 IN USB_CBI_DEVICE *UsbCbiDev,\r
511 IN UINT32 DataSize,\r
512 IN OUT VOID *DataBuffer,\r
513 IN EFI_USB_DATA_DIRECTION Direction,\r
514 IN UINT16 Timeout,\r
515 OUT UINT32 *Result\r
516 )\r
517/*++\r
518\r
519Routine Description:\r
520\r
521 CBI1 Data Phase\r
522\r
523Arguments:\r
524\r
525 UsbCbiDev - USB_CBI_DEVICE\r
526 DataSize - Data Size\r
527 DataBuffer - Data Buffer\r
528 Direction - IN/OUT/NODATA\r
529 Timeout - Time out value in milliseconds\r
530 Result - Transfer result\r
531\r
532Returns:\r
533\r
534 EFI_SUCCESS - Success\r
535\r
536--*/\r
537{\r
538 EFI_STATUS Status;\r
539 EFI_USB_IO_PROTOCOL *UsbIo;\r
540 UINT8 EndpointAddr;\r
541 UINTN Remain;\r
542 UINTN Increment;\r
543 UINT32 MaxPacketLen;\r
544 UINT8 *BufferPtr;\r
545\r
546 UsbIo = UsbCbiDev->UsbIo;\r
547\r
548 Remain = DataSize;\r
549 BufferPtr = (UINT8 *) DataBuffer;\r
550\r
551 //\r
552 // retrieve the the max packet length of the given endpoint\r
553 //\r
554 if (Direction == EfiUsbDataIn) {\r
555 MaxPacketLen = (UsbCbiDev->BulkInEndpointDescriptor).MaxPacketSize;\r
556 EndpointAddr = (UsbCbiDev->BulkInEndpointDescriptor).EndpointAddress;\r
557 } else {\r
558 MaxPacketLen = (UsbCbiDev->BulkOutEndpointDescriptor).MaxPacketSize;\r
559 EndpointAddr = (UsbCbiDev->BulkOutEndpointDescriptor).EndpointAddress;\r
560 }\r
561\r
562 while (Remain > 0) {\r
563 //\r
564 // Using 15 packets to aVOID Bitstuff error\r
565 //\r
566 if (Remain > 15 * MaxPacketLen) {\r
567 Increment = 15 * MaxPacketLen;\r
568 } else {\r
569 Increment = Remain;\r
570 }\r
571\r
572 Status = UsbIo->UsbBulkTransfer (\r
573 UsbIo,\r
574 EndpointAddr,\r
575 BufferPtr,\r
576 &Increment,\r
577 Timeout,\r
578 Result\r
579 );\r
580\r
581 if (EFI_ERROR (Status)) {\r
582 goto ErrorExit;\r
583 }\r
584\r
585 BufferPtr += Increment;\r
586 Remain -= Increment;\r
587 }\r
588\r
589 return EFI_SUCCESS;\r
590\r
591ErrorExit:\r
592\r
593 if (Direction == EfiUsbDataIn) {\r
594 Cbi1ReportStatusCode (\r
595 UsbCbiDev->DevicePath,\r
596 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
597 (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_INPUT_ERROR)\r
598 );\r
599 } else {\r
600 Cbi1ReportStatusCode (\r
601 UsbCbiDev->DevicePath,\r
602 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
603 (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_OUTPUT_ERROR)\r
604 );\r
605 }\r
606\r
607 if (((*Result) & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {\r
608 //\r
609 // just endpoint stall happens\r
610 //\r
611 UsbClearEndpointHalt (\r
612 UsbIo,\r
613 EndpointAddr,\r
614 Result\r
615 );\r
616 }\r
617\r
618 return Status;\r
619}\r
620//\r
621// CBI1 USB ATAPI Protocol\r
622//\r
623STATIC\r
624EFI_STATUS\r
625EFIAPI\r
626CBI1MassStorageReset (\r
627 IN EFI_USB_ATAPI_PROTOCOL *This,\r
628 IN BOOLEAN ExtendedVerification\r
629 )\r
630/*++\r
631\r
632 Routine Description:\r
633 Reset CBI Devices\r
634 \r
635 Arguments:\r
636 This - Protocol instance pointer.\r
637 ExtendedVerification - TRUE if we need to do strictly reset.\r
638\r
639 Returns:\r
640 EFI_SUCCESS - Command succeeded.\r
641 EFI_DEVICE_ERROR - Command failed.\r
642\r
643--*/\r
644{\r
645 UINT8 ResetCommand[12];\r
878ddf1f 646 EFI_USB_IO_PROTOCOL *UsbIo;\r
647 USB_CBI_DEVICE *UsbCbiDev;\r
648 UINT8 EndpointAddr;\r
649 UINT32 Result;\r
650\r
651 UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (This);\r
652 UsbIo = UsbCbiDev->UsbIo;\r
653\r
654 Cbi1ReportStatusCode (\r
655 UsbCbiDev->DevicePath,\r
656 EFI_PROGRESS_CODE,\r
657 (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_RESET)\r
658 );\r
659\r
660 if (ExtendedVerification) {\r
661 UsbIo->UsbPortReset (UsbIo);\r
662 }\r
663 //\r
664 // CBI reset command protocol\r
665 //\r
666 SetMem (ResetCommand, sizeof (ResetCommand), 0xff);\r
667 ResetCommand[0] = 0x1d;\r
668 ResetCommand[1] = 0x04;\r
669\r
1cc8ee78 670 CBI1CommandPhase (\r
671 UsbCbiDev,\r
672 ResetCommand,\r
673 12,\r
674 &Result\r
675 );\r
878ddf1f 676\r
677 //\r
678 // clear bulk in endpoint stall feature\r
679 //\r
680 EndpointAddr = UsbCbiDev->BulkInEndpointDescriptor.EndpointAddress;\r
681 UsbClearEndpointHalt (\r
682 UsbIo,\r
683 EndpointAddr,\r
684 &Result\r
685 );\r
686\r
687 //\r
688 // clear bulk out endpoint stall feature\r
689 //\r
690 EndpointAddr = UsbCbiDev->BulkOutEndpointDescriptor.EndpointAddress;\r
691 UsbClearEndpointHalt (\r
692 UsbIo,\r
693 EndpointAddr,\r
694 &Result\r
695 );\r
696\r
697 return EFI_SUCCESS;\r
698\r
699}\r
700\r
701STATIC\r
702EFI_STATUS\r
703EFIAPI\r
704CBI1AtapiCommand (\r
705 IN EFI_USB_ATAPI_PROTOCOL *This,\r
706 IN VOID *Command,\r
707 IN UINT8 CommandSize,\r
708 IN VOID *DataBuffer,\r
709 IN UINT32 BufferLength,\r
710 IN EFI_USB_DATA_DIRECTION Direction,\r
711 IN UINT16 TimeOutInMilliSeconds\r
712 )\r
713/*++\r
714\r
715 Routine Description:\r
716 Send ATAPI command using CBI1 protocol.\r
717 \r
718 Arguments:\r
719 This - Protocol instance pointer.\r
720 Command - Command buffer \r
721 CommandSize - Size of Command Buffer\r
722 DataBuffer - Data buffer\r
723 BufferLength - Length of Data buffer\r
724 Direction - Data direction of this command\r
725 TimeOutInMilliSeconds - Timeout value in ms\r
726\r
727 Returns:\r
728 EFI_SUCCESS - Command succeeded.\r
729 EFI_DEVICE_ERROR - Command failed.\r
730\r
731--*/\r
732{\r
733 EFI_STATUS Status;\r
734 USB_CBI_DEVICE *UsbCbiDev;\r
735 UINT32 Result;\r
736 UINT8 Index;\r
737 UINT8 MaxRetryNum;\r
738\r
739 UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (This);\r
740\r
741 MaxRetryNum = 3;\r
742\r
743 for (Index = 0; Index < MaxRetryNum; Index++) {\r
744 \r
745 //\r
746 // First send ATAPI command through CBI1\r
747 //\r
748 Status = CBI1CommandPhase (\r
749 UsbCbiDev,\r
750 Command,\r
751 CommandSize,\r
752 &Result\r
753 );\r
754 if (EFI_ERROR (Status)) {\r
755\r
756 switch (Result) {\r
757\r
758 case EFI_USB_NOERROR:\r
759 case EFI_USB_ERR_STALL:\r
760 case EFI_USB_ERR_SYSTEM:\r
761 return EFI_DEVICE_ERROR;\r
762\r
763 default:\r
764 continue;\r
765 break;\r
766 }\r
767 } else {\r
768 break;\r
769 }\r
770 }\r
771\r
772 if (Index == MaxRetryNum) {\r
773 return EFI_DEVICE_ERROR;\r
774 }\r
775\r
776 for (Index = 0; Index < MaxRetryNum; Index++) {\r
777 //\r
778 // Send/Get Data if there is a Data Stage\r
779 //\r
780 switch (Direction) {\r
781\r
782 case EfiUsbDataIn:\r
783 case EfiUsbDataOut:\r
784 Status = CBI1DataPhase (\r
785 UsbCbiDev,\r
786 BufferLength,\r
787 DataBuffer,\r
788 Direction,\r
789 TimeOutInMilliSeconds,\r
790 &Result\r
791 );\r
792\r
793 if (EFI_ERROR (Status)) {\r
794 switch (Result) {\r
795\r
796 case EFI_USB_NOERROR:\r
797 case EFI_USB_ERR_STALL:\r
798 case EFI_USB_ERR_SYSTEM:\r
799 return EFI_DEVICE_ERROR;\r
800\r
801 default:\r
802 continue;\r
803 break;\r
804 }\r
805\r
806 } else {\r
807\r
808 return EFI_SUCCESS;\r
809 }\r
810 break;\r
811\r
812 case EfiUsbNoData:\r
813 return EFI_SUCCESS;\r
814 }\r
815 }\r
816 //\r
817 // If goes here, means met error.\r
818 //\r
819 return EFI_DEVICE_ERROR;\r
820}\r
821\r
92dda53e 822STATIC\r
878ddf1f 823VOID\r
824Cbi1ReportStatusCode (\r
825 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
826 IN EFI_STATUS_CODE_TYPE CodeType,\r
827 IN EFI_STATUS_CODE_VALUE Value\r
828 )\r
829/*++\r
830\r
831 Routine Description:\r
832 Report Status Code in Usb Cbi1 Driver\r
833\r
834 Arguments:\r
835 DevicePath - Use this to get Device Path\r
836 CodeType - Status Code Type\r
837 CodeValue - Status Code Value\r
838\r
839 Returns:\r
840 None\r
841\r
842--*/\r
843{\r
844 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
845 CodeType,\r
846 Value,\r
847 DevicePath\r
848 );\r
849\r
850}\r