]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/iScsi/IScsiConfig.c
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / MdeModulePkg / Universal / iScsi / IScsiConfig.c
index a8ef2c79b61982efab991aeaaf86d02c99f49770..67dcb8b2ae17bc32fcde482499e999ea1523bed1 100644 (file)
@@ -22,6 +22,7 @@ Abstract:
 EFI_GUID        mVendorGuid             = ISCSI_CONFIG_GUID;\r
 BOOLEAN         mIScsiDeviceListUpdated = FALSE;\r
 UINTN           mNumberOfIScsiDevices   = 0;\r
+ISCSI_FORM_CALLBACK_INFO  *mCallbackInfo;\r
 \r
 NET_LIST_ENTRY  mIScsiConfigFormList = {\r
   &mIScsiConfigFormList,\r
@@ -74,21 +75,9 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_FORM_BROWSER_PROTOCOL *FormBrowser;\r
-  EFI_STATUS                Status;\r
   EFI_INPUT_KEY             Key;\r
-  CHAR16                    Buffer[10];\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiFormBrowserProtocolGuid,\r
-                  NULL,\r
-                  (VOID **)&FormBrowser\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return ;\r
-  }\r
 \r
-  FormBrowser->CreatePopUp (1, TRUE, 10, Buffer, &Key, Warning);\r
+  IfrLibCreatePopUp (1, &Key, Warning);\r
 }\r
 \r
 EFI_STATUS\r
@@ -335,42 +324,47 @@ Returns:
   IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData->ReverseCHAPSecret);\r
 }\r
 \r
+\r
 EFI_STATUS\r
 EFIAPI\r
-IScsiFormNvRead (\r
-  IN     EFI_FORM_CALLBACK_PROTOCOL    * This,\r
-  IN     CHAR16                        *VariableName,\r
-  IN     EFI_GUID                      * VendorGuid,\r
-  OUT    UINT32                        *Attributes OPTIONAL,\r
-  IN OUT UINTN                         *DataSize,\r
-  OUT    VOID                          *Buffer\r
+IScsiFormExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
   )\r
 /*++\r
 \r
-Routine Description:\r
-\r
-  NV read function for the iSCSI form callback protocol.\r
-\r
-Arguments:\r
-\r
-  This         - The EFI form callback protocol instance.\r
-  VariableName - Name of the variable to read.\r
-  VendorGuid   - Guid of the variable to read.\r
-  Attributes   - The storage to get the attributes of the variable.\r
-  DataSize     - The size of the buffer to store the variable.\r
-  Buffer       - The buffer to store the variable to read.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS          - The variable is read.\r
-  EFI_BUFFER_TOO_SMALL - The buffer provided is too small to hold the variable.\r
+  Routine Description:\r
+    This function allows a caller to extract the current configuration for one\r
+    or more named elements from the target driver.\r
+\r
+  Arguments:\r
+    This       - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+    Request    - A null-terminated Unicode string in <ConfigRequest> format.\r
+    Progress   - On return, points to a character in the Request string.\r
+                 Points to the string's null terminator if request was successful.\r
+                 Points to the most recent '&' before the first failing name/value\r
+                 pair (or the beginning of the string if the failure is in the\r
+                 first name/value pair) if the request was not successful.\r
+    Results    - A null-terminated Unicode string in <ConfigAltResp> format which\r
+                 has all values filled in for the names in the Request string.\r
+                 String to be allocated by the called function.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The Results is filled with the requested values.\r
+    EFI_OUT_OF_RESOURCES  - Not enough memory to store the results.\r
+    EFI_INVALID_PARAMETER - Request is NULL, illegal syntax, or unknown name.\r
+    EFI_NOT_FOUND         - Routing data doesn't match any storage in this driver.\r
 \r
 --*/\r
 {\r
-  EFI_STATUS              Status;\r
-  CHAR8                   InitiatorName[ISCSI_NAME_IFR_MAX_SIZE];\r
-  UINTN                   BufferSize;\r
-  ISCSI_CONFIG_IFR_NVDATA *IfrNvData;\r
+  EFI_STATUS                       Status;\r
+  CHAR8                            InitiatorName[ISCSI_NAME_IFR_MAX_SIZE];\r
+  UINTN                            BufferSize;\r
+  ISCSI_CONFIG_IFR_NVDATA          *IfrNvData;\r
+  ISCSI_FORM_CALLBACK_INFO         *Private;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
 \r
   if (!mIScsiDeviceListUpdated) {\r
     //\r
@@ -380,9 +374,14 @@ Returns:
     mIScsiDeviceListUpdated = TRUE;\r
   }\r
 \r
-  IfrNvData   = (ISCSI_CONFIG_IFR_NVDATA *) Buffer;\r
-  BufferSize  = ISCSI_NAME_IFR_MAX_SIZE;\r
+  Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
+  IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));\r
+  ASSERT (IfrNvData != NULL);\r
+  if (Private->Current != NULL) {\r
+    IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);\r
+  }\r
 \r
+  BufferSize  = ISCSI_NAME_IFR_MAX_SIZE;\r
   Status      = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);\r
   if (EFI_ERROR (Status)) {\r
     IfrNvData->InitiatorName[0] = L'\0';\r
@@ -390,37 +389,82 @@ Returns:
     IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  //\r
+  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
+  //\r
+  HiiConfigRouting = Private->ConfigRouting;\r
+  BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
+  Status = HiiConfigRouting->BlockToConfig (\r
+                               HiiConfigRouting,\r
+                               Request,\r
+                               (UINT8 *) IfrNvData,\r
+                               BufferSize,\r
+                               Results,\r
+                               Progress\r
+                               );\r
+  NetFreePool (IfrNvData);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
 EFIAPI\r
-IScsiFormCallback (\r
-  IN EFI_FORM_CALLBACK_PROTOCOL       *This,\r
-  IN UINT16                           KeyValue,\r
-  IN EFI_IFR_DATA_ARRAY               *Data,\r
-  OUT EFI_HII_CALLBACK_PACKET         **Packet\r
+IScsiFormRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
   )\r
 /*++\r
 \r
-Routine Description:\r
+  Routine Description:\r
+    This function processes the results of changes in configuration.\r
 \r
-  The form callback function for iSCSI form callback protocol, it processes\r
-  the events tiggered in the UI and take some operations to update the form,\r
-  store the data, etc.\r
+  Arguments:\r
+    This          - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+    Configuration - A null-terminated Unicode string in <ConfigResp> format.\r
+    Progress      - A pointer to a string filled in with the offset of the most\r
+                    recent '&' before the first failing name/value pair (or the\r
+                    beginning of the string if the failure is in the first\r
+                    name/value pair) or the terminating NULL if all was successful.\r
 \r
-Arguments:\r
+  Returns:\r
+    EFI_SUCCESS           - The Results is processed successfully.\r
+    EFI_INVALID_PARAMETER - Configuration is NULL.\r
+    EFI_NOT_FOUND         - Routing data doesn't match any storage in this driver.\r
 \r
-  This     - The EFI form callback protocol instance.\r
-  KeyValue - A unique value which is sent to the original exporting driver so that it\r
-             can identify the type of data to expect.  The format of the data tends to\r
-             vary based on the op-code that geerated the callback.\r
-  Data     - A pointer to the data being sent to the original exporting driver.\r
+--*/\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
 \r
-Returns:\r
+EFI_STATUS\r
+EFIAPI\r
+IScsiFormCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        KeyValue,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    This function processes the results of changes in configuration.\r
 \r
-  EFI_SUCCESS           - The data is valid and the correspondance operation is done.\r
-  EFI_INVALID_PARAMETER - The data is invalid.\r
+  Arguments:\r
+    This          - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+    Action        - Specifies the type of action taken by the browser.\r
+    QuestionId    - A unique value which is sent to the original exporting driver\r
+                    so that it can identify the type of data to expect.\r
+    Type          - The type of value for the question.\r
+    Value         - A pointer to the data being sent to the original exporting driver.\r
+    ActionRequest - On return, points to the action requested by the callback function.\r
+\r
+  Returns:\r
+    EFI_SUCCESS          - The callback successfully handled the action.\r
+    EFI_OUT_OF_RESOURCES - Not enough storage is available to hold the variable and its data.\r
+    EFI_DEVICE_ERROR     - The variable could not be saved.\r
+    EFI_UNSUPPORTED      - The specified Action is not supported by the callback.\r
 \r
 --*/\r
 {\r
@@ -440,8 +484,18 @@ Returns:
   EFI_STATUS                Status;\r
 \r
   Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
-  IfrNvData = (ISCSI_CONFIG_IFR_NVDATA *) Data->NvRamMap;\r
-  Status    = EFI_SUCCESS;\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
+  }\r
 \r
   switch (KeyValue) {\r
   case KEY_INITIATOR_NAME:\r
@@ -633,7 +687,7 @@ Returns:
           BufferSize,\r
           &Private->Current->AuthConfigData\r
           );\r
-\r
+    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
     break;\r
 \r
   default:\r
@@ -644,16 +698,9 @@ Returns:
       ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (KeyValue - KEY_DEVICE_ENTRY_BASE));\r
       ASSERT (ConfigFormEntry != NULL);\r
 \r
-      UnicodeSPrint (PortString, 128, L"Port %s", ConfigFormEntry->MacString);\r
+      UnicodeSPrint (PortString, (UINTN) 128, L"Port %s", ConfigFormEntry->MacString);\r
       DeviceFormTitleToken = (STRING_REF) STR_ISCSI_DEVICE_FORM_TITLE;\r
-\r
-      Private->Hii->NewString (\r
-                      Private->Hii,\r
-                      NULL,\r
-                      Private->RegisteredHandle,\r
-                      &DeviceFormTitleToken,\r
-                      PortString\r
-                      );\r
+      IfrLibSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString);\r
 \r
       IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);\r
 \r
@@ -663,9 +710,19 @@ Returns:
     break;\r
   }\r
 \r
+  if (!EFI_ERROR (Status)) {\r
+    //\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
+  }\r
+\r
+  NetFreePool (IfrNvData);\r
   return Status;\r
 }\r
 \r
+\r
 EFI_STATUS\r
 IScsiConfigUpdateForm (\r
   IN EFI_HANDLE  DriverBindingHandle,\r
@@ -695,28 +752,13 @@ Returns:
   NET_LIST_ENTRY              *Entry;\r
   ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;\r
   BOOLEAN                     EntryExisted;\r
-  EFI_HII_UPDATE_DATA         *UpdateData;\r
   EFI_STATUS                  Status;\r
-  EFI_FORM_CALLBACK_PROTOCOL  *Callback;\r
-  ISCSI_FORM_CALLBACK_INFO    *CallbackInfo;\r
+  EFI_HII_UPDATE_DATA         UpdateData;\r
   EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
   CHAR16                      PortString[128];\r
   UINT16                      FormIndex;\r
   UINTN                       BufferSize;\r
 \r
-  //\r
-  // Get the EFI_FORM_CALLBACK_PROTOCOL.\r
-  //\r
-  Status = gBS->HandleProtocol (\r
-                  DriverBindingHandle,\r
-                  &gEfiFormCallbackProtocolGuid,\r
-                  (VOID **)&Callback\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  CallbackInfo    = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (Callback);\r
 \r
   ConfigFormEntry = NULL;\r
   EntryExisted    = FALSE;\r
@@ -790,25 +832,13 @@ Returns:
       // Compose the Port string and create a new STRING_REF.\r
       //\r
       UnicodeSPrint (PortString, 128, L"Port %s", ConfigFormEntry->MacString);\r
-      CallbackInfo->Hii->NewString (\r
-                          CallbackInfo->Hii,\r
-                          NULL,\r
-                          CallbackInfo->RegisteredHandle,\r
-                          &ConfigFormEntry->PortTitleToken,\r
-                          PortString\r
-                          );\r
+      IfrLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleToken, PortString);\r
 \r
       //\r
       // Compose the help string of this port and create a new STRING_REF.\r
       //\r
       UnicodeSPrint (PortString, 128, L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);\r
-      CallbackInfo->Hii->NewString (\r
-                          CallbackInfo->Hii,\r
-                          NULL,\r
-                          CallbackInfo->RegisteredHandle,\r
-                          &ConfigFormEntry->PortTitleHelpToken,\r
-                          PortString\r
-                          );\r
+      IfrLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleHelpToken, PortString);\r
 \r
       NetListInsertTail (&mIScsiConfigFormList, &ConfigFormEntry->Link);\r
       mNumberOfIScsiDevices++;\r
@@ -823,37 +853,11 @@ Returns:
   //\r
   // Allocate space for creation of Buffer\r
   //\r
-  UpdateData = (EFI_HII_UPDATE_DATA *) NetAllocatePool (0x1000);\r
-  NetZeroMem (UpdateData, 0x1000);\r
-\r
-  //\r
-  // Flag update pending in FormSet\r
-  //\r
-  UpdateData->FormSetUpdate = TRUE;\r
-\r
-  //\r
-  // Register CallbackHandle data for FormSet\r
-  //\r
-  UpdateData->FormCallbackHandle  = (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackInfo->CallbackHandle;\r
-  UpdateData->FormUpdate          = FALSE;\r
-  UpdateData->FormTitle           = 0;\r
-\r
-  //\r
-  // first of all, remove all the forms.\r
-  //\r
-  UpdateData->DataCount = 0xFF;\r
-\r
-  CallbackInfo->Hii->UpdateForm (\r
-                      CallbackInfo->Hii,\r
-                      CallbackInfo->RegisteredHandle,\r
-                      (EFI_FORM_LABEL) DEVICE_ENTRY_LABEL,\r
-                      FALSE,\r
-                      UpdateData\r
-                      );\r
-\r
-  UpdateData->DataCount = 1;\r
-  FormIndex             = 0;\r
+  UpdateData.BufferSize = 0x1000;\r
+  UpdateData.Data = NetAllocateZeroPool (0x1000);\r
+  UpdateData.Offset = 0;\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
@@ -861,23 +865,24 @@ Returns:
       FORMID_DEVICE_FORM,\r
       ConfigFormEntry->PortTitleToken,\r
       ConfigFormEntry->PortTitleHelpToken,\r
-      EFI_IFR_FLAG_INTERACTIVE,\r
-      (UINT16) (KEY_DEVICE_ENTRY_BASE + FormIndex),\r
-      &UpdateData->Data\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      KEY_DEVICE_ENTRY_BASE + FormIndex,\r
+      &UpdateData\r
       );\r
 \r
-    CallbackInfo->Hii->UpdateForm (\r
-                        CallbackInfo->Hii,\r
-                        CallbackInfo->RegisteredHandle,\r
-                        (EFI_FORM_LABEL) DEVICE_ENTRY_LABEL,\r
-                        TRUE,\r
-                        UpdateData\r
-                        );\r
-\r
     FormIndex++;\r
   }\r
 \r
-  NetFreePool (UpdateData);\r
+  IfrLibUpdateForm (\r
+    mCallbackInfo->RegisteredHandle,\r
+    &mVendorGuid,\r
+    FORMID_MAIN_FORM,\r
+    DEVICE_ENTRY_LABEL,\r
+    FALSE,\r
+    &UpdateData\r
+    );\r
+\r
+  NetFreePool (UpdateData.Data);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -903,17 +908,14 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_HII_PROTOCOL          *Hii;\r
-  EFI_HII_PACKAGES          *PackageList;\r
-  EFI_HII_HANDLE            HiiHandle;\r
-  EFI_HII_UPDATE_DATA       *UpdateData;\r
-  ISCSI_FORM_CALLBACK_INFO  *CallbackInfo;\r
-  EFI_GUID                  StringPackGuid = ISCSI_CONFIG_GUID;\r
-\r
-  Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, (VOID **)&Hii);\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, &HiiDatabase);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;;\r
+    return Status;\r
   }\r
 \r
   CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) NetAllocatePool (sizeof (ISCSI_FORM_CALLBACK_INFO));\r
@@ -922,59 +924,55 @@ Returns:
   }\r
 \r
   CallbackInfo->Signature             = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;\r
-  CallbackInfo->Hii                   = Hii;\r
+  CallbackInfo->HiiDatabase = HiiDatabase;\r
   CallbackInfo->Current               = NULL;\r
 \r
-  CallbackInfo->FormCallback.NvRead   = IScsiFormNvRead;\r
-  CallbackInfo->FormCallback.NvWrite  = NULL;\r
-  CallbackInfo->FormCallback.Callback = IScsiFormCallback;\r
+  CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;\r
+  CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;\r
+  CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;\r
 \r
+  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, &CallbackInfo->ConfigRouting);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Create driver handle used by HII database\r
+  //\r
+  Status = HiiLibCreateHiiDriverHandle (&CallbackInfo->DriverHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  \r
   //\r
-  // Install protocol interface\r
+  // Install Config Access protocol to driver handle\r
   //\r
   Status = gBS->InstallProtocolInterface (\r
-                  &DriverBindingHandle,\r
-                  &gEfiFormCallbackProtocolGuid,\r
+                  &CallbackInfo->DriverHandle,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
                   EFI_NATIVE_INTERFACE,\r
-                  &CallbackInfo->FormCallback\r
+                  &CallbackInfo->ConfigAccess\r
                   );\r
-\r
   ASSERT_EFI_ERROR (Status);\r
-\r
-  CallbackInfo->CallbackHandle  = DriverBindingHandle;\r
-  PackageList                   = PreparePackages (2, &StringPackGuid, iSCSIStrings, IScsiConfigDxeBin);\r
-  Status                        = Hii->NewPack (Hii, PackageList, &HiiHandle);\r
-  NetFreePool (PackageList);\r
-\r
-  CallbackInfo->RegisteredHandle = HiiHandle;\r
-\r
+  \r
   //\r
-  // Allocate space for creation of Buffer\r
+  // Publish our HII data\r
   //\r
-  UpdateData = (EFI_HII_UPDATE_DATA *) NetAllocatePool (0x1000);\r
-  ASSERT (UpdateData != NULL);\r
-  if (UpdateData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  PackageList = PreparePackageList (2, &mVendorGuid, iSCSIStrings, IScsiConfigDxeBin);\r
+  ASSERT (PackageList != NULL);\r
+  \r
+  Status = HiiDatabase->NewPackageList (\r
+                           HiiDatabase,\r
+                           PackageList,\r
+                           CallbackInfo->DriverHandle,\r
+                           &CallbackInfo->RegisteredHandle\r
+                           );\r
+  NetFreePool (PackageList);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
   }\r
 \r
-  NetZeroMem (UpdateData, 0x1000);\r
-\r
-  //\r
-  // Flag update pending in FormSet\r
-  //\r
-  UpdateData->FormSetUpdate = TRUE;\r
-\r
-  //\r
-  // Register CallbackHandle data for FormSet\r
-  //\r
-  UpdateData->FormCallbackHandle  = (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackInfo->CallbackHandle;\r
-  UpdateData->FormUpdate          = FALSE;\r
-  UpdateData->FormTitle           = 0;\r
-  UpdateData->DataCount           = 0x1;\r
-\r
-  Hii->UpdateForm (Hii, HiiHandle, (EFI_FORM_LABEL) 0x1000, TRUE, UpdateData);\r
-\r
-  NetFreePool (UpdateData);\r
+  mCallbackInfo = CallbackInfo;\r
 \r
   return Status;\r
 }\r
@@ -1003,11 +1001,6 @@ Returns:
 --*/\r
 {\r
   ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;\r
-  EFI_STATUS                  Status;\r
-  EFI_HII_PROTOCOL            *Hii;\r
-  EFI_HII_UPDATE_DATA         *UpdateData;\r
-  EFI_FORM_CALLBACK_PROTOCOL  *FormCallback;\r
-  ISCSI_FORM_CALLBACK_INFO    *CallbackInfo;\r
 \r
   while (!NetListIsEmpty (&mIScsiConfigFormList)) {\r
     //\r
@@ -1021,54 +1014,25 @@ Returns:
     IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller, FALSE);\r
   }\r
 \r
-  Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, (VOID **)&Hii);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = gBS->HandleProtocol (DriverBindingHandle, &gEfiFormCallbackProtocolGuid, (VOID **)&FormCallback);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  CallbackInfo = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (FormCallback);\r
-\r
   //\r
-  // remove the form.\r
+  // Remove HII package list\r
   //\r
-  UpdateData = (EFI_HII_UPDATE_DATA *) NetAllocatePool (0x1000);\r
-  ASSERT (UpdateData != NULL);\r
-  if (UpdateData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NetZeroMem (UpdateData, 0x1000);\r
-\r
-  UpdateData->FormSetUpdate       = FALSE;\r
-  UpdateData->FormCallbackHandle  = 0;\r
-  UpdateData->FormUpdate          = FALSE;\r
-  UpdateData->FormTitle           = 0;\r
-  UpdateData->DataCount           = 0xFF;\r
-\r
-  Hii->UpdateForm (Hii, CallbackInfo->RegisteredHandle, (EFI_FORM_LABEL) 0x1000, FALSE, UpdateData);\r
-\r
-  NetFreePool (UpdateData);\r
+  mCallbackInfo->HiiDatabase->RemovePackageList (\r
+                                mCallbackInfo->HiiDatabase,\r
+                                mCallbackInfo->RegisteredHandle\r
+                                );\r
 \r
   //\r
-  // Uninstall the EFI_FORM_CALLBACK_PROTOCOL.\r
+  // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL\r
   //\r
   gBS->UninstallProtocolInterface (\r
-        DriverBindingHandle,\r
-        &gEfiFormCallbackProtocolGuid,\r
-        FormCallback\r
+        mCallbackInfo->DriverHandle,\r
+        &gEfiHiiConfigAccessProtocolGuid,\r
+        &mCallbackInfo->ConfigAccess\r
         );\r
+  HiiLibDestroyHiiDriverHandle (mCallbackInfo->DriverHandle);\r
 \r
-  //\r
-  // Remove the package.\r
-  //\r
-  Hii->RemovePack (Hii, CallbackInfo->RegisteredHandle);\r
-\r
-  NetFreePool (CallbackInfo);\r
+  NetFreePool (mCallbackInfo);\r
 \r
   return EFI_SUCCESS;\r
 }\r