MdeModulePkg NvmExpressDxe: Refine GetNameSpace API to follow spec

According to the UEFI spec,
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.GetNamespace() should return
EFI_NOT_FOUND when the input DevicePath is a device path node type that
the NVM Express Pass Thru driver supports, but there is not a valid
translation from DevicePath to a namespace ID. Current code will return
EFI_SUCCESS. This commit adds additional check in the GetNameSpace API to
make sure correct status is returned.

Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
Hao Wu 2016-08-19 11:18:42 +08:00
parent 946f48ebe6
commit 284dc9bfe4
1 changed files with 11 additions and 1 deletions

View File

@ -820,6 +820,7 @@ NvmExpressGetNamespace (
)
{
NVME_NAMESPACE_DEVICE_PATH *Node;
NVME_CONTROLLER_PRIVATE_DATA *Private;
if ((This == NULL) || (DevicePath == NULL) || (NamespaceId == NULL)) {
return EFI_INVALID_PARAMETER;
@ -829,13 +830,22 @@ NvmExpressGetNamespace (
return EFI_UNSUPPORTED;
}
Node = (NVME_NAMESPACE_DEVICE_PATH *)DevicePath;
Node = (NVME_NAMESPACE_DEVICE_PATH *)DevicePath;
Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);
if (DevicePath->SubType == MSG_NVME_NAMESPACE_DP) {
if (DevicePathNodeLength(DevicePath) != sizeof(NVME_NAMESPACE_DEVICE_PATH)) {
return EFI_NOT_FOUND;
}
//
// Check NamespaceId in the device path node is valid or not.
//
if ((Node->NamespaceId == 0) ||
(Node->NamespaceId > Private->ControllerData->Nn)) {
return EFI_NOT_FOUND;
}
*NamespaceId = Node->NamespaceId;
return EFI_SUCCESS;