+++ /dev/null
-/** @file\r
- The entry point of IScsi driver.\r
-\r
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "IScsiImpl.h"\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {\r
- IScsiDriverBindingSupported,\r
- IScsiDriverBindingStart,\r
- IScsiDriverBindingStop,\r
- 0xa,\r
- NULL,\r
- NULL\r
-};\r
-\r
-/**\r
- Tests to see if this driver supports the RemainingDevicePath.\r
-\r
- @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This\r
- parameter is ignored by device drivers, and is optional for bus\r
- drivers. For bus drivers, if this parameter is not NULL, then\r
- the bus driver must determine if the bus controller specified\r
- by ControllerHandle and the child controller specified\r
- by RemainingDevicePath are both supported by this\r
- bus driver.\r
-\r
- @retval EFI_SUCCESS The RemainingDevicePath is supported or NULL.\r
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and\r
- RemainingDevicePath is not supported by the driver specified by This.\r
-**/\r
-EFI_STATUS\r
-IScsiIsDevicePathSupported (\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;\r
-\r
- CurrentDevicePath = RemainingDevicePath;\r
- if (CurrentDevicePath != NULL) {\r
- while (!IsDevicePathEnd (CurrentDevicePath)) {\r
- if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);\r
- }\r
-\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Tests to see if this driver supports a given controller. If a child device is provided,\r
- it further tests to see if this driver supports creating a handle for the specified child device.\r
-\r
- @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
- @param[in] ControllerHandle The handle of the controller to test. This handle\r
- must support a protocol interface that supplies\r
- an I/O abstraction to the driver.\r
- @param[in] RemainingDevicePath A pointer to the remaining portion of a device path.\r
- This parameter is ignored by device drivers, and is optional for bus drivers.\r
-\r
-\r
- @retval EFI_SUCCESS The device specified by ControllerHandle and\r
- RemainingDevicePath is supported by the driver specified by This.\r
- @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and\r
- RemainingDevicePath is already being managed by the driver\r
- specified by This.\r
- @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and\r
- RemainingDevicePath is already being managed by a different\r
- driver or an application that requires exclusive acces.\r
- Currently not implemented.\r
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and\r
- RemainingDevicePath is not supported by the driver specified by This.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IScsiDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiCallerIdGuid,\r
- NULL,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- return EFI_ALREADY_STARTED;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiTcp4ServiceBindingProtocolGuid,\r
- NULL,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- Status = IScsiIsDevicePathSupported (RemainingDevicePath);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (IScsiDhcpIsConfigured (ControllerHandle)) {\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiDhcp4ServiceBindingProtocolGuid,\r
- NULL,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Start this driver on ControllerHandle.\r
-\r
- The Start() function is designed to be invoked from the EFI boot service ConnectController().\r
- As a result, much of the error checking on the parameters to Start() has been moved into this\r
- common boot service. It is legal to call Start() from other locations, but the following calling\r
- restrictions must be followed or the system behavior will not be deterministic.\r
- 1. ControllerHandle must be a valid EFI_HANDLE.\r
- 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned\r
- EFI_DEVICE_PATH_PROTOCOL.\r
- 3. Prior to calling Start(), the Supported() function for the driver specified by This must\r
- have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.\r
-\r
- @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
- @param[in] ControllerHandle The handle of the controller to start. This handle\r
- must support a protocol interface that supplies\r
- an I/O abstraction to the driver.\r
- @param[in] RemainingDevicePath A pointer to the remaining portion of a device path.\r
- This parameter is ignored by device drivers, and is optional for bus drivers.\r
-\r
- @retval EFI_SUCCESS The device was started.\r
- @retval EFI_DEVICE_ERROR The device could not be started due to a device error.\r
- Currently not implemented.\r
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
- @retval Others The driver failded to start the device.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IScsiDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- ISCSI_DRIVER_DATA *Private;\r
- VOID *Interface;\r
-\r
- Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle);\r
- if (Private == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- //\r
- // Create a underlayer child instance, but not need to configure it. Just open ChildHandle\r
- // via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle.\r
- // Therefore, when DisconnectController(), especially VLAN virtual controller handle,\r
- // IScsiDriverBindingStop() will be called.\r
- //\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiTcp4ServiceBindingProtocolGuid,\r
- &Private->ChildHandle\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->ChildHandle,\r
- &gEfiTcp4ProtocolGuid,\r
- &Interface,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Always install private protocol no matter what happens later. We need to\r
- // keep the relationship between ControllerHandle and ChildHandle.\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &ControllerHandle,\r
- &gEfiCallerIdGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &Private->IScsiIdentifier\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Try to add a port configuration page for this controller.\r
- //\r
- IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE);\r
-\r
- //\r
- // Get the iSCSI configuration data of this controller.\r
- //\r
- Status = IScsiGetConfigData (Private);\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
- //\r
- // Try to login and create an iSCSI session according to the configuration.\r
- //\r
- Status = IScsiSessionLogin (Private);\r
- if (Status == EFI_MEDIA_CHANGED) {\r
- //\r
- // The specified target is not available and the redirection information is\r
- // got, login the session again with the updated target address.\r
- //\r
- Status = IScsiSessionLogin (Private);\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
- //\r
- // Duplicate the Session's tcp connection device path. The source port field\r
- // will be set to zero as one iSCSI session is comprised of several iSCSI\r
- // connections.\r
- //\r
- Private->DevicePath = IScsiGetTcpConnDevicePath (Private);\r
- if (Private->DevicePath == NULL) {\r
- goto ON_ERROR;\r
- }\r
- //\r
- // Install the updated device path onto the ExtScsiPassThruHandle.\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &Private->ExtScsiPassThruHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- Private->DevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER.\r
- //\r
- Status = gBS->OpenProtocol (\r
- Private->ChildHandle, /// Default Tcp child\r
- &gEfiTcp4ProtocolGuid,\r
- &Interface,\r
- This->DriverBindingHandle,\r
- Private->ExtScsiPassThruHandle,\r
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- Private->ExtScsiPassThruHandle,\r
- &gEfiExtScsiPassThruProtocolGuid,\r
- &Private->IScsiExtScsiPassThru,\r
- &gEfiDevicePathProtocolGuid,\r
- Private->DevicePath,\r
- NULL\r
- );\r
-\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Update/Publish the iSCSI Boot Firmware Table.\r
- //\r
- IScsiPublishIbft ();\r
-\r
- return EFI_SUCCESS;\r
-\r
-ON_ERROR:\r
-\r
- IScsiSessionAbort (&Private->Session);\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Stop this driver on ControllerHandle.\r
-\r
- Release the control of this controller and remove the IScsi functions. The Stop()\r
- function is designed to be invoked from the EFI boot service DisconnectController().\r
- As a result, much of the error checking on the parameters to Stop() has been moved\r
- into this common boot service. It is legal to call Stop() from other locations,\r
- but the following calling restrictions must be followed or the system behavior will not be deterministic.\r
- 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this\r
- same driver's Start() function.\r
- 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid\r
- EFI_HANDLE. In addition, all of these handles must have been created in this driver's\r
- Start() function, and the Start() function must have called OpenProtocol() on\r
- ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.\r
-\r
- @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
- @param[in] ControllerHandle A handle to the device being stopped. The handle must\r
- support a bus specific I/O protocol for the driver\r
- to use to stop the device.\r
- @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used.\r
- @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL\r
- if NumberOfChildren is 0.Not used.\r
-\r
- @retval EFI_SUCCESS The device was stopped.\r
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.\r
- @retval EFI_INVALID_PARAMETER Child handle is NULL.\r
- @retval EFI_ACCESS_DENIED The protocol could not be removed from the Handle\r
- because its interfaces are being used.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IScsiDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer OPTIONAL\r
- )\r
-{\r
- EFI_HANDLE IScsiController;\r
- EFI_STATUS Status;\r
- ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;\r
- ISCSI_DRIVER_DATA *Private;\r
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;\r
- ISCSI_CONNECTION *Conn;\r
-\r
- if (NumberOfChildren != 0) {\r
- //\r
- // We should have only one child.\r
- //\r
- Status = gBS->OpenProtocol (\r
- ChildHandleBuffer[0],\r
- &gEfiExtScsiPassThruProtocolGuid,\r
- (VOID **) &PassThru,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);\r
- Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link);\r
-\r
- //\r
- // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close\r
- // the protocol here but not uninstall the device path protocol and\r
- // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.\r
- //\r
- gBS->CloseProtocol (\r
- Private->ChildHandle,\r
- &gEfiTcp4ProtocolGuid,\r
- Private->Image,\r
- Private->ExtScsiPassThruHandle\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Conn->Tcp4Io.Handle,\r
- &gEfiTcp4ProtocolGuid,\r
- Private->Image,\r
- Private->ExtScsiPassThruHandle\r
- );\r
-\r
- return EFI_SUCCESS;\r
- }\r
- //\r
- // Get the handle of the controller we are controling.\r
- //\r
- IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);\r
-\r
- Status = gBS->OpenProtocol (\r
- IScsiController,\r
- &gEfiCallerIdGuid,\r
- (VOID **)&IScsiIdentifier,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);\r
-\r
- if (Private->ChildHandle != NULL) {\r
- Status = gBS->CloseProtocol (\r
- Private->ChildHandle,\r
- &gEfiTcp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- IScsiController\r
- );\r
-\r
- ASSERT (!EFI_ERROR (Status));\r
-\r
- Status = NetLibDestroyServiceChild (\r
- IScsiController,\r
- This->DriverBindingHandle,\r
- &gEfiTcp4ServiceBindingProtocolGuid,\r
- Private->ChildHandle\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);\r
-\r
- //\r
- // Uninstall the private protocol.\r
- //\r
- gBS->UninstallProtocolInterface (\r
- IScsiController,\r
- &gEfiCallerIdGuid,\r
- &Private->IScsiIdentifier\r
- );\r
-\r
- //\r
- // Update the iSCSI Boot Firware Table.\r
- //\r
- IScsiPublishIbft ();\r
-\r
- IScsiSessionAbort (&Private->Session);\r
- Status = IScsiCleanDriverData (Private);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Unloads an image(the iSCSI driver).\r
-\r
- @param[in] ImageHandle Handle that identifies the image to be unloaded.\r
-\r
- @retval EFI_SUCCESS The image has been unloaded.\r
- @retval Others Other errors as indicated.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EfiIScsiUnload (\r
- IN EFI_HANDLE ImageHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN DeviceHandleCount;\r
- EFI_HANDLE *DeviceHandleBuffer;\r
- UINTN Index;\r
- EFI_COMPONENT_NAME_PROTOCOL *ComponentName;\r
- EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;\r
-\r
- //\r
- // Try to disonnect the driver from the devices it's controlling.\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- &DeviceHandleCount,\r
- &DeviceHandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- for (Index = 0; Index < DeviceHandleCount; Index++) {\r
- Status = IScsiTestManagedDevice (\r
- DeviceHandleBuffer[Index],\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- &gEfiTcp4ProtocolGuid\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- Status = gBS->DisconnectController (\r
- DeviceHandleBuffer[Index],\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- }\r
-\r
- //\r
- // Unload the iSCSI configuration form.\r
- //\r
- Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
-\r
- //\r
- // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle\r
- // if it has been installed.\r
- //\r
- Status = gBS->HandleProtocol (\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- &gEfiComponentNameProtocolGuid,\r
- (VOID **) &ComponentName\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- &gEfiComponentNameProtocolGuid,\r
- ComponentName,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- &gEfiComponentName2ProtocolGuid,\r
- (VOID **) &ComponentName2\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- gIScsiDriverBinding.DriverBindingHandle,\r
- &gEfiComponentName2ProtocolGuid,\r
- ComponentName2,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- }\r
-\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- ImageHandle,\r
- &gEfiDriverBindingProtocolGuid,\r
- &gIScsiDriverBinding,\r
- &gEfiIScsiInitiatorNameProtocolGuid,\r
- &gIScsiInitiatorName,\r
- NULL\r
- );\r
-ON_EXIT:\r
-\r
- if (DeviceHandleBuffer != NULL) {\r
- FreePool (DeviceHandleBuffer);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- This is the declaration of an EFI image entry point. This entry point is\r
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
- both device drivers and bus drivers. It initialize the global variables and\r
- publish the driver binding protocol.\r
-\r
- @param[in] ImageHandle The firmware allocated handle for the UEFI image.\r
- @param[in] SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly.\r
- @retval Others Other errors as indicated.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IScsiDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName;\r
-\r
- //\r
- // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiIScsiInitiatorNameProtocolGuid,\r
- NULL,\r
- (VOID**) &IScsiInitiatorName\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- return EFI_ACCESS_DENIED;\r
- }\r
-\r
- //\r
- // Initialize the EFI Driver Library\r
- //\r
- Status = EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle,\r
- SystemTable,\r
- &gIScsiDriverBinding,\r
- ImageHandle,\r
- &gIScsiComponentName,\r
- &gIScsiComponentName2\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Install the iSCSI Initiator Name Protocol.\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &ImageHandle,\r
- &gEfiIScsiInitiatorNameProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gIScsiInitiatorName\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- ImageHandle,\r
- &gEfiDriverBindingProtocolGuid,\r
- &gIScsiDriverBinding,\r
- &gEfiComponentName2ProtocolGuid,\r
- &gIScsiComponentName2,\r
- &gEfiComponentNameProtocolGuid,\r
- &gIScsiComponentName,\r
- NULL\r
- );\r
- return Status;\r
- }\r
-\r
- //\r
- // Initialize the configuration form of iSCSI.\r
- //\r
- Status = IScsiConfigFormInit ();\r
- if (EFI_ERROR (Status)) {\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- ImageHandle,\r
- &gEfiDriverBindingProtocolGuid,\r
- &gIScsiDriverBinding,\r
- &gEfiComponentName2ProtocolGuid,\r
- &gIScsiComponentName2,\r
- &gEfiComponentNameProtocolGuid,\r
- &gIScsiComponentName,\r
- &gEfiIScsiInitiatorNameProtocolGuid,\r
- &gIScsiInitiatorName,\r
- NULL\r
- );\r
- }\r
- }\r
- return Status;\r
-}\r
-\r