/** Initialize data for device that does not support multiple LUNSs. @param This The Driver Binding Protocol instance. @param Controller The device to initialize. @param Transport Pointer to USB_MASS_TRANSPORT. @param Context Parameter for USB_MASS_DEVICE.Context. @retval EFI_SUCCESS Initialization succeeds. @retval Other Initialization fails. **/ EFI_STATUS UsbMassInitNonLun ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN USB_MASS_TRANSPORT *Transport, IN VOID *Context ) { USB_MASS_DEVICE *UsbMass; EFI_USB_IO_PROTOCOL *UsbIo; EFI_STATUS Status; UsbIo = NULL; UsbMass = AllocateZeroPool (sizeof (USB_MASS_DEVICE)); ASSERT (UsbMass != NULL); Status = gBS->OpenProtocol ( Controller, &gEfiUsbIoProtocolGuid, (VOID **) &UsbIo, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: OpenUsbIoProtocol By Driver (%r)\n", Status)); goto ON_ERROR; } UsbMass->Signature = USB_MASS_SIGNATURE; UsbMass->Controller = Controller; UsbMass->UsbIo = UsbIo; UsbMass->BlockIo.Media = &UsbMass->BlockIoMedia; UsbMass->BlockIo.Reset = UsbMassReset; UsbMass->BlockIo.ReadBlocks = UsbMassReadBlocks; UsbMass->BlockIo.WriteBlocks = UsbMassWriteBlocks; UsbMass->BlockIo.FlushBlocks = UsbMassFlushBlocks; UsbMass->OpticalStorage = FALSE; UsbMass->Transport = Transport; UsbMass->Context = Context; // // Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol. // Status = UsbMassInitMedia (UsbMass); if ((EFI_ERROR (Status)) && (Status != EFI_NO_MEDIA)) { DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: UsbMassInitMedia (%r)\n", Status)); goto ON_ERROR; } InitializeDiskInfo (UsbMass); Status = gBS->InstallMultipleProtocolInterfaces ( &Controller, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); if (EFI_ERROR (Status)) { goto ON_ERROR; } return EFI_SUCCESS; ON_ERROR: if (UsbMass != NULL) { FreePool (UsbMass); } if (UsbIo != NULL) { gBS->CloseProtocol ( Controller, &gEfiUsbIoProtocolGuid, This->DriverBindingHandle, Controller ); } return Status; }
/** Initialize data for device that supports multiple LUNSs. @param This The Driver Binding Protocol instance. @param Controller The device to initialize. @param Transport Pointer to USB_MASS_TRANSPORT. @param Context Parameter for USB_MASS_DEVICE.Context. @param DevicePath The remaining device path. @param MaxLun The max LUN number. @retval EFI_SUCCESS At least one LUN is initialized successfully. @retval EFI_NOT_FOUND Fail to initialize any of multiple LUNs. **/ EFI_STATUS UsbMassInitMultiLun ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN USB_MASS_TRANSPORT *Transport, IN VOID *Context, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINT8 MaxLun ) { USB_MASS_DEVICE *UsbMass; EFI_USB_IO_PROTOCOL *UsbIo; DEVICE_LOGICAL_UNIT_DEVICE_PATH LunNode; UINT8 Index; EFI_STATUS Status; EFI_STATUS ReturnStatus; ASSERT (MaxLun > 0); ReturnStatus = EFI_NOT_FOUND; for (Index = 0; Index <= MaxLun; Index++) { DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Start to initialize No.%d logic unit\n", Index)); UsbIo = NULL; UsbMass = AllocateZeroPool (sizeof (USB_MASS_DEVICE)); ASSERT (UsbMass != NULL); UsbMass->Signature = USB_MASS_SIGNATURE; UsbMass->UsbIo = UsbIo; UsbMass->BlockIo.Media = &UsbMass->BlockIoMedia; UsbMass->BlockIo.Reset = UsbMassReset; UsbMass->BlockIo.ReadBlocks = UsbMassReadBlocks; UsbMass->BlockIo.WriteBlocks = UsbMassWriteBlocks; UsbMass->BlockIo.FlushBlocks = UsbMassFlushBlocks; UsbMass->OpticalStorage = FALSE; UsbMass->Transport = Transport; UsbMass->Context = Context; UsbMass->Lun = Index; // // Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol. // Status = UsbMassInitMedia (UsbMass); if ((EFI_ERROR (Status)) && (Status != EFI_NO_MEDIA)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: UsbMassInitMedia (%r)\n", Status)); FreePool (UsbMass); continue; } // // Create a device path node for device logic unit, and append it. // LunNode.Header.Type = MESSAGING_DEVICE_PATH; LunNode.Header.SubType = MSG_DEVICE_LOGICAL_UNIT_DP; LunNode.Lun = UsbMass->Lun; SetDevicePathNodeLength (&LunNode.Header, sizeof (LunNode)); UsbMass->DevicePath = AppendDevicePathNode (DevicePath, &LunNode.Header); if (UsbMass->DevicePath == NULL) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: failed to create device logic unit device path\n")); Status = EFI_OUT_OF_RESOURCES; FreePool (UsbMass); continue; } InitializeDiskInfo (UsbMass); // // Create a new handle for each LUN, and install Block I/O Protocol and Device Path Protocol. // Status = gBS->InstallMultipleProtocolInterfaces ( &UsbMass->Controller, &gEfiDevicePathProtocolGuid, UsbMass->DevicePath, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: InstallMultipleProtocolInterfaces (%r)\n", Status)); FreePool (UsbMass->DevicePath); FreePool (UsbMass); continue; } // // Open USB I/O Protocol by child to setup a parent-child relationship. // Status = gBS->OpenProtocol ( Controller, &gEfiUsbIoProtocolGuid, (VOID **) &UsbIo, This->DriverBindingHandle, UsbMass->Controller, EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: OpenUsbIoProtocol By Child (%r)\n", Status)); gBS->UninstallMultipleProtocolInterfaces ( &UsbMass->Controller, &gEfiDevicePathProtocolGuid, UsbMass->DevicePath, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); FreePool (UsbMass->DevicePath); FreePool (UsbMass); continue; } ReturnStatus = EFI_SUCCESS; DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Success to initialize No.%d logic unit\n", Index)); } return ReturnStatus; }
/** Initialize data for device that supports multiple LUNSs. @param This The Driver Binding Protocol instance. @param Controller The device to initialize. @param Transport Pointer to USB_MASS_TRANSPORT. @param Context Parameter for USB_MASS_DEVICE.Context. @param DevicePath The remaining device path. @param MaxLun The max LUN number. @retval EFI_SUCCESS At least one LUN is initialized successfully. @retval EFI_OUT_OF_RESOURCES Out of resource while creating device path node. @retval Other Initialization fails. **/ EFI_STATUS UsbMassInitMultiLun ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN USB_MASS_TRANSPORT *Transport, IN VOID *Context, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINT8 MaxLun ) { USB_MASS_DEVICE *UsbMass; EFI_USB_IO_PROTOCOL *UsbIo; DEVICE_LOGICAL_UNIT_DEVICE_PATH LunNode; UINT8 Index; EFI_STATUS Status; ASSERT (MaxLun > 0); for (Index = 0; Index <= MaxLun; Index++) { DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Start to initialize No.%d logic unit\n", Index)); UsbIo = NULL; UsbMass = AllocateZeroPool (sizeof (USB_MASS_DEVICE)); ASSERT (UsbMass != NULL); UsbMass->Signature = USB_MASS_SIGNATURE; UsbMass->UsbIo = UsbIo; UsbMass->BlockIo.Media = &UsbMass->BlockIoMedia; UsbMass->BlockIo.Reset = UsbMassReset; UsbMass->BlockIo.ReadBlocks = UsbMassReadBlocks; UsbMass->BlockIo.WriteBlocks = UsbMassWriteBlocks; UsbMass->BlockIo.FlushBlocks = UsbMassFlushBlocks; UsbMass->OpticalStorage = FALSE; UsbMass->Transport = Transport; UsbMass->Context = Context; UsbMass->Lun = Index; // // Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol. // Status = UsbMassInitMedia (UsbMass); if (!EFI_ERROR (Status)) { // // According to USB Mass Storage Specification for Bootability, only following // 4 Peripheral Device Types are in spec. // if ((UsbMass->Pdt != USB_PDT_DIRECT_ACCESS) && (UsbMass->Pdt != USB_PDT_CDROM) && (UsbMass->Pdt != USB_PDT_OPTICAL) && (UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt)); goto ON_ERROR; } } else if (Status != EFI_NO_MEDIA){ DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: UsbMassInitMedia (%r)\n", Status)); goto ON_ERROR; } // // Create a device path node for device logic unit, and append it. // LunNode.Header.Type = MESSAGING_DEVICE_PATH; LunNode.Header.SubType = MSG_DEVICE_LOGICAL_UNIT_DP; LunNode.Lun = UsbMass->Lun; SetDevicePathNodeLength (&LunNode.Header, sizeof (LunNode)); UsbMass->DevicePath = AppendDevicePathNode (DevicePath, &LunNode.Header); if (UsbMass->DevicePath == NULL) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: failed to create device logic unit device path\n")); Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } InitializeDiskInfo (UsbMass); // // Create a new handle for each LUN, and install Block I/O Protocol and Device Path Protocol. // Status = gBS->InstallMultipleProtocolInterfaces ( &UsbMass->Controller, &gEfiDevicePathProtocolGuid, UsbMass->DevicePath, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: InstallMultipleProtocolInterfaces (%r)\n", Status)); goto ON_ERROR; } // // Open USB I/O Protocol by child to setup a parent-child relationship. // Status = gBS->OpenProtocol ( Controller, &gEfiUsbIoProtocolGuid, (VOID **) &UsbIo, This->DriverBindingHandle, UsbMass->Controller, EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: OpenUsbIoProtocol By Child (%r)\n", Status)); gBS->UninstallMultipleProtocolInterfaces ( &UsbMass->Controller, &gEfiDevicePathProtocolGuid, UsbMass->DevicePath, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); goto ON_ERROR; } DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Success to initialize No.%d logic unit\n", Index)); } return EFI_SUCCESS; ON_ERROR: if (UsbMass != NULL) { if (UsbMass->DevicePath != NULL) { FreePool (UsbMass->DevicePath); } FreePool (UsbMass); } if (UsbIo != NULL) { gBS->CloseProtocol ( Controller, &gEfiUsbIoProtocolGuid, This->DriverBindingHandle, UsbMass->Controller ); } // // Return EFI_SUCCESS if at least one LUN is initialized successfully. // if (Index > 0) { return EFI_SUCCESS; } else { return Status; } }
/** Initialize data for device that does not support multiple LUNSs. @param This The Driver Binding Protocol instance. @param Controller The device to initialize. @param Transport Pointer to USB_MASS_TRANSPORT. @param Context Parameter for USB_MASS_DEVICE.Context. @retval EFI_SUCCESS Initialization succeeds. @retval Other Initialization fails. **/ EFI_STATUS UsbMassInitNonLun ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN USB_MASS_TRANSPORT *Transport, IN VOID *Context ) { USB_MASS_DEVICE *UsbMass; EFI_USB_IO_PROTOCOL *UsbIo; EFI_STATUS Status; UsbIo = NULL; UsbMass = AllocateZeroPool (sizeof (USB_MASS_DEVICE)); ASSERT (UsbMass != NULL); Status = gBS->OpenProtocol ( Controller, &gEfiUsbIoProtocolGuid, (VOID **) &UsbIo, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: OpenUsbIoProtocol By Driver (%r)\n", Status)); goto ON_ERROR; } UsbMass->Signature = USB_MASS_SIGNATURE; UsbMass->Controller = Controller; UsbMass->UsbIo = UsbIo; UsbMass->BlockIo.Media = &UsbMass->BlockIoMedia; UsbMass->BlockIo.Reset = UsbMassReset; UsbMass->BlockIo.ReadBlocks = UsbMassReadBlocks; UsbMass->BlockIo.WriteBlocks = UsbMassWriteBlocks; UsbMass->BlockIo.FlushBlocks = UsbMassFlushBlocks; UsbMass->OpticalStorage = FALSE; UsbMass->Transport = Transport; UsbMass->Context = Context; // // Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol. // Status = UsbMassInitMedia (UsbMass); if (!EFI_ERROR (Status)) { // // According to USB Mass Storage Specification for Bootability, only following // 4 Peripheral Device Types are in spec. // if ((UsbMass->Pdt != USB_PDT_DIRECT_ACCESS) && (UsbMass->Pdt != USB_PDT_CDROM) && (UsbMass->Pdt != USB_PDT_OPTICAL) && (UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) { DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt)); goto ON_ERROR; } } else if (Status != EFI_NO_MEDIA){ DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: UsbMassInitMedia (%r)\n", Status)); goto ON_ERROR; } InitializeDiskInfo (UsbMass); Status = gBS->InstallMultipleProtocolInterfaces ( &Controller, &gEfiBlockIoProtocolGuid, &UsbMass->BlockIo, &gEfiDiskInfoProtocolGuid, &UsbMass->DiskInfo, NULL ); if (EFI_ERROR (Status)) { goto ON_ERROR; } return EFI_SUCCESS; ON_ERROR: if (UsbMass != NULL) { FreePool (UsbMass); } if (UsbIo != NULL) { gBS->CloseProtocol ( Controller, &gEfiUsbIoProtocolGuid, This->DriverBindingHandle, Controller ); } return Status; }
/** Check if the specified Nvm Express device namespace is active, and create child handles for them with BlockIo and DiskInfo protocol instances. @param[in] Private The pointer to the NVME_CONTROLLER_PRIVATE_DATA data structure. @param[in] NamespaceId The NVM Express namespace ID for which a device path node is to be allocated and built. Caller must set the NamespaceId to zero if the device path node will contain a valid UUID. @retval EFI_SUCCESS All the namespaces in the device are successfully enumerated. @return Others Some error occurs when enumerating the namespaces. **/ EFI_STATUS EnumerateNvmeDevNamespace ( IN NVME_CONTROLLER_PRIVATE_DATA *Private, UINT32 NamespaceId ) { NVME_ADMIN_NAMESPACE_DATA *NamespaceData; EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_HANDLE DeviceHandle; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; NVME_DEVICE_PRIVATE_DATA *Device; EFI_STATUS Status; UINT32 Lbads; UINT32 Flbas; UINT32 LbaFmtIdx; UINT8 Sn[21]; UINT8 Mn[41]; VOID *DummyInterface; NewDevicePathNode = NULL; DevicePath = NULL; Device = NULL; // // Allocate a buffer for Identify Namespace data // NamespaceData = AllocateZeroPool(sizeof (NVME_ADMIN_NAMESPACE_DATA)); if(NamespaceData == NULL) { return EFI_OUT_OF_RESOURCES; } ParentDevicePath = Private->ParentDevicePath; // // Identify Namespace // Status = NvmeIdentifyNamespace ( Private, NamespaceId, (VOID *)NamespaceData ); if (EFI_ERROR(Status)) { goto Exit; } // // Validate Namespace // if (NamespaceData->Ncap == 0) { Status = EFI_DEVICE_ERROR; } else { // // allocate device private data for each discovered namespace // Device = AllocateZeroPool(sizeof(NVME_DEVICE_PRIVATE_DATA)); if (Device == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; } // // Initialize SSD namespace instance data // Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE; Device->NamespaceId = NamespaceId; Device->NamespaceUuid = NamespaceData->Eui64; Device->ControllerHandle = Private->ControllerHandle; Device->DriverBindingHandle = Private->DriverBindingHandle; Device->Controller = Private; // // Build BlockIo media structure // Device->Media.MediaId = 0; Device->Media.RemovableMedia = FALSE; Device->Media.MediaPresent = TRUE; Device->Media.LogicalPartition = FALSE; Device->Media.ReadOnly = FALSE; Device->Media.WriteCaching = FALSE; Device->Media.IoAlign = Private->PassThruMode.IoAlign; Flbas = NamespaceData->Flbas; LbaFmtIdx = Flbas & 0xF; Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads; Device->Media.BlockSize = (UINT32)1 << Lbads; Device->Media.LastBlock = NamespaceData->Nsze - 1; Device->Media.LogicalBlocksPerPhysicalBlock = 1; Device->Media.LowestAlignedLba = 1; // // Create BlockIo Protocol instance // Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2; Device->BlockIo.Media = &Device->Media; Device->BlockIo.Reset = NvmeBlockIoReset; Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks; Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks; Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks; // // Create BlockIo2 Protocol instance // Device->BlockIo2.Media = &Device->Media; Device->BlockIo2.Reset = NvmeBlockIoResetEx; Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx; Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx; Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx; InitializeListHead (&Device->AsyncQueue); // // Create StorageSecurityProtocol Instance // Device->StorageSecurity.ReceiveData = NvmeStorageSecurityReceiveData; Device->StorageSecurity.SendData = NvmeStorageSecuritySendData; // // Create DiskInfo Protocol instance // CopyMem (&Device->NamespaceData, NamespaceData, sizeof (NVME_ADMIN_NAMESPACE_DATA)); InitializeDiskInfo (Device); // // Create a Nvm Express Namespace Device Path Node // Status = Private->Passthru.BuildDevicePath ( &Private->Passthru, Device->NamespaceId, &NewDevicePathNode ); if (EFI_ERROR(Status)) { goto Exit; } // // Append the SSD node to the controller's device path // DevicePath = AppendDevicePathNode (ParentDevicePath, NewDevicePathNode); if (DevicePath == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; } DeviceHandle = NULL; RemainingDevicePath = DevicePath; Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle); if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) { Status = EFI_ALREADY_STARTED; FreePool (DevicePath); goto Exit; } Device->DevicePath = DevicePath; // // Make sure the handle is NULL so we create a new handle // Device->DeviceHandle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &Device->DeviceHandle, &gEfiDevicePathProtocolGuid, Device->DevicePath, &gEfiBlockIoProtocolGuid, &Device->BlockIo, &gEfiBlockIo2ProtocolGuid, &Device->BlockIo2, &gEfiDiskInfoProtocolGuid, &Device->DiskInfo, NULL ); if(EFI_ERROR(Status)) { goto Exit; } // // Check if the NVMe controller supports the Security Send and Security Receive commands // if ((Private->ControllerData->Oacs & SECURITY_SEND_RECEIVE_SUPPORTED) != 0) { Status = gBS->InstallProtocolInterface ( &Device->DeviceHandle, &gEfiStorageSecurityCommandProtocolGuid, EFI_NATIVE_INTERFACE, &Device->StorageSecurity ); if(EFI_ERROR(Status)) { gBS->UninstallMultipleProtocolInterfaces ( &Device->DeviceHandle, &gEfiDevicePathProtocolGuid, Device->DevicePath, &gEfiBlockIoProtocolGuid, &Device->BlockIo, &gEfiBlockIo2ProtocolGuid, &Device->BlockIo2, &gEfiDiskInfoProtocolGuid, &Device->DiskInfo, NULL ); goto Exit; } } gBS->OpenProtocol ( Private->ControllerHandle, &gEfiNvmExpressPassThruProtocolGuid, (VOID **) &DummyInterface, Private->DriverBindingHandle, Device->DeviceHandle, EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); // // Dump NvmExpress Identify Namespace Data // DEBUG ((EFI_D_INFO, " == NVME IDENTIFY NAMESPACE [%d] DATA ==\n", NamespaceId)); DEBUG ((EFI_D_INFO, " NSZE : 0x%x\n", NamespaceData->Nsze)); DEBUG ((EFI_D_INFO, " NCAP : 0x%x\n", NamespaceData->Ncap)); DEBUG ((EFI_D_INFO, " NUSE : 0x%x\n", NamespaceData->Nuse)); DEBUG ((EFI_D_INFO, " LBAF0.LBADS : 0x%x\n", (NamespaceData->LbaFormat[0].Lbads))); // // Build controller name for Component Name (2) protocol. // CopyMem (Sn, Private->ControllerData->Sn, sizeof (Private->ControllerData->Sn)); Sn[20] = 0; CopyMem (Mn, Private->ControllerData->Mn, sizeof (Private->ControllerData->Mn)); Mn[40] = 0; UnicodeSPrintAsciiFormat (Device->ModelName, sizeof (Device->ModelName), "%a-%a-%x", Sn, Mn, NamespaceData->Eui64); AddUnicodeString2 ( "eng", gNvmExpressComponentName.SupportedLanguages, &Device->ControllerNameTable, Device->ModelName, TRUE ); AddUnicodeString2 ( "en", gNvmExpressComponentName2.SupportedLanguages, &Device->ControllerNameTable, Device->ModelName, FALSE ); } Exit: if(NamespaceData != NULL) { FreePool (NamespaceData); } if (NewDevicePathNode != NULL) { FreePool (NewDevicePathNode); } if(EFI_ERROR(Status) && (Device != NULL) && (Device->DevicePath != NULL)) { FreePool (Device->DevicePath); } if(EFI_ERROR(Status) && (Device != NULL)) { FreePool (Device); } return Status; }