]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c
MdeModulePkg/NvmExpressDxe: Fix some bugs
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / NvmExpressDxe / NvmExpressPassthru.c
index d1231aca89af01ce4b37317f7857d7b947f71096..4320549ed4f48a9f51baf28c8b36658edcddf1ed 100644 (file)
@@ -387,6 +387,7 @@ NvmExpressPassThru (
   UINT64                        *Prp;\r
   VOID                          *PrpListHost;\r
   UINTN                         PrpListNo;\r
+  UINT32                        Data;\r
 \r
   //\r
   // check the data fields in Packet parameter.\r
@@ -431,8 +432,8 @@ NvmExpressPassThru (
   //\r
   // Currently we only support PRP for data transfer, SGL is NOT supported.\r
   //\r
-  ASSERT ((Sq->Opc & BIT15) == 0);\r
-  if ((Sq->Opc & BIT15) != 0) {\r
+  ASSERT (Sq->Psdt == 0);\r
+  if (Sq->Psdt != 0) {\r
     DEBUG ((EFI_D_ERROR, "NvmExpressPassThru: doesn't support SGL mechanism\n"));\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -534,14 +535,14 @@ NvmExpressPassThru (
   // Ring the submission queue doorbell.\r
   //\r
   Private->SqTdbl[Qid].Sqt ^= 1;\r
-\r
+  Data = ReadUnaligned32 ((UINT32*)&Private->SqTdbl[Qid]);\r
   PciIo->Mem.Write (\r
                PciIo,\r
                EfiPciIoWidthUint32,\r
                NVME_BAR,\r
                NVME_SQTDBL_OFFSET(Qid, Private->Cap.Dstrd),\r
                1,\r
-               &Private->SqTdbl[Qid]\r
+               &Data\r
                );\r
 \r
   Status = gBS->CreateEvent (\r
@@ -591,13 +592,14 @@ NvmExpressPassThru (
     NvmeDumpStatus(Cq);\r
   DEBUG_CODE_END();\r
 \r
+  Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[Qid]);\r
   PciIo->Mem.Write (\r
                PciIo,\r
                EfiPciIoWidthUint32,\r
                NVME_BAR,\r
                NVME_CQHDBL_OFFSET(Qid, Private->Cap.Dstrd),\r
                1,\r
-               &Private->CqHdbl[Qid]\r
+               &Data\r
                );\r
 \r
 EXIT:\r