]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
Remove iScsi driver's dependency on IntelFrameworkPkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / IScsiConfig.c
index 6d143ffa0a6179ed99bbee054e42eab56d6db789..0025f24bc1c9703947f2c6ab2bea9c66b55f0aa0 100644 (file)
@@ -1,5 +1,5 @@
 /** @file\r
-  Helper functions for configuring or getting the parameters relating to ISCSI.\r
+  Helper functions for configuring or getting the parameters relating to iSCSI.\r
 \r
 Copyright (c) 2004 - 2008, Intel Corporation.<BR>\r
 All rights reserved. This program and the accompanying materials\r
@@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "IScsiImpl.h"\r
 \r
 EFI_GUID        mVendorGuid              = ISCSI_CONFIG_GUID;\r
+CHAR16          mVendorStorageName[]     = L"ISCSI_CONFIG_IFR_NVDATA";\r
 BOOLEAN         mIScsiDeviceListUpdated  = FALSE;\r
 UINTN           mNumberOfIScsiDevices    = 0;\r
 ISCSI_FORM_CALLBACK_INFO  *mCallbackInfo = NULL;\r
@@ -24,6 +25,31 @@ LIST_ENTRY      mIScsiConfigFormList = {
   &mIScsiConfigFormList\r
 };\r
 \r
+HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {49D7B73E-143D-4716-977B-C45F1CB038CC}\r
+    //\r
+    { 0x49d7b73e, 0x143d, 0x4716, { 0x97, 0x7b, 0xc4, 0x5f, 0x1c, 0xb0, 0x38, 0xcc } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
 /**\r
   Convert the IPv4 address into a dotted string.\r
 \r
@@ -39,21 +65,6 @@ IScsiIpToStr (
   UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);\r
 }\r
 \r
-/**\r
-  Pop up an invalid notify which displays the message in Warning.\r
-\r
-  @param[in]  Warning  The warning message.\r
-**/\r
-VOID\r
-PopUpInvalidNotify (\r
-  IN CHAR16 *Warning\r
-  )\r
-{\r
-  EFI_INPUT_KEY             Key;\r
-\r
-  IfrLibCreatePopUp (1, &Key, Warning);\r
-}\r
-\r
 /**\r
   Update the list of iSCSI devices the iSCSI driver is controlling.\r
   \r
@@ -398,7 +409,7 @@ IScsiFormExtractConfig (
   driver followed by name / value configuration pairs. The driver\r
   must apply those pairs to its configurable storage. If the\r
   driver's configuration is stored in a linear block of data\r
-  and the driver????s name / value pairs are in <BlockConfig>\r
+  and the driver's name / value pairs are in <BlockConfig>\r
   format, it may use the ConfigToBlock helper function (above) to\r
   simplify the job. Currently not implemented.\r
 \r
@@ -487,20 +498,19 @@ IScsiFormCallback (
   EFI_IP_ADDRESS            SubnetMask;\r
   EFI_IP_ADDRESS            Gateway;\r
   EFI_STATUS                Status;\r
+  EFI_INPUT_KEY             Key;\r
 \r
   Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
 \r
   //\r
   // Retrive uncommitted data from Browser\r
   //\r
-  BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
-  IfrNvData = AllocateZeroPool (BufferSize);\r
-  ASSERT (IfrNvData != NULL);\r
-  Status = GetBrowserData (NULL, NULL, &BufferSize, (UINT8 *) IfrNvData);\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (IfrNvData);\r
-    return Status;\r
+  IfrNvData = (ISCSI_CONFIG_IFR_NVDATA *) HiiGetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA));\r
+  if (IfrNvData == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
+  \r
+  Status = EFI_SUCCESS;\r
 \r
   switch (QuestionId) {\r
   case KEY_INITIATOR_NAME:\r
@@ -509,7 +519,7 @@ IScsiFormCallback (
 \r
     Status      = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
     }\r
 \r
     break;\r
@@ -518,7 +528,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
     if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-      PopUpInvalidNotify (L"Invalid IP address!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
@@ -530,7 +540,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);\r
     if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {\r
-      PopUpInvalidNotify (L"Invalid Subnet Mask!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
@@ -542,7 +552,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);\r
     if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {\r
-      PopUpInvalidNotify (L"Invalid Gateway!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
@@ -554,7 +564,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
     if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-      PopUpInvalidNotify (L"Invalid IP address!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));\r
@@ -566,7 +576,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);\r
     Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
     } else {\r
       AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);\r
     }\r
@@ -584,7 +594,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);\r
     Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid LUN string!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);\r
     } else {\r
       CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));\r
     }\r
@@ -636,11 +646,11 @@ IScsiFormCallback (
 \r
         if ((Gateway.Addr[0] != 0)) {\r
           if (SubnetMask.Addr[0] == 0) {\r
-            PopUpInvalidNotify (L"Gateway address is set but subnet mask is zero.");\r
+            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);\r
             Status = EFI_INVALID_PARAMETER;\r
             break;\r
           } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {\r
-            PopUpInvalidNotify (L"Local IP and Gateway are not in the same subnet.");\r
+            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);\r
             Status = EFI_INVALID_PARAMETER;\r
             break;\r
           }\r
@@ -652,7 +662,7 @@ IScsiFormCallback (
       if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {\r
         CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));\r
         if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-          PopUpInvalidNotify (L"Target IP is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
@@ -660,7 +670,7 @@ IScsiFormCallback (
 \r
       if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {\r
         if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {\r
-          PopUpInvalidNotify (L"CHAP Name or CHAP Secret is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
@@ -668,7 +678,7 @@ IScsiFormCallback (
         if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&\r
             ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))\r
             ) {\r
-          PopUpInvalidNotify (L"Reverse CHAP Name or Reverse CHAP Secret is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
@@ -705,7 +715,7 @@ IScsiFormCallback (
 \r
       UnicodeSPrint (PortString, (UINTN) 128, L"Port %s", ConfigFormEntry->MacString);\r
       DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;\r
-      HiiLibSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString);\r
+      HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);\r
 \r
       IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);\r
 \r
@@ -719,11 +729,10 @@ IScsiFormCallback (
     //\r
     // Pass changed uncommitted data back to Form Browser\r
     //\r
-    BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
-    Status = SetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData, NULL);\r
+    HiiSetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);\r
   }\r
 \r
-  gBS->FreePool (IfrNvData);\r
+  FreePool (IfrNvData);\r
   return Status;\r
 }\r
 \r
@@ -750,12 +759,14 @@ IScsiConfigUpdateForm (
   ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;\r
   BOOLEAN                     EntryExisted;\r
   EFI_STATUS                  Status;\r
-  EFI_HII_UPDATE_DATA         UpdateData;\r
   EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
   CHAR16                      PortString[128];\r
   UINT16                      FormIndex;\r
   UINTN                       BufferSize;\r
-\r
+  VOID                        *StartOpCodeHandle;\r
+  VOID                        *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL          *StartLabel;\r
+  EFI_IFR_GUID_LABEL          *EndLabel;\r
 \r
   ConfigFormEntry = NULL;\r
   EntryExisted    = FALSE;\r
@@ -829,13 +840,13 @@ IScsiConfigUpdateForm (
       // Compose the Port string and create a new EFI_STRING_ID.\r
       //\r
       UnicodeSPrint (PortString, 128, L"Port %s", ConfigFormEntry->MacString);\r
-      HiiLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleToken, PortString);\r
+      ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);\r
 \r
       //\r
       // Compose the help string of this port and create a new EFI_STRING_ID.\r
       //\r
       UnicodeSPrint (PortString, 128, L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);\r
-      HiiLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleHelpToken, PortString);\r
+      ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);\r
 \r
       InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);\r
       mNumberOfIScsiDevices++;\r
@@ -850,36 +861,56 @@ IScsiConfigUpdateForm (
   //\r
   // Allocate space for creation of Buffer\r
   //\r
-  UpdateData.BufferSize = 0x1000;\r
-  UpdateData.Data = AllocateZeroPool (0x1000);\r
-  UpdateData.Offset = 0;\r
+\r
+  //\r
+  // Init OpCode Handle\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = DEVICE_ENTRY_LABEL;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
 \r
   FormIndex = 0;\r
   NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {\r
     ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);\r
 \r
-    CreateGotoOpCode (\r
-      FORMID_DEVICE_FORM,\r
-      ConfigFormEntry->PortTitleToken,\r
-      ConfigFormEntry->PortTitleHelpToken,\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex),\r
-      &UpdateData\r
+    HiiCreateGotoOpCode (\r
+      StartOpCodeHandle,                            // Container for dynamic created opcodes\r
+      FORMID_DEVICE_FORM,                           // Target Form ID\r
+      ConfigFormEntry->PortTitleToken,              // Prompt text\r
+      ConfigFormEntry->PortTitleHelpToken,          // Help text\r
+      EFI_IFR_FLAG_CALLBACK,                        // Question flag\r
+      (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex)   // Question ID\r
       );\r
 \r
     FormIndex++;\r
   }\r
 \r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     mCallbackInfo->RegisteredHandle,\r
     &mVendorGuid,\r
     FORMID_MAIN_FORM,\r
-    DEVICE_ENTRY_LABEL,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL\r
+    EndOpCodeHandle    // LABEL_END\r
     );\r
 \r
-  gBS->FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -900,7 +931,6 @@ IScsiConfigFormInit (
 {\r
   EFI_STATUS                  Status;\r
   EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;\r
-  EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
   ISCSI_FORM_CALLBACK_INFO    *CallbackInfo;\r
 \r
   Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase);\r
@@ -908,7 +938,7 @@ IScsiConfigFormInit (
     return Status;\r
   }\r
 \r
-  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocatePool (sizeof (ISCSI_FORM_CALLBACK_INFO));\r
+  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO));\r
   if (CallbackInfo == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -928,41 +958,31 @@ IScsiConfigFormInit (
   }\r
 \r
   //\r
-  // Create driver handle used by HII database\r
-  //\r
-  Status = HiiLibCreateHiiDriverHandle (&CallbackInfo->DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool(CallbackInfo);\r
-    return Status;\r
-  }\r
-  \r
-  //\r
-  // Install Config Access protocol to driver handle\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
   //\r
-  Status = gBS->InstallProtocolInterface (\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &CallbackInfo->DriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mIScsiHiiVendorDevicePath,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &CallbackInfo->ConfigAccess\r
+                  &CallbackInfo->ConfigAccess,\r
+                  NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
   \r
   //\r
   // Publish our HII data\r
   //\r
-  PackageList = HiiLibPreparePackageList (2, &mVendorGuid, IScsiDxeStrings, IScsiConfigDxeBin);\r
-  ASSERT (PackageList != NULL);\r
-  \r
-  Status = HiiDatabase->NewPackageList (\r
-                           HiiDatabase,\r
-                           PackageList,\r
-                           CallbackInfo->DriverHandle,\r
-                           &CallbackInfo->RegisteredHandle\r
-                           );\r
-  FreePool (PackageList);\r
-  if (EFI_ERROR (Status)) {\r
+  CallbackInfo->RegisteredHandle = HiiAddPackages (\r
+                                     &mVendorGuid,\r
+                                     CallbackInfo->DriverHandle,\r
+                                     IScsiDxeStrings,\r
+                                     IScsiConfigDxeBin,\r
+                                     NULL\r
+                                     );\r
+  if (CallbackInfo->RegisteredHandle == NULL) {\r
     FreePool(CallbackInfo);\r
-    return Status;\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   mCallbackInfo = CallbackInfo;\r
@@ -1010,13 +1030,14 @@ IScsiConfigFormUnload (
   //\r
   // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL\r
   //\r
-  gBS->UninstallProtocolInterface (\r
-        mCallbackInfo->DriverHandle,\r
-        &gEfiHiiConfigAccessProtocolGuid,\r
-        &mCallbackInfo->ConfigAccess\r
-        );\r
-  HiiLibDestroyHiiDriverHandle (mCallbackInfo->DriverHandle);\r
-\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         mCallbackInfo->DriverHandle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         &mIScsiHiiVendorDevicePath,\r
+         &gEfiHiiConfigAccessProtocolGuid,\r
+         &mCallbackInfo->ConfigAccess,\r
+         NULL\r
+         );\r
   gBS->FreePool (mCallbackInfo);\r
 \r
   return EFI_SUCCESS;\r