-/**\r
- This function is used to poll for the DRDY bit set in the Status Register. DRDY\r
- bit is set when the device is ready to accept command. Most ATA commands must be\r
- sent after DRDY set except the ATAPI Packet Command.\r
-\r
- @param PciIo A pointer to EFI_PCI_IO_PROTOCOL data structure.\r
- @param IdeRegisters A pointer to EFI_IDE_REGISTERS data structure.\r
- @param Timeout The time to complete the command, uses 100ns as a unit.\r
-\r
- @retval EFI_SUCCESS DRDY bit set within the time out.\r
- @retval EFI_TIMEOUT DRDY bit not set within the time out.\r
-\r
- @note Read Status Register will clear interrupt status.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DRDYReady (\r
- IN EFI_PCI_IO_PROTOCOL *PciIo,\r
- IN EFI_IDE_REGISTERS *IdeRegisters,\r
- IN UINT64 Timeout\r
- )\r
-{\r
- UINT64 Delay;\r
- UINT8 StatusRegister;\r
- UINT8 ErrorRegister;\r
- BOOLEAN InfiniteWait;\r
-\r
- ASSERT (PciIo != NULL);\r
- ASSERT (IdeRegisters != NULL);\r
-\r
- if (Timeout == 0) {\r
- InfiniteWait = TRUE;\r
- } else {\r
- InfiniteWait = FALSE;\r
- }\r
-\r
- Delay = DivU64x32(Timeout, 1000) + 1;\r
- do {\r
- StatusRegister = IdeReadPortB (PciIo, IdeRegisters->CmdOrStatus);\r
- //\r
- // Wait for BSY == 0, then judge if DRDY is set or ERR is set\r
- //\r
- if ((StatusRegister & ATA_STSREG_BSY) == 0) {\r
- if ((StatusRegister & ATA_STSREG_ERR) == ATA_STSREG_ERR) {\r
- ErrorRegister = IdeReadPortB (PciIo, IdeRegisters->ErrOrFeature);\r
-\r
- if ((ErrorRegister & ATA_ERRREG_ABRT) == ATA_ERRREG_ABRT) {\r
- return EFI_ABORTED;\r
- }\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- if ((StatusRegister & ATA_STSREG_DRDY) == ATA_STSREG_DRDY) {\r
- return EFI_SUCCESS;\r
- } else {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- }\r
-\r
- //\r
- // Stall for 100 microseconds.\r
- //\r
- MicroSecondDelay (100);\r
-\r
- Delay--;\r
- } while (InfiniteWait || (Delay > 0));\r
-\r
- return EFI_TIMEOUT;\r
-}\r
-\r
-/**\r
- This function is used to poll for the DRDY bit set in the Alternate Status Register.\r
- DRDY bit is set when the device is ready to accept command. Most ATA commands must\r
- be sent after DRDY set except the ATAPI Packet Command.\r
-\r
- @param PciIo A pointer to EFI_PCI_IO_PROTOCOL data structure.\r
- @param IdeRegisters A pointer to EFI_IDE_REGISTERS data structure.\r
- @param Timeout The time to complete the command, uses 100ns as a unit.\r
-\r
- @retval EFI_SUCCESS DRDY bit set within the time out.\r
- @retval EFI_TIMEOUT DRDY bit not set within the time out.\r
-\r
- @note Read Alternate Status Register will clear interrupt status.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DRDYReady2 (\r
- IN EFI_PCI_IO_PROTOCOL *PciIo,\r
- IN EFI_IDE_REGISTERS *IdeRegisters,\r
- IN UINT64 Timeout\r
- )\r
-{\r
- UINT64 Delay;\r
- UINT8 AltRegister;\r
- UINT8 ErrorRegister;\r
- BOOLEAN InfiniteWait;\r
-\r
- ASSERT (PciIo != NULL);\r
- ASSERT (IdeRegisters != NULL);\r
-\r
- if (Timeout == 0) {\r
- InfiniteWait = TRUE;\r
- } else {\r
- InfiniteWait = FALSE;\r
- }\r
-\r
- Delay = DivU64x32(Timeout, 1000) + 1;\r
- do {\r
- AltRegister = IdeReadPortB (PciIo, IdeRegisters->AltOrDev);\r
- //\r
- // Wait for BSY == 0, then judge if DRDY is set or ERR is set\r
- //\r
- if ((AltRegister & ATA_STSREG_BSY) == 0) {\r
- if ((AltRegister & ATA_STSREG_ERR) == ATA_STSREG_ERR) {\r
- ErrorRegister = IdeReadPortB (PciIo, IdeRegisters->ErrOrFeature);\r
-\r
- if ((ErrorRegister & ATA_ERRREG_ABRT) == ATA_ERRREG_ABRT) {\r
- return EFI_ABORTED;\r
- }\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- if ((AltRegister & ATA_STSREG_DRDY) == ATA_STSREG_DRDY) {\r
- return EFI_SUCCESS;\r
- } else {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- }\r
-\r
- //\r
- // Stall for 100 microseconds.\r
- //\r
- MicroSecondDelay (100);\r