IN EFI_EVENT Event OPTIONAL\r
)\r
{\r
- NVME_CONTROLLER_PRIVATE_DATA *Private;\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- NVME_SQ *Sq;\r
- NVME_CQ *Cq;\r
- UINT16 QueueId;\r
- UINT32 Bytes;\r
- UINT16 Offset;\r
- EFI_EVENT TimerEvent;\r
- EFI_PCI_IO_PROTOCOL_OPERATION Flag;\r
- EFI_PHYSICAL_ADDRESS PhyAddr;\r
- VOID *MapData;\r
- VOID *MapMeta;\r
- VOID *MapPrpList;\r
- UINTN MapLength;\r
- UINT64 *Prp;\r
- VOID *PrpListHost;\r
- UINTN PrpListNo;\r
- UINT32 Data;\r
- NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;\r
- EFI_TPL OldTpl;\r
+ NVME_CONTROLLER_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ NVME_SQ *Sq;\r
+ NVME_CQ *Cq;\r
+ UINT16 QueueId;\r
+ UINT32 Bytes;\r
+ UINT16 Offset;\r
+ EFI_EVENT TimerEvent;\r
+ EFI_PCI_IO_PROTOCOL_OPERATION Flag;\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
+ VOID *MapData;\r
+ VOID *MapMeta;\r
+ VOID *MapPrpList;\r
+ UINTN MapLength;\r
+ UINT64 *Prp;\r
+ VOID *PrpListHost;\r
+ UINTN PrpListNo;\r
+ UINT32 IoAlign;\r
+ UINT32 Data;\r
+ NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;\r
+ EFI_TPL OldTpl;\r
\r
//\r
// check the data fields in Packet parameter.\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Buffer alignment check for TransferBuffer & MetadataBuffer.\r
+ //\r
+ IoAlign = This->Mode->IoAlign;\r
+ if (IoAlign > 0 && (((UINTN) Packet->TransferBuffer & (IoAlign - 1)) != 0)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (IoAlign > 0 && (((UINTN) Packet->MetadataBuffer & (IoAlign - 1)) != 0)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);\r
PciIo = Private->PciIo;\r
MapData = NULL;\r