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 Attributes;\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
+ // 'Attributes' with neither EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL nor\r
+ // EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL set is an illegal\r
+ // configuration.\r
+ //\r
+ Attributes = This->Mode->Attributes;\r
+ if ((Attributes & (EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |\r
+ EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL)) == 0) {\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
\r
*NamespaceId = NextNamespaceId;\r
} else {\r
- if (*NamespaceId >= Private->ControllerData->Nn) {\r
+ if (*NamespaceId > Private->ControllerData->Nn) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
NextNamespaceId = *NamespaceId + 1;\r
+ if (NextNamespaceId > Private->ControllerData->Nn) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
//\r
// Allocate buffer for Identify Namespace data.\r
//\r