In IdeBus driver block I/O read/write interface, it will always try to use UDMA mode first, if fails, then try to use PIO mode.

This may cause side effects if disk does not support UDMA mode and also let bad performance. 
The modification is to record supported mode and only try supported mode when do disk read/write. 
Also this patch combines the code for read/readex/write/writex to reduce code size.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2412 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
klu2 2007-03-02 08:21:43 +00:00
parent 59e9a3659f
commit bc4e770c78
4 changed files with 291 additions and 1155 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1097,6 +1097,42 @@ AtaUdmaWriteExt (
)
;
/**
Perform an ATA Udma operation (Read, ReadExt, Write, WriteExt).
@param[in] *IdeDev
pointer pointing to IDE_BLK_IO_DEV data structure, used
to record all the information of the IDE device.
@param[in] *DataBuffer
A pointer to the source buffer for the data.
@param[in] StartLba
The starting logical block address to write to
on the device media.
@param[in] NumberOfBlocks
The number of transfer data blocks.
@param[in] UdmaOp
The perform operations could be AtaUdmaReadOp, AtaUdmaReadExOp,
AtaUdmaWriteOp, AtaUdmaWriteExOp
@return The device status of UDMA operation. If the operation is
successful, return EFI_SUCCESS.
**/
EFI_STATUS
DoAtaUdma (
IN IDE_BLK_IO_DEV *IdeDev,
IN VOID *DataBuffer,
IN EFI_LBA StartLba,
IN UINTN NumberOfBlocks,
IN ATA_UDMA_OPERATION UdmaOp
)
;
/**
TODO: Add function description

View File

@ -65,7 +65,7 @@ typedef struct {
INQUIRY_DATA *pInquiryData;
EFI_IDENTIFY_DATA *pIdData;
ATA_PIO_MODE PioMode;
ATA_UDMA_MODE UDma_Mode;
EFI_ATA_MODE UdmaMode;
CHAR8 ModelName[41];
REQUEST_SENSE_DATA *SenseData;
UINT8 SenseDataNumber;

View File

@ -86,6 +86,13 @@ typedef enum {
SenseOtherSense
} SENSE_RESULT;
typedef enum {
AtaUdmaReadOp,
AtaUdmaReadExtOp,
AtaUdmaWriteOp,
AtaUdmaWriteExtOp
} ATA_UDMA_OPERATION;
//
// IDE Registers
//