/** @file\r
+ This file implement UEFI driver for IDE Bus which includes device identification, \r
+ Child device(Disk, CDROM, etc) enumeration and child handler installation, and \r
+ driver stop.\r
+ \r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
NULL,\r
NULL\r
};\r
+/**\r
+ Deregister an IDE device and free resources\r
\r
-//\r
-// ***********************************************************************************\r
-// IDEBusDriverBindingSupported\r
-// ***********************************************************************************\r
-//\r
+ @param This Protocol instance pointer.\r
+ @param Controller Ide device handle\r
+ @param Handle Handle of device to deregister driver on\r
+\r
+ @retval EFI_SUCCESS Deregiter a specific IDE device successfully\r
+\r
+\r
+**/\r
+EFI_STATUS\r
+DeRegisterIdeDevice (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_HANDLE Handle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
+ IDE_BLK_IO_DEV *IdeBlkIoDevice;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ UINTN Index;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ (VOID **) &BlkIo,\r
+ This->DriverBindingHandle,\r
+ Controller,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (BlkIo);\r
+\r
+ //\r
+ // Report Status code: Device disabled\r
+ //\r
+ REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+ EFI_PROGRESS_CODE,\r
+ (EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_DISABLE),\r
+ IdeBlkIoDevice->DevicePath\r
+ );\r
+\r
+ //\r
+ // Close the child handle\r
+ //\r
+ Status = gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Handle\r
+ );\r
+\r
+ Status = gBS->UninstallMultipleProtocolInterfaces (\r
+ Handle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ IdeBlkIoDevice->DevicePath,\r
+ &gEfiBlockIoProtocolGuid,\r
+ &IdeBlkIoDevice->BlkIo,\r
+ &gEfiDiskInfoProtocolGuid,\r
+ &IdeBlkIoDevice->DiskInfo,\r
+ NULL\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->OpenProtocol (\r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ (VOID **) &PciIo,\r
+ This->DriverBindingHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Release allocated resources\r
+ //\r
+ Index = IdeBlkIoDevice->Channel * 2 + IdeBlkIoDevice->Device;\r
+ if (Index < MAX_IDE_DEVICE) {\r
+ IdeBlkIoDevice->IdeBusDriverPrivateData->HaveScannedDevice[Index] = FALSE;\r
+ }\r
+ ReleaseIdeResources (IdeBlkIoDevice);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
/**\r
- Register Driver Binding protocol for this driver.\r
+ Supported function of Driver Binding protocol for this driver.\r
\r
- @param[in] This -- A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
- @param[in] ControllerHandle -- The handle of the controller to test.\r
- @param[in] RemainingDevicePath -- A pointer to the remaining portion of a device path.\r
+ @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
+ @param ControllerHandle The handle of the controller to test.\r
+ @param RemainingDevicePath A pointer to the remaining portion of a device path.\r
\r
@retval EFI_SUCCESS Driver loaded.\r
- @retval other Driver not loaded.\r
+ @retval other Driver not loaded.\r
\r
**/\r
EFI_STATUS\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-// TODO: Controller - add argument and description to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
return Status;\r
}\r
\r
-//\r
-// ***********************************************************************************\r
-// IDEBusDriverBindingStart\r
-// ***********************************************************************************\r
-//\r
+\r
/**\r
- Start this driver on Controller by detecting all disks and installing\r
- BlockIo protocol on them.\r
+ Start function of Driver binding protocol which start this driver on Controller\r
+ by detecting all disks and installing BlockIo protocol on them.\r
\r
- @param This Protocol instance pointer.\r
- @param Controller Handle of device to bind driver to.\r
- @param RemainingDevicePath Not used, always produce all possible children.\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to bind driver to.\r
+ @param RemainingDevicePath produce all possible children.\r
\r
- @retval EFI_SUCCESS This driver is added to ControllerHandle.\r
+ @retval EFI_SUCCESS This driver is added to ControllerHandle.\r
@retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
- @retval other This driver does not support this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
EndIdeChannel = BeginningIdeChannel;\r
BeginningIdeDevice = Node->Atapi.SlaveMaster;\r
EndIdeDevice = BeginningIdeDevice;\r
+ if (BeginningIdeChannel >= IdeMaxChannel || EndIdeChannel >= IdeMaxChannel) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto ErrorExit;\r
+ }\r
+ if (BeginningIdeDevice >= IdeMaxDevice|| EndIdeDevice >= IdeMaxDevice) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto ErrorExit;\r
+ }\r
}\r
\r
//\r
}\r
\r
EndIdeDevice = (UINT8) MIN ((MaxDevices - 1), EndIdeDevice);\r
-\r
+ ASSERT (EndIdeDevice < IdeMaxDevice);\r
//\r
// Now inform the IDE Controller Init Module. Sept10\r
//\r
//\r
// Discover device, now!\r
//\r
- PERF_START (0, "DiscoverIdeDevice", "IDE", 0);\r
+ PERF_START (NULL, "DiscoverIdeDevice", "IDE", 0);\r
Status = DiscoverIdeDevice (IdeBlkIoDevicePtr);\r
- PERF_END (0, "DiscoverIdeDevice", "IDE", 0);\r
+ PERF_END (NULL, "DiscoverIdeDevice", "IDE", 0);\r
\r
IdeBusDriverPrivateData->HaveScannedDevice[IdeChannel * 2 + IdeDevice] = TRUE;\r
IdeBusDriverPrivateData->DeviceProcessed[IdeChannel * 2 + IdeDevice] = FALSE;\r
//\r
// Submit identify data to IDE controller init driver\r
//\r
- CopyMem (&IdentifyData, IdeBlkIoDevicePtr->pIdData, sizeof (IdentifyData));\r
+ CopyMem (&IdentifyData, IdeBlkIoDevicePtr->IdData, sizeof (IdentifyData));\r
IdeBusDriverPrivateData->DeviceFound[IdeChannel * 2 + IdeDevice] = TRUE;\r
IdeInit->SubmitData (IdeInit, IdeChannel, IdeDevice, &IdentifyData);\r
} else {\r
//\r
// Set best supported PIO mode on this IDE device\r
//\r
- if (SupportedModes->PioMode.Mode <= ATA_PIO_MODE_2) {\r
+ if (SupportedModes->PioMode.Mode <= AtaPioMode2) {\r
TransferMode.ModeCategory = ATA_MODE_CATEGORY_DEFAULT_PIO;\r
} else {\r
TransferMode.ModeCategory = ATA_MODE_CATEGORY_FLOW_PIO;\r
//\r
// Init driver parameters\r
//\r
- DriveParameters.Sector = (UINT8) IdeBlkIoDevicePtr->pIdData->AtaData.sectors_per_track;\r
- DriveParameters.Heads = (UINT8) (IdeBlkIoDevicePtr->pIdData->AtaData.heads - 1);\r
- DriveParameters.MultipleSector = (UINT8) IdeBlkIoDevicePtr->pIdData->AtaData.multi_sector_cmd_max_sct_cnt;\r
+ DriveParameters.Sector = (UINT8) IdeBlkIoDevicePtr->IdData->AtaData.sectors_per_track;\r
+ DriveParameters.Heads = (UINT8) (IdeBlkIoDevicePtr->IdData->AtaData.heads - 1);\r
+ DriveParameters.MultipleSector = (UINT8) IdeBlkIoDevicePtr->IdData->AtaData.multi_sector_cmd_max_sct_cnt;\r
//\r
// Set Parameters for the device:\r
// 1) Init\r
// Add Component Name for the IDE/ATAPI device that was discovered.\r
//\r
IdeBlkIoDevicePtr->ControllerNameTable = NULL;\r
- ADD_NAME (IdeBlkIoDevicePtr);\r
+ ADD_IDE_ATAPI_NAME (IdeBlkIoDevicePtr);\r
\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&IdeBlkIoDevicePtr->Handle,\r
//\r
// Create event to clear pending IDE interrupt\r
//\r
- Status = gBS->CreateEvent (\r
- EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
TPL_NOTIFY,\r
ClearInterrupt,\r
IdeBlkIoDevicePtr,\r
+ &gEfiEventExitBootServicesGuid,\r
&IdeBlkIoDevicePtr->ExitBootServiceEvent\r
);\r
\r
gBS->FreePool (SupportedModes);\r
}\r
\r
- PERF_START (0, "Finish IDE detection", "IDE", 1);\r
- PERF_END (0, "Finish IDE detection", "IDE", 0);\r
+ PERF_START (NULL, "Finish IDE detection", "IDE", 1);\r
+ PERF_END (NULL, "Finish IDE detection", "IDE", 0);\r
\r
return EFI_SUCCESS;\r
\r
return Status;\r
\r
}\r
-\r
-//\r
-// ***********************************************************************************\r
-// IDEBusDriverBindingStop\r
-// ***********************************************************************************\r
-//\r
/**\r
- Stop this driver on Controller Handle.\r
+ Stop function of Driver Binding Protocol which is to stop the driver on Controller Handle and all\r
+ child handle attached to the controller handle if there are.\r
\r
@param This Protocol instance pointer.\r
@param Controller Handle of device to stop driver on\r
IN UINTN NumberOfChildren,\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
-// TODO: Controller - add argument and description to function comment\r
-// TODO: EFI_DEVICE_ERROR - add return value to function comment\r
{\r
EFI_STATUS Status;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
return EFI_SUCCESS;\r
}\r
\r
-//\r
-// ***********************************************************************************\r
-// DeRegisterIdeDevice\r
-// ***********************************************************************************\r
-//\r
/**\r
- Deregister an IDE device and free resources\r
-\r
- @param This Protocol instance pointer.\r
- @param Controller Ide device handle\r
- @param Handle Handle of device to deregister driver on\r
-\r
- @return EFI_STATUS\r
-\r
-**/\r
-EFI_STATUS\r
-DeRegisterIdeDevice (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Handle\r
- )\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-{\r
- EFI_STATUS Status;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- IDE_BLK_IO_DEV *IdeBlkIoDevice;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- UINTN Index;\r
-\r
- Status = gBS->OpenProtocol (\r
- Handle,\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (BlkIo);\r
-\r
- //\r
- // Report Status code: Device disabled\r
- //\r
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
- EFI_PROGRESS_CODE,\r
- (EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_DISABLE),\r
- IdeBlkIoDevice->DevicePath\r
- );\r
-\r
- //\r
- // Close the child handle\r
- //\r
- Status = gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Handle\r
- );\r
-\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- Handle,\r
- &gEfiDevicePathProtocolGuid,\r
- IdeBlkIoDevice->DevicePath,\r
- &gEfiBlockIoProtocolGuid,\r
- &IdeBlkIoDevice->BlkIo,\r
- &gEfiDiskInfoProtocolGuid,\r
- &IdeBlkIoDevice->DiskInfo,\r
- NULL\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- gBS->OpenProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- (VOID **) &PciIo,\r
- This->DriverBindingHandle,\r
- Handle,\r
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
- );\r
- return Status;\r
- }\r
-\r
- //\r
- // Release allocated resources\r
- //\r
- Index = IdeBlkIoDevice->Channel * 2 + IdeBlkIoDevice->Device;\r
- IdeBlkIoDevice->IdeBusDriverPrivateData->HaveScannedDevice[Index] = FALSE;\r
-\r
- ReleaseIdeResources (IdeBlkIoDevice);\r
-\r
- return EFI_SUCCESS;\r
-}\r
+ issue ATA or ATAPI command to reset a block IO device.\r
+ @param This Block IO protocol instance pointer.\r
+ @param ExtendedVerification If FALSE,for ATAPI device, driver will only invoke ATAPI reset method\r
+ If TRUE, for ATAPI device, driver need invoke ATA reset method after\r
+ invoke ATAPI reset method\r
\r
-//\r
-// ***********************************************************************************\r
-// IDEBlkIoReset\r
-// ***********************************************************************************\r
-//\r
-/**\r
- TODO: This - add argument and description to function comment\r
- TODO: ExtendedVerification - add argument and description to function comment\r
- TODO: EFI_DEVICE_ERROR - add return value to function comment\r
+ @retval EFI_DEVICE_ERROR When the device is neighther ATA device or ATAPI device.\r
+ @retval EFI_SUCCESS The device reset successfully\r
\r
**/\r
EFI_STATUS\r
}\r
\r
/**\r
- Read data from block io device\r
+ Read data from a block IO device\r
\r
- @param This Protocol instance pointer.\r
- @param MediaId The media ID of the device\r
- @param LBA Starting LBA address to read data\r
+ @param This Block IO protocol instance pointer.\r
+ @param MediaId The media ID of the device\r
+ @param Lba Starting LBA address to read data\r
@param BufferSize The size of data to be read\r
- @param Buffer Caller supplied buffer to save data\r
+ @param Buffer Caller supplied buffer to save data\r
\r
- @return read data status\r
+ @retval EFI_DEVICE_ERROR unknown device type\r
+ @retval other read data status.\r
\r
**/\r
EFI_STATUS\r
IDEBlkIoReadBlocks (\r
IN EFI_BLOCK_IO_PROTOCOL *This,\r
IN UINT32 MediaId,\r
- IN EFI_LBA LBA,\r
+ IN EFI_LBA Lba,\r
IN UINTN BufferSize,\r
OUT VOID *Buffer\r
)\r
-// TODO: EFI_DEVICE_ERROR - add return value to function comment\r
{\r
IDE_BLK_IO_DEV *IdeBlkIoDevice;\r
EFI_STATUS Status;\r
Status = AtaBlkIoReadBlocks (\r
IdeBlkIoDevice,\r
MediaId,\r
- LBA,\r
+ Lba,\r
BufferSize,\r
Buffer\r
);\r
Status = AtapiBlkIoReadBlocks (\r
IdeBlkIoDevice,\r
MediaId,\r
- LBA,\r
+ Lba,\r
BufferSize,\r
Buffer\r
);\r
}\r
\r
/**\r
- Write data to block io device\r
+ Write data to block io device.\r
\r
- @param This Protocol instance pointer.\r
- @param MediaId The media ID of the device\r
- @param LBA Starting LBA address to write data\r
+ @param This Protocol instance pointer.\r
+ @param MediaId The media ID of the device\r
+ @param Lba Starting LBA address to write data\r
@param BufferSize The size of data to be written\r
- @param Buffer Caller supplied buffer to save data\r
+ @param Buffer Caller supplied buffer to save data\r
\r
- @return write data status\r
+ @retval EFI_DEVICE_ERROR unknown device type\r
+ @retval other write data status\r
\r
**/\r
EFI_STATUS\r
IDEBlkIoWriteBlocks (\r
IN EFI_BLOCK_IO_PROTOCOL *This,\r
IN UINT32 MediaId,\r
- IN EFI_LBA LBA,\r
+ IN EFI_LBA Lba,\r
IN UINTN BufferSize,\r
IN VOID *Buffer\r
)\r
-// TODO: EFI_DEVICE_ERROR - add return value to function comment\r
{\r
IDE_BLK_IO_DEV *IdeBlkIoDevice;\r
EFI_STATUS Status;\r
Status = AtaBlkIoWriteBlocks (\r
IdeBlkIoDevice,\r
MediaId,\r
- LBA,\r
+ Lba,\r
BufferSize,\r
Buffer\r
);\r
Status = AtapiBlkIoWriteBlocks (\r
IdeBlkIoDevice,\r
MediaId,\r
- LBA,\r
+ Lba,\r
BufferSize,\r
Buffer\r
);\r
gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
-\r
-//\r
-// ***********************************************************************************\r
-// IDEBlkIoFlushBlocks\r
-// ***********************************************************************************\r
-//\r
/**\r
- TODO: This - add argument and description to function comment\r
- TODO: EFI_SUCCESS - add return value to function comment\r
+ Flushes all modified data to a physical block devices\r
+\r
+ @param This Indicates a pointer to the calling context which to sepcify a\r
+ sepcific block device\r
+\r
+ @retval EFI_SUCCESS Always return success.\r
**/\r
EFI_STATUS\r
EFIAPI\r
}\r
\r
/**\r
- Return the results of the Inquiry command to a drive in InquiryData.\r
- Data format of Inquiry data is defined by the Interface GUID.\r
+ This function is used by the IDE bus driver to get inquiry data. \r
+ Data format of Identify data is defined by the Interface GUID.\r
\r
- @param This Protocol instance pointer.\r
- @param InquiryData Results of Inquiry command to device\r
- @param InquiryDataSize Size of InquiryData in bytes.\r
+ @param This Pointer to the EFI_DISK_INFO_PROTOCOL instance.\r
+ @param InquiryData Pointer to a buffer for the inquiry data.\r
+ @param InquiryDataSize Pointer to the value for the inquiry data size.\r
\r
- @retval EFI_SUCCESS InquiryData valid\r
- @retval EFI_NOT_FOUND Device does not support this data class\r
- @retval EFI_DEVICE_ERROR Error reading InquiryData from device\r
- @retval EFI_BUFFER_TOO_SMALL IntquiryDataSize not big enough\r
+ @retval EFI_SUCCESS The command was accepted without any errors.\r
+ @retval EFI_NOT_FOUND Device does not support this data class \r
+ @retval EFI_DEVICE_ERROR Error reading InquiryData from device \r
+ @retval EFI_BUFFER_TOO_SMALL IntquiryDataSize not big enough \r
\r
**/\r
EFI_STATUS\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
- if (IdeBlkIoDevice->pInquiryData == NULL) {\r
+ if (IdeBlkIoDevice->InquiryData == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- gBS->CopyMem (InquiryData, IdeBlkIoDevice->pInquiryData, sizeof (ATAPI_INQUIRY_DATA));\r
+ gBS->CopyMem (InquiryData, IdeBlkIoDevice->InquiryData, sizeof (ATAPI_INQUIRY_DATA));\r
*InquiryDataSize = sizeof (ATAPI_INQUIRY_DATA);\r
\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Return the results of the Identify command to a drive in IdentifyData.\r
+ This function is used by the IDE bus driver to get identify data. \r
Data format of Identify data is defined by the Interface GUID.\r
\r
- @param This Protocol instance pointer.\r
- @param IdentifyData Results of Identify command to device\r
- @param IdentifyDataSize Size of IdentifyData in bytes.\r
+ @param This Pointer to the EFI_DISK_INFO_PROTOCOL instance.\r
+ @param IdentifyData Pointer to a buffer for the identify data.\r
+ @param IdentifyDataSize Pointer to the value for the identify data size.\r
\r
- @retval EFI_SUCCESS IdentifyData valid\r
- @retval EFI_NOT_FOUND Device does not support this data class\r
- @retval EFI_DEVICE_ERROR Error reading IdentifyData from device\r
- @retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough\r
+ @retval EFI_SUCCESS The command was accepted without any errors.\r
+ @retval EFI_NOT_FOUND Device does not support this data class \r
+ @retval EFI_DEVICE_ERROR Error reading IdentifyData from device \r
+ @retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough \r
\r
**/\r
EFI_STATUS\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
- if (IdeBlkIoDevice->pIdData == NULL) {\r
+ if (IdeBlkIoDevice->IdData == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- gBS->CopyMem (IdentifyData, IdeBlkIoDevice->pIdData, sizeof (EFI_IDENTIFY_DATA));\r
+ gBS->CopyMem (IdentifyData, IdeBlkIoDevice->IdData, sizeof (EFI_IDENTIFY_DATA));\r
*IdentifyDataSize = sizeof (EFI_IDENTIFY_DATA);\r
\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Return the results of the Request Sense command to a drive in SenseData.\r
+ This function is used by the IDE bus driver to get sense data. \r
Data format of Sense data is defined by the Interface GUID.\r
\r
- @param This Protocol instance pointer.\r
- @param SenseData Results of Request Sense command to device\r
- @param SenseDataSize Size of SenseData in bytes.\r
- @param SenseDataNumber Type of SenseData\r
+ @param This Pointer to the EFI_DISK_INFO_PROTOCOL instance. \r
+ @param SenseData Pointer to the SenseData. \r
+ @param SenseDataSize Size of SenseData in bytes. \r
+ @param SenseDataNumber Pointer to the value for the identify data size.\r
\r
- @retval EFI_SUCCESS InquiryData valid\r
- @retval EFI_NOT_FOUND Device does not support this data class\r
- @retval EFI_DEVICE_ERROR Error reading InquiryData from device\r
- @retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough\r
+ @retval EFI_SUCCESS The command was accepted without any errors.\r
+ @retval EFI_NOT_FOUND Device does not support this data class \r
+ @retval EFI_DEVICE_ERROR Error reading InquiryData from device \r
+ @retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough \r
\r
**/\r
EFI_STATUS\r
}\r
\r
/**\r
- Return the results of the Request Sense command to a drive in SenseData.\r
- Data format of Sense data is defined by the Interface GUID.\r
+ This function is used by the IDE bus driver to get controller information.\r
\r
- @param This Protocol instance pointer.\r
- @param IdeChannel Primary or Secondary\r
- @param IdeDevice Master or Slave\r
+ @param This Pointer to the EFI_DISK_INFO_PROTOCOL instance. \r
+ @param IdeChannel Pointer to the Ide Channel number. Primary or secondary.\r
+ @param IdeDevice Pointer to the Ide Device number. Master or slave.\r
\r
- @retval EFI_SUCCESS IdeChannel and IdeDevice are valid\r
- @retval EFI_UNSUPPORTED This is not an IDE device\r
+ @retval EFI_SUCCESS IdeChannel and IdeDevice are valid \r
+ @retval EFI_UNSUPPORTED This is not an IDE device \r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ The is an event(generally the event is exitBootService event) call back function.\r
+ Clear pending IDE interrupt before OS loader/kernel take control of the IDE device.\r
+\r
+ @param Event Pointer to this event\r
+ @param Context Event hanlder private data\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ClearInterrupt (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT64 IoPortForBmis;\r
+ UINT8 RegisterValue;\r
+ IDE_BLK_IO_DEV *IdeDev;\r
+\r
+ //\r
+ // Get our context\r
+ //\r
+ IdeDev = (IDE_BLK_IO_DEV *) Context;\r
+\r
+ //\r
+ // Obtain IDE IO port registers' base addresses\r
+ //\r
+ Status = ReassignIdeResources (IdeDev);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Check whether interrupt is pending\r
+ //\r
+\r
+ //\r
+ // Reset IDE device to force it de-assert interrupt pin\r
+ // Note: this will reset all devices on this IDE channel\r
+ //\r
+ AtaSoftReset (IdeDev);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Get base address of IDE Bus Master Status Regsiter\r
+ //\r
+ if (IdePrimary == IdeDev->Channel) {\r
+ IoPortForBmis = IdeDev->IoPort->BusMasterBaseAddr + BMISP_OFFSET;\r
+ } else {\r
+ if (IdeSecondary == IdeDev->Channel) {\r
+ IoPortForBmis = IdeDev->IoPort->BusMasterBaseAddr + BMISS_OFFSET;\r
+ } else {\r
+ return;\r
+ }\r
+ }\r
+ //\r
+ // Read BMIS register and clear ERROR and INTR bit\r
+ //\r
+ IdeDev->PciIo->Io.Read (\r
+ IdeDev->PciIo,\r
+ EfiPciIoWidthUint8,\r
+ EFI_PCI_IO_PASS_THROUGH_BAR,\r
+ IoPortForBmis,\r
+ 1,\r
+ &RegisterValue\r
+ );\r
+\r
+ RegisterValue |= (BMIS_INTERRUPT | BMIS_ERROR);\r
+\r
+ IdeDev->PciIo->Io.Write (\r
+ IdeDev->PciIo,\r
+ EfiPciIoWidthUint8,\r
+ EFI_PCI_IO_PASS_THROUGH_BAR,\r
+ IoPortForBmis,\r
+ 1,\r
+ &RegisterValue\r
+ );\r
+\r
+ //\r
+ // Select the other device on this channel to ensure this device to release the interrupt pin\r
+ //\r
+ if (IdeDev->Device == 0) {\r
+ RegisterValue = (1 << 4) | 0xe0;\r
+ } else {\r
+ RegisterValue = (0 << 4) | 0xe0;\r
+ }\r
+ IDEWritePortB (\r
+ IdeDev->PciIo,\r
+ IdeDev->IoPort->Head,\r
+ RegisterValue\r
+ );\r
+\r
+}\r
+\r
/**\r
The user Entry Point for module IdeBus. The user code starts with this function.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
- \r
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r