From 4d1fe68e1ca84cf0d3eec69d20625fa57769de12 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Fri, 26 Jan 2007 04:08:57 +0000 Subject: 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 --- EdkModulePkg/Bus/Usb/UsbBot/Dxe/ComponentName.c | 62 +-- EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.c | 435 +++++++++------------ EdkModulePkg/Bus/Usb/UsbBot/Dxe/bot.h | 19 +- .../Bus/Usb/UsbMassStorage/Dxe/ComponentName.c | 62 +-- .../Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c | 157 ++++---- .../Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.h | 19 +- .../Usb/UsbMassStorage/Dxe/UsbMassStorageData.h | 18 +- .../Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.c | 417 +++++++++----------- .../Usb/UsbMassStorage/Dxe/UsbMassStorageHelper.h | 16 +- 9 files changed, 534 insertions(+), 671 deletions(-) (limited to 'EdkModulePkg/Bus/Usb') 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 +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: -- cgit v1.2.3