Hello,

One inline comment below:

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Zurcher, Christopher J
> Sent: Saturday, September 07, 2019 6:12 AM
> To: devel@edk2.groups.io
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: [edk2-devel] [PATCH v6 1/4] MdePkg: Implement SCSI commands
> for Security Protocol In/Out
> 
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1546
> 
> This patch implements the Security Protocol In and Security Protocol Out
> commands in UefiScsiLib to prepare support for the Storage Security
> Command Protocol.
> 
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Jian J Wang <jian.j.w...@intel.com>
> Cc: Liming Gao <liming....@intel.com>
> Signed-off-by: Christopher J Zurcher <christopher.j.zurc...@intel.com>
> ---
>  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
>  MdePkg/Include/Library/UefiScsiLib.h     | 128 +++++++++++-
>  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 217 +++++++++++++++++++-
>  3 files changed, 374 insertions(+), 19 deletions(-)
> 
> diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> b/MdePkg/Include/IndustryStandard/Scsi.h
> index cbe5709fe5..d03886417f 100644
> --- a/MdePkg/Include/IndustryStandard/Scsi.h
> +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Support for SCSI-2 standard
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -163,6 +163,12 @@
>  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
>  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> 
> +//
> +// Additional commands for Secure Transactions
> +//
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> +
>  //
>  // SCSI Data Transfer Direction
>  //
> @@ -172,22 +178,30 @@
>  //
>  // Peripheral Device Type Definitions
>  //
> -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> magnetic disk)
> -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g. some
> optical disks)
> -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g.
> some optical disks)
> -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> device (e.g. jukeboxes)
> -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> device
> -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)
> -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)
> -//
> -// 0Ch - 1Eh are reserved
> -//
> -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
> type
> +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> magnetic disk)
> +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device 
> (e.g.
> magnetic tape)
> +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
> +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
> device (e.g. jukeboxes)
> +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
> device (obsolete)
> +#define EFI_SCSI_TYPE_ASCIT8_1        0x0A  ///< Defined by ASC IT8
> (Graphic arts pre-press devices)
> +#define EFI_SCSI_TYPE_ASCIT8_2        0x0B  ///< Defined by ASC IT8
> (Graphic arts pre-press devices)
> +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> device (e.g., RAID)
> +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access 
> device
> (e.g., magnetic disk)
> +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
> device
> +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
> +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
> +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> Interface
> +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
> device
> +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device
> type
> 
>  //
>  // Page Codes for INQUIRY command
> diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> b/MdePkg/Include/Library/UefiScsiLib.h
> index 10dd81902b..5c94b0aa16 100644
> --- a/MdePkg/Include/Library/UefiScsiLib.h
> +++ b/MdePkg/Include/Library/UefiScsiLib.h
> @@ -5,7 +5,7 @@
>    for hard drive, CD and DVD devices that are the most common SCSI boot
> targets used by UEFI platforms.
>    This library class depends on SCSI I/O Protocol defined in UEFI 
> Specification
> and SCSI-2 industry standard.
> 
> -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -813,6 +813,132 @@ ScsiWrite16Command (
>    );
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command 
> to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If TransferLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo                    SCSI IO Protocol to use.
> +  @param[in]      Timeout                   The length of timeout period.
> +  @param[in, out] SenseData                 A pointer to output sense data.
> +  @param[in, out] SenseDataLength           The length of output sense data.
> +  @param[out]     HostAdapterStatus         The status of Host Adapter.
> +  @param[out]     TargetStatus              The status of the target.
> +  @param[in]      SecurityProtocol          The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific 
> data.
> +  @param[in]      Inc512                    If Inc512 is TRUE, DataLength is 
> expressed
> in 512-byte increments.
> +  @param[in]      DataLength                The size in bytes of the data 
> buffer.
> +  @param[in, out] DataBuffer                A pointer to a data buffer.
> +  @param[out]     TransferLength            A pointer to a buffer to store 
> the size
> in
> +                                            bytes of the data written to the 
> data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number 
> of bytes
> transferred is returned in TransferLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host 
> Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for 
> the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     BOOLEAN               Inc512,
> +  IN     UINTN                 DataLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +     OUT UINTN                 *TransferLength
> +  );
> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command 
> to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo                    SCSI IO Protocol to use.
> +  @param[in]      Timeout                   The length of timeout period.
> +  @param[in, out] SenseData                 A pointer to output sense data.
> +  @param[in, out] SenseDataLength           The length of output sense data.
> +  @param[out]     HostAdapterStatus         The status of Host Adapter.
> +  @param[out]     TargetStatus              The status of the target.
> +  @param[in]      SecurityProtocol          The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific 
> data.
> +  @param[in]      Inc512                    If Inc512 is TRUE, DataLength is 
> expressed
> in 512-byte increments.
> +  @param[in]      DataLength                The size in bytes of the 
> transfer data.
> +  @param[in, out] DataBuffer                A pointer to a data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number 
> of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host 
> Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for 
> the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     BOOLEAN               Inc512,
> +  IN     UINTN                 DataLength,
> +  IN OUT VOID                  *DataBuffer   OPTIONAL
> +  );
> +
> +
>  /**
>    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
>    target.
> diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> index c7491d1436..229fe11ef2 100644
> --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    UEFI SCSI Library implementation
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -23,6 +23,7 @@
>    //
>  #define EFI_SCSI_OP_LENGTH_SIX      0x6
>  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
>  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> 
>  //
> @@ -1280,6 +1281,220 @@ ScsiWrite16Command (
>  }
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command 
> to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If TransferLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo                    SCSI IO Protocol to use.
> +  @param[in]      Timeout                   The length of timeout period.
> +  @param[in, out] SenseData                 A pointer to output sense data.
> +  @param[in, out] SenseDataLength           The length of output sense data.
> +  @param[out]     HostAdapterStatus         The status of Host Adapter.
> +  @param[out]     TargetStatus              The status of the target.
> +  @param[in]      SecurityProtocol          The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific 
> data.
> +  @param[in]      Inc512                    If Inc512 is TRUE, DataLength is 
> expressed
> in 512-byte increments.
> +  @param[in]      DataLength                The size in bytes of the data 
> buffer.
> +  @param[in, out] DataBuffer                A pointer to a data buffer.
> +  @param[out]     TransferLength            A pointer to a buffer to store 
> the size
> in
> +                                            bytes of the data written to the 
> data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number 
> of bytes
> transferred is returned in TransferLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host 
> Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for 
> the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     BOOLEAN               Inc512,
> +  IN     UINTN                 DataLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +     OUT UINTN                 *TransferLength
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (ScsiIo != NULL);
> +  ASSERT (TransferLength != NULL);
> +  ASSERT (DataLength <= MAX_UINT32);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.InDataBuffer      = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.InTransferLength  = (UINT32) DataLength;


I think if 'Inc512' is TRUE, the above statement may not be proper.

My thought is that the 'Inc512' parameter only affects whether the Cdb[4] bit 7
will be set or not:

@param[in] Inc512  If TRUE, 512 increment (INC_512) bit will be set for the
                   SECURITY PROTOCOL IN command.

and for Cdb[6]:

  if (Inc512) {
    if (DataLength % 512 != 0) {
      return EFI_INVALID_PARAMETER;
    }
    Cdb[4]                      = BIT7;
    WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 ((UINT32) DataLength / 
512));
  } else {
    WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 ((UINT32) DataLength));
  }

Similar comment for the function ScsiSecurityProtocolOutCommand() as well.

Other than this, the patch looks good to me.

Best Regards,
Hao Wu


> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol In Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 ((UINT32)
> DataLength));
> +
> +  if (Inc512) {
> +    Cdb[4]                      = BIT7;
> +  }
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +  *TransferLength               = (UINTN) CommandPacket.InTransferLength;
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command 
> to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo                    SCSI IO Protocol to use.
> +  @param[in]      Timeout                   The length of timeout period.
> +  @param[in, out] SenseData                 A pointer to output sense data.
> +  @param[in, out] SenseDataLength           The length of output sense data.
> +  @param[out]     HostAdapterStatus         The status of Host Adapter.
> +  @param[out]     TargetStatus              The status of the target.
> +  @param[in]      SecurityProtocol          The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific 
> data.
> +  @param[in]      Inc512                    If Inc512 is TRUE, DataLength is 
> expressed
> in 512-byte increments.
> +  @param[in]      DataLength                The size in bytes of the 
> transfer data.
> +  @param[in, out] DataBuffer                A pointer to a data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number 
> of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host 
> Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for 
> the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     BOOLEAN               Inc512,
> +  IN     UINTN                 DataLength,
> +  IN OUT VOID                  *DataBuffer   OPTIONAL
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (ScsiIo != NULL);
> +  ASSERT (DataLength <= MAX_UINT32);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.OutDataBuffer     = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.OutTransferLength = (UINT32) DataLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol Out Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 ((UINT32)
> DataLength));
> +
> +  if (Inc512) {
> +    Cdb[4]                      = BIT7;
> +  }
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +
> +  return Status;
> +}
> +
> +
>  /**
>    Internal helper notify function in which update the result of the
>    non-blocking SCSI Read/Write commands and signal caller event.
> --
> 2.16.2.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#47025): https://edk2.groups.io/g/devel/message/47025
Mute This Topic: https://groups.io/mt/33202221/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to