-/*++\r
+/** @file\r
+ Copyright (c) 2006, 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
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
\r
-Copyright (c) 2006, 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
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-Module Name:\r
-\r
- ide.c\r
- \r
-Abstract: \r
- \r
-\r
-Revision History\r
---*/\r
+**/\r
\r
#include "idebus.h"\r
\r
BOOLEAN SlaveDeviceExist = FALSE;\r
BOOLEAN MasterDeviceExist = FALSE;\r
\r
-UINT8\r
-IDEReadPortB (\r
- IN EFI_PCI_IO_PROTOCOL *PciIo,\r
- IN UINT16 Port\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
TODO: Add function description\r
\r
-Arguments:\r
-\r
- PciIo - TODO: add argument description\r
- Port - TODO: add argument description\r
-\r
-Returns:\r
+ @param PciIo TODO: add argument description\r
+ @param Port TODO: add argument description\r
\r
TODO: add return values\r
\r
---*/\r
+**/\r
+UINT8\r
+IDEReadPortB (\r
+ IN EFI_PCI_IO_PROTOCOL *PciIo,\r
+ IN UINT16 Port\r
+ )\r
{\r
UINT8 Data;\r
\r
return Data;\r
}\r
\r
+/**\r
+ Reads multiple words of data from the IDE data port.\r
+ Call the IO abstraction once to do the complete read,\r
+ not one word at a time\r
+\r
+ @param PciIo Pointer to the EFI_PCI_IO instance\r
+ @param Port IO port to read\r
+ @param Count No. of UINT16's to read\r
+ @param Buffer Pointer to the data buffer for read\r
+\r
+**/\r
VOID\r
IDEReadPortWMultiple (\r
IN EFI_PCI_IO_PROTOCOL *PciIo,\r
IN UINTN Count,\r
IN VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Reads multiple words of data from the IDE data port. \r
- Call the IO abstraction once to do the complete read,\r
- not one word at a time\r
- \r
-\r
-Arguments:\r
- PciIo - Pointer to the EFI_PCI_IO instance\r
- Port - IO port to read\r
- Count - No. of UINT16's to read\r
- Buffer - Pointer to the data buffer for read\r
-\r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
{\r
UINT16 *AlignedBuffer;\r
UINT16 *WorkingBuffer;\r
gBS->FreePool (WorkingBuffer);\r
}\r
\r
+/**\r
+ TODO: Add function description\r
+\r
+ @param PciIo TODO: add argument description\r
+ @param Port TODO: add argument description\r
+ @param Data TODO: add argument description\r
+\r
+ TODO: add return values\r
+\r
+**/\r
VOID\r
IDEWritePortB (\r
IN EFI_PCI_IO_PROTOCOL *PciIo,\r
IN UINT16 Port,\r
IN UINT8 Data\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- PciIo - TODO: add argument description\r
- Port - TODO: add argument description\r
- Data - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
{\r
//\r
// perform 1-byte data write to register\r
\r
}\r
\r
+/**\r
+ TODO: Add function description\r
+\r
+ @param PciIo TODO: add argument description\r
+ @param Port TODO: add argument description\r
+ @param Data TODO: add argument description\r
+\r
+ TODO: add return values\r
+\r
+**/\r
VOID\r
IDEWritePortW (\r
IN EFI_PCI_IO_PROTOCOL *PciIo,\r
IN UINT16 Port,\r
IN UINT16 Data\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- PciIo - TODO: add argument description\r
- Port - TODO: add argument description\r
- Data - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
{\r
//\r
// perform 1-word data write to register\r
);\r
}\r
\r
+/**\r
+ Write multiple words of data to the IDE data port.\r
+ Call the IO abstraction once to do the complete read,\r
+ not one word at a time\r
+\r
+ @param PciIo Pointer to the EFI_PCI_IO instance\r
+ @param Port IO port to read\r
+ @param Count No. of UINT16's to read\r
+ @param Buffer Pointer to the data buffer for read\r
+\r
+**/\r
VOID\r
IDEWritePortWMultiple (\r
IN EFI_PCI_IO_PROTOCOL *PciIo,\r
IN UINTN Count,\r
IN VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Write multiple words of data to the IDE data port. \r
- Call the IO abstraction once to do the complete read,\r
- not one word at a time\r
- \r
-\r
-Arguments:\r
- PciIo - Pointer to the EFI_PCI_IO instance\r
- Port - IO port to read\r
- Count - No. of UINT16's to read\r
- Buffer - Pointer to the data buffer for read\r
-\r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
{\r
UINT16 *AlignedBuffer;\r
UINT32 *WorkingBuffer;\r
gBS->FreePool (WorkingBuffer);\r
}\r
\r
-BOOLEAN\r
-BadIdeDeviceCheck (\r
- IN IDE_BLK_IO_DEV *IdeDev\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
TODO: Add function description\r
\r
-Arguments:\r
-\r
- IdeDev - TODO: add argument description\r
-\r
-Returns:\r
+ @param IdeDev TODO: add argument description\r
\r
TODO: add return values\r
\r
---*/\r
+**/\r
+BOOLEAN\r
+BadIdeDeviceCheck (\r
+ IN IDE_BLK_IO_DEV *IdeDev\r
+ )\r
{\r
//\r
// check whether all registers return 0xff,\r
//\r
// GetIdeRegistersBaseAddr\r
//\r
-EFI_STATUS\r
-GetIdeRegistersBaseAddr (\r
- IN EFI_PCI_IO_PROTOCOL *PciIo,\r
- OUT IDE_REGISTERS_BASE_ADDR *IdeRegsBaseAddr\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,\r
use fixed addresses. In Native-PCI mode, get base addresses from BARs in\r
the PCI IDE controller's Configuration Space.\r
- \r
- The steps to get IDE IO port registers' base addresses for each channel \r
+\r
+ The steps to get IDE IO port registers' base addresses for each channel\r
as follows:\r
\r
- 1. Examine the Programming Interface byte of the Class Code fields in PCI IDE \r
- controller's Configuration Space to determine the operating mode.\r
- \r
+ 1. Examine the Programming Interface byte of the Class Code fields in PCI IDE\r
+ controller's Configuration Space to determine the operating mode.\r
+\r
2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below.\r
- ___________________________________________\r
- | | Command Block | Control Block |\r
- | Channel | Registers | Registers |\r
- |___________|_______________|_______________|\r
- | Primary | 1F0h - 1F7h | 3F6h - 3F7h |\r
- |___________|_______________|_______________|\r
- | Secondary | 170h - 177h | 376h - 377h |\r
- |___________|_______________|_______________|\r
- \r
- Table 1. Compatibility resource mappings\r
- \r
- b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs\r
- in IDE controller's PCI Configuration Space, shown in the Table 2 below.\r
- ___________________________________________________\r
- | | Command Block | Control Block |\r
- | Channel | Registers | Registers |\r
- |___________|___________________|___________________|\r
- | Primary | BAR at offset 0x10| BAR at offset 0x14|\r
- |___________|___________________|___________________|\r
- | Secondary | BAR at offset 0x18| BAR at offset 0x1C|\r
- |___________|___________________|___________________|\r
- \r
- Table 2. BARs for Register Mapping\r
- Note: Refer to Intel ICH4 datasheet, Control Block Offset: 03F4h for \r
- primary, 0374h for secondary. So 2 bytes extra offset should be \r
- added to the base addresses read from BARs.\r
- \r
- For more details, please refer to PCI IDE Controller Specification and Intel \r
+ <pre>\r
+ ___________________________________________\r
+ | | Command Block | Control Block |\r
+ | Channel | Registers | Registers |\r
+ |___________|_______________|_______________|\r
+ | Primary | 1F0h - 1F7h | 3F6h - 3F7h |\r
+ |___________|_______________|_______________|\r
+ | Secondary | 170h - 177h | 376h - 377h |\r
+ |___________|_______________|_______________|\r
+\r
+ Table 1. Compatibility resource mappings\r
+ </pre>\r
+\r
+ b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs\r
+ in IDE controller's PCI Configuration Space, shown in the Table 2 below.\r
+ <pre>\r
+ ___________________________________________________\r
+ | | Command Block | Control Block |\r
+ | Channel | Registers | Registers |\r
+ |___________|___________________|___________________|\r
+ | Primary | BAR at offset 0x10| BAR at offset 0x14|\r
+ |___________|___________________|___________________|\r
+ | Secondary | BAR at offset 0x18| BAR at offset 0x1C|\r
+ |___________|___________________|___________________|\r
+\r
+ Table 2. BARs for Register Mapping\r
+ </pre>\r
+ @note Refer to Intel ICH4 datasheet, Control Block Offset: 03F4h for\r
+ primary, 0374h for secondary. So 2 bytes extra offset should be\r
+ added to the base addresses read from BARs.\r
+\r
+ For more details, please refer to PCI IDE Controller Specification and Intel\r
ICH4 Datasheet.\r
- \r
-Arguments:\r
- PciIo - Pointer to the EFI_PCI_IO_PROTOCOL instance\r
- IdeRegsBaseAddr - Pointer to IDE_REGISTERS_BASE_ADDR to \r
- receive IDE IO port registers' base addresses\r
- \r
-Returns:\r
- \r
---*/\r
+\r
+ @param PciIo Pointer to the EFI_PCI_IO_PROTOCOL instance\r
+ @param IdeRegsBaseAddr Pointer to IDE_REGISTERS_BASE_ADDR to\r
+ receive IDE IO port registers' base addresses\r
+\r
+**/\r
+EFI_STATUS\r
+GetIdeRegistersBaseAddr (\r
+ IN EFI_PCI_IO_PROTOCOL *PciIo,\r
+ OUT IDE_REGISTERS_BASE_ADDR *IdeRegsBaseAddr\r
+ )\r
// TODO: EFI_UNSUPPORTED - add return value to function comment\r
// TODO: EFI_UNSUPPORTED - add return value to function comment\r
// TODO: EFI_SUCCESS - add return value to function comment\r
if ((PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE) == 0) {\r
IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 0x1f0;\r
IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 0x3f6;\r
- IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = \r
+ IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr =\r
(UINT16)((PciData.Device.Bar[4] & 0x0000fff0));\r
} else {\r
//\r
// The BARs should be of IO type\r
//\r
- if ((PciData.Device.Bar[0] & bit0) == 0 || \r
+ if ((PciData.Device.Bar[0] & bit0) == 0 ||\r
(PciData.Device.Bar[1] & bit0) == 0) {\r
return EFI_UNSUPPORTED;\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ This function is used to requery IDE resources. The IDE controller will\r
+ probably switch between native and legacy modes during the EFI->CSM->OS\r
+ transfer. We do this everytime before an BlkIo operation to ensure its\r
+ succeess.\r
+\r
+ @param IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
EFI_STATUS\r
ReassignIdeResources (\r
IN IDE_BLK_IO_DEV *IdeDev\r
)\r
-/*++\r
-\r
-Routine Description:\r
- This function is used to requery IDE resources. The IDE controller will \r
- probably switch between native and legacy modes during the EFI->CSM->OS \r
- transfer. We do this everytime before an BlkIo operation to ensure its\r
- succeess.\r
- \r
-Arguments:\r
- IdeDev - The BLK_IO private data which specifies the IDE device\r
- \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Read SATA registers to detect SATA disks\r
+\r
+ @param IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
EFI_STATUS\r
CheckPowerMode (\r
IDE_BLK_IO_DEV *IdeDev\r
)\r
-/*++\r
- Routine Description:\r
- \r
- Read SATA registers to detect SATA disks\r
-\r
- Arguments:\r
-\r
- IdeDev - The BLK_IO private data which specifies the IDE device\r
- \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
// TODO: EFI_NOT_FOUND - add return value to function comment\r
// TODO: EFI_SUCCESS - add return value to function comment\r
// TODO: EFI_NOT_FOUND - add return value to function comment\r
//\r
// DiscoverIdeDevice\r
//\r
+/**\r
+ Detect if there is disk connected to this port\r
+\r
+ @param IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
EFI_STATUS\r
DiscoverIdeDevice (\r
IN IDE_BLK_IO_DEV *IdeDev\r
)\r
-/*++\r
- Routine Description:\r
- \r
- Detect if there is disk connected to this port\r
-\r
- Arguments:\r
-\r
- IdeDev - The BLK_IO private data which specifies the IDE device\r
- \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
// TODO: EFI_NOT_FOUND - add return value to function comment\r
// TODO: EFI_NOT_FOUND - add return value to function comment\r
// TODO: EFI_SUCCESS - add return value to function comment\r
if (Status == EFI_SUCCESS) {\r
SataFlag = TRUE;\r
}\r
- \r
+\r
//\r
// If a channel has not been checked, check it now. Then set it to "checked" state\r
// After this step, all devices in this channel have been checked.\r
if ((EFI_ERROR (Status)) && !SataFlag) {\r
return EFI_NOT_FOUND;\r
}\r
- \r
+\r
//\r
// Device exists. test if it is an ATA device\r
//\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-DetectIDEController (\r
- IN IDE_BLK_IO_DEV *IdeDev\r
- )\r
-/*++\r
- \r
- Name: DetectIDEController\r
+/**\r
+ This function is called by DiscoverIdeDevice(). It is used for detect\r
+ whether the IDE device exists in the specified Channel as the specified\r
+ Device Number.\r
\r
+ There is two IDE channels: one is Primary Channel, the other is\r
+ Secondary Channel.(Channel is the logical name for the physical "Cable".)\r
+ Different channel has different register group.\r
\r
- Purpose: \r
- This function is called by DiscoverIdeDevice(). It is used for detect \r
- whether the IDE device exists in the specified Channel as the specified \r
- Device Number.\r
+ On each IDE channel, at most two IDE devices attach,\r
+ one is called Device 0 (Master device), the other is called Device 1\r
+ (Slave device). The devices on the same channel co-use the same register\r
+ group, so before sending out a command for a specified device via command\r
+ register, it is a must to select the current device to accept the command\r
+ by set the device number in the Head/Device Register.\r
\r
- There is two IDE channels: one is Primary Channel, the other is \r
- Secondary Channel.(Channel is the logical name for the physical "Cable".) \r
- Different channel has different register group.\r
+ @param[in] *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
- On each IDE channel, at most two IDE devices attach, \r
- one is called Device 0 (Master device), the other is called Device 1 \r
- (Slave device). The devices on the same channel co-use the same register \r
- group, so before sending out a command for a specified device via command \r
- register, it is a must to select the current device to accept the command \r
- by set the device number in the Head/Device Register.\r
- \r
- \r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval TRUE\r
+ successfully detects device.\r
\r
+ @retval FALSE\r
+ any failure during detection process will return this\r
+ value.\r
\r
- Returns: \r
- TRUE \r
- successfully detects device.\r
+ @note\r
+ TODO: EFI_SUCCESS - add return value to function comment\r
+ TODO: EFI_NOT_FOUND - add return value to function comment\r
\r
- FALSE\r
- any failure during detection process will return this\r
- value.\r
-\r
-\r
- Notes:\r
---*/\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: IdeDev - add argument and description to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_NOT_FOUND - add return value to function comment\r
+**/\r
+EFI_STATUS\r
+DetectIDEController (\r
+ IN IDE_BLK_IO_DEV *IdeDev\r
+ )\r
{\r
EFI_STATUS Status;\r
UINT8 ErrorReg;\r
return EFI_NOT_FOUND;\r
}\r
}\r
- \r
+\r
//\r
// Select slave device\r
//\r
MasterDeviceExist = FALSE;\r
DeviceStatus = EFI_NOT_FOUND;\r
}\r
- \r
+\r
//\r
// Master Error register is not 0x81, Go on check Slave\r
//\r
\r
+ //\r
+ // Stall 20ms to wait for slave device ready if master device not exists\r
+ //\r
+ if (!MasterDeviceExist) {\r
+ gBS->Stall (20000);\r
+ }\r
+\r
//\r
// select slave\r
//\r
\r
}\r
\r
-EFI_STATUS\r
-DRQClear (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name: DRQClear\r
-\r
-\r
- Purpose: \r
- This function is used to poll for the DRQ bit clear in the Status \r
- Register. DRQ is cleared when the device is finished transferring data. \r
- So this function is called after data transfer is finished.\r
-\r
+/**\r
+ This function is used to poll for the DRQ bit clear in the Status\r
+ Register. DRQ is cleared when the device is finished transferring data.\r
+ So this function is called after data transfer is finished.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @param[in] *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ clear.\r
+ @param[in] TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ clear.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRQ bit clear within the time out.\r
+ @retval EFI_SUCCESS\r
+ DRQ bit clear within the time out.\r
\r
- EFI_TIMEOUT\r
- DRQ bit not clear within the time out. \r
+ @retval EFI_TIMEOUT\r
+ DRQ bit not clear within the time out.\r
\r
+ @note\r
+ Read Status Register will clear interrupt status.\r
\r
- Notes:\r
- Read Status Register will clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRQClear (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-DRQClear2 (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name: DRQClear2\r
-\r
+/**\r
+ This function is used to poll for the DRQ bit clear in the Alternate\r
+ Status Register. DRQ is cleared when the device is finished\r
+ transferring data. So this function is called after data transfer\r
+ is finished.\r
\r
- Purpose: \r
- This function is used to poll for the DRQ bit clear in the Alternate \r
- Status Register. DRQ is cleared when the device is finished \r
- transferring data. So this function is called after data transfer\r
- is finished.\r
+ @param[in] *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
+ @param[in] TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ clear.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval EFI_SUCCESS\r
+ DRQ bit clear within the time out.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ clear.\r
+ @retval EFI_TIMEOUT\r
+ DRQ bit not clear within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRQ bit clear within the time out.\r
+ @note\r
+ Read Alternate Status Register will not clear interrupt status.\r
\r
- EFI_TIMEOUT\r
- DRQ bit not clear within the time out. \r
-\r
-\r
- Notes:\r
- Read Alternate Status Register will not clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRQClear2 (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-DRQReady (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name: DRQReady\r
-\r
- \r
- Purpose: \r
- This function is used to poll for the DRQ bit set in the \r
- Status Register.\r
- DRQ is set when the device is ready to transfer data. So this function\r
- is called after the command is sent to the device and before required \r
- data is transferred.\r
-\r
+/**\r
+ This function is used to poll for the DRQ bit set in the\r
+ Status Register.\r
+ DRQ is set when the device is ready to transfer data. So this function\r
+ is called after the command is sent to the device and before required\r
+ data is transferred.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure,used\r
- to record all the information of the IDE device.\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure,used\r
+ to record all the information of the IDE device.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
+ @retval EFI_SUCCESS\r
+ DRQ bit set within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRQ bit set within the time out.\r
+ @retval EFI_TIMEOUT\r
+ DRQ bit not set within the time out.\r
\r
- EFI_TIMEOUT\r
- DRQ bit not set within the time out.\r
- \r
- EFI_ABORTED\r
- DRQ bit not set caused by the command abort.\r
+ @retval EFI_ABORTED\r
+ DRQ bit not set caused by the command abort.\r
\r
- Notes:\r
- Read Status Register will clear interrupt status.\r
+ @note\r
+ Read Status Register will clear interrupt status.\r
\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRQReady (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-DRQReady2 (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name: DRQReady2\r
-\r
+/**\r
+ This function is used to poll for the DRQ bit set in the\r
+ Alternate Status Register. DRQ is set when the device is ready to\r
+ transfer data. So this function is called after the command\r
+ is sent to the device and before required data is transferred.\r
\r
- Purpose: \r
- This function is used to poll for the DRQ bit set in the \r
- Alternate Status Register. DRQ is set when the device is ready to \r
- transfer data. So this function is called after the command \r
- is sent to the device and before required data is transferred.\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval EFI_SUCCESS\r
+ DRQ bit set within the time out.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @retval EFI_TIMEOUT\r
+ DRQ bit not set within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRQ bit set within the time out.\r
+ @retval EFI_ABORTED\r
+ DRQ bit not set caused by the command abort.\r
\r
- EFI_TIMEOUT\r
- DRQ bit not set within the time out. \r
- \r
- EFI_ABORTED\r
- DRQ bit not set caused by the command abort.\r
+ @note\r
+ Read Alternate Status Register will not clear interrupt status.\r
\r
- Notes:\r
- Read Alternate Status Register will not clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRQReady2 (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-WaitForBSYClear (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name:\r
- WaitForBSYClear\r
-\r
+/**\r
+ This function is used to poll for the BSY bit clear in the\r
+ Status Register. BSY is clear when the device is not busy.\r
+ Every command must be sent after device is not busy.\r
\r
- Purpose: \r
- This function is used to poll for the BSY bit clear in the \r
- Status Register. BSY is clear when the device is not busy.\r
- Every command must be sent after device is not busy.\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval EFI_SUCCESS\r
+ BSY bit clear within the time out.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @retval EFI_TIMEOUT\r
+ BSY bit not clear within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- BSY bit clear within the time out.\r
+ @note\r
+ Read Status Register will clear interrupt status.\r
\r
- EFI_TIMEOUT\r
- BSY bit not clear within the time out. \r
-\r
-\r
- Notes:\r
- Read Status Register will clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+WaitForBSYClear (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
//\r
// WaitForBSYClear2\r
//\r
-EFI_STATUS\r
-WaitForBSYClear2 (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN TimeoutInMilliSeconds\r
- )\r
-/*++\r
- Name:\r
- WaitForBSYClear2\r
-\r
-\r
- Purpose: \r
- This function is used to poll for the BSY bit clear in the \r
- Alternate Status Register. BSY is clear when the device is not busy.\r
- Every command must be sent after device is not busy.\r
+/**\r
+ This function is used to poll for the BSY bit clear in the\r
+ Alternate Status Register. BSY is clear when the device is not busy.\r
+ Every command must be sent after device is not busy.\r
\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @retval EFI_SUCCESS\r
+ BSY bit clear within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- BSY bit clear within the time out.\r
+ @retval EFI_TIMEOUT\r
+ BSY bit not clear within the time out.\r
\r
- EFI_TIMEOUT\r
- BSY bit not clear within the time out. \r
+ @note\r
+ Read Alternate Status Register will not clear interrupt status.\r
\r
-\r
- Notes:\r
- Read Alternate Status Register will not clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+WaitForBSYClear2 (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN TimeoutInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
//\r
// DRDYReady\r
//\r
-EFI_STATUS\r
-DRDYReady (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN DelayInMilliSeconds\r
- )\r
-/*++\r
- Name:\r
- DRDYReady\r
+/**\r
+ This function is used to poll for the DRDY bit set in the\r
+ Status Register. DRDY bit is set when the device is ready\r
+ to accept command. Most ATA commands must be sent after\r
+ DRDY set except the ATAPI Packet Command.\r
\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
- Purpose: \r
- This function is used to poll for the DRDY bit set in the \r
- Status Register. DRDY bit is set when the device is ready \r
- to accept command. Most ATA commands must be sent after \r
- DRDY set except the ATAPI Packet Command.\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
+ @retval EFI_SUCCESS\r
+ DRDY bit set within the time out.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval EFI_TIMEOUT\r
+ DRDY bit not set within the time out.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @note\r
+ Read Status Register will clear interrupt status.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRDY bit set within the time out.\r
-\r
- EFI_TIMEOUT\r
- DRDY bit not set within the time out. \r
-\r
-\r
- Notes:\r
- Read Status Register will clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRDYReady (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN DelayInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
//\r
// DRDYReady2\r
//\r
-EFI_STATUS\r
-DRDYReady2 (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN DelayInMilliSeconds\r
- )\r
-/*++\r
- Name:\r
- DRDYReady2\r
-\r
+/**\r
+ This function is used to poll for the DRDY bit set in the\r
+ Alternate Status Register. DRDY bit is set when the device is ready\r
+ to accept command. Most ATA commands must be sent after\r
+ DRDY set except the ATAPI Packet Command.\r
\r
- Purpose: \r
- This function is used to poll for the DRDY bit set in the \r
- Alternate Status Register. DRDY bit is set when the device is ready \r
- to accept command. Most ATA commands must be sent after \r
- DRDY set except the ATAPI Packet Command.\r
+ @param[in] IDE_BLK_IO_DEV IN *IdeDev\r
+ pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+ to record all the information of the IDE device.\r
\r
+ @param[in] UINTN IN TimeoutInMilliSeconds\r
+ used to designate the timeout for the DRQ ready.\r
\r
- Parameters:\r
- IDE_BLK_IO_DEV IN *IdeDev\r
- pointer pointing to IDE_BLK_IO_DEV data structure, used\r
- to record all the information of the IDE device.\r
+ @retval EFI_SUCCESS\r
+ DRDY bit set within the time out.\r
\r
- UINTN IN TimeoutInMilliSeconds\r
- used to designate the timeout for the DRQ ready.\r
+ @retval EFI_TIMEOUT\r
+ DRDY bit not set within the time out.\r
\r
- Returns: \r
- EFI_SUCCESS\r
- DRDY bit set within the time out.\r
+ @note\r
+ Read Alternate Status Register will clear interrupt status.\r
\r
- EFI_TIMEOUT\r
- DRDY bit not set within the time out. \r
-\r
-\r
- Notes:\r
- Read Alternate Status Register will clear interrupt status.\r
---*/\r
+**/\r
+EFI_STATUS\r
+DRDYReady2 (\r
+ IN IDE_BLK_IO_DEV *IdeDev,\r
+ IN UINTN DelayInMilliSeconds\r
+ )\r
// TODO: function comment is missing 'Routine Description:'\r
// TODO: function comment is missing 'Arguments:'\r
// TODO: IdeDev - add argument and description to function comment\r
//\r
// SwapStringChars\r
//\r
+/**\r
+ This function is a helper function used to change the char order in a\r
+ string. It is designed specially for the PrintAtaModuleName() function.\r
+ After the IDE device is detected, the IDE driver gets the device module\r
+ name by sending ATA command called ATA Identify Command or ATAPI\r
+ Identify Command to the specified IDE device. The module name returned\r
+ is a string of ASCII characters: the first character is bit8--bit15\r
+ of the first word, the second character is bit0--bit7 of the first word\r
+ and so on. Thus the string can not be print directly before it is\r
+ preprocessed by this func to change the order of characters in\r
+ each word in the string.\r
+\r
+ @param[in] CHAR8 IN *Destination\r
+ Indicates the destination string.\r
+\r
+ @param[in] CHAR8 IN *Source\r
+ Indicates the source string.\r
+\r
+ @param[in] UINT8 IN Size\r
+ the length of the string\r
+\r
+**/\r
VOID\r
SwapStringChars (\r
IN CHAR8 *Destination,\r
IN CHAR8 *Source,\r
IN UINT32 Size\r
)\r
-/*++\r
- Name:\r
- SwapStringChars\r
-\r
-\r
- Purpose: \r
- This function is a helper function used to change the char order in a \r
- string. It is designed specially for the PrintAtaModuleName() function.\r
- After the IDE device is detected, the IDE driver gets the device module\r
- name by sending ATA command called ATA Identify Command or ATAPI \r
- Identify Command to the specified IDE device. The module name returned \r
- is a string of ASCII characters: the first character is bit8--bit15 \r
- of the first word, the second character is bit0--bit7 of the first word \r
- and so on. Thus the string can not be print directly before it is \r
- preprocessed by this func to change the order of characters in \r
- each word in the string.\r
-\r
-\r
- Parameters:\r
- CHAR8 IN *Destination\r
- Indicates the destination string.\r
-\r
- CHAR8 IN *Source\r
- Indicates the source string.\r
-\r
- UINT8 IN Size\r
- the length of the string\r
-\r
-\r
- Returns: \r
- none\r
-\r
- Notes:\r
-\r
---*/\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: Destination - add argument and description to function comment\r
-// TODO: Source - add argument and description to function comment\r
-// TODO: Size - add argument and description to function comment\r
{\r
UINT32 Index;\r
CHAR8 Temp;\r
//\r
// ReleaseIdeResources\r
//\r
+/**\r
+ Release resources of an IDE device before stopping it.\r
+\r
+ @param[in] *IdeBlkIoDevice Standard IDE device private data structure\r
+\r
+**/\r
VOID\r
ReleaseIdeResources (\r
IN IDE_BLK_IO_DEV *IdeBlkIoDevice\r
)\r
-/*++\r
-Routing Description:\r
-\r
- Release resources of an IDE device before stopping it.\r
-\r
-Arguments:\r
-\r
- IdeBlkIoDevice -- Standard IDE device private data structure\r
-\r
-\r
-Returns:\r
-\r
- NONE\r
- \r
----*/\r
-// TODO: function comment is missing 'Routine Description:'\r
{\r
if (IdeBlkIoDevice == NULL) {\r
return ;\r
//\r
// Release all the resourses occupied by the IDE_BLK_IO_DEV\r
//\r
- \r
+\r
if (IdeBlkIoDevice->SenseData != NULL) {\r
gBS->FreePool (IdeBlkIoDevice->SenseData);\r
IdeBlkIoDevice->SenseData = NULL;\r
//\r
// SetDeviceTransferMode\r
//\r
+/**\r
+ Set the calculated Best transfer mode to a detected device\r
+\r
+ @param[in] *IdeDev Standard IDE device private data structure\r
+ @param[in] *TransferMode The device transfer mode to be set\r
+\r
+ @return Set transfer mode Command execute status\r
+\r
+**/\r
EFI_STATUS\r
SetDeviceTransferMode (\r
IN IDE_BLK_IO_DEV *IdeDev,\r
IN ATA_TRANSFER_MODE *TransferMode\r
)\r
-/*++\r
-Routing Description:\r
-\r
- Set the calculated Best transfer mode to a detected device\r
-\r
-Arguments:\r
-\r
- IdeDev -- Standard IDE device private data structure\r
- TransferMode -- The device transfer mode to be set\r
-\r
-Returns:\r
-\r
- Set transfer mode Command execute status\r
- \r
----*/\r
// TODO: function comment is missing 'Routine Description:'\r
{\r
EFI_STATUS Status;\r
return Status;\r
}\r
\r
+/**\r
+ Send ATA command into device with NON_DATA protocol\r
+\r
+ @param IdeDev Standard IDE device private data structure\r
+ @param AtaCommand The ATA command to be sent\r
+ @param Device The value in Device register\r
+ @param Feature The value in Feature register\r
+ @param SectorCount The value in SectorCount register\r
+ @param LbaLow The value in LBA_LOW register\r
+ @param LbaMiddle The value in LBA_MIDDLE register\r
+ @param LbaHigh The value in LBA_HIGH register\r
+\r
+ @retval EFI_SUCCESS Reading succeed\r
+ @retval EFI_ABORTED Command failed\r
+ @retval EFI_DEVICE_ERROR Device status error\r
+\r
+**/\r
EFI_STATUS\r
AtaNonDataCommandIn (\r
IN IDE_BLK_IO_DEV *IdeDev,\r
IN UINT8 LbaMiddle,\r
IN UINT8 LbaHigh\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Send ATA command into device with NON_DATA protocol\r
-\r
-Arguments:\r
-\r
- IdeDev - Standard IDE device private data structure\r
- AtaCommand - The ATA command to be sent\r
- Device - The value in Device register\r
- Feature - The value in Feature register\r
- SectorCount - The value in SectorCount register \r
- LbaLow - The value in LBA_LOW register\r
- LbaMiddle - The value in LBA_MIDDLE register\r
- LbaHigh - The value in LBA_HIGH register\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Reading succeed\r
- EFI_ABORTED - Command failed\r
- EFI_DEVICE_ERROR - Device status error\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
UINT8 StatusRegister;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Send ATA Ext command into device with NON_DATA protocol\r
+\r
+ @param IdeDev Standard IDE device private data structure\r
+ @param AtaCommand The ATA command to be sent\r
+ @param Device The value in Device register\r
+ @param Feature The value in Feature register\r
+ @param SectorCount The value in SectorCount register\r
+ @param LbaAddress The LBA address in 48-bit mode\r
+\r
+ @retval EFI_SUCCESS Reading succeed\r
+ @retval EFI_ABORTED Command failed\r
+ @retval EFI_DEVICE_ERROR Device status error\r
+\r
+**/\r
EFI_STATUS\r
AtaNonDataCommandInExt (\r
IN IDE_BLK_IO_DEV *IdeDev,\r
IN UINT16 SectorCount,\r
IN EFI_LBA LbaAddress\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Send ATA Ext command into device with NON_DATA protocol\r
-\r
-Arguments:\r
-\r
- IdeDev - Standard IDE device private data structure\r
- AtaCommand - The ATA command to be sent\r
- Device - The value in Device register\r
- Feature - The value in Feature register\r
- SectorCount - The value in SectorCount register \r
- LbaAddress - The LBA address in 48-bit mode\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Reading succeed\r
- EFI_ABORTED - Command failed\r
- EFI_DEVICE_ERROR - Device status error\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
UINT8 StatusRegister;\r
//\r
// SetDriveParameters\r
//\r
+/**\r
+ Set drive parameters for devices not support PACKETS command\r
+\r
+ @param[in] IdeDev Standard IDE device private data structure\r
+ @param[in] DriveParameters The device parameters to be set into the disk\r
+\r
+ @return SetParameters Command execute status\r
+\r
+**/\r
EFI_STATUS\r
SetDriveParameters (\r
IN IDE_BLK_IO_DEV *IdeDev,\r
IN ATA_DRIVE_PARMS *DriveParameters\r
)\r
-/*++\r
-Routine Description: \r
-\r
- Set drive parameters for devices not support PACKETS command\r
-\r
-Arguments:\r
-\r
- IdeDev -- Standard IDE device private data structure\r
- DriveParameters -- The device parameters to be set into the disk\r
-\r
-Returns:\r
-\r
- SetParameters Command execute status\r
- \r
---*/\r
{\r
EFI_STATUS Status;\r
UINT8 DeviceSelect;\r
return Status;\r
}\r
\r
+/**\r
+ TODO: Add function description\r
+\r
+ @param IdeDev TODO: add argument description\r
+\r
+ @retval EFI_SUCCESS TODO: Add description for return value\r
+\r
+**/\r
EFI_STATUS\r
EnableInterrupt (\r
IN IDE_BLK_IO_DEV *IdeDev\r
)\r
-/*++\r
+{\r
+ UINT8 DeviceControl;\r
+\r
+ //\r
+ // Enable interrupt for DMA operation\r
+ //\r
+ DeviceControl = 0;\r
+ IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+/**\r
+ Clear pending IDE interrupt before OS loader/kernel take control of the IDE device.\r
+\r
+ @param[in] Event Pointer to this event\r
+ @param[in] Context Event hanlder private data\r
+\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
-Routine Description:\r
+ //\r
+ // Get our context\r
+ //\r
+ IdeDev = (IDE_BLK_IO_DEV *) Context;\r
\r
- TODO: Add function description\r
+ //\r
+ // Obtain IDE IO port registers' base addresses\r
+ //\r
+ Status = ReassignIdeResources (IdeDev);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
\r
-Arguments:\r
+ //\r
+ // Check whether interrupt is pending\r
+ //\r
\r
- IdeDev - TODO: add argument description\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
-Returns:\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
- EFI_SUCCESS - TODO: Add description for return value\r
+ RegisterValue |= (BMIS_INTERRUPT | BMIS_ERROR);\r
\r
---*/\r
-{\r
- UINT8 DeviceControl;\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
- // Enable interrupt for DMA operation\r
+ // Select the other device on this channel to ensure this device to release the interrupt pin\r
//\r
- DeviceControl = 0;\r
- IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);\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
- return EFI_SUCCESS;\r
}\r