summaryrefslogtreecommitdiff
path: root/EdkModulePkg/Bus/Usb
diff options
context:
space:
mode:
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2007-01-26 04:08:57 +0000
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2007-01-26 04:08:57 +0000
commit4d1fe68e1ca84cf0d3eec69d20625fa57769de12 (patch)
tree225a3ba03053fc3b4c1e45b10a185bef52645df2 /EdkModulePkg/Bus/Usb
parent01bf334d2c017095a1776c2c42fe5dd0337cff0a (diff)
downloadedk2-platforms-4d1fe68e1ca84cf0d3eec69d20625fa57769de12.tar.xz
1. Add NULL QH to set as QH header;
2. Do ping for high speed OUT pipe; 3. Bug fix for QTD size detection; 4. Bug fix for short package detection; 5. Bug fix get next QTD in ExcutionTransfer; 6. BOT module modify to follow spec; 7. Massstorage error hanling enhancement git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2321 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkModulePkg/Bus/Usb')
-rw-r--r--EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c62
-rw-r--r--EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c435
-rw-r--r--EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h19
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/ComponentName.c62
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c157
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h19
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h18
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c417
-rw-r--r--EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h16
9 files changed, 534 insertions, 671 deletions
diff --git a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c
index 34ab75864f..ca4228583a 100644
--- a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c
+++ b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c
@@ -1,13 +1,13 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -70,21 +70,21 @@ UsbBotComponentNameGetDriverName (
Arguments:
This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
Language - A pointer to a three character ISO 639-2 language identifier.
- This is the language of the driver name that that the caller
+ This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
- in SupportedLanguages. The number of languages supported by a
+ in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
DriverName - A pointer to the Unicode string to return. This Unicode string
- is the name of the driver specified by This in the language
+ is the name of the driver specified by This in the language
specified by Language.
Returns:
EFI_SUCCESS - The Unicode string for the Driver specified by This
- and the language specified by Language was returned
+ and the language specified by Language was returned
in DriverName.
EFI_INVALID_PARAMETER - Language is NULL.
EFI_INVALID_PARAMETER - DriverName is NULL.
- EFI_UNSUPPORTED - The driver specified by This does not support the
+ EFI_UNSUPPORTED - The driver specified by This does not support the
language specified by Language.
--*/
@@ -114,39 +114,39 @@ UsbBotComponentNameGetControllerName (
Arguments:
This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- ControllerHandle - The handle of a controller that the driver specified by
- This is managing. This handle specifies the controller
+ ControllerHandle - The handle of a controller that the driver specified by
+ This is managing. This handle specifies the controller
whose name is to be returned.
- ChildHandle - The handle of the child controller to retrieve the name
- of. This is an optional parameter that may be NULL. It
- will be NULL for device drivers. It will also be NULL
- for a bus drivers that wish to retrieve the name of the
- bus controller. It will not be NULL for a bus driver
+ ChildHandle - The handle of the child controller to retrieve the name
+ of. This is an optional parameter that may be NULL. It
+ will be NULL for device drivers. It will also be NULL
+ for a bus drivers that wish to retrieve the name of the
+ bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
- Language - A pointer to a three character ISO 639-2 language
- identifier. This is the language of the controller name
+ Language - A pointer to a three character ISO 639-2 language
+ identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
- of the languages specified in SupportedLanguages. The
- number of languages supported by a driver is up to the
+ of the languages specified in SupportedLanguages. The
+ number of languages supported by a driver is up to the
driver writer.
ControllerName - A pointer to the Unicode string to return. This Unicode
- string is the name of the controller specified by
+ string is the name of the controller specified by
ControllerHandle and ChildHandle in the language specified
by Language from the point of view of the driver specified
- by This.
+ by This.
Returns:
- EFI_SUCCESS - The Unicode string for the user readable name in the
- language specified by Language for the driver
+ EFI_SUCCESS - The Unicode string for the user readable name in the
+ language specified by Language for the driver
specified by This was returned in DriverName.
EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.
EFI_INVALID_PARAMETER - Language is NULL.
EFI_INVALID_PARAMETER - ControllerName is NULL.
- EFI_UNSUPPORTED - The driver specified by This is not currently managing
- the controller specified by ControllerHandle and
+ EFI_UNSUPPORTED - The driver specified by This is not currently managing
+ the controller specified by ControllerHandle and
ChildHandle.
- EFI_UNSUPPORTED - The driver specified by This does not support the
+ EFI_UNSUPPORTED - The driver specified by This does not support the
language specified by Language.
--*/
diff --git a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c
index acba154842..37b316f875 100644
--- a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c
+++ b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c
@@ -1,13 +1,13 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -19,6 +19,8 @@ Abstract:
#include "bot.h"
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32 gBOTDebugLevel = EFI_D_INFO;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32 gBOTErrorLevel = EFI_D_INFO;
//
// Function prototypes
//
@@ -85,7 +87,7 @@ STATIC
EFI_STATUS
BotDataPhase (
IN USB_BOT_DEVICE *UsbBotDev,
- IN UINT32 *DataSize,
+ IN UINTN *DataSize,
IN OUT VOID *DataBuffer,
IN EFI_USB_DATA_DIRECTION Direction,
IN UINT16 Timeout
@@ -94,11 +96,10 @@ BotDataPhase (
STATIC
EFI_STATUS
BotStatusPhase (
- IN USB_BOT_DEVICE *UsbBotDev,
- OUT UINT8 *TransferStatus,
- IN UINT16 Timeout
+ IN USB_BOT_DEVICE *UsbBotDev,
+ OUT UINT32 *DataResidue,
+ IN UINT16 Timeout
);
-
//
// USB Atapi protocol prototype
//
@@ -193,7 +194,7 @@ BotDriverBindingSupported (
//
// Check if it is a BOT type Mass Storage Device
//
- if ((InterfaceDescriptor.InterfaceClass != 0x08) ||
+ if ((InterfaceDescriptor.InterfaceClass != MASS_STORAGE_CLASS) ||
(InterfaceDescriptor.InterfaceProtocol != BOT)) {
Status = EFI_UNSUPPORTED;
goto Exit;
@@ -431,7 +432,7 @@ BotDriverBindingStop (
Returns:
EFI_SUCCESS - This driver is removed DeviceHandle
- EFI_UNSUPPORTED - Can't open the gEfiUsbAtapiProtocolGuid protocl
+ EFI_UNSUPPORTED - Can't open the gEfiUsbAtapiProtocolGuid protocl
other - This driver was not removed from this device
--*/
@@ -513,6 +514,38 @@ BotDriverBindingStop (
return Status;
}
+
+
+STATIC
+EFI_STATUS
+ClearBulkInPipe (
+ IN USB_BOT_DEVICE *UsbBotDev
+ )
+{
+ UINT32 Result;
+
+ return UsbClearEndpointHalt (
+ UsbBotDev->UsbIo,
+ UsbBotDev->BulkInEndpointDescriptor->EndpointAddress,
+ &Result
+ );
+}
+
+
+STATIC
+EFI_STATUS
+ClearBulkOutPipe (
+ IN USB_BOT_DEVICE *UsbBotDev
+ )
+{
+ UINT32 Result;
+ return UsbClearEndpointHalt (
+ UsbBotDev->UsbIo,
+ UsbBotDev->BulkOutEndpointDescriptor->EndpointAddress,
+ &Result
+ );
+}
+
STATIC
EFI_STATUS
BotRecoveryReset (
@@ -530,17 +563,12 @@ Arguments:
Returns:
EFI_SUCCESS - Success the operation
-
+
--*/
{
EFI_STATUS Status;
- UINT32 Result;
EFI_USB_DEVICE_REQUEST Request;
- EFI_USB_IO_PROTOCOL *UsbIo;
- UINT8 EndpointAddr;
-
- UsbIo = UsbBotDev->UsbIo;
-
+ UINT32 Result;
BotReportStatusCode (
UsbBotDev->DevicePath,
EFI_PROGRESS_CODE,
@@ -555,43 +583,24 @@ Returns:
Request.RequestType = 0x21;
Request.Request = 0xFF;
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &Request,
- EfiUsbNoData,
- TIMEOUT_VALUE,
- NULL,
- 0,
- &Result
- );
+ Status = UsbBotDev->UsbIo->UsbControlTransfer (
+ UsbBotDev->UsbIo,
+ &Request,
+ EfiUsbNoData,
+ TIMEOUT_VALUE,
+ NULL,
+ 0,
+ &Result
+ );
gBS->Stall (100 * 1000);
- if (!EFI_ERROR (Status)) {
- //
- // clear bulk in endpoint stall feature
- //
- EndpointAddr = UsbBotDev->BulkInEndpointDescriptor->EndpointAddress;
-
- Status = UsbClearEndpointHalt (
- UsbIo,
- EndpointAddr,
- &Result
- );
-
- //
- // clear bulk out endpoint stall feature
- //
- EndpointAddr = UsbBotDev->BulkOutEndpointDescriptor->EndpointAddress;
- Status = UsbClearEndpointHalt (
- UsbIo,
- EndpointAddr,
- &Result
- );
- }
+ ClearBulkInPipe (UsbBotDev);
+ ClearBulkOutPipe (UsbBotDev);
return Status;
}
+
//
// Bot Protocol Implementation
//
@@ -639,7 +648,17 @@ BotCommandPhase (
cbw.dCBWSignature = CBWSIG;
cbw.dCBWTag = 0x01;
cbw.dCBWDataTransferLength = DataTransferLength;
- cbw.bmCBWFlags = (UINT8) (Direction << 7);
+ switch (Direction) {
+ case EfiUsbDataOut:
+ case EfiUsbNoData:
+ cbw.bmCBWFlags = 0;
+ break;
+ case EfiUsbDataIn:
+ cbw.bmCBWFlags = 0x80;
+ break;
+ default:
+ break;
+ }
cbw.bCBWCBLength = CommandSize;
CopyMem (cbw.CBWCB, Command, CommandSize);
@@ -648,28 +667,20 @@ BotCommandPhase (
Status = UsbIo->UsbBulkTransfer (
UsbIo,
- (UsbBotDev->BulkOutEndpointDescriptor)->EndpointAddress,
+ UsbBotDev->BulkOutEndpointDescriptor->EndpointAddress,
&cbw,
&DataSize,
Timeout,
&Result
);
- if (EFI_ERROR (Status)) {
- //
- // Command phase fail, we need to recovery reset this device
- //
- BotRecoveryReset (UsbBotDev);
- return EFI_DEVICE_ERROR;
- }
-
- return EFI_SUCCESS;
+ return Status;
}
STATIC
EFI_STATUS
BotDataPhase (
IN USB_BOT_DEVICE *UsbBotDev,
- IN UINT32 *DataSize,
+ IN UINTN *DataSize,
IN OUT VOID *DataBuffer,
IN EFI_USB_DATA_DIRECTION Direction,
IN UINT16 Timeout
@@ -695,125 +706,52 @@ BotDataPhase (
UINT32 Result;
EFI_USB_IO_PROTOCOL *UsbIo;
UINT8 EndpointAddr;
- UINTN Remain;
- UINTN Increment;
- UINT32 MaxPacketLen;
UINT8 *BufferPtr;
- UINTN TransferredSize;
- UINTN RetryTimes;
- UINTN MaxRetry;
- UINTN BlockSize;
- UINTN PackageNum;
UsbIo = UsbBotDev->UsbIo;
- Remain = *DataSize;
BufferPtr = (UINT8 *) DataBuffer;
- TransferredSize = 0;
- MaxRetry = 10;
- PackageNum = 128;
//
// retrieve the the max packet length of the given endpoint
//
if (Direction == EfiUsbDataIn) {
- MaxPacketLen = (UsbBotDev->BulkInEndpointDescriptor)->MaxPacketSize;
- EndpointAddr = (UsbBotDev->BulkInEndpointDescriptor)->EndpointAddress;
+ EndpointAddr = UsbBotDev->BulkInEndpointDescriptor->EndpointAddress;
} else {
- MaxPacketLen = (UsbBotDev->BulkOutEndpointDescriptor)->MaxPacketSize;
- EndpointAddr = (UsbBotDev->BulkOutEndpointDescriptor)->EndpointAddress;
+ EndpointAddr = UsbBotDev->BulkOutEndpointDescriptor->EndpointAddress;
}
- RetryTimes = MaxRetry;
- BlockSize = PackageNum * MaxPacketLen;
- while (Remain > 0) {
- //
- // Using 15 packets to aVOID Bitstuff error
- //
- if (Remain > PackageNum * MaxPacketLen) {
- Increment = BlockSize;
- } else {
- Increment = Remain;
- }
-
Status = UsbIo->UsbBulkTransfer (
UsbIo,
EndpointAddr,
BufferPtr,
- &Increment,
- Timeout,
+ DataSize,
+ (UINT16)(Timeout),
&Result
);
- TransferredSize += Increment;
-
if (EFI_ERROR (Status)) {
- RetryTimes--;
- if ((RetryTimes == 0) || ((Result & EFI_USB_ERR_TIMEOUT) == 0)) {
- goto ErrorExit;
+ if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {
+ if (Direction == EfiUsbDataIn) {
+ DEBUG((gBOTErrorLevel, "BOT: Data IN Stall, ClearBulkInPipe\n"));
+ ClearBulkInPipe (UsbBotDev);
+ } else {
+ DEBUG((gBOTErrorLevel, "BOT: Data OUT Stall, ClearBulkInPipe\n"));
+ ClearBulkOutPipe (UsbBotDev);
+ }
}
+ // BotRecoveryReset (UsbBotDev);
+ }
- TransferredSize -= Increment;
- continue;
- } else {
- //
- // we try MaxTetry times for every bulk transfer
- //
- RetryTimes = MaxRetry;
- }
-
- BufferPtr += Increment;
- Remain -= Increment;
- if (Increment < BlockSize && TransferredSize <= *DataSize) {
- //
- // we get to the end of transter and transter size is
- // less than requriedsize
- //
- break;
- }
- }
-
- *DataSize = (UINT32) TransferredSize;
-
- return EFI_SUCCESS;
-
-ErrorExit:
- if (Direction == EfiUsbDataIn) {
- BotReportStatusCode (
- UsbBotDev->DevicePath,
- EFI_ERROR_CODE | EFI_ERROR_MINOR,
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_INPUT_ERROR)
- );
- } else {
- BotReportStatusCode (
- UsbBotDev->DevicePath,
- EFI_ERROR_CODE | EFI_ERROR_MINOR,
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_OUTPUT_ERROR)
- );
- }
-
- if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {
- //
- // just endpoint stall happens
- //
- UsbClearEndpointHalt (
- UsbIo,
- EndpointAddr,
- &Result
- );
- }
-
- *DataSize = (UINT32) TransferredSize;
return Status;
-
}
STATIC
EFI_STATUS
BotStatusPhase (
- IN USB_BOT_DEVICE *UsbBotDev,
- OUT UINT8 *TransferStatus,
- IN UINT16 Timeout
+ IN USB_BOT_DEVICE *UsbBotDev,
+ OUT UINT32 *DataResidue,
+ IN UINT16 Timeout
)
/*++
@@ -822,7 +760,6 @@ BotStatusPhase (
Parameters:
UsbBotDev - USB_BOT_DEVICE pointer
- TransferStatus - TransferStatus
Timeout - Time out value in milliseconds
Return Value:
EFI_SUCCESS
@@ -832,47 +769,21 @@ BotStatusPhase (
{
CSW csw;
EFI_STATUS Status;
- UINT32 Result;
EFI_USB_IO_PROTOCOL *UsbIo;
UINT8 EndpointAddr;
UINTN DataSize;
+ UINT32 Result;
+ UINT8 Index;
UsbIo = UsbBotDev->UsbIo;
+ EndpointAddr = UsbBotDev->BulkInEndpointDescriptor->EndpointAddress;
- ZeroMem (&csw, sizeof (CSW));
-
- EndpointAddr = (UsbBotDev->BulkInEndpointDescriptor)->EndpointAddress;
-
- DataSize = sizeof (CSW);
-
- //
- // Get the status field from bulk transfer
- //
- Status = UsbIo->UsbBulkTransfer (
- UsbIo,
- EndpointAddr,
- &csw,
- &DataSize,
- Timeout,
- &Result
- );
- if (EFI_ERROR (Status)) {
- if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {
- //
- // just endpoint stall happens
- //
- UsbClearEndpointHalt (
- UsbIo,
- EndpointAddr,
- &Result
- );
- }
+ for (Index = 0; Index < 3; Index ++) {
ZeroMem (&csw, sizeof (CSW));
+ DataSize = sizeof (CSW);
+ Result = 0;
- EndpointAddr = (UsbBotDev->BulkInEndpointDescriptor)->EndpointAddress;
-
- DataSize = sizeof (CSW);
Status = UsbIo->UsbBulkTransfer (
UsbIo,
EndpointAddr,
@@ -883,25 +794,36 @@ BotStatusPhase (
);
if (EFI_ERROR (Status)) {
if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {
- UsbClearEndpointHalt (
- UsbIo,
- EndpointAddr,
- &Result
- );
+ DEBUG((gBOTDebugLevel, "BOT: CSW Stall, ClearBulkInPipe\n"));
+ ClearBulkInPipe (UsbBotDev);
+ continue;
+ }
+ }
+
+ if (csw.dCSWSignature == CSWSIG) {
+ if (csw.bCSWStatus == 0 || csw.bCSWStatus == 0x01) {
+ if (DataResidue != NULL) {
+ *DataResidue = csw.dCSWDataResidue;
+ }
+ if (csw.bCSWStatus == 0x01) {
+ return EFI_DEVICE_ERROR;
+ }
+ break;
+ } else if (csw.bCSWStatus == 0x02) {
+ DEBUG((gBOTErrorLevel, "BOT: Bot Phase error\n"));
+ BotRecoveryReset (UsbBotDev);
}
- return Status;
}
}
- if (csw.dCSWSignature == CSWSIG) {
- *TransferStatus = csw.bCSWStatus;
- } else {
+ if (Index == 3) {
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
+
//
// Usb Atapi Protocol implementation
//
@@ -938,81 +860,82 @@ BotAtapiCommand (
{
EFI_STATUS Status;
EFI_STATUS BotDataStatus;
- UINT8 TransferStatus;
USB_BOT_DEVICE *UsbBotDev;
- UINT32 BufferSize;
-
- BotDataStatus = EFI_SUCCESS;
- TransferStatus = 0;
+ UINTN BufferSize;
+ UINT8 Index;
+ UINT32 DataResidue;
//
// Get the context
//
- UsbBotDev = USB_BOT_DEVICE_FROM_THIS (This);
+ UsbBotDev = USB_BOT_DEVICE_FROM_THIS (This);
+ BotDataStatus = EFI_SUCCESS;
+ BufferSize = 0;
- //
- // First send ATAPI command through Bot
- //
- Status = BotCommandPhase (
- UsbBotDev,
- Command,
- CommandSize,
- BufferLength,
- Direction,
- TimeOutInMilliSeconds
- );
+ for (Index = 0; Index < 3; Index ++) {
+ //
+ // First send ATAPI command through Bot
+ //
+ Status = BotCommandPhase (
+ UsbBotDev,
+ Command,
+ CommandSize,
+ BufferLength,
+ Direction,
+ 10 * 1000
+ );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
- //
- // Send/Get Data if there is a Data Stage
- //
- switch (Direction) {
+ if (EFI_ERROR (Status)) {
+ DEBUG((gBOTErrorLevel, "BotCommandPhase Fail\n"));
+ return Status;
+ }
+ //
+ // Send/Get Data if there is a Data Stage
+ //
+ switch (Direction) {
- case EfiUsbDataIn:
- case EfiUsbDataOut:
- BufferSize = BufferLength;
-
- BotDataStatus = BotDataPhase (
- UsbBotDev,
- &BufferSize,
- DataBuffer,
- Direction,
- (UINT16) (TimeOutInMilliSeconds)
- );
+ case EfiUsbDataIn:
+ case EfiUsbDataOut:
+ BufferSize = BufferLength;
- break;
+ BotDataStatus = BotDataPhase (
+ UsbBotDev,
+ &BufferSize,
+ DataBuffer,
+ Direction,
+ (UINT16) (TimeOutInMilliSeconds)
+ );
- case EfiUsbNoData:
- break;
- }
-
- //
- // Status Phase
- //
- Status = BotStatusPhase (
- UsbBotDev,
- &TransferStatus,
- TimeOutInMilliSeconds
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
+ if (EFI_ERROR (BotDataStatus)) {
+ DEBUG((gBOTErrorLevel, "BotDataPhase Fail\n"));
+ }
+ break;
- if (TransferStatus == 0x02) {
+ case EfiUsbNoData:
+ break;
+ }
+
+ DataResidue = 0;
//
- // Phase error
+ // Status Phase
//
- BotRecoveryReset (UsbBotDev);
- return EFI_DEVICE_ERROR;
- }
+ Status = BotStatusPhase (
+ UsbBotDev,
+ &DataResidue,
+ 10 * 1000
+ );
- if (TransferStatus == 0x01) {
- return EFI_DEVICE_ERROR;
- }
+ if (EFI_ERROR (Status)) {
+ DEBUG((gBOTErrorLevel, "BotStatusPhase Fail\n"));
+ return Status;
+ }
+ if (!EFI_ERROR (BotDataStatus)) {
+ break;
+ }
+
+ }
return BotDataStatus;
}
diff --git a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h
index 5f9006b5bd..383cfde48e 100644
--- a/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h
+++ b/EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h
@@ -1,13 +1,13 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -22,6 +22,9 @@ Abstract:
#include <IndustryStandard/Usb.h>
+extern UINT32 gBOTDebugLevel;
+extern UINT32 gBOTErrorLevel;
+#define MASS_STORAGE_CLASS 0x08
#pragma pack(1)
//
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/ComponentName.c b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/ComponentName.c
index a021d95389..f033361fff 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/ComponentName.c
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/ComponentName.c
@@ -1,13 +1,13 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -69,21 +69,21 @@ UsbMassStorageComponentNameGetDriverName (
Arguments:
This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
Language - A pointer to a three character ISO 639-2 language identifier.
- This is the language of the driver name that that the caller
+ This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
- in SupportedLanguages. The number of languages supported by a
+ in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
DriverName - A pointer to the Unicode string to return. This Unicode string
- is the name of the driver specified by This in the language
+ is the name of the driver specified by This in the language
specified by Language.
Returns:
EFI_SUCCESS - The Unicode string for the Driver specified by This
- and the language specified by Language was returned
+ and the language specified by Language was returned
in DriverName.
EFI_INVALID_PARAMETER - Language is NULL.
EFI_INVALID_PARAMETER - DriverName is NULL.
- EFI_UNSUPPORTED - The driver specified by This does not support the
+ EFI_UNSUPPORTED - The driver specified by This does not support the
language specified by Language.
--*/
@@ -113,39 +113,39 @@ UsbMassStorageComponentNameGetControllerName (
Arguments:
This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- ControllerHandle - The handle of a controller that the driver specified by
- This is managing. This handle specifies the controller
+ ControllerHandle - The handle of a controller that the driver specified by
+ This is managing. This handle specifies the controller
whose name is to be returned.
- ChildHandle - The handle of the child controller to retrieve the name
- of. This is an optional parameter that may be NULL. It
- will be NULL for device drivers. It will also be NULL
- for a bus drivers that wish to retrieve the name of the
- bus controller. It will not be NULL for a bus driver
+ ChildHandle - The handle of the child controller to retrieve the name
+ of. This is an optional parameter that may be NULL. It
+ will be NULL for device drivers. It will also be NULL
+ for a bus drivers that wish to retrieve the name of the
+ bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
- Language - A pointer to a three character ISO 639-2 language
- identifier. This is the language of the controller name
+ Language - A pointer to a three character ISO 639-2 language
+ identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
- of the languages specified in SupportedLanguages. The
- number of languages supported by a driver is up to the
+ of the languages specified in SupportedLanguages. The
+ number of languages supported by a driver is up to the
driver writer.
ControllerName - A pointer to the Unicode string to return. This Unicode
- string is the name of the controller specified by
+ string is the name of the controller specified by
ControllerHandle and ChildHandle in the language specified
by Language from the point of view of the driver specified
- by This.
+ by This.
Returns:
- EFI_SUCCESS - The Unicode string for the user readable name in the
- language specified by Language for the driver
+ EFI_SUCCESS - The Unicode string for the user readable name in the
+ language specified by Language for the driver
specified by This was returned in DriverName.
EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.
EFI_INVALID_PARAMETER - Language is NULL.
EFI_INVALID_PARAMETER - ControllerName is NULL.
- EFI_UNSUPPORTED - The driver specified by This is not currently managing
- the controller specified by ControllerHandle and
+ EFI_UNSUPPORTED - The driver specified by This is not currently managing
+ the controller specified by ControllerHandle and
ChildHandle.
- EFI_UNSUPPORTED - The driver specified by This does not support the
+ EFI_UNSUPPORTED - The driver specified by This does not support the
language specified by Language.
--*/
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c
index b86c06a514..7f6cd4daf2 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c
@@ -1,18 +1,18 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
UsbMassStorage.c
-
+
Abstract:
USB Mass Storage Driver
@@ -192,11 +192,11 @@ USBFloppyDriverBindingStart (
EFI_OUT_OF_RESOURCES- Can't allocate memory resources
EFI_ALREADY_STARTED - Thios driver has been started
--*/
-{
- EFI_STATUS Status;
+{
+ EFI_STATUS Status;
EFI_USB_ATAPI_PROTOCOL *AtapiProtocol;
USB_FLOPPY_DEV *UsbFloppyDevice;
-
+
UsbFloppyDevice = NULL;
//
// Check whether Usb Atapi Protocol attached on the controller handle.
@@ -311,7 +311,7 @@ USBFloppyDriverBindingStop (
EFI_DEVICE_ERROR
others
---*/
+--*/
{
EFI_STATUS Status;
USB_FLOPPY_DEV *UsbFloppyDevice;
@@ -373,17 +373,17 @@ USBFloppyReset (
Routine Description:
Implements EFI_BLOCK_IO_PROTOCOL.Reset() function.
-
+
Arguments:
This The EFI_BLOCK_IO_PROTOCOL instance.
ExtendedVerification
Indicates that the driver may perform a more exhaustive
verification operation of the device during reset.
(This parameter is ingored in this driver.)
-
- Returns:
+
+ Returns:
EFI_SUCCESS - Success
---*/
+--*/
{
USB_FLOPPY_DEV *UsbFloppyDevice;
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
@@ -396,7 +396,7 @@ USBFloppyReset (
//
// directly calling EFI_USB_ATAPI_PROTOCOL.Reset() to implement reset.
//
- Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, TRUE);
+ Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, ExtendedVerification);
return Status;
}
@@ -415,26 +415,26 @@ USBFloppyReadBlocks (
Routine Description:
Implements EFI_BLOCK_IO_PROTOCOL.ReadBlocks() function.
-
+
Arguments:
This The EFI_BLOCK_IO_PROTOCOL instance.
MediaId The media id that the read request is for.
LBA The starting logical block address to read from on the device.
BufferSize
- The size of the Buffer in bytes. This must be a multiple of
+ The size of the Buffer in bytes. This must be a multiple of
the intrinsic block size of the device.
- Buffer A pointer to the destination buffer for the data. The caller
+ Buffer A pointer to the destination buffer for the data. The caller
is responsible for either having implicit or explicit ownership
- of the buffer.
-
- Returns:
+ of the buffer.
+
+ Returns:
EFI_INVALID_PARAMETER - Parameter is error
- EFI_SUCCESS - Success
+ EFI_SUCCESS - Success
EFI_DEVICE_ERROR - Hardware Error
EFI_NO_MEDIA - No media
EFI_MEDIA_CHANGED - Media Change
EFI_BAD_BUFFER_SIZE - Buffer size is bad
- --*/
+ --*/
{
USB_FLOPPY_DEV *UsbFloppyDevice;
EFI_STATUS Status;
@@ -442,12 +442,9 @@ USBFloppyReadBlocks (
UINTN BlockSize;
UINTN NumberOfBlocks;
BOOLEAN MediaChange;
- EFI_TPL OldTpl;
- OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);
Status = EFI_SUCCESS;
MediaChange = FALSE;
-
UsbFloppyDevice = USB_FLOPPY_DEV_FROM_THIS (This);
//
@@ -473,14 +470,12 @@ USBFloppyReadBlocks (
}
if (MediaChange) {
- gBS->RestoreTPL (OldTpl);
gBS->ReinstallProtocolInterface (
UsbFloppyDevice->Handle,
&gEfiBlockIoProtocolGuid,
&UsbFloppyDevice->BlkIo,
&UsbFloppyDevice->BlkIo
);
- gBS->RaiseTPL (EFI_TPL_NOTIFY);
}
Media = UsbFloppyDevice->BlkIo.Media;
@@ -517,33 +512,31 @@ USBFloppyReadBlocks (
goto Done;
}
- if (!EFI_ERROR (Status)) {
-
- Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, 1);
- if (EFI_ERROR (Status)) {
- This->Reset (This, TRUE);
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- LBA += 1;
- NumberOfBlocks -= 1;
- Buffer = (UINT8 *) Buffer + This->Media->BlockSize;
+ while (NumberOfBlocks > 0) {
- if (NumberOfBlocks == 0) {
- Status = EFI_SUCCESS;
- goto Done;
+ if (NumberOfBlocks > BLOCK_UNIT) {
+ Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, BLOCK_UNIT);
+ } else {
+ Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
}
- Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
if (EFI_ERROR (Status)) {
This->Reset (This, TRUE);
Status = EFI_DEVICE_ERROR;
}
- }
-Done:
- gBS->RestoreTPL (OldTpl);
+ if (NumberOfBlocks > BLOCK_UNIT) {
+ NumberOfBlocks -= BLOCK_UNIT;
+ LBA += BLOCK_UNIT;
+ Buffer = (UINT8 *) Buffer + This->Media->BlockSize * BLOCK_UNIT;
+ } else {
+ NumberOfBlocks -= NumberOfBlocks;
+ LBA += NumberOfBlocks;
+ Buffer = (UINT8 *) Buffer + This->Media->BlockSize * NumberOfBlocks;
+ }
+ }
+
+ Done:
return Status;
}
@@ -561,29 +554,29 @@ USBFloppyWriteBlocks (
Routine Description:
Implements EFI_BLOCK_IO_PROTOCOL.WriteBlocks() function.
-
+
Arguments:
This The EFI_BLOCK_IO_PROTOCOL instance.
MediaId The media id that the write request is for.
LBA The starting logical block address to be written.
- The caller is responsible for writing to only
+ The caller is responsible for writing to only
legitimate locations.
BufferSize
- The size of the Buffer in bytes. This must be a multiple of
+ The size of the Buffer in bytes. This must be a multiple of
the intrinsic block size of the device.
- Buffer A pointer to the source buffer for the data. The caller
+ Buffer A pointer to the source buffer for the data. The caller
is responsible for either having implicit or explicit ownership
- of the buffer.
-
- Returns:
+ of the buffer.
+
+ Returns:
EFI_INVALID_PARAMETER - Parameter is error
- EFI_SUCCESS - Success
+ EFI_SUCCESS - Success
EFI_DEVICE_ERROR - Hardware Error
EFI_NO_MEDIA - No media
EFI_MEDIA_CHANGED - Media Change
EFI_BAD_BUFFER_SIZE - Buffer size is bad
---*/
+--*/
{
USB_FLOPPY_DEV *UsbFloppyDevice;
EFI_STATUS Status;
@@ -591,9 +584,7 @@ USBFloppyWriteBlocks (
UINTN BlockSize;
UINTN NumberOfBlocks;
BOOLEAN MediaChange;
- EFI_TPL OldTpl;
- OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);
Status = EFI_SUCCESS;
MediaChange = FALSE;
@@ -622,14 +613,12 @@ USBFloppyWriteBlocks (
}
if (MediaChange) {
- gBS->RestoreTPL (OldTpl);
gBS->ReinstallProtocolInterface (
UsbFloppyDevice->Handle,
&gEfiBlockIoProtocolGuid,
&UsbFloppyDevice->BlkIo,
&UsbFloppyDevice->BlkIo
);
- gBS->RaiseTPL (EFI_TPL_NOTIFY);
}
Media = UsbFloppyDevice->BlkIo.Media;
@@ -671,32 +660,32 @@ USBFloppyWriteBlocks (
goto Done;
}
- if (!EFI_ERROR (Status)) {
- Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, 1);
- if (EFI_ERROR (Status)) {
- This->Reset (This, TRUE);
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- LBA += 1;
- NumberOfBlocks -= 1;
- Buffer = (UINT8 *) Buffer + This->Media->BlockSize;
+ while (NumberOfBlocks > 0) {
- if (NumberOfBlocks == 0) {
- Status = EFI_SUCCESS;
- goto Done;
+ if (NumberOfBlocks > BLOCK_UNIT) {
+ Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, BLOCK_UNIT);
+ } else {
+ Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
}
- Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
if (EFI_ERROR (Status)) {
This->Reset (This, TRUE);
Status = EFI_DEVICE_ERROR;
}
- }
+
+ if (NumberOfBlocks > BLOCK_UNIT) {
+ NumberOfBlocks -= BLOCK_UNIT;
+ LBA += BLOCK_UNIT;
+ Buffer = (UINT8 *) Buffer + This->Media->BlockSize * BLOCK_UNIT;
+ } else {
+ NumberOfBlocks -= NumberOfBlocks;
+ LBA += NumberOfBlocks;
+ Buffer = (UINT8 *) Buffer + This->Media->BlockSize * NumberOfBlocks;
+ }
+ }
Done:
- gBS->RestoreTPL (OldTpl);
+
return Status;
}
@@ -711,13 +700,13 @@ USBFloppyFlushBlocks (
Routine Description:
Implements EFI_BLOCK_IO_PROTOCOL.FlushBlocks() function.
(In this driver, this function just returns EFI_SUCCESS.)
-
+
Arguments:
This The EFI_BLOCK_IO_PROTOCOL instance.
-
- Returns:
+
+ Returns:
EFI_SUCCESS - Success
---*/
+--*/
{
return EFI_SUCCESS;
}
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h
index fc19930cbd..832befcccc 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h
@@ -1,12 +1,12 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -37,6 +37,8 @@ Revision History
#define USBFLOPPY2 2 // for those that use ReadFormatCapacity(0x23) command to retrieve media capacity
#define USBCDROM 3
+#define BLOCK_UNIT 128
+
#define USB_FLOPPY_DEV_SIGNATURE EFI_SIGNATURE_32 ('u', 'f', 'l', 'p')
typedef struct {
@@ -50,7 +52,6 @@ typedef struct {
REQUEST_SENSE_DATA *SenseData;
UINT8 SenseDataNumber;
UINT8 DeviceType;
-
} USB_FLOPPY_DEV;
#define USB_FLOPPY_DEV_FROM_THIS(a) \
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h
index 45433edfc2..cef33bd4f5 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h
@@ -1,12 +1,12 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
@@ -30,7 +30,7 @@ Revision History
//
// timeout unit is in millisecond.
//
-#define USBFLPTIMEOUT 2000
+#define USBFLPTIMEOUT 1000
#define STALL_1_MILLI_SECOND 1000
//
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c
index de61eeb6d0..c81fbf299e 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c
@@ -1,18 +1,18 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
UsbMassStorageHelper.c
-
+
Abstract:
Helper functions for USB Mass Storage Driver
@@ -80,19 +80,19 @@ USBFloppyPacketCommand (
Routine Description:
Sends Packet Command to USB Floppy Drive.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
Command - A pointer to the command packet.
CommandSize - Indicates the size of the command packet.
DataBuffer - A pointer to the buffer for the data transfer
- after the command packet.
+ after the command packet.
BufferLength - Indicates the size of the Data Buffer.
Direction - Transfer Direction
TimeOutInMilliSeconds - Timeout Value
- Returns:
+ Returns:
EFI_SUCCESS - Success
---*/
+--*/
{
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
EFI_STATUS Status;
@@ -123,14 +123,14 @@ USBFloppyIdentify (
Routine Description:
Retrieves device information to tell the device type.
-
+
Arguments:
UsbFloppyDevice The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
+--*/
{
EFI_STATUS Status;
@@ -144,7 +144,7 @@ USBFloppyIdentify (
if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR;
}
-
+
//
// Get media removable info from INQUIRY data.
//
@@ -201,7 +201,7 @@ USBFloppyIdentify (
gBS->FreePool (Idata);
return EFI_DEVICE_ERROR;
}
-
+
//
// Get media information.
//
@@ -221,16 +221,16 @@ USBFloppyInquiry (
Routine Description:
Send Inquiry Packet Command to device and retrieve Inquiry Data.
-
+
Arguments:
UsbFloppyDevice The USB_FLOPPY_DEV instance.
- Idata A pointer pointing to the address of
+ Idata A pointer pointing to the address of
Inquiry Data.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
+--*/
{
ATAPI_PACKET_COMMAND Packet;
EFI_STATUS Status;
@@ -272,31 +272,31 @@ USBFloppyInquiry (
EFI_STATUS
USBFloppyRead10 (
- IN USB_FLOPPY_DEV *UsbFloppyDevice,
- IN VOID *Buffer,
- IN EFI_LBA Lba,
- IN UINTN NumberOfBlocks
+ IN USB_FLOPPY_DEV *UsbFloppyDevice,
+ IN VOID *Buffer,
+ IN EFI_LBA Lba,
+ IN UINTN NumberOfBlocks
)
/*++
Routine Description:
Sends Read10 Packet Command to device to perform data transfer
from device to host.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
- Buffer - A pointer to the destination buffer for the data.
+ Buffer - A pointer to the destination buffer for the data.
The caller is responsible for either having implicit
or explicit ownership of the buffer.
- Lba - The starting logical block address to read from
+ Lba - The starting logical block address to read from
on the device.
- NumberOfBlocks - Indicates the number of blocks that the read
+ NumberOfBlocks - Indicates the number of blocks that the read
operation requests.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
+--*/
{
ATAPI_PACKET_COMMAND Packet;
READ10_CMD *Read10Packet;
@@ -310,7 +310,7 @@ USBFloppyRead10 (
EFI_STATUS Status;
UINT16 TimeOut;
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
- UINTN SenseCounts;
+ UINT8 Index;
UsbAtapiInterface = UsbFloppyDevice->AtapiProtocol;
@@ -333,78 +333,52 @@ USBFloppyRead10 (
} else {
SectorCount = MaxBlock;
}
- //
- // fill the Packet data structure
- //
- Read10Packet->opcode = READ_10;
- //
- // Lba0 ~ Lba3 specify the start logical block address of the data transfer.
- // Lba0 is MSB, Lba3 is LSB
- //
- Read10Packet->Lba3 = (UINT8) (Lba32 & 0xff);
- Read10Packet->Lba2 = (UINT8) (Lba32 >> 8);
- Read10Packet->Lba1 = (UINT8) (Lba32 >> 16);
- Read10Packet->Lba0 = (UINT8) (Lba32 >> 24);
+ for (Index = 0; Index < 3; Index ++) {
- //
- // TranLen0 ~ TranLen1 specify the transfer length in block unit.
- // TranLen0 is MSB, TranLen is LSB
- //
- Read10Packet->TranLen1 = (UINT8) (SectorCount & 0xff);
- Read10Packet->TranLen0 = (UINT8) (SectorCount >> 8);
+ //
+ // fill the Packet data structure
+ //
+ Read10Packet->opcode = READ_10;
+ //
+ // Lba0 ~ Lba3 specify the start logical block address of the data transfer.
+ // Lba0 is MSB, Lba3 is LSB
+ //
+ Read10Packet->Lba3 = (UINT8) (Lba32 & 0xff);
+ Read10Packet->Lba2 = (UINT8) (Lba32 >> 8);
+ Read10Packet->Lba1 = (UINT8) (Lba32 >> 16);
+ Read10Packet->Lba0 = (UINT8) (Lba32 >> 24);
- ByteCount = SectorCount * BlockSize;
+ //
+ // TranLen0 ~ TranLen1 specify the transfer length in block unit.
+ // TranLen0 is MSB, TranLen is LSB
+ //
+ Read10Packet->TranLen1 = (UINT8) (SectorCount & 0xff);
+ Read10Packet->TranLen0 = (UINT8) (SectorCount >> 8);
- TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
+ ByteCount = SectorCount * BlockSize;
- Status = USBFloppyPacketCommand (
- UsbFloppyDevice,
- &Packet,
- sizeof (ATAPI_PACKET_COMMAND),
- (VOID *) ptrBuffer,
- ByteCount,
- EfiUsbDataIn,
- TimeOut
- );
- if (EFI_ERROR (Status)) {
+ TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
- Status = UsbFloppyRequestSense (UsbFloppyDevice, &SenseCounts);
- if (!EFI_ERROR (Status)) {
- if (IsLogicalUnitCommunicationOverRun (
- UsbFloppyDevice->SenseData,
- SenseCounts
- )) {
- Lba32 = (UINT32) Lba;
- ptrBuffer = Buffer;
- BlocksRemaining = (UINT16) NumberOfBlocks;
- MaxBlock = (UINT16) (MaxBlock / 4);
- if (MaxBlock < 1) {
- MaxBlock = 1;
- }
- continue;
- }
- } else {
- return EFI_DEVICE_ERROR;
- }
- //
- // retry read10 command
- //
Status = USBFloppyPacketCommand (
- UsbFloppyDevice,
- &Packet,
- sizeof (ATAPI_PACKET_COMMAND),
- (VOID *) ptrBuffer,
- ByteCount,
- EfiUsbDataIn,
- TimeOut
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
+ UsbFloppyDevice,
+ &Packet,
+ sizeof (ATAPI_PACKET_COMMAND),
+ (VOID *) ptrBuffer,
+ ByteCount,
+ EfiUsbDataIn,
+ TimeOut
+ );
+ if (!EFI_ERROR (Status)) {
+ break;
}
}
+ if (Index == 3) {
+ return EFI_DEVICE_ERROR;
+ }
+
Lba32 += SectorCount;
ptrBuffer = (UINT8 *) ptrBuffer + SectorCount * BlockSize;
BlocksRemaining = (UINT16) (BlocksRemaining - SectorCount);
@@ -420,17 +394,17 @@ USBFloppyReadCapacity (
/*++
Routine Description:
- Retrieves media capacity information via
+ Retrieves media capacity information via
sending Read Capacity Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
-{
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -483,17 +457,17 @@ USBFloppyReadFormatCapacity (
/*++
Routine Description:
- Retrieves media capacity information via sending Read Format
+ Retrieves media capacity information via sending Read Format
Capacity Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
-{
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -537,7 +511,7 @@ USBFloppyReadFormatCapacity (
} else {
UsbFloppyDevice->BlkIo.Media->LastBlock = (FormatData.LastLba3 << 24) |
- (FormatData.LastLba2 << 16) |
+ (FormatData.LastLba2 << 16) |
(FormatData.LastLba1 << 8) |
FormatData.LastLba0;
@@ -565,17 +539,17 @@ UsbFloppyRequestSense (
/*++
Routine Description:
- Retrieves Sense Data from device via
+ Retrieves Sense Data from device via
sending Request Sense Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
SenseCounts - A pointer to the number of Sense Data returned.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
+--*/
{
EFI_STATUS Status;
REQUEST_SENSE_DATA *Sense;
@@ -598,7 +572,7 @@ UsbFloppyRequestSense (
ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));
Packet.RequestSense.opcode = REQUEST_SENSE;
Packet.RequestSense.allocation_length = sizeof (REQUEST_SENSE_DATA);
-
+
//
// initialize pointer
//
@@ -666,7 +640,7 @@ UsbFloppyRequestSense (
//
SenseReq = FALSE;
}
-
+
//
// If the sense key numbers exceed Sense Data Buffer size,
// just skip the loop and do not fetch the sense key in this function.
@@ -687,25 +661,25 @@ UsbFloppyTestUnitReady (
Routine Description:
Sends Test Unit ReadyPacket Command to the device.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
-{
- ATAPI_PACKET_COMMAND Packet;
+--*/
+{
+ ATAPI_PACKET_COMMAND Packet;
EFI_STATUS Status;
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
UINT32 RetryIndex;
UINT32 MaximumRetryTimes;
-
+
UsbAtapiInterface = UsbFloppyDevice->AtapiProtocol;
MaximumRetryTimes = 2;
//
- // fill command packet
+ // fill command packet
//
ZeroMem (&Packet, sizeof (ATAPI_PACKET_COMMAND));
Packet.TestUnitReady.opcode = TEST_UNIT_READY;
@@ -737,31 +711,31 @@ UsbFloppyTestUnitReady (
EFI_STATUS
USBFloppyWrite10 (
- IN USB_FLOPPY_DEV *UsbFloppyDevice,
- IN VOID *Buffer,
- IN EFI_LBA Lba,
- IN UINTN NumberOfBlocks
+ IN USB_FLOPPY_DEV *UsbFloppyDevice,
+ IN VOID *Buffer,
+ IN EFI_LBA Lba,
+ IN UINTN NumberOfBlocks
)
/*++
Routine Description:
Sends Write10 Packet Command to device to perform data transfer
from host to device.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
- Buffer - A pointer to the source buffer for the data.
+ Buffer - A pointer to the source buffer for the data.
The caller is responsible for either having implicit
or explicit ownership of the buffer.
- Lba - The starting logical block address to written to
+ Lba - The starting logical block address to written to
the device.
- NumberOfBlocks - Indicates the number of blocks that the write
+ NumberOfBlocks - Indicates the number of blocks that the write
operation requests.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
+--*/
{
ATAPI_PACKET_COMMAND Packet;
READ10_CMD *Write10Packet;
@@ -775,7 +749,7 @@ USBFloppyWrite10 (
EFI_STATUS Status;
UINT16 TimeOut;
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
- UINTN SenseCounts;
+ UINT8 Index;
UsbAtapiInterface = UsbFloppyDevice->AtapiProtocol;
@@ -795,82 +769,56 @@ USBFloppyWrite10 (
while (BlocksRemaining > 0) {
if (BlocksRemaining <= MaxBlock) {
-
SectorCount = BlocksRemaining;
} else {
-
SectorCount = MaxBlock;
}
- //
- // fill the Packet data structure
- //
- Write10Packet->opcode = WRITE_10;
- //
- // Lba0 ~ Lba3 specify the start logical block address
- // of the data transfer.
- // Lba0 is MSB, Lba3 is LSB
- //
- Write10Packet->Lba3 = (UINT8) (Lba32 & 0xff);
- Write10Packet->Lba2 = (UINT8) (Lba32 >> 8);
- Write10Packet->Lba1 = (UINT8) (Lba32 >> 16);
- Write10Packet->Lba0 = (UINT8) (Lba32 >> 24);
+ for (Index = 0; Index < 3; Index ++) {
+ //
+ // fill the Packet data structure
+ //
+ Write10Packet->opcode = WRITE_10;
- //
- // TranLen0 ~ TranLen1 specify the transfer length in block unit.
- // TranLen0 is MSB, TranLen is LSB
- //
- Write10Packet->TranLen1 = (UINT8) (SectorCount & 0xff);
- Write10Packet->TranLen0 = (UINT8) (SectorCount >> 8);
+ //
+ // Lba0 ~ Lba3 specify the start logical block address
+ // of the data transfer.
+ // Lba0 is MSB, Lba3 is LSB
+ //
+ Write10Packet->Lba3 = (UINT8) (Lba32 & 0xff);
+ Write10Packet->Lba2 = (UINT8) (Lba32 >> 8);
+ Write10Packet->Lba1 = (UINT8) (Lba32 >> 16);
+ Write10Packet->Lba0 = (UINT8) (Lba32 >> 24);
- ByteCount = SectorCount * BlockSize;
+ //
+ // TranLen0 ~ TranLen1 specify the transfer length in block unit.
+ // TranLen0 is MSB, TranLen is LSB
+ //
+ Write10Packet->TranLen1 = (UINT8) (SectorCount & 0xff);
+ Write10Packet->TranLen0 = (UINT8) (SectorCount >> 8);
- TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
+ ByteCount = SectorCount * BlockSize;
- Status = USBFloppyPacketCommand (
- UsbFloppyDevice,
- &Packet,
- sizeof (ATAPI_PACKET_COMMAND),
- (VOID *) ptrBuffer,
- ByteCount,
- EfiUsbDataOut,
- TimeOut
- );
- if (EFI_ERROR (Status)) {
- Status = UsbFloppyRequestSense (UsbFloppyDevice, &SenseCounts);
- if (!EFI_ERROR (Status)) {
- if (IsLogicalUnitCommunicationOverRun (
- UsbFloppyDevice->SenseData,
- SenseCounts
- )) {
- Lba32 = (UINT32) Lba;
- ptrBuffer = Buffer;
- BlocksRemaining = (UINT16) NumberOfBlocks;
- MaxBlock = (UINT16) (MaxBlock / 4);
- if (MaxBlock < 1) {
- MaxBlock = 1;
- }
+ TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
- continue;
- }
- }
- //
- // retry write10 command
- //
Status = USBFloppyPacketCommand (
- UsbFloppyDevice,
- &Packet,
- sizeof (ATAPI_PACKET_COMMAND),
- (VOID *) ptrBuffer,
- ByteCount,
- EfiUsbDataOut,
- TimeOut
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
+ UsbFloppyDevice,
+ &Packet,
+ sizeof (ATAPI_PACKET_COMMAND),
+ (VOID *) ptrBuffer,
+ ByteCount,
+ EfiUsbDataOut,
+ TimeOut
+ );
+ if (!EFI_ERROR (Status)) {
+ break;
}
}
+ if (Index == 3) {
+ return EFI_DEVICE_ERROR;
+ }
+
Lba32 += SectorCount;
ptrBuffer = (UINT8 *) ptrBuffer + SectorCount * BlockSize;
BlocksRemaining = (UINT16) (BlocksRemaining - SectorCount);
@@ -888,16 +836,16 @@ UsbFloppyDetectMedia (
Routine Description:
Retrieves media information.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
MediaChange - Indicates whether media was changed.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
EFI_INVALID_PARAMETER - Parameter is error
---*/
+--*/
{
EFI_STATUS Status;
EFI_STATUS FloppyStatus;
@@ -910,11 +858,10 @@ UsbFloppyDetectMedia (
UINTN RetryTimes;
UINTN MaximumRetryTimes;
BOOLEAN NeedRetry;
-
+ BOOLEAN NeedReadCapacity;
//
// a flag used to determine whether need to perform Read Capacity command.
//
- BOOLEAN NeedReadCapacity;
REQUEST_SENSE_DATA *SensePtr;
@@ -955,14 +902,14 @@ UsbFloppyDetectMedia (
if (IsMediaChange (UsbFloppyDevice->SenseData, SenseCounts)) {
UsbFloppyDevice->BlkIo.Media->MediaId++;
}
-
+
//
// Media Write-protected
//
if (IsMediaWriteProtected (UsbFloppyDevice->SenseData, SenseCounts)) {
UsbFloppyDevice->BlkIo.Media->ReadOnly = TRUE;
}
-
+
//
// Media Error
//
@@ -1078,7 +1025,7 @@ UsbFloppyDetectMedia (
}
if (!IsDriveReady (UsbFloppyDevice->SenseData, SenseCounts, &NeedRetry)) {
-
+
//
// Drive not ready: if NeedRetry, then retry once more;
// else return error
@@ -1160,18 +1107,18 @@ UsbFloppyModeSense5APage5 (
/*++
Routine Description:
- Retrieves media capacity information via sending Read Format
+ Retrieves media capacity information via sending Read Format
Capacity Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
-
---*/
-{
+
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -1246,18 +1193,18 @@ UsbFloppyModeSense5APage1C (
/*++
Routine Description:
- Retrieves media capacity information via sending Read Format
+ Retrieves media capacity information via sending Read Format
Capacity Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
-
---*/
-{
+
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -1323,16 +1270,16 @@ UsbFloppyModeSense5APage3F (
Routine Description:
Retrieves mode sense information via sending Mode Sense
Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
---*/
-{
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -1381,16 +1328,16 @@ UsbSCSIModeSense1APage3F (
Routine Description:
Retrieves mode sense information via sending Mode Sense
Packet Command.
-
+
Arguments:
UsbFloppyDevice - The USB_FLOPPY_DEV instance.
-
- Returns:
+
+ Returns:
EFI_DEVICE_ERROR - Hardware error
EFI_SUCCESS - Success
-
---*/
-{
+
+--*/
+{
//
// status returned by Read Capacity Packet Command
//
@@ -1450,7 +1397,7 @@ IsNoMedia (
for (Index = 0; Index < SenseCounts; Index++) {
- if ((SensePtr->sense_key == SK_NOT_READY) &&
+ if ((SensePtr->sense_key == SK_NOT_READY) &&
(SensePtr->addnl_sense_code == ASC_NO_MEDIA)) {
NoMedia = TRUE;
@@ -1479,7 +1426,7 @@ IsMediaError (
for (Index = 0; Index < SenseCounts; Index++) {
switch (SensePtr->sense_key) {
-
+
//
// Medium error case
//
diff --git a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h
index f41241adc4..dc810bc3dc 100644
--- a/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h
+++ b/EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h
@@ -1,12 +1,12 @@
/*++
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name: