-/**\r
- This function is used to parse sense data. Only the first\r
- sense data is honoured.\r
-\r
- @param[in] IdeDev Indicates the calling context.\r
- @param[in] SenseCount Count of sense data.\r
- @param[out] Result The parsed result.\r
-\r
- @retval EFI_SUCCESS Successfully parsed.\r
- @retval EFI_INVALID_PARAMETER Count of sense data is zero.\r
-\r
-**/\r
-EFI_STATUS\r
-ParseSenseData (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- IN UINTN SenseCount,\r
- OUT SENSE_RESULT *Result\r
- )\r
-{\r
- ATAPI_REQUEST_SENSE_DATA *SenseData;\r
-\r
- if (SenseCount == 0) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Only use the first sense data\r
- //\r
- SenseData = IdeDev->SenseData;\r
- *Result = SenseOtherSense;\r
-\r
- switch (SenseData->sense_key) {\r
- case ATA_SK_NO_SENSE:\r
- *Result = SenseNoSenseKey;\r
- break;\r
- case ATA_SK_NOT_READY:\r
- switch (SenseData->addnl_sense_code) {\r
- case ATA_ASC_NO_MEDIA:\r
- *Result = SenseNoMedia;\r
- break;\r
- case ATA_ASC_MEDIA_UPSIDE_DOWN:\r
- *Result = SenseMediaError;\r
- break;\r
- case ATA_ASC_NOT_READY:\r
- if (SenseData->addnl_sense_code_qualifier == ATA_ASCQ_IN_PROGRESS) {\r
- *Result = SenseDeviceNotReadyNeedRetry;\r
- } else {\r
- *Result = SenseDeviceNotReadyNoRetry;\r
- }\r
- break;\r
- }\r
- break;\r
- case ATA_SK_UNIT_ATTENTION:\r
- if (SenseData->addnl_sense_code == ATA_ASC_MEDIA_CHANGE) {\r
- *Result = SenseMediaChange;\r
- }\r
- break;\r
- case ATA_SK_MEDIUM_ERROR:\r
- switch (SenseData->addnl_sense_code) {\r
- case ATA_ASC_MEDIA_ERR1:\r
- case ATA_ASC_MEDIA_ERR2:\r
- case ATA_ASC_MEDIA_ERR3:\r
- case ATA_ASC_MEDIA_ERR4:\r
- *Result = SenseMediaError;\r
- break;\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function reads the pending data in the device.\r
-\r
- @param[in] IdeDev Indicates the calling context.\r
-\r
- @retval EFI_SUCCESS Successfully read.\r
- @retval EFI_NOT_READY The BSY is set avoiding reading.\r
-\r
-**/\r
-EFI_STATUS\r
-AtapiReadPendingData (\r
- IN IDE_BLK_IO_DEV *IdeDev\r
- )\r
-{\r
- UINT8 AltRegister;\r
- UINT16 TempWordBuffer;\r
-\r
- AltRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Alt.AltStatus);\r
- if ((AltRegister & ATA_STSREG_BSY) == ATA_STSREG_BSY) {\r
- return EFI_NOT_READY;\r
- }\r
- if ((AltRegister & (ATA_STSREG_BSY | ATA_STSREG_DRQ)) == ATA_STSREG_DRQ) {\r
- TempWordBuffer = IDEReadPortB (IdeDev->PciIo,IdeDev->IoPort->Alt.AltStatus);\r
- while ((TempWordBuffer & (ATA_STSREG_BSY | ATA_STSREG_DRQ)) == ATA_STSREG_DRQ) {\r
- IDEReadPortWMultiple (\r
- IdeDev->PciIo,\r
- IdeDev->IoPort->Data, \r
- 1, \r
- &TempWordBuffer\r
- );\r
- TempWordBuffer = IDEReadPortB (IdeDev->PciIo,IdeDev->IoPort->Alt.AltStatus);\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- TODO: Add function description\r
-\r
- @param IdeDev TODO: add argument description\r
- @param WriteProtected TODO: add argument description\r
-\r
- @retval EFI_DEVICE_ERROR TODO: Add description for return value\r
- @retval EFI_DEVICE_ERROR TODO: Add description for return value\r
- @retval EFI_SUCCESS TODO: Add description for return value\r
-\r
-**/\r
-EFI_STATUS\r
-IsLS120orZipWriteProtected (\r
- IN IDE_BLK_IO_DEV *IdeDev,\r
- OUT BOOLEAN *WriteProtected\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- *WriteProtected = FALSE;\r
-\r
- Status = LS120EnableMediaStatus (IdeDev, TRUE);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- //\r
- // the Get Media Status Command is only valid\r
- // if a Set Features/Enable Media Status Command has been priviously issued.\r
- //\r
- if (LS120GetMediaStatus (IdeDev) == EFI_WRITE_PROTECTED) {\r
-\r
- *WriteProtected = TRUE;\r
- } else {\r
-\r
- *WriteProtected = FALSE;\r
- }\r