From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.32258.1585208066963607856 for ; Thu, 26 Mar 2020 00:34:27 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: christopher.j.zurcher@intel.com) IronPort-SDR: TzQynDcNtkt/y6V61pFK+/O3VMNjKLkbUetuF8FKrmAPBtVbia8WVFowgOCMwBOEOXHxPg19/4 wZwslKRyiVgA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2020 00:34:26 -0700 IronPort-SDR: h0IY2Hu1D4Q17mxuLS+Jk/9eNb54+Nmpa6GM+X6+RRcVhVNZKSSHiM/cxZS/ZIWQhy8l70hh9O 7dzt4BQOlZAA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,307,1580803200"; d="scan'208";a="393889986" Received: from cjzurch-desk.amr.corp.intel.com ([10.9.70.181]) by orsmga004.jf.intel.com with ESMTP; 26 Mar 2020 00:34:25 -0700 From: "Zurcher, Christopher J" To: devel@edk2.groups.io Cc: Michael D Kinney , Jian J Wang , Liming Gao , Zhiguang Liu Subject: [PATCH v2 1/1] MdePkg/UefiScsiLib: Set FUA bit for synchronous SCSI Write operations Date: Thu, 26 Mar 2020 00:34:24 -0700 Message-Id: <20200326073424.69960-2-christopher.j.zurcher@intel.com> X-Mailer: git-send-email 2.16.2.windows.1 In-Reply-To: <20200326073424.69960-1-christopher.j.zurcher@intel.com> References: <20200326073424.69960-1-christopher.j.zurcher@intel.com> The FUA (Force Unit Access) bit forces data to be written directly to disk instead of the write cache. This prevents data from being lost if a shutdown or reset is requested immediately after a SCSI write operation. Cc: Michael D Kinney Cc: Jian J Wang Cc: Liming Gao Cc: Zhiguang Liu Signed-off-by: Christopher J Zurcher --- MdePkg/Include/IndustryStandard/Scsi.h | 8 +++++++- MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 14 ++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/Scsi.h b/MdePkg/Include/IndustryStandard/Scsi.h index 3e966520a1..64b9918b82 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 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -175,6 +175,12 @@ #define EFI_SCSI_DATA_IN 0 #define EFI_SCSI_DATA_OUT 1 +// +// SCSI Block Command Cache Control Parameters +// +#define EFI_SCSI_BLOCK_FUA BIT3 ///< Force Unit Access +#define EFI_SCSI_BLOCK_DPO BIT4 ///< Disable Page Out + // // Peripheral Device Type Definitions // diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c index 13a2a1912c..512bec500c 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 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -1055,15 +1055,16 @@ ScsiWrite10Command ( ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN); - CommandPacket.Timeout = Timeout; - CommandPacket.OutDataBuffer = DataBuffer; - CommandPacket.SenseData = SenseData; - CommandPacket.OutTransferLength= *DataLength; - CommandPacket.Cdb = Cdb; + CommandPacket.Timeout = Timeout; + CommandPacket.OutDataBuffer = DataBuffer; + CommandPacket.SenseData = SenseData; + CommandPacket.OutTransferLength = *DataLength; + CommandPacket.Cdb = Cdb; // // Fill Cdb for Write (10) Command // Cdb[0] = EFI_SCSI_OP_WRITE10; + Cdb[1] = EFI_SCSI_BLOCK_FUA; WriteUnaligned32 ((UINT32 *)&Cdb[2], SwapBytes32 (StartLba)); WriteUnaligned16 ((UINT16 *)&Cdb[7], SwapBytes16 ((UINT16) SectorSize)); @@ -1263,6 +1264,7 @@ ScsiWrite16Command ( // Fill Cdb for Write (16) Command // Cdb[0] = EFI_SCSI_OP_WRITE16; + Cdb[1] = EFI_SCSI_BLOCK_FUA; WriteUnaligned64 ((UINT64 *)&Cdb[2], SwapBytes64 (StartLba)); WriteUnaligned32 ((UINT32 *)&Cdb[10], SwapBytes32 (SectorSize)); -- 2.16.2.windows.1