[edk2] [PATCH v4 2/2] MdePkg: UefiScsiLib: do not encode LUN in CDB for other SCSI commands

Subject: [edk2] [PATCH v4 2/2] MdePkg: UefiScsiLib: do not encode LUN in CDB for other SCSI commands

From: Laszlo Ersek <lersek@redhat.com>

To: edk2-devel@lists.sourceforge.net

Date: 2014-11-27 01:08:54

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 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek 
---

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 
 #include 
 #include 
 #include 
 #include 
   
 #include 
   
   
   //
-  // 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