Fine to me. let's wait MdePkg maintainer's feedback. -----Original Message----- From: Laszlo Ersek [mailto:ler...@redhat.com] Sent: Thursday, November 27, 2014 00:09 To: edk2-devel@lists.sourceforge.net Subject: [edk2] [PATCH v4 2/2] MdePkg: UefiScsiLib: do not encode LUN in CDB for other SCSI commands
The TEST UNIT READY, INQUIRY, MODE SENSE, REQUEST SENSE and READ CAPACITY commands define bits [7:5] of Cdb[1] as Reserved (potentially as part of a larger Reserved bitfield): Command Reserved bitfield in Cdb[1] SCSI spec reference ------------------ --------------------------- ------------------- TEST UNIT READY all bits SPC-4 6.37 INQUIRY bits [7:2] SPC-4 6.4.1 MODE SENSE (6) bits [7:4] SPC-4 6.11.1 MODE SENSE (10) bits [7:5] SPC-4 6.12 REQUEST SENSE bits [7:1] SPC-4 6.29 READ CAPACITY (10) bits [7:1] SBC-3 5.16 READ CAPACITY (16) bits [7:5] SBC-3 5.17 Update the UefiScsiLib functions accordingly. (In ScsiReadCapacity16Command() the LUN has not been encoded, so there we just remove the useless ScsiIo->GetDeviceLocation() call, with its auxiliary local variables.) The EFI_SCSI_TARGET_MAX_BYTES and EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK macros become unused with this patch, remove them too. Suggested-by: Feng Tian <feng.t...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- Notes: v4: - new in v4 [Feng] MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 53 +------------------------------- 1 file changed, 1 insertion(+), 52 deletions(-) diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c index 1dbe874..8a073db 100644 --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c @@ -15,33 +15,22 @@ #include <Uefi.h> #include <Library/BaseLib.h> #include <Library/DebugLib.h> #include <Library/UefiScsiLib.h> #include <Library/BaseMemoryLib.h> #include <IndustryStandard/Scsi.h> // - // Max bytes needed to represent ID of a SCSI device - // -#define EFI_SCSI_TARGET_MAX_BYTES (0x10) - - // - // bit5..7 are for Logical unit number - // 11100000b (0xe0) - // -#define EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK 0xe0 - - // // Scsi Command Length // #define EFI_SCSI_OP_LENGTH_SIX 0x6 #define EFI_SCSI_OP_LENGTH_TEN 0xa #define EFI_SCSI_OP_LENGTH_SIXTEEN 0x10 /** Execute Test Unit Ready SCSI command on a specific SCSI target. @@ -109,51 +98,44 @@ EFI_STATUS EFIAPI ScsiTestUnitReadyCommand ( IN EFI_SCSI_IO_PROTOCOL *ScsiIo, IN UINT64 Timeout, IN OUT VOID *SenseData, OPTIONAL IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = NULL; CommandPacket.InTransferLength= 0; CommandPacket.OutDataBuffer = NULL; CommandPacket.OutTransferLength= 0; CommandPacket.SenseData = SenseData; CommandPacket.Cdb = Cdb; // // Fill Cdb for Test Unit Ready Command // - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_TEST_UNIT_READY; - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX; CommandPacket.SenseDataLength = *SenseDataLength; Status = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL); *HostAdapterStatus = CommandPacket.HostAdapterStatus; *TargetStatus = CommandPacket.TargetStatus; *SenseDataLength = CommandPacket.SenseDataLength; return Status; } @@ -247,49 +229,42 @@ ScsiInquiryCommandEx ( IN OUT VOID *SenseData, OPTIONAL IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus, IN OUT VOID *InquiryDataBuffer, OPTIONAL IN OUT UINT32 *InquiryDataLength, IN BOOLEAN EnableVitalProductData, IN UINT8 PageCode ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (InquiryDataLength != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = InquiryDataBuffer; CommandPacket.InTransferLength= *InquiryDataLength; CommandPacket.SenseData = SenseData; CommandPacket.SenseDataLength = *SenseDataLength; CommandPacket.Cdb = Cdb; - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_INQUIRY; - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); if (EnableVitalProductData) { Cdb[1] |= 0x01; Cdb[2] = PageCode; } if (*InquiryDataLength > 0xff) { *InquiryDataLength = 0xff; } Cdb[4] = (UINT8) (*InquiryDataLength); CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX; @@ -502,53 +477,47 @@ ScsiModeSense10Command ( IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus, IN OUT VOID *DataBuffer, OPTIONAL IN OUT UINT32 *DataLength, IN UINT8 DBDField, OPTIONAL IN UINT8 PageControl, IN UINT8 PageCode ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (DataLength != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = DataBuffer; CommandPacket.SenseData = SenseData; CommandPacket.InTransferLength= *DataLength; CommandPacket.Cdb = Cdb; // // Fill Cdb for Mode Sense (10) Command // - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_MODE_SEN10; // // DBDField is in Cdb[1] bit3 of (bit7..0) // - Cdb[1] = (UINT8) ((LShiftU64 (Lun, 5) & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK) + ((DBDField << 3) & 0x08)); + Cdb[1] = (UINT8) ((DBDField << 3) & 0x08); // // PageControl is in Cdb[2] bit7..6, PageCode is in Cdb[2] bit5..0 // Cdb[2] = (UINT8) (((PageControl << 6) & 0xc0) | (PageCode & 0x3f)); Cdb[7] = (UINT8) (*DataLength >> 8); Cdb[8] = (UINT8) (*DataLength); CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN; CommandPacket.DataDirection = EFI_SCSI_DATA_IN; CommandPacket.SenseDataLength = *SenseDataLength; @@ -594,49 +563,42 @@ EFI_STATUS EFIAPI ScsiRequestSenseCommand ( IN EFI_SCSI_IO_PROTOCOL *ScsiIo, IN UINT64 Timeout, IN OUT VOID *SenseData, OPTIONAL IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[EFI_SCSI_OP_LENGTH_SIX]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_SIX); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = SenseData; CommandPacket.SenseData = NULL; CommandPacket.InTransferLength= *SenseDataLength; CommandPacket.Cdb = Cdb; // // Fill Cdb for Request Sense Command // - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_REQUEST_SENSE; - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); Cdb[4] = (UINT8) (*SenseDataLength); CommandPacket.CdbLength = (UINT8) EFI_SCSI_OP_LENGTH_SIX; CommandPacket.DataDirection = EFI_SCSI_DATA_IN; CommandPacket.SenseDataLength = 0; Status = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL); *HostAdapterStatus = CommandPacket.HostAdapterStatus; *TargetStatus = CommandPacket.TargetStatus; *SenseDataLength = (UINT8) CommandPacket.InTransferLength; @@ -687,50 +649,43 @@ ScsiReadCapacityCommand ( IN UINT64 Timeout, IN OUT VOID *SenseData, OPTIONAL IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus, IN OUT VOID *DataBuffer, OPTIONAL IN OUT UINT32 *DataLength, IN BOOLEAN Pmi ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[EFI_SCSI_OP_LENGTH_TEN]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (DataLength != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = DataBuffer; CommandPacket.SenseData = SenseData; CommandPacket.InTransferLength= *DataLength; CommandPacket.Cdb = Cdb; // // Fill Cdb for Read Capacity Command // - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_READ_CAPACITY; - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); if (!Pmi) { // // Partial medium indicator,if Pmi is FALSE, the Cdb.2 ~ Cdb.5 MUST BE ZERO. // ZeroMem ((Cdb + 2), 4); } else { Cdb[8] |= 0x01; } CommandPacket.CdbLength = EFI_SCSI_OP_LENGTH_TEN; CommandPacket.DataDirection = EFI_SCSI_DATA_IN; @@ -789,48 +744,42 @@ ScsiReadCapacity16Command ( IN UINT64 Timeout, IN OUT VOID *SenseData, OPTIONAL IN OUT UINT8 *SenseDataLength, OUT UINT8 *HostAdapterStatus, OUT UINT8 *TargetStatus, IN OUT VOID *DataBuffer, OPTIONAL IN OUT UINT32 *DataLength, IN BOOLEAN Pmi ) { EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; - UINT64 Lun; - UINT8 *Target; - UINT8 TargetArray[EFI_SCSI_TARGET_MAX_BYTES]; EFI_STATUS Status; UINT8 Cdb[16]; ASSERT (SenseDataLength != NULL); ASSERT (HostAdapterStatus != NULL); ASSERT (TargetStatus != NULL); ASSERT (DataLength != NULL); ASSERT (ScsiIo != NULL); ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, 16); CommandPacket.Timeout = Timeout; CommandPacket.InDataBuffer = DataBuffer; CommandPacket.SenseData = SenseData; CommandPacket.InTransferLength= *DataLength; CommandPacket.Cdb = Cdb; // // Fill Cdb for Read Capacity Command // - Target = &TargetArray[0]; - ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); - Cdb[0] = EFI_SCSI_OP_READ_CAPACITY16; Cdb[1] = 0x10; if (!Pmi) { // // Partial medium indicator,if Pmi is FALSE, the Cdb.2 ~ Cdb.9 MUST BE ZERO. // ZeroMem ((Cdb + 2), 8); } else { Cdb[14] |= 0x01; } -- 1.8.3.1 ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel