From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: hao.a.wu@intel.com) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by groups.io with SMTP; Mon, 17 Jun 2019 19:12:19 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Jun 2019 19:12:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,387,1557212400"; d="scan'208";a="185947269" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by fmsmga002.fm.intel.com with ESMTP; 17 Jun 2019 19:12:18 -0700 Received: from fmsmsx115.amr.corp.intel.com (10.18.116.19) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Jun 2019 19:12:18 -0700 Received: from shsmsx154.ccr.corp.intel.com (10.239.6.54) by fmsmsx115.amr.corp.intel.com (10.18.116.19) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Jun 2019 19:12:17 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.185]) by SHSMSX154.ccr.corp.intel.com ([169.254.7.156]) with mapi id 14.03.0439.000; Tue, 18 Jun 2019 10:12:15 +0800 From: "Wu, Hao A" To: "devel@edk2.groups.io" , "Zurcher, Christopher J" , "Gao, Liming" CC: "Yao, Jiewen" , "Wang, Jian J" Subject: Re: [edk2-devel] [PATCH v4 1/2] MdePkg: Implement SCSI commands for Security Protocol In/Out Thread-Topic: [edk2-devel] [PATCH v4 1/2] MdePkg: Implement SCSI commands for Security Protocol In/Out Thread-Index: AQHVIYxrscAGnxVO8kidxiJbCzP/eaaZBPoAgACSw4CABcJkQA== Date: Tue, 18 Jun 2019 02:12:15 +0000 Message-ID: References: <20190613020454.19324-1-christopher.j.zurcher@intel.com> <20190613020454.19324-2-christopher.j.zurcher@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E48099C@SHSMSX104.ccr.corp.intel.com> <8EE4873E19344F4DA986A2AC15D512AE4613B8A2@CRSMSX104.amr.corp.intel.com> In-Reply-To: <8EE4873E19344F4DA986A2AC15D512AE4613B8A2@CRSMSX104.amr.corp.intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: hao.a.wu@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Zurcher, Christopher J > Sent: Friday, June 14, 2019 5:39 AM > To: Gao, Liming; devel@edk2.groups.io > Cc: Yao, Jiewen; Wang, Jian J > Subject: Re: [edk2-devel] [PATCH v4 1/2] MdePkg: Implement SCSI > commands for Security Protocol In/Out >=20 > > Why remove ASCIT8_1 & ASCIT8_2? Can we keep them for compatibility? >=20 > If that's preferred, I can add them back in. They were only removed as t= hey > are marked obsolete in SPC-5. I prefer to keep them for compatibility consideration as well. You can append the comments to mark them as deprecated in spc5 spec. Also, I suggest to add a parameter called 'Inc512' for both new APIs: ScsiSecurityProtocolInCommand ScsiSecurityProtocolOutCommand Though UFS spec requires the INC_512 field of a CDB to be set to 0, but for other devices, setting this field to 1 may be a valid configuration. Some inline comments below: >=20 > -- > Christopher Zurcher >=20 > -----Original Message----- > From: Gao, Liming > Sent: Thursday, June 13, 2019 05:54 > To: Zurcher, Christopher J ; > devel@edk2.groups.io > Cc: Yao, Jiewen ; Wang, Jian J > > Subject: RE: [PATCH v4 1/2] MdePkg: Implement SCSI commands for Security > Protocol In/Out >=20 >=20 > > -----Original Message----- > > From: Zurcher, Christopher J > > Sent: Thursday, June 13, 2019 10:05 AM > > To: devel@edk2.groups.io > > Cc: Yao, Jiewen ; Wang, Jian J > ; Gao, Liming > > Subject: [PATCH v4 1/2] MdePkg: Implement SCSI commands for Security > Protocol In/Out > > > > This patch implements the Security Protocol In and Security Protocol O= ut > > commands in UefiScsiLib to prepare support for the Storage Security > > Command Protocol. > > > > Cc: Jiewen Yao > > Cc: Jian J Wang > > Cc: Liming Gao > > Signed-off-by: Christopher J Zurcher > > --- > > MdePkg/Include/IndustryStandard/Scsi.h | 48 +++-- > > MdePkg/Include/Library/UefiScsiLib.h | 126 +++++++++++- > > MdePkg/Include/Protocol/ScsiIo.h | 9 +- > > MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++- > > 4 files changed, 366 insertions(+), 22 deletions(-) > > > > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h > b/MdePkg/Include/IndustryStandard/Scsi.h > > index cbe5709fe5..10d7b49ba7 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 devi= ce (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) >=20 > Why remove ASCIT8_1 & ASCIT8_2? Can we keep them for compatibility? >=20 > > -// > > -// 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 de= vice > (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 (obso= lete) > > +#define EFI_SCSI_TYPE_OPTICAL 0x07 ///< Optical memory devic= e > (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_A 0x0A ///< Obsolete > > +#define EFI_SCSI_TYPE_B 0x0B ///< Obsolete > > +#define EFI_SCSI_TYPE_RAID 0x0C ///< Storage array contro= ller > device (e.g., RAID) > > +#define EFI_SCSI_TYPE_SES 0x0D ///< Enclosure services d= evice > > +#define EFI_SCSI_TYPE_RBC 0x0E ///< Simplified direct-ac= cess > 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 u= nit > > +#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..a0d99e703a 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 bo= ot > 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. > > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > **/ > > @@ -813,6 +813,130 @@ 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 c= ommand > to complete. > > + If Timeout is greater than zero, then the command is executed and w= ill > timeout after > > + Timeout 100 ns units. The StartLba and SectorSize parameters are u= sed > to construct There is no 'StartLba' & 'SectorSize' parameters for APIs: ScsiSecurityProtocolInCommand ScsiSecurityProtocolOutCommand Could you help to update the comments to address this? > > + the CDB for this SCSI command. > > + 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 DataLength 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 mu= st > 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 dat= a. > > + @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 Spe= cific > data. > > + @param[in] TransferLength The size in bytes of the data = allocation. > > + @param[in, out] DataBuffer A pointer to a data buffer. > > + @param[in, out] DataLength The length of data buffer. Referring to the implementation of the library (changes made in MdePkg/Library/UefiScsiLib/UefiScsiLib.c): 'TransferLength' (input) specifies the length of content in 'DataBuffer'; 'DataLength' (input & output) reflects the actual number of bytes transferred. How about swapping their names and changing the description comments to: @param[in] DataLength The size in bytes of the data buffe= r. ... @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 successful= ly. > > + @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 q= ueued. > > + @retval EFI_DEVICE_ERROR A device error occurred while > attempting to send SCSI Request Packet. > > + @retval EFI_UNSUPPORTED The command described by the S= CSI > Request Packet is not supported by > > + the SCSI initiator(i.e., SCSI = Host Controller) > > + @retval EFI_TIMEOUT A timeout occurred while waiti= ng for the > SCSI Request Packet to execute. > > + @retval EFI_INVALID_PARAMETER The contents of the SCSI Reque= st > 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 UINT32 TransferLength, > > + IN OUT VOID *DataBuffer, OPTIONAL > > + IN OUT UINT32 *DataLength > > + ); Suggest the below parameter type changes to match with the services definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the name swap mentioned above): IN UINT32 TransferLength, to IN UINTN DataLength, IN OUT UINT32 *DataLength to OUT UINTN *TransferLength > > + > > + > > +/** > > + Execute Security Protocol Out SCSI command on a specific SCSI targe= t. > > + > > + 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 c= ommand > to complete. > > + If Timeout is greater than zero, then the command is executed and w= ill > timeout after > > + Timeout 100 ns units. The StartLba and SectorSize parameters are u= sed > to construct > > + the CDB for this SCSI command. > > + 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 DataLength 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 mu= st > 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 dat= a. > > + @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 Spe= cific > data. > > + @param[in] TransferLength The size in bytes of the trans= fer data. Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit more clear for users to know 'DataLength' reflects the size of 'DataBuffer= '. > > + @param[in, out] DataBuffer A pointer to a data buffer. > > + > > + @retval EFI_SUCCESS Command is executed successful= ly. > > + @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 q= ueued. > > + @retval EFI_DEVICE_ERROR A device error occurred while > attempting to send SCSI Request Packet. > > + @retval EFI_UNSUPPORTED The command described by the S= CSI > Request Packet is not supported by > > + the SCSI initiator(i.e., SCSI = Host Controller) > > + @retval EFI_TIMEOUT A timeout occurred while waiti= ng for the > SCSI Request Packet to execute. > > + @retval EFI_INVALID_PARAMETER The contents of the SCSI Reque= st > 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 UINT32 TransferLength, Suggest the below parameter type changes to match with the services definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the name change mentioned above): IN UINT32 TransferLength to IN UINTN DataLength Best Regards, Hao Wu > > + IN OUT VOID *DataBuffer OPTIONAL > > + ); > > + > > + > > /** > > Execute blocking/non-blocking Read(10) SCSI command on a specific S= CSI > > target. > > diff --git a/MdePkg/Include/Protocol/ScsiIo.h > b/MdePkg/Include/Protocol/ScsiIo.h > > index 05e46bda9c..27c31fe7f9 100644 > > --- a/MdePkg/Include/Protocol/ScsiIo.h > > +++ b/MdePkg/Include/Protocol/ScsiIo.h > > @@ -4,7 +4,7 @@ > > services environment to access SCSI devices. In particular, functio= ns for > > managing devices on SCSI buses are defined here. > > > > - 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 > > > > **/ > > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL > EFI_SCSI_IO_PROTOCOL; > > #define MFI_SCSI_IO_TYPE_OCRW 0x0F = ///< Optical > card reader/writer device > > #define MFI_SCSI_IO_TYPE_BRIDGE 0x10 = ///< Bridge > Controller Commands > > #define MFI_SCSI_IO_TYPE_OSD 0x11 = ///< Object- > based Storage Device > > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW 0x12 = ///< > Reserved (low) > > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH 0x1E = ///< > Reserved (high) > > +#define MFI_SCSI_IO_TYPE_AUTOMATION 0x12 = ///< > Automation/Drive Interface > > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER 0x13 = ///< > Security manager device > > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW 0x14 = ///< > Reserved (low) > > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH 0x1D = ///< > Reserved (high) > > +#define EFI_SCSI_IO_TYPE_WLUN 0x1E = ///< Well > known logical unit > > #define EFI_SCSI_IO_TYPE_UNKNOWN 0x1F = ///< > Unknown no device type > > > > // > > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > > index c7491d1436..7584d717ad 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,208 @@ 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 c= ommand > to complete. > > + If Timeout is greater than zero, then the command is executed and w= ill > timeout after > > + Timeout 100 ns units. The StartLba and SectorSize parameters are u= sed > to construct > > + the CDB for this SCSI command. > > + 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 DataLength 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 mu= st > 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 dat= a. > > + @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 Spe= cific > data. > > + @param[in] TransferLength The size in bytes of the data = allocation. > > + @param[in, out] DataBuffer A pointer to a data buffer. > > + @param[in, out] DataLength The length of data buffer. > > + > > + @retval EFI_SUCCESS Command is executed successful= ly. > > + @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 q= ueued. > > + @retval EFI_DEVICE_ERROR A device error occurred while > attempting to send SCSI Request Packet. > > + @retval EFI_UNSUPPORTED The command described by the S= CSI > Request Packet is not supported by > > + the SCSI initiator(i.e., SCSI = Host Controller) > > + @retval EFI_TIMEOUT A timeout occurred while waiti= ng for the > SCSI Request Packet to execute. > > + @retval EFI_INVALID_PARAMETER The contents of the SCSI Reque= st > 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 UINT32 TransferLength, > > + IN OUT VOID *DataBuffer, OPTIONAL > > + IN OUT UINT32 *DataLength > > + ) > > +{ > > + EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; > > + EFI_STATUS Status; > > + UINT8 Cdb[EFI_SCSI_OP_LENGTH_TWELVE]; > > + > > + ASSERT (SenseDataLength !=3D NULL); > > + ASSERT (HostAdapterStatus !=3D NULL); > > + ASSERT (TargetStatus !=3D NULL); > > + ASSERT (DataLength !=3D NULL); > > + ASSERT (ScsiIo !=3D NULL); > > + > > + ZeroMem (&CommandPacket, sizeof > (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); > > + ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE); > > + > > + CommandPacket.Timeout =3D Timeout; > > + CommandPacket.InDataBuffer =3D DataBuffer; > > + CommandPacket.SenseData =3D SenseData; > > + CommandPacket.InTransferLength =3D TransferLength; > > + CommandPacket.Cdb =3D Cdb; > > + // > > + // Fill Cdb for Security Protocol In Command > > + // > > + Cdb[0] =3D EFI_SCSI_OP_SECURITY_PROTOCOL_IN; > > + Cdb[1] =3D SecurityProtocol; > > + WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 > (SecurityProtocolSpecific)); > > + WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength)); > > + > > + CommandPacket.CdbLength =3D EFI_SCSI_OP_LENGTH_TWELVE; > > + CommandPacket.DataDirection =3D EFI_SCSI_DATA_IN; > > + CommandPacket.SenseDataLength =3D *SenseDataLength; > > + > > + Status =3D ScsiIo->ExecuteScsiCommand (ScsiI= o, > &CommandPacket, NULL); > > + > > + *HostAdapterStatus =3D CommandPacket.HostAdapterStatus; > > + *TargetStatus =3D CommandPacket.TargetStatus; > > + *SenseDataLength =3D CommandPacket.SenseDataLength; > > + *DataLength =3D CommandPacket.InTransferLength; > > + > > + return Status; > > +} > > + > > + > > +/** > > + Execute Security Protocol Out SCSI command on a specific SCSI targe= t. > > + > > + 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 c= ommand > to complete. > > + If Timeout is greater than zero, then the command is executed and w= ill > timeout after > > + Timeout 100 ns units. The StartLba and SectorSize parameters are u= sed > to construct > > + the CDB for this SCSI command. > > + 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 DataLength 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 mu= st > 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 dat= a. > > + @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 Spe= cific > data. > > + @param[in] TransferLength The size in bytes of the trans= fer data. > > + @param[in, out] DataBuffer A pointer to a data buffer. > > + > > + @retval EFI_SUCCESS Command is executed successful= ly. > > + @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 q= ueued. > > + @retval EFI_DEVICE_ERROR A device error occurred while > attempting to send SCSI Request Packet. > > + @retval EFI_UNSUPPORTED The command described by the S= CSI > Request Packet is not supported by > > + the SCSI initiator(i.e., SCSI = Host Controller) > > + @retval EFI_TIMEOUT A timeout occurred while waiti= ng for the > SCSI Request Packet to execute. > > + @retval EFI_INVALID_PARAMETER The contents of the SCSI Reque= st > 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 UINT32 TransferLength, > > + IN OUT VOID *DataBuffer OPTIONAL > > + ) > > +{ > > + EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; > > + EFI_STATUS Status; > > + UINT8 Cdb[EFI_SCSI_OP_LENGTH_TWELVE]; > > + > > + ASSERT (SenseDataLength !=3D NULL); > > + ASSERT (HostAdapterStatus !=3D NULL); > > + ASSERT (TargetStatus !=3D NULL); > > + ASSERT (ScsiIo !=3D NULL); > > + > > + ZeroMem (&CommandPacket, sizeof > (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); > > + ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE); > > + > > + CommandPacket.Timeout =3D Timeout; > > + CommandPacket.OutDataBuffer =3D DataBuffer; > > + CommandPacket.SenseData =3D SenseData; > > + CommandPacket.OutTransferLength =3D TransferLength; > > + CommandPacket.Cdb =3D Cdb; > > + // > > + // Fill Cdb for Security Protocol Out Command > > + // > > + Cdb[0] =3D EFI_SCSI_OP_SECURITY_PROTOCOL_OUT= ; > > + Cdb[1] =3D SecurityProtocol; > > + WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 > (SecurityProtocolSpecific)); > > + WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength)); > > + > > + CommandPacket.CdbLength =3D EFI_SCSI_OP_LENGTH_TWELVE; > > + CommandPacket.DataDirection =3D EFI_SCSI_DATA_OUT; > > + CommandPacket.SenseDataLength =3D *SenseDataLength; > > + > > + Status =3D ScsiIo->ExecuteScsiCommand (ScsiI= o, > &CommandPacket, NULL); > > + > > + *HostAdapterStatus =3D CommandPacket.HostAdapterStatus; > > + *TargetStatus =3D CommandPacket.TargetStatus; > > + *SenseDataLength =3D 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 >=20 >=20 >=20