IDEBusDriverBindingSupported,\r
IDEBusDriverBindingStart,\r
IDEBusDriverBindingStop,\r
- 0x10,\r
+ 0xa,\r
NULL,\r
NULL\r
};\r
}\r
\r
//\r
- // Clsoe protocol, don't use device path protocol in the .Support() function\r
+ // Close protocol, don't use device path protocol in the .Support() function\r
//\r
gBS->CloseProtocol (\r
Controller,\r
UINT16 CommandBlockBaseAddr;\r
UINT16 ControlBlockBaseAddr;\r
UINTN DataSize;\r
- UINT32 Attributes;\r
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;\r
\r
//\r
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeInit;\r
BOOLEAN EnumAll;\r
BOOLEAN ChannelEnabled;\r
- UINT8 ChannelCount;\r
UINT8 MaxDevices;\r
EFI_IDENTIFY_DATA IdentifyData;\r
EFI_ATA_COLLECTIVE_MODE *SupportedModes;\r
}\r
\r
//\r
- // Save Enumall and ChannelCount. Step7.2\r
+ // Save Enumall. Step7.2\r
//\r
EnumAll = IdeInit->EnumAll;\r
- ChannelCount = IdeInit->ChannelCount;\r
\r
//\r
// Consume PCI I/O protocol. Note that the OpenProtocol with _GET_PROTOCOL\r
Status = gRT->GetVariable (\r
(CHAR16 *) L"Configuration",\r
&gEfiCallerIdGuid,\r
- &Attributes,\r
+ NULL,\r
&DataSize,\r
&ConfigurationOptions\r
);\r
EfiIdeBusBeforeDevicePresenceDetection,\r
IdeChannel\r
);\r
+\r
+ //\r
+ // Prepare to detect IDE device of this channel\r
+ //\r
+ InitializeIDEChannelData ();\r
+\r
//\r
// -- 1st inner loop --- Master/Slave ------------ Step14\r
//\r
ZeroMem (IdeBlkIoDevicePtr, sizeof (IDE_BLK_IO_DEV));\r
\r
IdeBlkIoDevicePtr->Signature = IDE_BLK_IO_DEV_SIGNATURE;\r
- IdeBlkIoDevicePtr->Channel = IdeChannel;\r
- IdeBlkIoDevicePtr->Device = IdeDevice;\r
+ IdeBlkIoDevicePtr->Channel = (EFI_IDE_CHANNEL) IdeChannel;\r
+ IdeBlkIoDevicePtr->Device = (EFI_IDE_DEVICE) IdeDevice;\r
\r
//\r
// initialize Block IO interface's Media pointer\r
IdeBlkIoDevicePtr->IdeBusDriverPrivateData = IdeBusDriverPrivateData;\r
IdeBlkIoDevicePtr->IoPort->BusMasterBaseAddr = IdeRegsBaseAddr[IdeChannel].BusMasterBaseAddr;\r
\r
+ //\r
+ // Report Status code: is about to detect IDE drive\r
+ //\r
+ REPORT_STATUS_CODE_EX (\r
+ EFI_PROGRESS_CODE,\r
+ (EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_PRESENCE_DETECT),\r
+ 0,\r
+ &gEfiCallerIdGuid,\r
+ NULL,\r
+ NULL,\r
+ 0\r
+ );\r
+\r
//\r
// Discover device, now!\r
//\r
// Submit identify data to IDE controller init driver\r
//\r
CopyMem (&IdentifyData, IdeBlkIoDevicePtr->pIdData, sizeof (IdentifyData));\r
- // IdentifyData = *IdeBlkIoDevicePtr->pIdData;\r
IdeBusDriverPrivateData->DeviceFound[IdeChannel * 2 + IdeDevice] = TRUE;\r
IdeInit->SubmitData (IdeInit, IdeChannel, IdeDevice, &IdentifyData);\r
} else {\r
//\r
// Record PIO mode used in private data\r
//\r
- IdeBlkIoDevicePtr->PioMode = SupportedModes->PioMode.Mode;\r
+ IdeBlkIoDevicePtr->PioMode = (ATA_PIO_MODE) SupportedModes->PioMode.Mode;\r
\r
//\r
// Set IDE controller Timing Blocks in the PCI Configuration Space\r
(EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_ENABLE),\r
IdeBlkIoDevicePtr->DevicePath\r
);\r
+ \r
+ //\r
+ // Create event to clear pending IDE interrupt\r
+ //\r
+ Status = gBS->CreateEvent (\r
+ EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ EFI_TPL_NOTIFY,\r
+ ClearInterrupt,\r
+ IdeBlkIoDevicePtr,\r
+ &IdeBlkIoDevicePtr->ExitBootServiceEvent\r
+ );\r
+\r
//\r
// end of 2nd inner loop ----\r
//\r
//\r
// for ATA device, using ATA reset method\r
//\r
- if (IdeBlkIoDevice->Type == IdeHardDisk) {\r
+ if (IdeBlkIoDevice->Type == IdeHardDisk ||\r
+ IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {\r
return AtaSoftReset (IdeBlkIoDevice);\r
}\r
\r