**/\r
\r
\r
-#include <PiDxe.h>\r
+#include <Uefi.h>\r
+#include <Library/DebugLib.h>\r
#include <Library/ScsiLib.h>\r
#include <Library/BaseMemoryLib.h>\r
\r
#include <IndustryStandard/Scsi.h>\r
\r
+//\r
+// bit5..7 are for Logical unit number\r
+// 11100000b (0xe0)\r
+//\r
+#define EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK 0xe0\r
+\r
+//\r
+// Scsi Command Length six or ten\r
+//\r
+#define EFI_SCSI_OP_LENGTH_SIX 0x6\r
+#define EFI_SCSI_OP_LENGTH_TEN 0xa\r
\r
/**\r
Function test the ready status of the SCSI unit.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
\r
@param[in] ScsiIo A pointer to SCSI IO protocol.\r
@param[in] Timeout The length of timeout period.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiTestUnitReadyCommand (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[6];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 6);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = NULL;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_TEST_UNIT_READY;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
- CommandPacket.CdbLength = (UINT8) 6;\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
+ CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX;\r
CommandPacket.SenseDataLength = *SenseDataLength;\r
\r
Status = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL);\r
\r
/**\r
Function to submit SCSI inquiry command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
+ If InquiryDataLength is NULL, then ASSERT().\r
\r
@param[in] ScsiIo SCSI IO Protocol to use\r
@param[in] Timeout The length of timeout period.\r
- @param[out] SenseData A pointer to output sense data.\r
+ @param[in] SenseData A pointer to output sense data.\r
@param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
output, the number of bytes written to the SenseData buffer.\r
@param[out] HostAdapterStatus The status of Host Adapter.\r
@param[out] TargetStatus The status of the target.\r
- @param[in] InquirydataBuffer A pointer to inquiry data buffer.\r
- @param[in,out] InquiryDataLength The length of inquiry data buffer.\r
+ @param[in] InquirydDtaBuffer A pointer to inquiry data buffer.\r
+ @param[in out] InquiryDataLength The length of inquiry data buffer.\r
@param[in] EnableVitalProductData Boolean to enable Vital Product Data.\r
\r
@retval EFI_SUCCESS The status of the unit is tested successfully.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiInquiryCommand (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[6];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 6);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = InquiryDataBuffer;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_INQUIRY;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
if (EnableVitalProductData) {\r
Cdb[1] |= 0x01;\r
}\r
}\r
\r
Cdb[4] = (UINT8) (*InquiryDataLength);\r
- CommandPacket.CdbLength = (UINT8) 6;\r
+ CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_IN;\r
\r
Status = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL);\r
\r
/**\r
Function to submit SCSI mode sense 10 command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
+ If DataLength is NULL, then ASSERT().\r
\r
@param[in] ScsiIo A pointer to SCSI IO protocol.\r
@param[in] Timeout The length of timeout period.\r
- @param[out] SenseData A pointer to output sense data.\r
+ @param[in] SenseData A pointer to output sense data.\r
@param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
output, the number of bytes written to the SenseData buffer.\r
@param[out] HostAdapterStatus The status of Host Adapter.\r
@param[out] TargetStatus The status of the target.\r
@param[in] DataBuffer A pointer to input data buffer.\r
- @param[in,out] DataLength The length of input data buffer.\r
+ @param[in out] DataLength The length of input data buffer.\r
@param[in] DBDField The DBD Field (Optional).\r
@param[in] PageControl Page Control.\r
@param[in] PageCode Page code.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiModeSense10Command (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[10];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 10);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = DataBuffer;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_MODE_SEN10;\r
- Cdb[1] = (UINT8) ((Lun & 0xe0) + ((DBDField << 3) & 0x08));\r
+ //\r
+ // DBDField is in Cdb[1] bit3 of (bit7..0)\r
+ //\r
+ Cdb[1] = (UINT8) ((Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK) + ((DBDField << 3) & 0x08));\r
+ //\r
+ // PageControl is in Cdb[2] bit7..6, PageCode is in Cdb[2] bit5..0\r
+ //\r
Cdb[2] = (UINT8) ((PageControl & 0xc0) | (PageCode & 0x3f));\r
Cdb[7] = (UINT8) (*DataLength >> 8);\r
Cdb[8] = (UINT8) (*DataLength);\r
\r
- CommandPacket.CdbLength = 10;\r
+ CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_IN;\r
CommandPacket.SenseDataLength = *SenseDataLength;\r
\r
\r
/**\r
Function to submit SCSI request sense command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
\r
@param[in] ScsiIo A pointer to SCSI IO protocol.\r
@param[in] Timeout The length of timeout period.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiRequestSenseCommand (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[6];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 6);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = SenseData;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_REQUEST_SENSE;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
Cdb[4] = (UINT8) (*SenseDataLength);\r
\r
- CommandPacket.CdbLength = (UINT8) 6;\r
+ CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_IN;\r
CommandPacket.SenseDataLength = 0;\r
\r
\r
/**\r
Function to submit read capacity command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
+ If DataLength is NULL, then ASSERT().\r
\r
@param[in] ScsiIo A pointer to SCSI IO protocol.\r
@param[in] Timeout The length of timeout period.\r
- @param[out] SenseData A pointer to output sense data.\r
+ @param[in] SenseData A pointer to output sense data.\r
@param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
output, the number of bytes written to the SenseData buffer.\r
@param[out] HostAdapterStatus The status of Host Adapter.\r
@param[out] TargetStatus The status of the target.\r
@param[out] DataBuffer A pointer to a data buffer.\r
- @param[in,out] DataLength The length of data buffer.\r
+ @param[in out] DataLength The length of data buffer.\r
@param[in] PMI Partial medium indicator.\r
\r
@retval EFI_SUCCESS The status of the unit is tested successfully.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiReadCapacityCommand (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[10];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 10);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = DataBuffer;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_READ_CAPACITY;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
if (!PMI) {\r
//\r
// Partial medium indicator,if PMI is FALSE, the Cdb.2 ~ Cdb.5 MUST BE ZERO.\r
Cdb[8] |= 0x01;\r
}\r
\r
- CommandPacket.CdbLength = 10;\r
+ CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_IN;\r
CommandPacket.SenseDataLength = *SenseDataLength;\r
\r
\r
/**\r
Function to submit read 10 command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
+ If DataLength is NULL, then ASSERT().\r
\r
@param[in] ScsiIo A pointer to SCSI IO protocol.\r
@param[in] Timeout The length of timeout period.\r
- @param[out] SenseData A pointer to output sense data.\r
+ @param[in] SenseData A pointer to output sense data.\r
@param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
output, the number of bytes written to the SenseData buffer.\r
@param[out] HostAdapterStatus The status of Host Adapter.\r
@param[out] TargetStatus The status of the target.\r
@param[out] DataBuffer Read 10 command data.\r
- @param[in,out] DataLength The length of data buffer.\r
+ @param[in out] DataLength The length of data buffer.\r
@param[in] StartLba The start address of LBA.\r
@param[in] SectorSize The sector size.\r
\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiRead10Command (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[10];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 10);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.InDataBuffer = DataBuffer;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_READ10;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
Cdb[2] = (UINT8) (StartLba >> 24);\r
Cdb[3] = (UINT8) (StartLba >> 16);\r
Cdb[4] = (UINT8) (StartLba >> 8);\r
Cdb[7] = (UINT8) (SectorSize >> 8);\r
Cdb[8] = (UINT8) (SectorSize & 0xff);\r
\r
- CommandPacket.CdbLength = 10;\r
+ CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_IN;\r
CommandPacket.SenseDataLength = *SenseDataLength;\r
\r
\r
/**\r
Function to submit SCSI write 10 command.\r
+ If SenseDataLength is NULL, then ASSERT().\r
+ If HostAdapterStatus is NULL, then ASSERT().\r
+ If TargetStatus is NULL, then ASSERT().\r
+ If DataLength is NULL, then ASSERT().\r
\r
@param[in] ScsiIo SCSI IO Protocol to use\r
@param[in] Timeout The length of timeout period.\r
- @param[out] SenseData A pointer to output sense data.\r
- @param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
+ @param[in] SenseData A pointer to output sense data.\r
+ @param[in out] SenseDataLength On input, the length in bytes of the SenseData buffer. On\r
output, the number of bytes written to the SenseData buffer.\r
@param[out] HostAdapterStatus The status of Host Adapter.\r
@param[out] TargetStatus The status of the target.\r
@param[out] DataBuffer A pointer to a data buffer.\r
- @param[in,out] DataLength The length of data buffer.\r
+ @param[in out] DataLength The length of data buffer.\r
@param[in] StartLba The start address of LBA.\r
@param[in] SectorSize The sector size.\r
\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
ScsiWrite10Command (\r
IN EFI_SCSI_IO_PROTOCOL *ScsiIo,\r
IN UINT64 Timeout,\r
UINT8 *Target;\r
UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES];\r
EFI_STATUS Status;\r
- UINT8 Cdb[10];\r
+ UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN];\r
\r
ASSERT (SenseDataLength != NULL);\r
ASSERT (HostAdapterStatus != NULL);\r
}\r
\r
ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, 10);\r
+ ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN);\r
\r
CommandPacket.Timeout = Timeout;\r
CommandPacket.OutDataBuffer = DataBuffer;\r
ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun);\r
\r
Cdb[0] = EFI_SCSI_OP_WRITE10;\r
- Cdb[1] = (UINT8) (Lun & 0xe0);\r
+ Cdb[1] = (UINT8) (Lun & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK);\r
Cdb[2] = (UINT8) (StartLba >> 24);\r
Cdb[3] = (UINT8) (StartLba >> 16);\r
Cdb[4] = (UINT8) (StartLba >> 8);\r
Cdb[7] = (UINT8) (SectorSize >> 8);\r
Cdb[8] = (UINT8) SectorSize;\r
\r
- CommandPacket.CdbLength = 10;\r
+ CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN;\r
CommandPacket.DataDirection = EFI_SCSI_DATA_OUT;\r
CommandPacket.SenseDataLength = *SenseDataLength;\r
\r
\r
return Status;\r
}\r
+\r