1. Changed device detect method to use ATA/ATAPI device signature;

2. Enhancements to better support SATA CDROM;
3. Fixed UDMA operation for buffer above 4G memory issue;
4. Fixed maximal block setting for ATAPI read sector operation to comply with spec;
5. Some minor fixes.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1739 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jtang12 2006-10-13 05:51:59 +00:00
parent c51cec2560
commit a98f11c5b9
7 changed files with 1100 additions and 983 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,11 @@
#include "idebus.h" #include "idebus.h"
BOOLEAN SlaveDeviceExist = FALSE; BOOLEAN ChannelDeviceDetected = FALSE;
BOOLEAN MasterDeviceExist = FALSE; BOOLEAN SlaveDeviceExist = FALSE;
UINT8 SlaveDeviceType = INVALID_DEVICE_TYPE;
BOOLEAN MasterDeviceExist = FALSE;
UINT8 MasterDeviceType = INVALID_DEVICE_TYPE;
/** /**
TODO: Add function description TODO: Add function description
@ -464,57 +467,6 @@ ReassignIdeResources (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Read SATA registers to detect SATA disks
@param IdeDev The BLK_IO private data which specifies the IDE device
**/
EFI_STATUS
CheckPowerMode (
IDE_BLK_IO_DEV *IdeDev
)
// TODO: EFI_NOT_FOUND - add return value to function comment
// TODO: EFI_SUCCESS - add return value to function comment
// TODO: EFI_NOT_FOUND - add return value to function comment
{
UINT8 ErrorRegister;
EFI_STATUS Status;
IDEWritePortB (
IdeDev->PciIo,
IdeDev->IoPort->Head,
(UINT8) ((IdeDev->Device << 4) | 0xe0)
);
//
// Wait 31 seconds for BSY clear. BSY should be in clear state if there exists
// a device (initial state). Normally, BSY is also in clear state if there is
// no device
//
Status = WaitForBSYClear (IdeDev, 31000);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
//
// select device, read error register
//
IDEWritePortB (
IdeDev->PciIo,
IdeDev->IoPort->Head,
(UINT8) ((IdeDev->Device << 4) | 0xe0)
);
Status = DRDYReady (IdeDev, 200);
ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);
if ((ErrorRegister == 0x01) || (ErrorRegister == 0x81)) {
return EFI_SUCCESS;
} else {
return EFI_NOT_FOUND;
}
}
// //
// DiscoverIdeDevice // DiscoverIdeDevice
// //
@ -533,44 +485,67 @@ DiscoverIdeDevice (
// TODO: EFI_SUCCESS - add return value to function comment // TODO: EFI_SUCCESS - add return value to function comment
{ {
EFI_STATUS Status; EFI_STATUS Status;
BOOLEAN SataFlag;
SataFlag = FALSE;
//
// This extra detection is for SATA disks
//
Status = CheckPowerMode (IdeDev);
if (Status == EFI_SUCCESS) {
SataFlag = TRUE;
}
// //
// If a channel has not been checked, check it now. Then set it to "checked" state // If a channel has not been checked, check it now. Then set it to "checked" state
// After this step, all devices in this channel have been checked. // After this step, all devices in this channel have been checked.
// //
Status = DetectIDEController (IdeDev); if (ChannelDeviceDetected == FALSE) {
Status = DetectIDEController (IdeDev);
if ((EFI_ERROR (Status)) && !SataFlag) {
return EFI_NOT_FOUND;
}
//
// Device exists. test if it is an ATA device
//
Status = ATAIdentify (IdeDev);
if (EFI_ERROR (Status)) {
//
// if not ATA device, test if it is an ATAPI device
//
Status = ATAPIIdentify (IdeDev);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
//
// if not ATAPI device either, return error.
//
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
} }
Status = EFI_NOT_FOUND;
//
// Device exists. test if it is an ATA device.
// Prefer the result from DetectIDEController,
// if failed, try another device type to handle
// devices that not follow the spec.
//
if ((IdeDev->Device == IdeMaster) && (MasterDeviceExist)) {
if (MasterDeviceType == ATA_DEVICE_TYPE) {
Status = ATAIdentify (IdeDev);
if (EFI_ERROR (Status)) {
Status = ATAPIIdentify (IdeDev);
if (!EFI_ERROR (Status)) {
MasterDeviceType = ATAPI_DEVICE_TYPE;
}
}
} else {
Status = ATAPIIdentify (IdeDev);
if (EFI_ERROR (Status)) {
Status = ATAIdentify (IdeDev);
if (!EFI_ERROR (Status)) {
MasterDeviceType = ATA_DEVICE_TYPE;
}
}
}
}
if ((IdeDev->Device == IdeSlave) && (SlaveDeviceExist)) {
if (SlaveDeviceType == ATA_DEVICE_TYPE) {
Status = ATAIdentify (IdeDev);
if (EFI_ERROR (Status)) {
Status = ATAPIIdentify (IdeDev);
if (!EFI_ERROR (Status)) {
SlaveDeviceType = ATAPI_DEVICE_TYPE;
}
}
} else {
Status = ATAPIIdentify (IdeDev);
if (EFI_ERROR (Status)) {
Status = ATAIdentify (IdeDev);
if (!EFI_ERROR (Status)) {
SlaveDeviceType = ATA_DEVICE_TYPE;
}
}
}
}
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
// //
// Init Block I/O interface // Init Block I/O interface
// //
@ -595,6 +570,26 @@ DiscoverIdeDevice (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
This interface is used to initialize all state data related to the detection of one
channel.
@retval EFI_SUCCESS Completed Successfully.
**/
EFI_STATUS
InitializeIDEChannelData (
VOID
)
{
ChannelDeviceDetected = FALSE;
MasterDeviceExist = FALSE;
MasterDeviceType = 0xff;
SlaveDeviceExist = FALSE;
SlaveDeviceType = 0xff;
return EFI_SUCCESS;
}
/** /**
This function is called by DiscoverIdeDevice(). It is used for detect This function is called by DiscoverIdeDevice(). It is used for detect
whether the IDE device exists in the specified Channel as the specified whether the IDE device exists in the specified Channel as the specified
@ -633,31 +628,12 @@ DetectIDEController (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT8 ErrorReg; UINT8 SectorCountReg;
UINT8 StatusReg; UINT8 LBALowReg;
UINT8 LBAMidReg;
UINT8 LBAHighReg;
UINT8 InitStatusReg; UINT8 InitStatusReg;
EFI_STATUS DeviceStatus; UINT8 StatusReg;
//
// Slave device has been detected with master device.
//
if ((IdeDev->Device) == 1) {
if (SlaveDeviceExist) {
//
// If master not exists but slave exists, slave have to wait a while
//
if (!MasterDeviceExist) {
//
// if single slave can't be detected, add delay 4s here.
//
gBS->Stall (4000000);
}
return EFI_SUCCESS;
} else {
return EFI_NOT_FOUND;
}
}
// //
// Select slave device // Select slave device
@ -675,7 +651,7 @@ DetectIDEController (
InitStatusReg = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status); InitStatusReg = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);
// //
// Select master back // Select Master back
// //
IDEWritePortB ( IDEWritePortB (
IdeDev->PciIo, IdeDev->PciIo,
@ -683,6 +659,7 @@ DetectIDEController (
(UINT8) ((0 << 4) | 0xe0) (UINT8) ((0 << 4) | 0xe0)
); );
gBS->Stall (100); gBS->Stall (100);
// //
// Send ATA Device Execut Diagnostic command. // Send ATA Device Execut Diagnostic command.
// This command should work no matter DRDY is ready or not // This command should work no matter DRDY is ready or not
@ -690,88 +667,124 @@ DetectIDEController (
IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, 0x90); IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, 0x90);
Status = WaitForBSYClear (IdeDev, 3500); Status = WaitForBSYClear (IdeDev, 3500);
if (EFI_ERROR (Status)) {
ErrorReg = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error); DEBUG((EFI_D_ERROR, "New detecting method: Send Execute Diagnostic Command: WaitForBSYClear: Status: %d\n", Status));
return Status;
}
// //
// Master Error register is 0x01. D0 passed, D1 passed or not present. // Read device signature
// Master Error register is 0x81. D0 passed, D1 failed. Return.
// Master Error register is other value. D0 failed, D1 passed or not present..
// //
if (ErrorReg == 0x01) { //
// Select Master
//
IDEWritePortB (
IdeDev->PciIo,
IdeDev->IoPort->Head,
(UINT8) ((0 << 4) | 0xe0)
);
gBS->Stall (100);
SectorCountReg = IDEReadPortB (
IdeDev->PciIo,
IdeDev->IoPort->SectorCount
);
LBALowReg = IDEReadPortB (
IdeDev->PciIo,
IdeDev->IoPort->SectorNumber
);
LBAMidReg = IDEReadPortB (
IdeDev->PciIo,
IdeDev->IoPort->CylinderLsb
);
LBAHighReg = IDEReadPortB (
IdeDev->PciIo,
IdeDev->IoPort->CylinderMsb
);
if ((SectorCountReg == 0x1) &&
(LBALowReg == 0x1) &&
(LBAMidReg == 0x0) &&
(LBAHighReg == 0x0)) {
MasterDeviceExist = TRUE; MasterDeviceExist = TRUE;
DeviceStatus = EFI_SUCCESS; MasterDeviceType = ATA_DEVICE_TYPE;
} else if (ErrorReg == 0x81) {
MasterDeviceExist = TRUE;
DeviceStatus = EFI_SUCCESS;
SlaveDeviceExist = FALSE;
return DeviceStatus;
} else { } else {
MasterDeviceExist = FALSE; if ((LBAMidReg == 0x14) &&
DeviceStatus = EFI_NOT_FOUND; (LBAHighReg == 0xeb)) {
MasterDeviceExist = TRUE;
MasterDeviceType = ATAPI_DEVICE_TYPE;
}
} }
// //
// Master Error register is not 0x81, Go on check Slave // For some Hard Drive, it takes some time to get
// // the right signature when operating in single slave mode.
// We stall 20ms to work around this.
//
// Stall 20ms to wait for slave device ready if master device not exists
// //
if (!MasterDeviceExist) { if (!MasterDeviceExist) {
gBS->Stall (20000); gBS->Stall (20000);
} }
// //
// select slave // Select Slave
// //
IDEWritePortB ( IDEWritePortB (
IdeDev->PciIo, IdeDev->PciIo,
IdeDev->IoPort->Head, IdeDev->IoPort->Head,
(UINT8) ((1 << 4) | 0xe0) (UINT8) ((1 << 4) | 0xe0)
); );
gBS->Stall (100);
gBS->Stall (300); SectorCountReg = IDEReadPortB (
ErrorReg = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error); IdeDev->PciIo,
IdeDev->IoPort->SectorCount
// );
// Slave Error register is not 0x01, D1 failed. Return. LBALowReg = IDEReadPortB (
// IdeDev->PciIo,
if (ErrorReg != 0x01) { IdeDev->IoPort->SectorNumber
SlaveDeviceExist = FALSE; );
return DeviceStatus; LBAMidReg = IDEReadPortB (
} IdeDev->PciIo,
IdeDev->IoPort->CylinderLsb
StatusReg = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status); );
LBAHighReg = IDEReadPortB (
// IdeDev->PciIo,
// Most ATAPI devices don't set DRDY bit, so test with a slow but accurate IdeDev->IoPort->CylinderMsb
// "ATAPI TEST UNIT READY" command );
// StatusReg = IDEReadPortB (
if (((StatusReg & DRDY) == 0) && ((InitStatusReg & DRDY) == 0)) { IdeDev->PciIo,
Status = AtapiTestUnitReady (IdeDev); IdeDev->IoPort->Reg.Status
);
// if ((SectorCountReg == 0x1) &&
// Still fail, Slave doesn't exist. (LBALowReg == 0x1) &&
// (LBAMidReg == 0x0) &&
if (EFI_ERROR (Status)) { (LBAHighReg == 0x0)) {
SlaveDeviceExist = FALSE; SlaveDeviceExist = TRUE;
return DeviceStatus; SlaveDeviceType = ATA_DEVICE_TYPE;
} else {
if ((LBAMidReg == 0x14) &&
(LBAHighReg == 0xeb)) {
SlaveDeviceExist = TRUE;
SlaveDeviceType = ATAPI_DEVICE_TYPE;
} }
} }
// //
// Error reg is 0x01 and DRDY is ready, // When single master is plugged, slave device
// or ATAPI test unit ready success, // will be wrongly detected. Here's the workaround
// or init Slave status DRDY is ready // for ATA devices by detecting DRY bit in status
// Slave exists. // register.
// NOTE: This workaround doesn't apply to ATAPI.
// //
SlaveDeviceExist = TRUE; if (MasterDeviceExist && SlaveDeviceExist &&
(StatusReg & DRDY) == 0 &&
return DeviceStatus; (InitStatusReg & DRDY) == 0 &&
MasterDeviceType == SlaveDeviceType &&
SlaveDeviceType != ATAPI_DEVICE_TYPE) {
SlaveDeviceExist = FALSE;
}
//
// Indicate this channel has been detected
//
ChannelDeviceDetected = TRUE;
return EFI_SUCCESS;
} }
/** /**
@ -1251,7 +1264,7 @@ DRDYReady (
} }
} }
gBS->Stall (15); gBS->Stall (30);
Delay--; Delay--;
} while (Delay); } while (Delay);
@ -1432,6 +1445,11 @@ ReleaseIdeResources (
gBS->FreePool (IdeBlkIoDevice->DevicePath); gBS->FreePool (IdeBlkIoDevice->DevicePath);
} }
if (IdeBlkIoDevice->ExitBootServiceEvent != NULL) {
gBS->CloseEvent (IdeBlkIoDevice->ExitBootServiceEvent);
IdeBlkIoDevice->ExitBootServiceEvent = NULL;
}
gBS->FreePool (IdeBlkIoDevice); gBS->FreePool (IdeBlkIoDevice);
IdeBlkIoDevice = NULL; IdeBlkIoDevice = NULL;
@ -1553,8 +1571,14 @@ AtaNonDataCommandIn (
// //
// Wait for command completion // Wait for command completion
// For ATA_SMART_CMD, we may need more timeout to let device
// adjust internal states.
// //
Status = WaitForBSYClear (IdeDev, ATATIMEOUT); if (AtaCommand == ATA_SMART_CMD) {
Status = WaitForBSYClear (IdeDev, ATASMARTTIMEOUT);
} else {
Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
}
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
@ -1716,12 +1740,11 @@ SetDriveParameters (
// //
// Send Init drive parameters // Send Init drive parameters
// //
Status = AtaPioDataIn ( Status = AtaNonDataCommandIn (
IdeDev, IdeDev,
NULL,
0,
INIT_DRIVE_PARAM_CMD, INIT_DRIVE_PARAM_CMD,
(UINT8) (DeviceSelect + DriveParameters->Heads), (UINT8) (DeviceSelect + DriveParameters->Heads),
0,
DriveParameters->Sector, DriveParameters->Sector,
0, 0,
0, 0,
@ -1731,18 +1754,16 @@ SetDriveParameters (
// //
// Send Set Multiple parameters // Send Set Multiple parameters
// //
Status = AtaPioDataIn ( Status = AtaNonDataCommandIn (
IdeDev, IdeDev,
NULL,
0,
SET_MULTIPLE_MODE_CMD, SET_MULTIPLE_MODE_CMD,
DeviceSelect, DeviceSelect,
0,
DriveParameters->MultipleSector, DriveParameters->MultipleSector,
0, 0,
0, 0,
0 0
); );
return Status; return Status;
} }
@ -1769,13 +1790,13 @@ EnableInterrupt (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Clear pending IDE interrupt before OS loader/kernel take control of the IDE device. Clear pending IDE interrupt before OS loader/kernel take control of the IDE device.
@param[in] Event Pointer to this event @param[in] Event Pointer to this event
@param[in] Context Event hanlder private data @param[in] Context Event hanlder private data
**/ **/
VOID VOID
EFIAPI EFIAPI

View File

@ -1,15 +1,15 @@
/** @file /** @file
Header file for IDE Bus Driver, containing the helper functions' Header file for IDE Bus Driver, containing the helper functions'
entire prototype. entire prototype.
Copyright (c) 2006, Intel Corporation Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
@par Revision Reference: @par Revision Reference:
2002-6: Add Atapi6 enhancement, support >120GB hard disk, including 2002-6: Add Atapi6 enhancement, support >120GB hard disk, including
@ -198,6 +198,19 @@ DiscoverIdeDevice (
) )
; ;
/**
This interface is used to initialize all state data related to the
detection of one channel.
@retval EFI_SUCCESS Completed successfully.
**/
EFI_STATUS
InitializeIDEChannelData (
VOID
)
;
/** /**
TODO: Add function description TODO: Add function description
@ -661,6 +674,7 @@ PioReadWriteData (
/** /**
TODO: Add function description TODO: Add function description
@param IdeDev TODO: add argument description
@param IdeDev TODO: add argument description @param IdeDev TODO: add argument description
TODO: add return values TODO: add return values
@ -668,7 +682,8 @@ PioReadWriteData (
**/ **/
EFI_STATUS EFI_STATUS
AtapiTestUnitReady ( AtapiTestUnitReady (
IN IDE_BLK_IO_DEV *IdeDev IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount
) )
; ;
@ -691,6 +706,7 @@ AtapiRequestSense (
/** /**
TODO: Add function description TODO: Add function description
@param IdeDev TODO: add argument description
@param IdeDev TODO: add argument description @param IdeDev TODO: add argument description
TODO: add return values TODO: add return values
@ -698,7 +714,8 @@ AtapiRequestSense (
**/ **/
EFI_STATUS EFI_STATUS
AtapiReadCapacity ( AtapiReadCapacity (
IN IDE_BLK_IO_DEV *IdeDev IN IDE_BLK_IO_DEV *IdeDev,
OUT UINTN *SenseCount
) )
; ;
@ -819,82 +836,32 @@ AtapiBlkIoWriteBlocks (
/** /**
TODO: Add function description TODO: Add function description
@param SenseData TODO: add argument description @param IdeDev TODO: add argument description
@param SenseCounts TODO: add argument description @param SenseCount TODO: add argument description
@param Result TODO: add argument description
TODO: add return values TODO: add return values
**/ **/
BOOLEAN EFI_STATUS
IsNoMedia ( ParseSenseData (
IN REQUEST_SENSE_DATA *SenseData, IN IDE_BLK_IO_DEV *IdeDev,
IN UINTN SenseCounts IN UINTN SenseCount,
OUT SENSE_RESULT *Result
) )
; ;
/** /**
TODO: Add function description TODO: Add function description
@param SenseData TODO: add argument description @param IdeDev TODO: add argument description
@param SenseCounts TODO: add argument description
TODO: add return values TODO: add return values
**/ **/
BOOLEAN EFI_STATUS
IsMediaError ( AtapiReadPendingData (
IN REQUEST_SENSE_DATA *SenseData, IN IDE_BLK_IO_DEV *IdeDev
IN UINTN SenseCounts
)
;
/**
TODO: Add function description
@param SenseData TODO: add argument description
@param SenseCounts TODO: add argument description
TODO: add return values
**/
BOOLEAN
IsMediaChange (
IN REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts
)
;
/**
TODO: Add function description
@param SenseData TODO: add argument description
@param SenseCounts TODO: add argument description
@param NeedRetry TODO: add argument description
TODO: add return values
**/
BOOLEAN
IsDriveReady (
IN REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts,
OUT BOOLEAN *NeedRetry
)
;
/**
TODO: Add function description
@param SenseData TODO: add argument description
@param SenseCounts TODO: add argument description
TODO: add return values
**/
BOOLEAN
HaveSenseKey (
IN REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts
) )
; ;
@ -1304,6 +1271,7 @@ EnableInterrupt (
IN IDE_BLK_IO_DEV *IdeDev IN IDE_BLK_IO_DEV *IdeDev
) )
; ;
/** /**
Clear pending IDE interrupt before OS loader/kernel take control of the IDE device. Clear pending IDE interrupt before OS loader/kernel take control of the IDE device.

View File

@ -183,7 +183,6 @@ IDEBusDriverBindingStart (
UINTN DataSize; UINTN DataSize;
UINT32 Attributes; UINT32 Attributes;
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData; IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
EFI_EVENT Event;
// //
// Local variables declaration for IdeControllerInit support // Local variables declaration for IdeControllerInit support
@ -417,6 +416,12 @@ IDEBusDriverBindingStart (
EfiIdeBusBeforeDevicePresenceDetection, EfiIdeBusBeforeDevicePresenceDetection,
IdeChannel IdeChannel
); );
//
// Prepare to detect IDE device of this channel
//
InitializeIDEChannelData ();
// //
// -- 1st inner loop --- Master/Slave ------------ Step14 // -- 1st inner loop --- Master/Slave ------------ Step14
// //
@ -488,6 +493,15 @@ IDEBusDriverBindingStart (
IdeBlkIoDevicePtr->IdeBusDriverPrivateData = IdeBusDriverPrivateData; IdeBlkIoDevicePtr->IdeBusDriverPrivateData = IdeBusDriverPrivateData;
IdeBlkIoDevicePtr->IoPort->BusMasterBaseAddr = IdeRegsBaseAddr[IdeChannel].BusMasterBaseAddr; IdeBlkIoDevicePtr->IoPort->BusMasterBaseAddr = IdeRegsBaseAddr[IdeChannel].BusMasterBaseAddr;
//
// Report Status code: is about to detect IDE drive
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_PRESENCE_DETECT),
IdeBlkIoDevicePtr->DevicePath
);
// //
// Discover device, now! // Discover device, now!
// //
@ -523,7 +537,6 @@ IDEBusDriverBindingStart (
// Submit identify data to IDE controller init driver // Submit identify data to IDE controller init driver
// //
CopyMem (&IdentifyData, IdeBlkIoDevicePtr->pIdData, sizeof (IdentifyData)); CopyMem (&IdentifyData, IdeBlkIoDevicePtr->pIdData, sizeof (IdentifyData));
// IdentifyData = *IdeBlkIoDevicePtr->pIdData;
IdeBusDriverPrivateData->DeviceFound[IdeChannel * 2 + IdeDevice] = TRUE; IdeBusDriverPrivateData->DeviceFound[IdeChannel * 2 + IdeDevice] = TRUE;
IdeInit->SubmitData (IdeInit, IdeChannel, IdeDevice, &IdentifyData); IdeInit->SubmitData (IdeInit, IdeChannel, IdeDevice, &IdentifyData);
} else { } else {
@ -706,10 +719,9 @@ IDEBusDriverBindingStart (
EFI_TPL_NOTIFY, EFI_TPL_NOTIFY,
ClearInterrupt, ClearInterrupt,
IdeBlkIoDevicePtr, IdeBlkIoDevicePtr,
&Event &IdeBlkIoDevicePtr->ExitBootServiceEvent
); );
// //
// end of 2nd inner loop ---- // end of 2nd inner loop ----
// //
@ -1028,7 +1040,8 @@ IDEBlkIoReset (
// //
// for ATA device, using ATA reset method // for ATA device, using ATA reset method
// //
if (IdeBlkIoDevice->Type == IdeHardDisk) { if (IdeBlkIoDevice->Type == IdeHardDisk ||
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
return AtaSoftReset (IdeBlkIoDevice); return AtaSoftReset (IdeBlkIoDevice);
} }

View File

@ -28,6 +28,10 @@
#define MAX_IDE_CHANNELS 2 #define MAX_IDE_CHANNELS 2
#define MAX_IDE_DRIVES 2 #define MAX_IDE_DRIVES 2
#define INVALID_DEVICE_TYPE 0xff
#define ATA_DEVICE_TYPE 0x00
#define ATAPI_DEVICE_TYPE 0x01
typedef struct { typedef struct {
BOOLEAN HaveScannedDevice[MAX_IDE_DEVICE]; BOOLEAN HaveScannedDevice[MAX_IDE_DEVICE];
BOOLEAN DeviceFound[MAX_IDE_DEVICE]; BOOLEAN DeviceFound[MAX_IDE_DEVICE];
@ -67,6 +71,11 @@ typedef struct {
UINT8 SenseDataNumber; UINT8 SenseDataNumber;
UINT8 *Cache; UINT8 *Cache;
//
// ExitBootService Event, it is used to clear pending IDE interrupt
//
EFI_EVENT ExitBootServiceEvent;
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
} IDE_BLK_IO_DEV; } IDE_BLK_IO_DEV;

View File

@ -76,6 +76,16 @@ typedef enum {
IdeUnknown IdeUnknown
} IDE_DEVICE_TYPE; } IDE_DEVICE_TYPE;
typedef enum {
SenseNoSenseKey,
SenseDeviceNotReadyNoRetry,
SenseDeviceNotReadyNeedRetry,
SenseNoMedia,
SenseMediaChange,
SenseMediaError,
SenseOtherSense
} SENSE_RESULT;
// //
// IDE Registers // IDE Registers
// //
@ -234,6 +244,11 @@ typedef struct {
// //
#define ATAPILONGTIMEOUT 5000 #define ATAPILONGTIMEOUT 5000
//
// 10 seconds
//
#define ATASMARTTIMEOUT 10000
// //
// ATA Commands Code // ATA Commands Code
// //