mirror of https://github.com/acidanthera/audk.git
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
This commit is contained in:
parent
01bf334d2c
commit
4d1fe68e1c
|
@ -22,7 +22,8 @@ Revision History
|
|||
|
||||
#include "Ehci.h"
|
||||
|
||||
void
|
||||
|
||||
VOID
|
||||
DumpEHCIPortsStatus (
|
||||
IN USB2_HC_DEV *HcDev
|
||||
)
|
||||
|
@ -47,6 +48,8 @@ DumpEHCIPortsStatus (
|
|||
);
|
||||
DEBUG((gEHCDebugLevel, "Port[%d] = 0x%x\n", Index, Value));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,20 +1,20 @@
|
|||
/*++
|
||||
|
||||
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:
|
||||
|
||||
EhciMem.c
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
Revision History
|
||||
--*/
|
||||
|
@ -40,13 +40,13 @@ Arguments:
|
|||
HcDev - USB2_HC_DEV
|
||||
MemoryHeader - MEMORY_MANAGE_HEADER to output
|
||||
MemoryBlockSizeInPages - MemoryBlockSizeInPages
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_OUT_OF_RESOURCES Fail for no resources
|
||||
EFI_UNSUPPORTED Unsupported currently
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -73,7 +73,7 @@ Returns:
|
|||
//
|
||||
// each bit in Bit Array will manage 32 bytes memory in memory block
|
||||
//
|
||||
(*MemoryHeader)->BitArraySizeInBytes = ((*MemoryHeader)->MemoryBlockSizeInBytes / 32) / 8;
|
||||
(*MemoryHeader)->BitArraySizeInBytes = ((*MemoryHeader)->MemoryBlockSizeInBytes / MEM_UNIT_SIZE) / 8;
|
||||
|
||||
//
|
||||
// Allocate memory for BitArray
|
||||
|
@ -83,7 +83,7 @@ Returns:
|
|||
gBS->FreePool (*MemoryHeader);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Memory Block uses MemoryBlockSizeInPages pages,
|
||||
// and it is allocated as common buffer use.
|
||||
|
@ -112,7 +112,7 @@ Returns:
|
|||
&Mapping
|
||||
);
|
||||
//
|
||||
// If returned Mapped size is less than the size
|
||||
// If returned Mapped size is less than the size
|
||||
// we request,do not support.
|
||||
//
|
||||
if (EFI_ERROR (Status) || (MemoryBlockSizeInBytes != EFI_PAGES_TO_SIZE (MemoryBlockSizeInPages))) {
|
||||
|
@ -121,9 +121,9 @@ Returns:
|
|||
gBS->FreePool (*MemoryHeader);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Data structure involved by host controller
|
||||
// Data structure involved by host controller
|
||||
// should be restricted into the same 4G
|
||||
//
|
||||
if (HcDev->Is64BitCapable != 0) {
|
||||
|
@ -135,7 +135,7 @@ Returns:
|
|||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Set Memory block initial address
|
||||
//
|
||||
|
@ -240,16 +240,16 @@ Returns:
|
|||
ASSERT (MemoryHeader != NULL);
|
||||
|
||||
OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY + 1);
|
||||
|
||||
|
||||
//
|
||||
// allocate unit is 32 bytes (align on 32 byte)
|
||||
//
|
||||
if (AllocSize & 0x1F) {
|
||||
RealAllocSize = (AllocSize / 32 + 1) * 32;
|
||||
if (AllocSize & (MEM_UNIT_SIZE - 1)) {
|
||||
RealAllocSize = (AllocSize / MEM_UNIT_SIZE + 1) * MEM_UNIT_SIZE;
|
||||
} else {
|
||||
RealAllocSize = AllocSize;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// There may be linked MemoryHeaders.
|
||||
// To allocate a free pool in Memory blocks,
|
||||
|
@ -262,22 +262,26 @@ Returns:
|
|||
Status = AllocMemInMemoryBlock (
|
||||
TempHeaderPtr,
|
||||
(VOID **) Pool,
|
||||
RealAllocSize / 32
|
||||
RealAllocSize / MEM_UNIT_SIZE
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ZeroMem (*Pool, AllocSize);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return EFI_SUCCESS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ZeroMem (*Pool, AllocSize);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// There is no enough memory,
|
||||
// Create a new Memory Block
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// if pool size is larger than NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES,
|
||||
// just allocate a large enough memory block.
|
||||
|
@ -303,13 +307,15 @@ Returns:
|
|||
Status = AllocMemInMemoryBlock (
|
||||
NewMemoryHeader,
|
||||
(VOID **) Pool,
|
||||
RealAllocSize / 32
|
||||
RealAllocSize / MEM_UNIT_SIZE
|
||||
);
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ZeroMem (*Pool, AllocSize);
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -354,12 +360,12 @@ Returns:
|
|||
//
|
||||
// allocate unit is 32 byte (align on 32 byte)
|
||||
//
|
||||
if (AllocSize & 0x1F) {
|
||||
RealAllocSize = (AllocSize / 32 + 1) * 32;
|
||||
if (AllocSize & (MEM_UNIT_SIZE - 1)) {
|
||||
RealAllocSize = (AllocSize / MEM_UNIT_SIZE + 1) * MEM_UNIT_SIZE;
|
||||
} else {
|
||||
RealAllocSize = AllocSize;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// scan the memory header linked list for
|
||||
// the asigned memory to free.
|
||||
|
@ -373,14 +379,16 @@ Returns:
|
|||
// Pool is in the Memory Block area,
|
||||
// find the start byte and bit in the bit array
|
||||
//
|
||||
StartBytePos = ((Pool - TempHeaderPtr->MemoryBlockPtr) / 32) / 8;
|
||||
StartBitPos = (UINT8) (((Pool - TempHeaderPtr->MemoryBlockPtr) / 32) & 0x7);
|
||||
StartBytePos = ((Pool - TempHeaderPtr->MemoryBlockPtr) / MEM_UNIT_SIZE) / 8;
|
||||
StartBitPos = (UINT8) (((Pool - TempHeaderPtr->MemoryBlockPtr) / MEM_UNIT_SIZE) & 0x7);
|
||||
|
||||
//
|
||||
// reset associated bits in bit arry
|
||||
//
|
||||
for (Index = StartBytePos, Index2 = StartBitPos, Count = 0; Count < (RealAllocSize / 32); Count++) {
|
||||
TempHeaderPtr->BitArrayPtr[Index] = (UINT8) (TempHeaderPtr->BitArrayPtr[Index] ^ (bit (Index2)));
|
||||
for (Index = StartBytePos, Index2 = StartBitPos, Count = 0; Count < (RealAllocSize / MEM_UNIT_SIZE); Count++) {
|
||||
ASSERT ((TempHeaderPtr->BitArrayPtr[Index] & bit (Index2) )== bit (Index2));
|
||||
|
||||
TempHeaderPtr->BitArrayPtr[Index] ^= (UINT8) (bit (Index2));
|
||||
Index2++;
|
||||
if (Index2 == 8) {
|
||||
Index += 1;
|
||||
|
@ -393,7 +401,7 @@ Returns:
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Release emptied memory blocks (only if the memory block is not
|
||||
// the first one in the memory header list
|
||||
|
@ -479,7 +487,7 @@ Arguments:
|
|||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_NOT_FOUND Can't find the free memory
|
||||
EFI_NOT_FOUND Can't find the free memory
|
||||
|
||||
--*/
|
||||
{
|
||||
|
@ -508,7 +516,7 @@ Returns:
|
|||
//
|
||||
// right shift the byte
|
||||
//
|
||||
ByteValue /= 2;
|
||||
ByteValue = ByteValue >> 1;
|
||||
|
||||
if (BitValue == 0) {
|
||||
//
|
||||
|
@ -564,11 +572,11 @@ Returns:
|
|||
if (NumberOfZeros < NumberOfMemoryUnit) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Found enough free space.
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// The values recorded in (FoundBytePos,FoundBitPos) have two conditions:
|
||||
// 1)(FoundBytePos,FoundBitPos) record the position
|
||||
|
@ -581,7 +589,7 @@ Returns:
|
|||
if ((MemoryHeader->BitArrayPtr[FoundBytePos] & bit (FoundBitPos)) != 0) {
|
||||
FoundBitPos += 1;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Have the (FoundBytePos,FoundBitPos) make sense.
|
||||
//
|
||||
|
@ -589,13 +597,14 @@ Returns:
|
|||
FoundBytePos += 1;
|
||||
FoundBitPos -= 8;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Set the memory as allocated
|
||||
//
|
||||
for (TempBytePos = FoundBytePos, Index = FoundBitPos, Count = 0; Count < NumberOfMemoryUnit; Count++) {
|
||||
|
||||
MemoryHeader->BitArrayPtr[TempBytePos] = (UINT8) (MemoryHeader->BitArrayPtr[TempBytePos] | (bit (Index)));
|
||||
ASSERT ((MemoryHeader->BitArrayPtr[TempBytePos] & bit (Index) )== 0);
|
||||
MemoryHeader->BitArrayPtr[TempBytePos] |= bit (Index);
|
||||
Index++;
|
||||
if (Index == 8) {
|
||||
TempBytePos += 1;
|
||||
|
@ -603,7 +612,7 @@ Returns:
|
|||
}
|
||||
}
|
||||
|
||||
*Pool = MemoryHeader->MemoryBlockPtr + (FoundBytePos * 8 + FoundBitPos) * 32;
|
||||
*Pool = MemoryHeader->MemoryBlockPtr + (FoundBytePos * 8 + FoundBitPos) * MEM_UNIT_SIZE;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
@ -625,7 +634,7 @@ Arguments:
|
|||
Returns:
|
||||
|
||||
TRUE Empty
|
||||
FALSE Not Empty
|
||||
FALSE Not Empty
|
||||
|
||||
--*/
|
||||
{
|
||||
|
@ -675,6 +684,7 @@ Returns:
|
|||
// Link the before and after
|
||||
//
|
||||
TempHeaderPtr->Next = NeedFreeMemoryHeader->Next;
|
||||
NeedFreeMemoryHeader->Next = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -698,7 +708,7 @@ Returns:
|
|||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -736,7 +746,7 @@ Returns:
|
|||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
MEMORY_MANAGE_HEADER *TempHeaderPtr;
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
/*++
|
||||
|
||||
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:
|
||||
|
||||
Ehchlp.c
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
Revision History
|
||||
--*/
|
||||
|
@ -29,7 +29,7 @@ HostReset (
|
|||
{
|
||||
UINT32 Value;
|
||||
UINT32 TimeOut;
|
||||
|
||||
|
||||
ReadEhcOperationalReg (
|
||||
HcDev,
|
||||
USBCMD,
|
||||
|
@ -102,18 +102,18 @@ ReadEhcCapabiltiyReg (
|
|||
Routine Description:
|
||||
|
||||
Read Ehc Capabitlity register
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
CapabiltiyRegAddr - Ehc Capability register address
|
||||
Data - A pointer to data read from register
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
return HcDev->PciIo->Mem.Read (
|
||||
|
@ -137,18 +137,18 @@ ReadEhcOperationalReg (
|
|||
Routine Description:
|
||||
|
||||
Read Ehc Operation register
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
OperationalRegAddr - Ehc Operation register address
|
||||
Data - A pointer to data read from register
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
ASSERT (HcDev->UsbCapabilityLen);
|
||||
|
@ -173,18 +173,18 @@ WriteEhcOperationalReg (
|
|||
Routine Description:
|
||||
|
||||
Write Ehc Operation register
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
OperationalRegAddr - Ehc Operation register address
|
||||
Data - 32bit write to register
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
ASSERT (HcDev->UsbCapabilityLen);
|
||||
|
@ -198,6 +198,8 @@ Returns:
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
ClearLegacySupport (
|
||||
IN USB2_HC_DEV *HcDev
|
||||
|
@ -239,7 +241,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));
|
||||
|
@ -249,7 +251,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP + 0x4,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));
|
||||
|
@ -259,7 +261,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
Value = Value | (0x1 << 24);
|
||||
|
@ -270,7 +272,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
TimeOut = 40;
|
||||
|
@ -282,7 +284,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
if ((Value & 0x01010000) == 0x01000000) {
|
||||
break;
|
||||
|
@ -291,8 +293,8 @@ Returns:
|
|||
|
||||
if (TimeOut == 0) {
|
||||
DEBUG((gEHCErrorLevel, "Timeout for getting HC OS Owned Semaphore\n" ));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DEBUG((gEHCErrorLevel, "After Release Value\n" ));
|
||||
|
||||
HcDev->PciIo->Pci.Read (
|
||||
|
@ -300,7 +302,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));
|
||||
|
@ -310,7 +312,7 @@ Returns:
|
|||
EfiPciIoWidthUint32,
|
||||
EECP + 0x4,
|
||||
1,
|
||||
&Value
|
||||
&Value
|
||||
);
|
||||
|
||||
DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));
|
||||
|
@ -327,16 +329,16 @@ GetCapabilityLen (
|
|||
Routine Description:
|
||||
|
||||
Get the length of capability register
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -364,18 +366,18 @@ SetFrameListLen (
|
|||
Routine Description:
|
||||
|
||||
Set the length of Frame List
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Length - the required length of frame list
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_INVALID_PARAMETER Invalid parameter
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -428,14 +430,14 @@ SetFrameListBaseAddr (
|
|||
Routine Description:
|
||||
|
||||
Set base address of frame list first entry
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
FrameBuffer - base address of first entry of frame list
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -474,17 +476,17 @@ SetAsyncListAddr (
|
|||
Routine Description:
|
||||
|
||||
Set address of first Async schedule Qh
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
QhPtr - A pointer to first Qh in the Async schedule
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -512,16 +514,16 @@ SetCtrlDataStructSeg (
|
|||
Routine Description:
|
||||
|
||||
Set register of control and data structure segment
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
|
@ -550,16 +552,16 @@ SetPortRoutingEhc (
|
|||
Routine Description:
|
||||
|
||||
Set Ehc port routing bit
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -601,16 +603,16 @@ SetEhcDoorbell (
|
|||
Routine Description:
|
||||
|
||||
Set Ehc door bell bit
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -652,16 +654,16 @@ ClearEhcAllStatus (
|
|||
Routine Description:
|
||||
|
||||
Clear Ehc all status bits
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT32 UsbStatusAddr;
|
||||
|
@ -684,16 +686,16 @@ EnablePeriodicSchedule (
|
|||
Routine Description:
|
||||
|
||||
Enable periodic schedule
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -735,16 +737,16 @@ DisablePeriodicSchedule (
|
|||
Routine Description:
|
||||
|
||||
Disable periodic schedule
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -784,16 +786,16 @@ EnableAsynchronousSchedule (
|
|||
Routine Description:
|
||||
|
||||
Enable asynchrounous schedule
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -835,16 +837,16 @@ DisableAsynchronousSchedule (
|
|||
Routine Description:
|
||||
|
||||
Disable asynchrounous schedule
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -884,16 +886,16 @@ ResetEhc (
|
|||
Routine Description:
|
||||
|
||||
Reset Ehc
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -935,16 +937,16 @@ StartScheduleExecution (
|
|||
Routine Description:
|
||||
|
||||
Start Ehc schedule execution
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_DEVICE_ERROR Fail
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -986,16 +988,16 @@ IsFrameListProgrammable (
|
|||
Routine Description:
|
||||
|
||||
Whether frame list is programmable
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Programmable
|
||||
FALSE Unprogrammable
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1028,16 +1030,16 @@ IsPeriodicScheduleEnabled (
|
|||
Routine Description:
|
||||
|
||||
Whether periodic schedule is enabled
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Enabled
|
||||
FALSE Disabled
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1070,16 +1072,16 @@ IsAsyncScheduleEnabled (
|
|||
Routine Description:
|
||||
|
||||
Whether asynchronous schedule is enabled
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Enabled
|
||||
FALSE Disabled
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1113,16 +1115,16 @@ IsEhcPortEnabled (
|
|||
Routine Description:
|
||||
|
||||
Whether port is enabled
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Enabled
|
||||
FALSE Disabled
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT32 PortStatusControlAddr;
|
||||
|
@ -1148,16 +1150,16 @@ IsEhcReseted (
|
|||
Routine Description:
|
||||
|
||||
Whether Ehc is reseted
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Reseted
|
||||
FALSE Unreseted
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1190,16 +1192,16 @@ IsEhcHalted (
|
|||
Routine Description:
|
||||
|
||||
Whether Ehc is halted
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE Halted
|
||||
FALSE Not halted
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1232,16 +1234,16 @@ IsEhcSysError (
|
|||
Routine Description:
|
||||
|
||||
Whether Ehc is system error
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE System error
|
||||
FALSE No system error
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
BOOLEAN Value;
|
||||
|
@ -1268,29 +1270,29 @@ Returns:
|
|||
BOOLEAN
|
||||
IsHighSpeedDevice (
|
||||
IN EFI_USB2_HC_PROTOCOL *This,
|
||||
IN UINT8 PortNum
|
||||
IN UINT8 PortNum
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Whether high speed device attached
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
|
||||
Returns:
|
||||
|
||||
TRUE High speed
|
||||
FALSE Full speed
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
USB2_HC_DEV *HcDev;
|
||||
UINT32 PortStatusControlAddr;
|
||||
UINT32 PortStatusControlReg;
|
||||
|
||||
|
||||
HcDev = USB2_HC_DEV_FROM_THIS (This);
|
||||
PortStatusControlAddr = (UINT32) (PORTSC + (4 * PortNum));
|
||||
|
||||
|
@ -1360,17 +1362,17 @@ WaitForEhcReset (
|
|||
Routine Description:
|
||||
|
||||
wait for Ehc reset or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1406,17 +1408,17 @@ WaitForEhcHalt (
|
|||
Routine Description:
|
||||
|
||||
wait for Ehc halt or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1452,17 +1454,17 @@ WaitForEhcNotHalt (
|
|||
Routine Description:
|
||||
|
||||
wait for Ehc not halt or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1498,17 +1500,17 @@ WaitForAsyncScheduleEnable (
|
|||
Routine Description:
|
||||
|
||||
Wait for Ehc asynchronous schedule enable or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1544,17 +1546,17 @@ WaitForAsyncScheduleDisable (
|
|||
Routine Description:
|
||||
|
||||
Wait for Ehc asynchronous schedule disable or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1590,17 +1592,17 @@ WaitForPeriodicScheduleEnable (
|
|||
Routine Description:
|
||||
|
||||
Wait for Ehc periodic schedule enable or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1636,17 +1638,17 @@ WaitForPeriodicScheduleDisable (
|
|||
Routine Description:
|
||||
|
||||
Wait for periodic schedule disable or timeout
|
||||
|
||||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1685,14 +1687,14 @@ Routine Description:
|
|||
|
||||
Arguments:
|
||||
|
||||
HcDev - USB2_HC_DEV
|
||||
HcDev - USB2_HC_DEV
|
||||
Timeout - timeout threshold
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS Success
|
||||
EFI_TIMEOUT Timeout
|
||||
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1702,7 +1704,7 @@ Returns:
|
|||
|
||||
UsbCommandAddr = USBCMD;
|
||||
Delay = (Timeout / 50) + 1;
|
||||
|
||||
|
||||
do {
|
||||
Status = ReadEhcOperationalReg (
|
||||
HcDev,
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -485,6 +485,7 @@ UHCIDriverBindingStart (
|
|||
UINTN FlBaseAddrReg;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
USB_HC_DEV *HcDev;
|
||||
UINT64 Supports;
|
||||
|
||||
HcDev = NULL;
|
||||
|
||||
|
@ -510,10 +511,19 @@ UHCIDriverBindingStart (
|
|||
//
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
EfiPciIoAttributeOperationSupported,
|
||||
0,
|
||||
&Supports
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
Supports,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
|
@ -777,6 +787,8 @@ UnInstallUHCInterface (
|
|||
--*/
|
||||
{
|
||||
USB_HC_DEV *HcDev;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Supports;
|
||||
|
||||
HcDev = USB_HC_DEV_FROM_THIS (This);
|
||||
|
||||
|
@ -823,12 +835,21 @@ UnInstallUHCInterface (
|
|||
//
|
||||
// Disable the USB Host Controller
|
||||
//
|
||||
HcDev->PciIo->Attributes (
|
||||
HcDev->PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
);
|
||||
Status = HcDev->PciIo->Attributes (
|
||||
HcDev->PciIo,
|
||||
EfiPciIoAttributeOperationSupported,
|
||||
0,
|
||||
&Supports
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||
Status = HcDev->PciIo->Attributes (
|
||||
HcDev->PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
Supports,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
gBS->FreePool (HcDev);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
--*/
|
||||
|
|
|
@ -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
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
//
|
||||
// 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)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case EfiUsbNoData:
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Status Phase
|
||||
//
|
||||
Status = BotStatusPhase (
|
||||
UsbBotDev,
|
||||
&TransferStatus,
|
||||
TimeOutInMilliSeconds
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
if (TransferStatus == 0x02) {
|
||||
for (Index = 0; Index < 3; Index ++) {
|
||||
//
|
||||
// Phase error
|
||||
// First send ATAPI command through Bot
|
||||
//
|
||||
BotRecoveryReset (UsbBotDev);
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
Status = BotCommandPhase (
|
||||
UsbBotDev,
|
||||
Command,
|
||||
CommandSize,
|
||||
BufferLength,
|
||||
Direction,
|
||||
10 * 1000
|
||||
);
|
||||
|
||||
if (TransferStatus == 0x01) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
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)
|
||||
);
|
||||
|
||||
|
||||
if (EFI_ERROR (BotDataStatus)) {
|
||||
DEBUG((gBOTErrorLevel, "BotDataPhase Fail\n"));
|
||||
}
|
||||
break;
|
||||
|
||||
case EfiUsbNoData:
|
||||
break;
|
||||
}
|
||||
|
||||
DataResidue = 0;
|
||||
//
|
||||
// Status Phase
|
||||
//
|
||||
Status = BotStatusPhase (
|
||||
UsbBotDev,
|
||||
&DataResidue,
|
||||
10 * 1000
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG((gBOTErrorLevel, "BotStatusPhase Fail\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (BotDataStatus)) {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
return BotDataStatus;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
//
|
||||
|
|
|
@ -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.
|
||||
|
||||
--*/
|
||||
|
|
|
@ -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)) {
|
||||
while (NumberOfBlocks > 0) {
|
||||
|
||||
Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, 1);
|
||||
if (EFI_ERROR (Status)) {
|
||||
This->Reset (This, TRUE);
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
goto Done;
|
||||
if (NumberOfBlocks > BLOCK_UNIT) {
|
||||
Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, BLOCK_UNIT);
|
||||
} else {
|
||||
Status = USBFloppyRead10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
|
||||
}
|
||||
|
||||
LBA += 1;
|
||||
NumberOfBlocks -= 1;
|
||||
Buffer = (UINT8 *) Buffer + This->Media->BlockSize;
|
||||
|
||||
if (NumberOfBlocks == 0) {
|
||||
Status = EFI_SUCCESS;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
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;
|
||||
while (NumberOfBlocks > 0) {
|
||||
|
||||
if (NumberOfBlocks > BLOCK_UNIT) {
|
||||
Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, BLOCK_UNIT);
|
||||
} else {
|
||||
Status = USBFloppyWrite10 (UsbFloppyDevice, Buffer, LBA, NumberOfBlocks);
|
||||
}
|
||||
|
||||
LBA += 1;
|
||||
NumberOfBlocks -= 1;
|
||||
Buffer = (UINT8 *) Buffer + This->Media->BlockSize;
|
||||
|
||||
if (NumberOfBlocks == 0) {
|
||||
Status = EFI_SUCCESS;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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
|
||||
|
||||
//
|
||||
|
|
|
@ -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);
|
||||
|
||||
ByteCount = SectorCount * BlockSize;
|
||||
|
||||
TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
|
||||
|
||||
Status = USBFloppyPacketCommand (
|
||||
UsbFloppyDevice,
|
||||
&Packet,
|
||||
sizeof (ATAPI_PACKET_COMMAND),
|
||||
(VOID *) ptrBuffer,
|
||||
ByteCount,
|
||||
EfiUsbDataIn,
|
||||
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;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
//
|
||||
// retry read10 command
|
||||
// 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);
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
ByteCount = SectorCount * BlockSize;
|
||||
|
||||
TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
ByteCount = SectorCount * BlockSize;
|
||||
|
||||
TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
for (Index = 0; Index < 3; Index ++) {
|
||||
//
|
||||
// retry write10 command
|
||||
// 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);
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
ByteCount = SectorCount * BlockSize;
|
||||
|
||||
TimeOut = (UINT16) (SectorCount * USBFLPTIMEOUT);
|
||||
|
||||
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
|
||||
//
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
Loading…
Reference in New Issue