]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg/UefiScsiLib: Set FUA bit for synchronous SCSI Write operations
authorZurcher, Christopher J <christopher.j.zurcher@intel.com>
Thu, 26 Mar 2020 07:34:24 +0000 (15:34 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 15 Apr 2020 01:13:04 +0000 (01:13 +0000)
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 <michael.d.kinney@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Zhiguang Liu <zhiguang.liu@intel.com>
Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
MdePkg/Include/IndustryStandard/Scsi.h
MdePkg/Library/UefiScsiLib/UefiScsiLib.c

index 3e966520a185e323afb0f8dbfd960f0f52cbfc65..64b9918b82a01d5f5667fb68dc65358ca1d07510 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Support for SCSI-2 standard\r
 \r
-  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #define EFI_SCSI_DATA_IN  0\r
 #define EFI_SCSI_DATA_OUT 1\r
 \r
+//\r
+// SCSI Block Command Cache Control Parameters\r
+//\r
+#define EFI_SCSI_BLOCK_FUA  BIT3  ///< Force Unit Access\r
+#define EFI_SCSI_BLOCK_DPO  BIT4  ///< Disable Page Out\r
+\r
 //\r
 // Peripheral Device Type Definitions\r
 //\r
index 13a2a1912cbe8a23f5d018965d34db627902c162..512bec500cce5b89ac7f50b15fc12e83a5d272a5 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   UEFI SCSI Library implementation\r
 \r
-  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -1055,15 +1055,16 @@ ScsiWrite10Command (
   ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));\r
   ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TEN);\r
 \r
-  CommandPacket.Timeout         = Timeout;\r
-  CommandPacket.OutDataBuffer    = DataBuffer;\r
-  CommandPacket.SenseData       = SenseData;\r
-  CommandPacket.OutTransferLength= *DataLength;\r
-  CommandPacket.Cdb             = Cdb;\r
+  CommandPacket.Timeout           = Timeout;\r
+  CommandPacket.OutDataBuffer     = DataBuffer;\r
+  CommandPacket.SenseData         = SenseData;\r
+  CommandPacket.OutTransferLength = *DataLength;\r
+  CommandPacket.Cdb               = Cdb;\r
   //\r
   // Fill Cdb for Write (10) Command\r
   //\r
   Cdb[0]                        = EFI_SCSI_OP_WRITE10;\r
+  Cdb[1]                        = EFI_SCSI_BLOCK_FUA;\r
   WriteUnaligned32 ((UINT32 *)&Cdb[2], SwapBytes32 (StartLba));\r
   WriteUnaligned16 ((UINT16 *)&Cdb[7], SwapBytes16 ((UINT16) SectorSize));\r
 \r
@@ -1263,6 +1264,7 @@ ScsiWrite16Command (
   // Fill Cdb for Write (16) Command\r
   //\r
   Cdb[0]                        = EFI_SCSI_OP_WRITE16;\r
+  Cdb[1]                        = EFI_SCSI_BLOCK_FUA;\r
   WriteUnaligned64 ((UINT64 *)&Cdb[2], SwapBytes64 (StartLba));\r
   WriteUnaligned32 ((UINT32 *)&Cdb[10], SwapBytes32 (SectorSize));\r
 \r