]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Presentation.c
index 99a30bcfbfd2ee49692c4ef953dd790f018c3b8c..9587b08d6d82be5a771451d67bb76bd82a446f44 100644 (file)
@@ -1,29 +1,59 @@
 /** @file\r
 Utility functions for UI presentation.\r
 \r
-Copyright (c) 2004 - 2014, 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
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "Setup.h"\r
 \r
-BOOLEAN            mHiiPackageListUpdated;\r
-UI_MENU_SELECTION  *gCurrentSelection;\r
-EFI_HII_HANDLE     mCurrentHiiHandle = NULL;\r
-EFI_GUID           mCurrentFormSetGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
-UINT16             mCurrentFormId = 0;\r
-EFI_EVENT          mValueChangedEvent = NULL;\r
-LIST_ENTRY         mRefreshEventList = INITIALIZE_LIST_HEAD_VARIABLE (mRefreshEventList);\r
-UINT16             mCurFakeQestId;\r
-FORM_DISPLAY_ENGINE_FORM gDisplayFormData;\r
-BOOLEAN            mFinishRetrieveCall = FALSE;\r
+BOOLEAN                   mHiiPackageListUpdated;\r
+UI_MENU_SELECTION         *gCurrentSelection;\r
+EFI_HII_HANDLE            mCurrentHiiHandle   = NULL;\r
+EFI_GUID                  mCurrentFormSetGuid = {\r
+  0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }\r
+};\r
+UINT16                    mCurrentFormId     = 0;\r
+EFI_EVENT                 mValueChangedEvent = NULL;\r
+LIST_ENTRY                mRefreshEventList  = INITIALIZE_LIST_HEAD_VARIABLE (mRefreshEventList);\r
+UINT16                    mCurFakeQestId;\r
+FORM_DISPLAY_ENGINE_FORM  gDisplayFormData;\r
+BOOLEAN                   mFinishRetrieveCall = FALSE;\r
+BOOLEAN                   mDynamicFormUpdated = FALSE;\r
+\r
+/**\r
+  Check whether the ConfigAccess protocol is available.\r
+\r
+  @param FormSet           FormSet of which the ConfigAcces protocol need to be checked.\r
+\r
+  @retval EFI_SUCCESS     The function executed successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+CheckConfigAccess (\r
+  IN FORM_BROWSER_FORMSET  *FormSet\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  FormSet->DriverHandle,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  (VOID **)&FormSet->ConfigAccess\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // Configuration Driver don't attach ConfigAccess protocol to its HII package\r
+    // list, then there will be no configuration action required.\r
+    // Or the ConfigAccess protocol has been uninstalled.\r
+    //\r
+    FormSet->ConfigAccess = NULL;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Evaluate all expressions in a Form.\r
@@ -47,13 +77,14 @@ EvaluateFormExpressions (
   Link = GetFirstNode (&Form->ExpressionListHead);\r
   while (!IsNull (&Form->ExpressionListHead, Link)) {\r
     Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
-    Link = GetNextNode (&Form->ExpressionListHead, Link);\r
-\r
-    if (Expression->Type == EFI_HII_EXPRESSION_INCONSISTENT_IF ||\r
-        Expression->Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF ||\r
-        Expression->Type == EFI_HII_EXPRESSION_WARNING_IF ||\r
-        Expression->Type == EFI_HII_EXPRESSION_WRITE ||\r
-        (Expression->Type == EFI_HII_EXPRESSION_READ && Form->FormType != STANDARD_MAP_FORM_TYPE)) {\r
+    Link       = GetNextNode (&Form->ExpressionListHead, Link);\r
+\r
+    if ((Expression->Type == EFI_HII_EXPRESSION_INCONSISTENT_IF) ||\r
+        (Expression->Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF) ||\r
+        (Expression->Type == EFI_HII_EXPRESSION_WARNING_IF) ||\r
+        (Expression->Type == EFI_HII_EXPRESSION_WRITE) ||\r
+        ((Expression->Type == EFI_HII_EXPRESSION_READ) && (Form->FormType != STANDARD_MAP_FORM_TYPE)))\r
+    {\r
       //\r
       // Postpone Form validation to Question editing or Form submitting or Question Write or Question Read for nonstandard form.\r
       //\r
@@ -69,37 +100,21 @@ EvaluateFormExpressions (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Add empty function for event process function.\r
-\r
-  @param Event    The Event need to be process\r
-  @param Context  The context of the event.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-SetupBrowserEmptyFunction (\r
-  IN  EFI_EVENT    Event,\r
-  IN  VOID         *Context\r
-  )\r
-{\r
-}\r
-\r
 /**\r
   Base on the opcode buffer info to get the display statement.\r
 \r
   @param OpCode    The input opcode buffer for this statement.\r
-  \r
+\r
   @retval Statement  The statement use this opcode buffer.\r
 \r
 **/\r
 FORM_DISPLAY_ENGINE_STATEMENT *\r
 GetDisplayStatement (\r
-  IN EFI_IFR_OP_HEADER     *OpCode\r
+  IN EFI_IFR_OP_HEADER  *OpCode\r
   )\r
 {\r
-  FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement;\r
-  LIST_ENTRY                    *Link;\r
+  FORM_DISPLAY_ENGINE_STATEMENT  *DisplayStatement;\r
+  LIST_ENTRY                     *Link;\r
 \r
   Link = GetFirstNode (&gDisplayFormData.StatementListHead);\r
   while (!IsNull (&gDisplayFormData.StatementListHead, Link)) {\r
@@ -108,6 +123,7 @@ GetDisplayStatement (
     if (DisplayStatement->OpCode == OpCode) {\r
       return DisplayStatement;\r
     }\r
+\r
     Link = GetNextNode (&gDisplayFormData.StatementListHead, Link);\r
   }\r
 \r
@@ -118,16 +134,16 @@ GetDisplayStatement (
   Free the refresh event list.\r
 \r
 **/\r
-VOID \r
+VOID\r
 FreeRefreshEvent (\r
   VOID\r
   )\r
 {\r
-  LIST_ENTRY   *Link;\r
-  FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;\r
+  LIST_ENTRY                       *Link;\r
+  FORM_BROWSER_REFRESH_EVENT_NODE  *EventNode;\r
 \r
   while (!IsListEmpty (&mRefreshEventList)) {\r
-    Link = GetFirstNode (&mRefreshEventList);\r
+    Link      = GetFirstNode (&mRefreshEventList);\r
     EventNode = FORM_BROWSER_REFRESH_EVENT_FROM_LINK (Link);\r
     RemoveEntryList (&EventNode->Link);\r
 \r
@@ -138,7 +154,7 @@ FreeRefreshEvent (
 }\r
 \r
 /**\r
-  Check whether this statement value is changed. If yes, update the statement value and return TRUE; \r
+  Check whether this statement value is changed. If yes, update the statement value and return TRUE;\r
   else return FALSE.\r
 \r
   @param Statement           The statement need to check.\r
@@ -146,7 +162,7 @@ FreeRefreshEvent (
 **/\r
 VOID\r
 UpdateStatement (\r
-  IN OUT FORM_BROWSER_STATEMENT        *Statement\r
+  IN OUT FORM_BROWSER_STATEMENT  *Statement\r
   )\r
 {\r
   GetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithHiiDriver);\r
@@ -160,36 +176,53 @@ UpdateStatement (
   // Question value may be changed, need invoke its Callback()\r
   //\r
   ProcessCallBackFunction (gCurrentSelection, gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, EFI_BROWSER_ACTION_RETRIEVE, FALSE);\r
-  \r
+\r
   if (mHiiPackageListUpdated) {\r
     //\r
     // Package list is updated, force to reparse IFR binary of target Formset\r
     //\r
-    mHiiPackageListUpdated = FALSE;\r
+    mHiiPackageListUpdated    = FALSE;\r
     gCurrentSelection->Action = UI_ACTION_REFRESH_FORMSET;\r
   }\r
 }\r
 \r
 /**\r
   Refresh the question which has refresh guid event attribute.\r
-  \r
-  @param Event    The event which has this function related.     \r
+\r
+  @param Event    The event which has this function related.\r
   @param Context  The input context info related to this event or the status code return to the caller.\r
 **/\r
 VOID\r
 EFIAPI\r
-RefreshEventNotify(\r
-  IN      EFI_EVENT Event,\r
-  IN      VOID      *Context\r
+RefreshEventNotifyForStatement (\r
+  IN      EFI_EVENT  Event,\r
+  IN      VOID       *Context\r
   )\r
 {\r
-  FORM_BROWSER_STATEMENT        *Statement;\r
+  FORM_BROWSER_STATEMENT  *Statement;\r
 \r
   Statement = (FORM_BROWSER_STATEMENT *)Context;\r
-  UpdateStatement(Statement);\r
+  UpdateStatement (Statement);\r
   gBS->SignalEvent (mValueChangedEvent);\r
 }\r
 \r
+/**\r
+  Refresh the questions within this form.\r
+\r
+  @param Event    The event which has this function related.\r
+  @param Context  The input context info related to this event or the status code return to the caller.\r
+**/\r
+VOID\r
+EFIAPI\r
+RefreshEventNotifyForForm (\r
+  IN      EFI_EVENT  Event,\r
+  IN      VOID       *Context\r
+  )\r
+{\r
+  gCurrentSelection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+  gBS->SignalEvent (mValueChangedEvent);\r
+}\r
 \r
 /**\r
   Create refresh hook event for statement which has refresh event or interval.\r
@@ -198,30 +231,65 @@ RefreshEventNotify(
 \r
 **/\r
 VOID\r
-CreateRefreshEvent (\r
-  IN     FORM_BROWSER_STATEMENT        *Statement\r
+CreateRefreshEventForStatement (\r
+  IN     FORM_BROWSER_STATEMENT  *Statement\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EFI_EVENT                       RefreshEvent;\r
-  FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;\r
+  EFI_STATUS                       Status;\r
+  EFI_EVENT                        RefreshEvent;\r
+  FORM_BROWSER_REFRESH_EVENT_NODE  *EventNode;\r
+\r
+  //\r
+  // If question has refresh guid, create the notify function.\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  RefreshEventNotifyForStatement,\r
+                  Statement,\r
+                  &Statement->RefreshGuid,\r
+                  &RefreshEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE));\r
+  ASSERT (EventNode != NULL);\r
+  EventNode->RefreshEvent = RefreshEvent;\r
+  InsertTailList (&mRefreshEventList, &EventNode->Link);\r
+}\r
+\r
+/**\r
+  Create refresh hook event for form which has refresh event or interval.\r
+\r
+  @param Form           The form need to check.\r
+\r
+**/\r
+VOID\r
+CreateRefreshEventForForm (\r
+  IN     FORM_BROWSER_FORM  *Form\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  EFI_EVENT                        RefreshEvent;\r
+  FORM_BROWSER_REFRESH_EVENT_NODE  *EventNode;\r
 \r
   //\r
   // If question has refresh guid, create the notify function.\r
   //\r
   Status = gBS->CreateEventEx (\r
-                    EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
-                    RefreshEventNotify,\r
-                    Statement,\r
-                    &Statement->RefreshGuid,\r
-                    &RefreshEvent);\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  RefreshEventNotifyForForm,\r
+                  Form,\r
+                  &Form->RefreshGuid,\r
+                  &RefreshEvent\r
+                  );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE));\r
   ASSERT (EventNode != NULL);\r
   EventNode->RefreshEvent = RefreshEvent;\r
-  InsertTailList(&mRefreshEventList, &EventNode->Link);\r
+  InsertTailList (&mRefreshEventList, &EventNode->Link);\r
 }\r
 \r
 /**\r
@@ -233,14 +301,14 @@ CreateRefreshEvent (
 **/\r
 VOID\r
 InitializeDisplayStatement (\r
-  IN OUT FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement,\r
-  IN     FORM_BROWSER_STATEMENT        *Statement\r
+  IN OUT FORM_DISPLAY_ENGINE_STATEMENT  *DisplayStatement,\r
+  IN     FORM_BROWSER_STATEMENT         *Statement\r
   )\r
 {\r
-  LIST_ENTRY                 *Link;\r
-  QUESTION_OPTION            *Option;\r
-  DISPLAY_QUESTION_OPTION    *DisplayOption;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *ParentStatement;\r
+  LIST_ENTRY                     *Link;\r
+  QUESTION_OPTION                *Option;\r
+  DISPLAY_QUESTION_OPTION        *DisplayOption;\r
+  FORM_DISPLAY_ENGINE_STATEMENT  *ParentStatement;\r
 \r
   DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE;\r
   DisplayStatement->Version   = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1;\r
@@ -248,9 +316,10 @@ InitializeDisplayStatement (
   InitializeListHead (&DisplayStatement->NestStatementList);\r
   InitializeListHead (&DisplayStatement->OptionListHead);\r
 \r
-  if ((EvaluateExpressionList(Statement->Expression, FALSE, NULL, NULL) == ExpressGrayOut) || Statement->Locked) {\r
+  if ((EvaluateExpressionList (Statement->Expression, FALSE, NULL, NULL) == ExpressGrayOut) || Statement->Locked) {\r
     DisplayStatement->Attribute |= HII_DISPLAY_GRAYOUT;\r
   }\r
+\r
   if ((Statement->ValueExpression != NULL) || ((Statement->QuestionFlags & EFI_IFR_FLAG_READ_ONLY) != 0)) {\r
     DisplayStatement->Attribute |= HII_DISPLAY_READONLY;\r
   }\r
@@ -261,9 +330,10 @@ InitializeDisplayStatement (
   Link = GetFirstNode (&Statement->OptionListHead);\r
   while (!IsNull (&Statement->OptionListHead, Link)) {\r
     Option = QUESTION_OPTION_FROM_LINK (Link);\r
-    Link = GetNextNode (&Statement->OptionListHead, Link);\r
+    Link   = GetNextNode (&Statement->OptionListHead, Link);\r
     if ((Option->SuppressExpression != NULL) &&\r
-        ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
+        ((EvaluateExpressionList (Option->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress)))\r
+    {\r
       continue;\r
     }\r
 \r
@@ -273,7 +343,7 @@ InitializeDisplayStatement (
     DisplayOption->ImageId      = Option->ImageId;\r
     DisplayOption->Signature    = DISPLAY_QUESTION_OPTION_SIGNATURE;\r
     DisplayOption->OptionOpCode = Option->OpCode;\r
-    InsertTailList(&DisplayStatement->OptionListHead, &DisplayOption->Link);\r
+    InsertTailList (&DisplayStatement->OptionListHead, &DisplayOption->Link);\r
   }\r
 \r
   CopyMem (&DisplayStatement->CurrentValue, &Statement->HiiValue, sizeof (EFI_HII_VALUE));\r
@@ -286,11 +356,11 @@ InitializeDisplayStatement (
     //\r
     // Ordered list opcode may not initilized, get default value here.\r
     //\r
-    if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP && GetArrayData (Statement->BufferValue, Statement->ValueType, 0) == 0) {\r
+    if ((Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) && (GetArrayData (Statement->BufferValue, Statement->ValueType, 0) == 0)) {\r
       GetQuestionDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, 0);\r
     }\r
 \r
-    DisplayStatement->CurrentValue.Buffer    = AllocateCopyPool(Statement->StorageWidth,Statement->BufferValue);\r
+    DisplayStatement->CurrentValue.Buffer    = AllocateCopyPool (Statement->StorageWidth, Statement->BufferValue);\r
     DisplayStatement->CurrentValue.BufferLen = Statement->StorageWidth;\r
   }\r
 \r
@@ -300,21 +370,22 @@ InitializeDisplayStatement (
   // Get the highlight statement for current form.\r
   //\r
   if (((gCurrentSelection->QuestionId != 0) && (Statement->QuestionId == gCurrentSelection->QuestionId)) ||\r
-      ((mCurFakeQestId != 0) && (Statement->FakeQuestionId == mCurFakeQestId))) {\r
+      ((mCurFakeQestId != 0) && (Statement->FakeQuestionId == mCurFakeQestId)))\r
+  {\r
     gDisplayFormData.HighLightedStatement = DisplayStatement;\r
   }\r
 \r
   //\r
   // Create the refresh event process function.\r
   //\r
-  if (!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) {\r
-    CreateRefreshEvent (Statement);\r
+  if (!IsZeroGuid (&Statement->RefreshGuid)) {\r
+    CreateRefreshEventForStatement (Statement);\r
   }\r
 \r
   //\r
   // For RTC type of date/time, set default refresh interval to be 1 second.\r
   //\r
-  if ((Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) && Statement->Storage == NULL) {\r
+  if (((Statement->Operand == EFI_IFR_DATE_OP) || (Statement->Operand == EFI_IFR_TIME_OP)) && (Statement->Storage == NULL)) {\r
     Statement->RefreshInterval = 1;\r
   }\r
 \r
@@ -322,7 +393,7 @@ InitializeDisplayStatement (
   // Create the refresh guid hook event.\r
   // If the statement in this form has refresh event or refresh interval, browser will create this event for display engine.\r
   //\r
-  if ((!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) || (Statement->RefreshInterval != 0)) {\r
+  if ((!IsZeroGuid (&Statement->RefreshGuid)) || (Statement->RefreshInterval != 0)) {\r
     gDisplayFormData.FormRefreshEvent = mValueChangedEvent;\r
   }\r
 \r
@@ -338,11 +409,11 @@ InitializeDisplayStatement (
   // else insert to the form it belongs to.\r
   //\r
   if (Statement->ParentStatement != NULL) {\r
-    ParentStatement = GetDisplayStatement(Statement->ParentStatement->OpCode);\r
+    ParentStatement = GetDisplayStatement (Statement->ParentStatement->OpCode);\r
     ASSERT (ParentStatement != NULL);\r
-    InsertTailList(&ParentStatement->NestStatementList, &DisplayStatement->DisplayLink);\r
+    InsertTailList (&ParentStatement->NestStatementList, &DisplayStatement->DisplayLink);\r
   } else {\r
-    InsertTailList(&gDisplayFormData.StatementListHead, &DisplayStatement->DisplayLink);\r
+    InsertTailList (&gDisplayFormData.StatementListHead, &DisplayStatement->DisplayLink);\r
   }\r
 }\r
 \r
@@ -356,23 +427,23 @@ InitializeDisplayStatement (
 VOID\r
 EFIAPI\r
 RefreshIntervalProcess (\r
-  IN  EFI_EVENT    Event,\r
-  IN  VOID         *Context\r
+  IN  EFI_EVENT  Event,\r
+  IN  VOID       *Context\r
   )\r
 {\r
-  FORM_BROWSER_STATEMENT        *Statement;\r
-  LIST_ENTRY                    *Link;\r
+  FORM_BROWSER_STATEMENT  *Statement;\r
+  LIST_ENTRY              *Link;\r
 \r
   Link = GetFirstNode (&gCurrentSelection->Form->StatementListHead);\r
   while (!IsNull (&gCurrentSelection->Form->StatementListHead, Link)) {\r
     Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&gCurrentSelection->Form->StatementListHead, Link);\r
+    Link      = GetNextNode (&gCurrentSelection->Form->StatementListHead, Link);\r
 \r
     if (Statement->RefreshInterval == 0) {\r
       continue;\r
     }\r
 \r
-    UpdateStatement(Statement);\r
+    UpdateStatement (Statement);\r
   }\r
 \r
   gBS->SignalEvent (mValueChangedEvent);\r
@@ -396,14 +467,14 @@ UpdateHotkeyList (
   while (!IsNull (&gBrowserHotKeyList, Link)) {\r
     HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
 \r
-    CopyKey             = AllocateCopyPool(sizeof (BROWSER_HOT_KEY), HotKey);\r
+    CopyKey = AllocateCopyPool (sizeof (BROWSER_HOT_KEY), HotKey);\r
     ASSERT (CopyKey != NULL);\r
-    CopyKey->KeyData    = AllocateCopyPool(sizeof (EFI_INPUT_KEY), HotKey->KeyData);\r
+    CopyKey->KeyData = AllocateCopyPool (sizeof (EFI_INPUT_KEY), HotKey->KeyData);\r
     ASSERT (CopyKey->KeyData != NULL);\r
-    CopyKey->HelpString = AllocateCopyPool(StrSize (HotKey->HelpString), HotKey->HelpString);\r
+    CopyKey->HelpString = AllocateCopyPool (StrSize (HotKey->HelpString), HotKey->HelpString);\r
     ASSERT (CopyKey->HelpString != NULL);\r
 \r
-    InsertTailList(&gDisplayFormData.HotKeyListHead, &CopyKey->Link);\r
+    InsertTailList (&gDisplayFormData.HotKeyListHead, &CopyKey->Link);\r
 \r
     Link = GetNextNode (&gBrowserHotKeyList, Link);\r
   }\r
@@ -415,11 +486,11 @@ UpdateHotkeyList (
 \r
   @param    QuestionId    The question id for this request question.\r
 \r
-  @retval   The attribute for this question or NULL if not found this \r
+  @retval   The attribute for this question or NULL if not found this\r
             question in the list.\r
 \r
 **/\r
-UINT32 \r
+UINT32\r
 ProcessQuestionExtraAttr (\r
   IN   EFI_QUESTION_ID  QuestionId\r
   )\r
@@ -437,12 +508,13 @@ ProcessQuestionExtraAttr (
   Link = GetFirstNode (&mPrivateData.FormBrowserEx2.OverrideQestListHead);\r
   while (!IsNull (&mPrivateData.FormBrowserEx2.OverrideQestListHead, Link)) {\r
     QuestionDesc = FORM_QUESTION_ATTRIBUTE_OVERRIDE_FROM_LINK (Link);\r
-    Link = GetNextNode (&mPrivateData.FormBrowserEx2.OverrideQestListHead, Link);\r
+    Link         = GetNextNode (&mPrivateData.FormBrowserEx2.OverrideQestListHead, Link);\r
 \r
     if ((QuestionDesc->QuestionId == QuestionId) &&\r
         (QuestionDesc->FormId     == gCurrentSelection->FormId) &&\r
         (QuestionDesc->HiiHandle  == gCurrentSelection->Handle) &&\r
-        CompareGuid (&QuestionDesc->FormSetGuid, &gCurrentSelection->FormSetGuid)) {\r
+        CompareGuid (&QuestionDesc->FormSetGuid, &gCurrentSelection->FormSetGuid))\r
+    {\r
       return QuestionDesc->Attribute;\r
     }\r
   }\r
@@ -461,18 +533,18 @@ AddStatementToDisplayForm (
   VOID\r
   )\r
 {\r
-  EFI_STATUS                    Status;\r
-  LIST_ENTRY                    *Link;\r
-  FORM_BROWSER_STATEMENT        *Statement;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement;\r
-  UINT8                         MinRefreshInterval;\r
-  EFI_EVENT                     RefreshIntervalEvent;\r
-  FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;\r
-  BOOLEAN                       FormEditable;\r
-  UINT32                        ExtraAttribute;\r
+  EFI_STATUS                       Status;\r
+  LIST_ENTRY                       *Link;\r
+  FORM_BROWSER_STATEMENT           *Statement;\r
+  FORM_DISPLAY_ENGINE_STATEMENT    *DisplayStatement;\r
+  UINT8                            MinRefreshInterval;\r
+  EFI_EVENT                        RefreshIntervalEvent;\r
+  FORM_BROWSER_REFRESH_EVENT_NODE  *EventNode;\r
+  BOOLEAN                          FormEditable;\r
+  UINT32                           ExtraAttribute;\r
 \r
-  MinRefreshInterval   = 0;\r
-  FormEditable         = FALSE;\r
+  MinRefreshInterval = 0;\r
+  FormEditable       = FALSE;\r
 \r
   //\r
   // Process the statement outside the form, these statements are not recognized\r
@@ -481,32 +553,47 @@ AddStatementToDisplayForm (
   Link = GetFirstNode (&gCurrentSelection->FormSet->StatementListOSF);\r
   while (!IsNull (&gCurrentSelection->FormSet->StatementListOSF, Link)) {\r
     Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&gCurrentSelection->FormSet->StatementListOSF, Link);\r
+    Link      = GetNextNode (&gCurrentSelection->FormSet->StatementListOSF, Link);\r
 \r
     DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT));\r
     ASSERT (DisplayStatement != NULL);\r
     DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE;\r
     DisplayStatement->Version   = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1;\r
-    DisplayStatement->OpCode = Statement->OpCode;\r
+    DisplayStatement->OpCode    = Statement->OpCode;\r
 \r
     InitializeListHead (&DisplayStatement->NestStatementList);\r
     InitializeListHead (&DisplayStatement->OptionListHead);\r
 \r
-    InsertTailList(&gDisplayFormData.StatementListOSF, &DisplayStatement->DisplayLink);\r
+    InsertTailList (&gDisplayFormData.StatementListOSF, &DisplayStatement->DisplayLink);\r
   }\r
 \r
+  //\r
+  // treat formset as statement outside the form,get its opcode.\r
+  //\r
+  DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT));\r
+  ASSERT (DisplayStatement != NULL);\r
+\r
+  DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE;\r
+  DisplayStatement->Version   = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1;\r
+  DisplayStatement->OpCode    = gCurrentSelection->FormSet->OpCode;\r
+\r
+  InitializeListHead (&DisplayStatement->NestStatementList);\r
+  InitializeListHead (&DisplayStatement->OptionListHead);\r
+\r
+  InsertTailList (&gDisplayFormData.StatementListOSF, &DisplayStatement->DisplayLink);\r
+\r
   //\r
   // Process the statement in this form.\r
   //\r
   Link = GetFirstNode (&gCurrentSelection->Form->StatementListHead);\r
   while (!IsNull (&gCurrentSelection->Form->StatementListHead, Link)) {\r
     Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&gCurrentSelection->Form->StatementListHead, Link);\r
+    Link      = GetNextNode (&gCurrentSelection->Form->StatementListHead, Link);\r
 \r
     //\r
     // This statement can't be show, skip it.\r
     //\r
-    if (EvaluateExpressionList(Statement->Expression, FALSE, NULL, NULL) > ExpressGrayOut) {\r
+    if (EvaluateExpressionList (Statement->Expression, FALSE, NULL, NULL) > ExpressGrayOut) {\r
       continue;\r
     }\r
 \r
@@ -524,7 +611,7 @@ AddStatementToDisplayForm (
     //\r
     // Initialize this statement and add it to the display form.\r
     //\r
-    InitializeDisplayStatement(DisplayStatement, Statement);\r
+    InitializeDisplayStatement (DisplayStatement, Statement);\r
 \r
     //\r
     // Set the extra attribute.\r
@@ -538,8 +625,9 @@ AddStatementToDisplayForm (
     //\r
     // Get the minimal refresh interval value for later use.\r
     //\r
-    if ((Statement->RefreshInterval != 0) && \r
-      (MinRefreshInterval == 0 || Statement->RefreshInterval < MinRefreshInterval)) {\r
+    if ((Statement->RefreshInterval != 0) &&\r
+        ((MinRefreshInterval == 0) || (Statement->RefreshInterval < MinRefreshInterval)))\r
+    {\r
       MinRefreshInterval = Statement->RefreshInterval;\r
     }\r
   }\r
@@ -556,14 +644,24 @@ AddStatementToDisplayForm (
     EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE));\r
     ASSERT (EventNode != NULL);\r
     EventNode->RefreshEvent = RefreshIntervalEvent;\r
-    InsertTailList(&mRefreshEventList, &EventNode->Link);\r
+    InsertTailList (&mRefreshEventList, &EventNode->Link);\r
+  }\r
+\r
+  //\r
+  // Create the refresh event process function for Form.\r
+  //\r
+  if (!IsZeroGuid (&gCurrentSelection->Form->RefreshGuid)) {\r
+    CreateRefreshEventForForm (gCurrentSelection->Form);\r
+    if (gDisplayFormData.FormRefreshEvent == NULL) {\r
+      gDisplayFormData.FormRefreshEvent = mValueChangedEvent;\r
+    }\r
   }\r
 \r
   //\r
   // Update hotkey list field.\r
   //\r
-  if (gBrowserSettingScope == SystemLevel || FormEditable) {\r
-    UpdateHotkeyList();\r
+  if ((gBrowserSettingScope == SystemLevel) || FormEditable) {\r
+    UpdateHotkeyList ();\r
   }\r
 }\r
 \r
@@ -577,10 +675,10 @@ UpdateDataChangedFlag (
   VOID\r
   )\r
 {\r
-  LIST_ENTRY           *Link;\r
-  FORM_BROWSER_FORMSET *LocalFormSet;\r
+  LIST_ENTRY            *Link;\r
+  FORM_BROWSER_FORMSET  *LocalFormSet;\r
 \r
-  gDisplayFormData.SettingChangedFlag   = FALSE;\r
+  gDisplayFormData.SettingChangedFlag = FALSE;\r
 \r
   if (IsNvUpdateRequiredForForm (gCurrentSelection->Form)) {\r
     gDisplayFormData.SettingChangedFlag = TRUE;\r
@@ -589,32 +687,35 @@ UpdateDataChangedFlag (
 \r
   //\r
   // Base on the system level to check whether need to show the NV flag.\r
-  // \r
+  //\r
   switch (gBrowserSettingScope) {\r
-  case SystemLevel:\r
-    //\r
-    // Check the maintain list to see whether there is any change.\r
-    //\r
-    Link = GetFirstNode (&gBrowserFormSetList);\r
-    while (!IsNull (&gBrowserFormSetList, Link)) {\r
-      LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
-      if (IsNvUpdateRequiredForFormSet(LocalFormSet)) {\r
+    case SystemLevel:\r
+      //\r
+      // Check the maintain list to see whether there is any change.\r
+      //\r
+      Link = GetFirstNode (&gBrowserFormSetList);\r
+      while (!IsNull (&gBrowserFormSetList, Link)) {\r
+        LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
+        if (IsNvUpdateRequiredForFormSet (LocalFormSet)) {\r
+          gDisplayFormData.SettingChangedFlag = TRUE;\r
+          return;\r
+        }\r
+\r
+        Link = GetNextNode (&gBrowserFormSetList, Link);\r
+      }\r
+\r
+      break;\r
+\r
+    case FormSetLevel:\r
+      if (IsNvUpdateRequiredForFormSet (gCurrentSelection->FormSet)) {\r
         gDisplayFormData.SettingChangedFlag = TRUE;\r
         return;\r
       }\r
-      Link = GetNextNode (&gBrowserFormSetList, Link);\r
-    }\r
-    break;\r
 \r
-  case FormSetLevel:\r
-    if (IsNvUpdateRequiredForFormSet(gCurrentSelection->FormSet)) {\r
-      gDisplayFormData.SettingChangedFlag = TRUE;\r
-      return;\r
-    }\r
-    break;\r
+      break;\r
 \r
-  default:\r
-    break;\r
+    default:\r
+      break;\r
   }\r
 }\r
 \r
@@ -640,13 +741,13 @@ InitializeDisplayFormData (
   InitializeListHead (&gDisplayFormData.HotKeyListHead);\r
 \r
   Status = gBS->CreateEvent (\r
-        EVT_NOTIFY_WAIT, \r
-        TPL_CALLBACK,\r
-        SetupBrowserEmptyFunction,\r
-        NULL,\r
-        &mValueChangedEvent\r
-        );\r
-  ASSERT_EFI_ERROR (Status); \r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_CALLBACK,\r
+                  EfiEventEmptyFunction,\r
+                  NULL,\r
+                  &mValueChangedEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
 /**\r
@@ -663,7 +764,7 @@ FreeHotkeyList (
   LIST_ENTRY       *Link;\r
 \r
   while (!IsListEmpty (&gDisplayFormData.HotKeyListHead)) {\r
-    Link = GetFirstNode (&gDisplayFormData.HotKeyListHead);\r
+    Link   = GetFirstNode (&gDisplayFormData.HotKeyListHead);\r
     HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
 \r
     RemoveEntryList (&HotKey->Link);\r
@@ -684,14 +785,14 @@ UpdateDisplayFormData (
   VOID\r
   )\r
 {\r
-  gDisplayFormData.FormTitle        = gCurrentSelection->Form->FormTitle;\r
-  gDisplayFormData.FormId           = gCurrentSelection->FormId;\r
-  gDisplayFormData.HiiHandle        = gCurrentSelection->Handle;\r
+  gDisplayFormData.FormTitle = gCurrentSelection->Form->FormTitle;\r
+  gDisplayFormData.FormId    = gCurrentSelection->FormId;\r
+  gDisplayFormData.HiiHandle = gCurrentSelection->Handle;\r
   CopyGuid (&gDisplayFormData.FormSetGuid, &gCurrentSelection->FormSetGuid);\r
 \r
-  gDisplayFormData.Attribute        = 0;\r
-  gDisplayFormData.Attribute       |= gCurrentSelection->Form->ModalForm ? HII_DISPLAY_MODAL : 0;\r
-  gDisplayFormData.Attribute       |= gCurrentSelection->Form->Locked    ? HII_DISPLAY_LOCK  : 0;\r
+  gDisplayFormData.Attribute  = 0;\r
+  gDisplayFormData.Attribute |= gCurrentSelection->Form->ModalForm ? HII_DISPLAY_MODAL : 0;\r
+  gDisplayFormData.Attribute |= gCurrentSelection->Form->Locked    ? HII_DISPLAY_LOCK  : 0;\r
 \r
   gDisplayFormData.FormRefreshEvent     = NULL;\r
   gDisplayFormData.HighLightedStatement = NULL;\r
@@ -710,19 +811,19 @@ UpdateDisplayFormData (
 **/\r
 VOID\r
 FreeStatementData (\r
-  LIST_ENTRY           *StatementList\r
+  LIST_ENTRY  *StatementList\r
   )\r
 {\r
-  LIST_ENTRY                    *Link;\r
-  LIST_ENTRY                    *OptionLink;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
-  DISPLAY_QUESTION_OPTION       *Option;\r
+  LIST_ENTRY                     *Link;\r
+  LIST_ENTRY                     *OptionLink;\r
+  FORM_DISPLAY_ENGINE_STATEMENT  *Statement;\r
+  DISPLAY_QUESTION_OPTION        *Option;\r
 \r
   //\r
   // Free Statements/Questions\r
   //\r
   while (!IsListEmpty (StatementList)) {\r
-    Link = GetFirstNode (StatementList);\r
+    Link      = GetFirstNode (StatementList);\r
     Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
 \r
     //\r
@@ -730,7 +831,7 @@ FreeStatementData (
     //\r
     while (!IsListEmpty (&Statement->OptionListHead)) {\r
       OptionLink = GetFirstNode (&Statement->OptionListHead);\r
-      Option = DISPLAY_QUESTION_OPTION_FROM_LINK (OptionLink);\r
+      Option     = DISPLAY_QUESTION_OPTION_FROM_LINK (OptionLink);\r
       RemoveEntryList (&Option->Link);\r
       FreePool (Option);\r
     }\r
@@ -739,7 +840,7 @@ FreeStatementData (
     // Free nest statement List\r
     //\r
     if (!IsListEmpty (&Statement->NestStatementList)) {\r
-      FreeStatementData(&Statement->NestStatementList);\r
+      FreeStatementData (&Statement->NestStatementList);\r
     }\r
 \r
     RemoveEntryList (&Statement->DisplayLink);\r
@@ -760,9 +861,9 @@ FreeDisplayFormData (
   FreeStatementData (&gDisplayFormData.StatementListHead);\r
   FreeStatementData (&gDisplayFormData.StatementListOSF);\r
 \r
-  FreeRefreshEvent();\r
+  FreeRefreshEvent ();\r
 \r
-  FreeHotkeyList();\r
+  FreeHotkeyList ();\r
 }\r
 \r
 /**\r
@@ -776,11 +877,11 @@ FreeDisplayFormData (
 **/\r
 FORM_BROWSER_STATEMENT *\r
 GetBrowserStatement (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement\r
+  IN FORM_DISPLAY_ENGINE_STATEMENT  *DisplayStatement\r
   )\r
 {\r
-  FORM_BROWSER_STATEMENT *Statement;\r
-  LIST_ENTRY             *Link;\r
+  FORM_BROWSER_STATEMENT  *Statement;\r
+  LIST_ENTRY              *Link;\r
 \r
   Link = GetFirstNode (&gCurrentSelection->Form->StatementListHead);\r
   while (!IsNull (&gCurrentSelection->Form->StatementListHead, Link)) {\r
@@ -803,21 +904,28 @@ GetBrowserStatement (
   @param  Form                   Form data structure.\r
 \r
 **/\r
-VOID \r
+VOID\r
 UpdateStatementStatusForForm (\r
-  IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN FORM_BROWSER_FORM                *Form\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN FORM_BROWSER_FORM     *Form\r
   )\r
 {\r
-  LIST_ENTRY                  *Link;\r
-  FORM_BROWSER_STATEMENT      *Question;\r
+  LIST_ENTRY              *Link;\r
+  FORM_BROWSER_STATEMENT  *Question;\r
 \r
   Link = GetFirstNode (&Form->StatementListHead);\r
   while (!IsNull (&Form->StatementListHead, Link)) {\r
     Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&Form->StatementListHead, Link);\r
+    Link     = GetNextNode (&Form->StatementListHead, Link);\r
+\r
+    //\r
+    // For password opcode, not set the the value changed flag.\r
+    //\r
+    if (Question->Operand == EFI_IFR_PASSWORD_OP) {\r
+      continue;\r
+    }\r
 \r
-    IsQuestionValueChanged(FormSet, Form, Question, GetSetValueWithBuffer);\r
+    IsQuestionValueChanged (FormSet, Form, Question, GetSetValueWithBuffer);\r
   }\r
 }\r
 \r
@@ -827,13 +935,13 @@ UpdateStatementStatusForForm (
   @param  FormSet                FormSet data structure.\r
 \r
 **/\r
-VOID \r
+VOID\r
 UpdateStatementStatusForFormSet (\r
-  IN FORM_BROWSER_FORMSET                *FormSet\r
+  IN FORM_BROWSER_FORMSET  *FormSet\r
   )\r
 {\r
-  LIST_ENTRY                  *Link;\r
-  FORM_BROWSER_FORM           *Form;\r
+  LIST_ENTRY         *Link;\r
+  FORM_BROWSER_FORM  *Form;\r
 \r
   Link = GetFirstNode (&FormSet->FormListHead);\r
   while (!IsNull (&FormSet->FormListHead, Link)) {\r
@@ -852,40 +960,41 @@ UpdateStatementStatusForFormSet (
   @param  SettingScope           Setting Scope for Default action.\r
 \r
 **/\r
-VOID \r
+VOID\r
 UpdateStatementStatus (\r
-  IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN FORM_BROWSER_FORM                *Form, \r
-  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  IN FORM_BROWSER_FORMSET   *FormSet,\r
+  IN FORM_BROWSER_FORM      *Form,\r
+  IN BROWSER_SETTING_SCOPE  SettingScope\r
   )\r
 {\r
-  LIST_ENTRY                  *Link;\r
-  FORM_BROWSER_FORMSET        *LocalFormSet;\r
+  LIST_ENTRY            *Link;\r
+  FORM_BROWSER_FORMSET  *LocalFormSet;\r
 \r
   switch (SettingScope) {\r
-  case SystemLevel:\r
-    Link = GetFirstNode (&gBrowserFormSetList);\r
-    while (!IsNull (&gBrowserFormSetList, Link)) {\r
-      LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
-      Link = GetNextNode (&gBrowserFormSetList, Link);\r
-      if (!ValidateFormSet(LocalFormSet)) {\r
-        continue;\r
+    case SystemLevel:\r
+      Link = GetFirstNode (&gBrowserFormSetList);\r
+      while (!IsNull (&gBrowserFormSetList, Link)) {\r
+        LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
+        Link         = GetNextNode (&gBrowserFormSetList, Link);\r
+        if (!ValidateFormSet (LocalFormSet)) {\r
+          continue;\r
+        }\r
+\r
+        UpdateStatementStatusForFormSet (LocalFormSet);\r
       }\r
 \r
-      UpdateStatementStatusForFormSet (LocalFormSet);\r
-    }\r
-    break;\r
+      break;\r
 \r
-  case FormSetLevel:\r
-    UpdateStatementStatusForFormSet (FormSet);\r
-    break;\r
+    case FormSetLevel:\r
+      UpdateStatementStatusForFormSet (FormSet);\r
+      break;\r
 \r
-  case FormLevel:\r
-    UpdateStatementStatusForForm (FormSet, Form);\r
-    break;\r
+    case FormLevel:\r
+      UpdateStatementStatusForForm (FormSet, Form);\r
+      break;\r
 \r
-  default:\r
-    break;\r
+    default:\r
+      break;\r
   }\r
 }\r
 \r
@@ -899,10 +1008,10 @@ UpdateStatementStatus (
   @retval EFI_SUCESSS            This function always return successfully for now.\r
 \r
 **/\r
-EFI_STATUS \r
+EFI_STATUS\r
 ProcessAction (\r
-  IN UINT32        Action,\r
-  IN UINT16        DefaultId\r
+  IN UINT32  Action,\r
+  IN UINT16  DefaultId\r
   )\r
 {\r
   //\r
@@ -921,7 +1030,7 @@ ProcessAction (
   }\r
 \r
   if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {\r
-    ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);\r
+    ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE);\r
     UpdateStatementStatus (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);\r
   }\r
 \r
@@ -930,7 +1039,8 @@ ProcessAction (
   }\r
 \r
   if ((Action & BROWSER_ACTION_RESET) == BROWSER_ACTION_RESET) {\r
-    gResetRequired = TRUE;\r
+    gResetRequiredFormLevel   = TRUE;\r
+    gResetRequiredSystemLevel = TRUE;\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_EXIT) == BROWSER_ACTION_EXIT) {\r
@@ -940,12 +1050,13 @@ ProcessAction (
     // System Exit without saving, CallExitHandler and Exit SendForm.\r
     //\r
     DiscardForm (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);\r
-    if (gBrowserSettingScope == FormLevel || gBrowserSettingScope == FormSetLevel) {\r
+    if ((gBrowserSettingScope == FormLevel) || (gBrowserSettingScope == FormSetLevel)) {\r
       FindNextMenu (gCurrentSelection, gBrowserSettingScope);\r
     } else if (gBrowserSettingScope == SystemLevel) {\r
       if (ExitHandlerFunction != NULL) {\r
         ExitHandlerFunction ();\r
       }\r
+\r
       gCurrentSelection->Action = UI_ACTION_EXIT;\r
     }\r
   }\r
@@ -965,8 +1076,8 @@ ProcessAction (
 **/\r
 BOOLEAN\r
 GetFormsetGuidFromHiiHandle (\r
-  IN EFI_HII_HANDLE       HiiHandle,\r
-  IN EFI_GUID             *FormSetGuid\r
+  IN EFI_HII_HANDLE  HiiHandle,\r
+  IN EFI_GUID        *FormSetGuid\r
   )\r
 {\r
   EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
@@ -983,7 +1094,7 @@ GetFormsetGuidFromHiiHandle (
   BufferSize     = 0;\r
   HiiPackageList = NULL;\r
   FindGuid       = FALSE;\r
-  \r
+\r
   Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     HiiPackageList = AllocatePool (BufferSize);\r
@@ -991,19 +1102,20 @@ GetFormsetGuidFromHiiHandle (
 \r
     Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
   }\r
-  if (EFI_ERROR (Status) || HiiPackageList == NULL) {\r
+\r
+  if (EFI_ERROR (Status) || (HiiPackageList == NULL)) {\r
     return FALSE;\r
   }\r
 \r
   //\r
   // Get Form package from this HII package List\r
   //\r
-  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+  Offset  = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
   Offset2 = 0;\r
-  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); \r
+  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
 \r
   while (Offset < PackageListLength) {\r
-    Package = ((UINT8 *) HiiPackageList) + Offset;\r
+    Package = ((UINT8 *)HiiPackageList) + Offset;\r
     CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
     Offset += PackageHeader.Length;\r
 \r
@@ -1015,16 +1127,17 @@ GetFormsetGuidFromHiiHandle (
       while (Offset2 < PackageHeader.Length) {\r
         OpCodeData = Package + Offset2;\r
 \r
-        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-          if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))){\r
+        if (((EFI_IFR_OP_HEADER *)OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
+          if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
             FindGuid = TRUE;\r
             break;\r
           }\r
         }\r
 \r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
+        Offset2 += ((EFI_IFR_OP_HEADER *)OpCodeData)->Length;\r
       }\r
     }\r
+\r
     if (FindGuid) {\r
       break;\r
     }\r
@@ -1051,17 +1164,17 @@ GetFormsetGuidFromHiiHandle (
 **/\r
 EFI_HII_HANDLE\r
 DevicePathToHiiHandle (\r
-  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath,\r
-  IN EFI_GUID                   *FormsetGuid\r
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
+  IN EFI_GUID                  *FormsetGuid\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_DEVICE_PATH_PROTOCOL    *TmpDevicePath;\r
-  UINTN                       Index;\r
-  EFI_HANDLE                  Handle;\r
-  EFI_HANDLE                  DriverHandle;\r
-  EFI_HII_HANDLE              *HiiHandles;\r
-  EFI_HII_HANDLE              HiiHandle;\r
+  EFI_STATUS                Status;\r
+  EFI_DEVICE_PATH_PROTOCOL  *TmpDevicePath;\r
+  UINTN                     Index;\r
+  EFI_HANDLE                Handle;\r
+  EFI_HANDLE                DriverHandle;\r
+  EFI_HII_HANDLE            *HiiHandles;\r
+  EFI_HII_HANDLE            HiiHandle;\r
 \r
   ASSERT (DevicePath != NULL);\r
 \r
@@ -1097,7 +1210,7 @@ DevicePathToHiiHandle (
                              &Handle\r
                              );\r
     if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
-      if (GetFormsetGuidFromHiiHandle(HiiHandles[Index], FormsetGuid)) {\r
+      if (GetFormsetGuidFromHiiHandle (HiiHandles[Index], FormsetGuid)) {\r
         HiiHandle = HiiHandles[Index];\r
         break;\r
       }\r
@@ -1127,16 +1240,16 @@ DevicePathToHiiHandle (
 **/\r
 EFI_HII_HANDLE\r
 FormSetGuidToHiiHandle (\r
-  EFI_GUID     *ComparingGuid\r
+  EFI_GUID  *ComparingGuid\r
   )\r
 {\r
-  EFI_HII_HANDLE               *HiiHandles;\r
-  EFI_HII_HANDLE               HiiHandle;\r
-  UINTN                        Index;\r
+  EFI_HII_HANDLE  *HiiHandles;\r
+  EFI_HII_HANDLE  HiiHandle;\r
+  UINTN           Index;\r
 \r
   ASSERT (ComparingGuid != NULL);\r
 \r
-  HiiHandle  = NULL;\r
+  HiiHandle = NULL;\r
   //\r
   // Get all the Hii handles\r
   //\r
@@ -1147,7 +1260,7 @@ FormSetGuidToHiiHandle (
   // Search for formset of each class type\r
   //\r
   for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    if (GetFormsetGuidFromHiiHandle(HiiHandles[Index], ComparingGuid)) {\r
+    if (GetFormsetGuidFromHiiHandle (HiiHandles[Index], ComparingGuid)) {\r
       HiiHandle = HiiHandles[Index];\r
       break;\r
     }\r
@@ -1177,24 +1290,25 @@ FormSetGuidToHiiHandle (
 **/\r
 BOOLEAN\r
 ProcessChangedData (\r
-  IN OUT UI_MENU_SELECTION       *Selection,\r
-  IN     BROWSER_SETTING_SCOPE   Scope\r
+  IN OUT UI_MENU_SELECTION      *Selection,\r
+  IN     BROWSER_SETTING_SCOPE  Scope\r
   )\r
 {\r
-  BOOLEAN    RetValue;\r
-  EFI_STATUS Status;\r
+  BOOLEAN     RetValue;\r
+  EFI_STATUS  Status;\r
 \r
   RetValue = TRUE;\r
-  switch (mFormDisplay->ConfirmDataChange()) {\r
+  switch (mFormDisplay->ConfirmDataChange ()) {\r
     case BROWSER_ACTION_DISCARD:\r
       DiscardForm (Selection->FormSet, Selection->Form, Scope);\r
       break;\r
-  \r
+\r
     case BROWSER_ACTION_SUBMIT:\r
       Status = SubmitForm (Selection->FormSet, Selection->Form, Scope);\r
       if (EFI_ERROR (Status)) {\r
         RetValue = FALSE;\r
       }\r
+\r
       break;\r
 \r
     case BROWSER_ACTION_NONE:\r
@@ -1221,26 +1335,18 @@ ProcessChangedData (
 **/\r
 VOID\r
 FindParentFormSet (\r
-  IN OUT   UI_MENU_SELECTION           *Selection\r
+  IN OUT   UI_MENU_SELECTION  *Selection\r
   )\r
 {\r
-  FORM_ENTRY_INFO            *CurrentMenu;\r
-  FORM_ENTRY_INFO            *ParentMenu;\r
+  FORM_ENTRY_INFO  *CurrentMenu;\r
+  FORM_ENTRY_INFO  *ParentMenu;\r
 \r
   CurrentMenu = Selection->CurrentMenu;\r
-  ParentMenu  = UiFindParentMenu(CurrentMenu);\r
-\r
-  //\r
-  // Find a menu which has different formset guid with current.\r
-  //\r
-  while (ParentMenu != NULL && CompareGuid (&CurrentMenu->FormSetGuid, &ParentMenu->FormSetGuid)) {\r
-    CurrentMenu = ParentMenu;\r
-    ParentMenu  = UiFindParentMenu(CurrentMenu);\r
-  }\r
+  ParentMenu  = UiFindParentMenu (CurrentMenu, FormSetLevel);\r
 \r
   if (ParentMenu != NULL) {\r
     CopyMem (&Selection->FormSetGuid, &ParentMenu->FormSetGuid, sizeof (EFI_GUID));\r
-    Selection->Handle = ParentMenu->HiiHandle;\r
+    Selection->Handle     = ParentMenu->HiiHandle;\r
     Selection->FormId     = ParentMenu->FormId;\r
     Selection->QuestionId = ParentMenu->QuestionId;\r
   } else {\r
@@ -1248,7 +1354,7 @@ FindParentFormSet (
     Selection->QuestionId = CurrentMenu->QuestionId;\r
   }\r
 \r
-  Selection->Statement  = NULL;\r
+  Selection->Statement = NULL;\r
 }\r
 \r
 /**\r
@@ -1262,16 +1368,16 @@ FindParentFormSet (
 **/\r
 EFI_STATUS\r
 ProcessGotoOpCode (\r
-  IN OUT   FORM_BROWSER_STATEMENT      *Statement,\r
-  IN OUT   UI_MENU_SELECTION           *Selection\r
+  IN OUT   FORM_BROWSER_STATEMENT  *Statement,\r
+  IN OUT   UI_MENU_SELECTION       *Selection\r
   )\r
 {\r
-  CHAR16                          *StringPtr;\r
-  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
-  FORM_BROWSER_FORM               *RefForm;\r
-  EFI_STATUS                      Status;\r
-  EFI_HII_HANDLE                  HiiHandle;\r
-  \r
+  CHAR16                    *StringPtr;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  FORM_BROWSER_FORM         *RefForm;\r
+  EFI_STATUS                Status;\r
+  EFI_HII_HANDLE            HiiHandle;\r
+\r
   Status    = EFI_SUCCESS;\r
   StringPtr = NULL;\r
   HiiHandle = NULL;\r
@@ -1286,7 +1392,7 @@ ProcessGotoOpCode (
   //\r
   // Check whether the device path string is a valid string.\r
   //\r
-  if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringPtr[0] != L'\0') {\r
+  if ((Statement->HiiValue.Value.ref.DevicePath != 0) && (StringPtr != NULL) && (StringPtr[0] != L'\0')) {\r
     if (Selection->Form->ModalForm) {\r
       return Status;\r
     }\r
@@ -1295,17 +1401,18 @@ ProcessGotoOpCode (
     // Goto another Hii Package list\r
     //\r
     if (mPathFromText != NULL) {\r
-      DevicePath = mPathFromText->ConvertTextToDevicePath(StringPtr);\r
+      DevicePath = mPathFromText->ConvertTextToDevicePath (StringPtr);\r
       if (DevicePath != NULL) {\r
         HiiHandle = DevicePathToHiiHandle (DevicePath, &Statement->HiiValue.Value.ref.FormSetGuid);\r
         FreePool (DevicePath);\r
       }\r
+\r
       FreePool (StringPtr);\r
     } else {\r
       //\r
       // Not found the EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL protocol.\r
       //\r
-      PopupErrorMessage(BROWSER_PROTOCOL_NOT_FOUND, NULL, NULL, NULL);\r
+      PopupErrorMessage (BROWSER_PROTOCOL_NOT_FOUND, NULL, NULL, NULL);\r
       FreePool (StringPtr);\r
       return Status;\r
     }\r
@@ -1314,9 +1421,10 @@ ProcessGotoOpCode (
       //\r
       // Goto another Formset, check for uncommitted data\r
       //\r
-      if ((gBrowserSettingScope == FormLevel || gBrowserSettingScope == FormSetLevel) &&\r
-          IsNvUpdateRequiredForFormSet(Selection->FormSet)) {\r
-        if (!ProcessChangedData(Selection, FormSetLevel)) {\r
+      if (((gBrowserSettingScope == FormLevel) || (gBrowserSettingScope == FormSetLevel)) &&\r
+          IsNvUpdateRequiredForFormSet (Selection->FormSet))\r
+      {\r
+        if (!ProcessChangedData (Selection, FormSetLevel)) {\r
           return EFI_SUCCESS;\r
         }\r
       }\r
@@ -1328,48 +1436,50 @@ ProcessGotoOpCode (
       //\r
       // If target Hii Handle not found, exit current formset.\r
       //\r
-      FindParentFormSet(Selection);\r
+      FindParentFormSet (Selection);\r
       return EFI_SUCCESS;\r
     }\r
 \r
-    CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
+    Selection->FormId     = Statement->HiiValue.Value.ref.FormId;\r
     Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
-  } else if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &gZeroGuid)) {\r
+  } else if (!IsZeroGuid (&Statement->HiiValue.Value.ref.FormSetGuid)) {\r
     if (Selection->Form->ModalForm) {\r
       return Status;\r
     }\r
+\r
     if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &Selection->FormSetGuid)) {\r
       //\r
       // Goto another Formset, check for uncommitted data\r
       //\r
-      if ((gBrowserSettingScope == FormLevel || gBrowserSettingScope == FormSetLevel) &&\r
-         IsNvUpdateRequiredForFormSet(Selection->FormSet)) {\r
-        if (!ProcessChangedData(Selection, FormSetLevel)) {\r
+      if (((gBrowserSettingScope == FormLevel) || (gBrowserSettingScope == FormSetLevel)) &&\r
+          IsNvUpdateRequiredForFormSet (Selection->FormSet))\r
+      {\r
+        if (!ProcessChangedData (Selection, FormSetLevel)) {\r
           return EFI_SUCCESS;\r
         }\r
       }\r
     }\r
 \r
     Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-    Selection->Handle = FormSetGuidToHiiHandle(&Statement->HiiValue.Value.ref.FormSetGuid);\r
+    Selection->Handle = FormSetGuidToHiiHandle (&Statement->HiiValue.Value.ref.FormSetGuid);\r
     if (Selection->Handle == NULL) {\r
       //\r
       // If target Hii Handle not found, exit current formset.\r
       //\r
-      FindParentFormSet(Selection);\r
+      FindParentFormSet (Selection);\r
       return EFI_SUCCESS;\r
     }\r
 \r
     CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    Selection->FormId     = Statement->HiiValue.Value.ref.FormId;\r
     Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
   } else if (Statement->HiiValue.Value.ref.FormId != 0) {\r
     //\r
     // Goto another Form, check for uncommitted data\r
     //\r
     if (Statement->HiiValue.Value.ref.FormId != Selection->FormId) {\r
-      if ((gBrowserSettingScope == FormLevel && IsNvUpdateRequiredForForm(Selection->Form))) {\r
+      if (((gBrowserSettingScope == FormLevel) && IsNvUpdateRequiredForForm (Selection->Form))) {\r
         if (!ProcessChangedData (Selection, FormLevel)) {\r
           return EFI_SUCCESS;\r
         }\r
@@ -1378,16 +1488,16 @@ ProcessGotoOpCode (
 \r
     RefForm = IdToForm (Selection->FormSet, Statement->HiiValue.Value.ref.FormId);\r
     if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
-      if (EvaluateExpressionList(RefForm->SuppressExpression, TRUE, Selection->FormSet, RefForm) != ExpressFalse) {\r
+      if (EvaluateExpressionList (RefForm->SuppressExpression, TRUE, Selection->FormSet, RefForm) != ExpressFalse) {\r
         //\r
-        // Form is suppressed. \r
+        // Form is suppressed.\r
         //\r
-        PopupErrorMessage(BROWSER_FORM_SUPPRESS, NULL, NULL, NULL);\r
+        PopupErrorMessage (BROWSER_FORM_SUPPRESS, NULL, NULL, NULL);\r
         return EFI_SUCCESS;\r
       }\r
     }\r
 \r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    Selection->FormId     = Statement->HiiValue.Value.ref.FormId;\r
     Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
   } else if (Statement->HiiValue.Value.ref.QuestionId != 0) {\r
     Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
@@ -1396,7 +1506,6 @@ ProcessGotoOpCode (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Process Question Config.\r
 \r
@@ -1413,9 +1522,9 @@ ProcessQuestionConfig (
   IN  FORM_BROWSER_STATEMENT  *Question\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  CHAR16                          *ConfigResp;\r
-  CHAR16                          *Progress;\r
+  EFI_STATUS  Status;\r
+  CHAR16      *ConfigResp;\r
+  CHAR16      *Progress;\r
 \r
   if (Question->QuestionConfig == 0) {\r
     return EFI_SUCCESS;\r
@@ -1427,16 +1536,18 @@ ProcessQuestionConfig (
   ConfigResp = GetToken (Question->QuestionConfig, Selection->FormSet->HiiHandle);\r
   if (ConfigResp == NULL) {\r
     return EFI_NOT_FOUND;\r
+  } else if (ConfigResp[0] == L'\0') {\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   //\r
   // Send config to Configuration Driver\r
   //\r
   Status = mHiiConfigRouting->RouteConfig (\r
-                           mHiiConfigRouting,\r
-                           ConfigResp,\r
-                           &Progress\r
-                           );\r
+                                mHiiConfigRouting,\r
+                                ConfigResp,\r
+                                &Progress\r
+                                );\r
 \r
   return Status;\r
 }\r
@@ -1446,21 +1557,20 @@ ProcessQuestionConfig (
   Process the user input data.\r
 \r
   @param UserInput               The user input data.\r
-  @param ChangeHighlight         Whether need to change the highlight statement.  \r
 \r
   @retval EFI_SUCESSS            This function always return successfully for now.\r
 \r
 **/\r
 EFI_STATUS\r
 ProcessUserInput (\r
-  IN USER_INPUT               *UserInput,\r
-  IN BOOLEAN                  ChangeHighlight\r
+  IN USER_INPUT  *UserInput\r
   )\r
 {\r
-  EFI_STATUS                    Status;\r
-  FORM_BROWSER_STATEMENT        *Statement;\r
+  EFI_STATUS              Status;\r
+  FORM_BROWSER_STATEMENT  *Statement;\r
 \r
-  Status = EFI_SUCCESS;\r
+  Status    = EFI_SUCCESS;\r
+  Statement = NULL;\r
 \r
   //\r
   // When Exit from FormDisplay function, one of the below two cases must be true.\r
@@ -1471,127 +1581,103 @@ ProcessUserInput (
   // Remove the last highligh question id, this id will update when show next form.\r
   //\r
   gCurrentSelection->QuestionId = 0;\r
+  if (UserInput->SelectedStatement != NULL) {\r
+    Statement = GetBrowserStatement (UserInput->SelectedStatement);\r
+    ASSERT (Statement != NULL);\r
+\r
+    //\r
+    // This question is the current user select one,record it and later\r
+    // show it as the highlight question.\r
+    //\r
+    gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
+    //\r
+    // For statement like text, actio, it not has question id.\r
+    // So use FakeQuestionId to save the question.\r
+    //\r
+    if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
+      mCurFakeQestId = Statement->FakeQuestionId;\r
+    } else {\r
+      mCurFakeQestId = 0;\r
+    }\r
+  }\r
 \r
   //\r
   // First process the Action field in USER_INPUT.\r
   //\r
   if (UserInput->Action != 0) {\r
-    Status = ProcessAction (UserInput->Action, UserInput->DefaultId);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-    //\r
-    // Clear the highlight info.\r
-    //\r
+    Status                       = ProcessAction (UserInput->Action, UserInput->DefaultId);\r
     gCurrentSelection->Statement = NULL;\r
-\r
-    if (UserInput->SelectedStatement != NULL) {\r
-      Statement = GetBrowserStatement(UserInput->SelectedStatement);\r
-      ASSERT (Statement != NULL);\r
-      //\r
-      // Save the current highlight menu in the menu history data.\r
-      // which will be used when later browse back to this form.\r
-      //\r
-      gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
-      //\r
-      // For statement like text, actio, it not has question id.\r
-      // So use FakeQuestionId to save the question.\r
-      //\r
-      if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
-        mCurFakeQestId = Statement->FakeQuestionId;\r
-      } else {\r
-        mCurFakeQestId = 0;\r
-      }\r
-    }\r
   } else {\r
-    Statement = GetBrowserStatement(UserInput->SelectedStatement);\r
     ASSERT (Statement != NULL);\r
-\r
     gCurrentSelection->Statement = Statement;\r
-\r
-    if (ChangeHighlight) {\r
-      //\r
-      // This question is the current user select one,record it and later\r
-      // show it as the highlight question.\r
-      //\r
-      gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
-      //\r
-      // For statement like text, actio, it not has question id.\r
-      // So use FakeQuestionId to save the question.\r
-      //\r
-      if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
-        mCurFakeQestId = Statement->FakeQuestionId;\r
-      } else {\r
-        mCurFakeQestId = 0;\r
-      }\r
-    }\r
-\r
     switch (Statement->Operand) {\r
-    case EFI_IFR_REF_OP:\r
-      Status = ProcessGotoOpCode(Statement, gCurrentSelection);\r
-      break;\r
-    \r
-    case EFI_IFR_ACTION_OP:\r
-      //\r
-      // Process the Config string <ConfigResp>\r
-      //\r
-      Status = ProcessQuestionConfig (gCurrentSelection, Statement);\r
-      break;\r
-    \r
-    case EFI_IFR_RESET_BUTTON_OP:\r
-      //\r
-      // Reset Question to default value specified by DefaultId\r
-      //\r
-      Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);\r
-      UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel);\r
-      break;\r
-\r
-    default:\r
-      switch (Statement->Operand) {\r
-      case EFI_IFR_STRING_OP:\r
-        DeleteString(Statement->HiiValue.Value.string, gCurrentSelection->FormSet->HiiHandle);\r
-        Statement->HiiValue.Value.string = UserInput->InputValue.Value.string;\r
-        CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, (UINTN) UserInput->InputValue.BufferLen);\r
-        FreePool (UserInput->InputValue.Buffer);\r
+      case EFI_IFR_REF_OP:\r
+        Status = ProcessGotoOpCode (Statement, gCurrentSelection);\r
         break;\r
 \r
-      case EFI_IFR_PASSWORD_OP:\r
-        if (UserInput->InputValue.Buffer == NULL) {\r
-          //\r
-          // User not input new password, just return.\r
-          //\r
-          break;\r
-        }\r
-\r
-        DeleteString(Statement->HiiValue.Value.string, gCurrentSelection->FormSet->HiiHandle);\r
-        Statement->HiiValue.Value.string = UserInput->InputValue.Value.string;\r
-        CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, (UINTN) UserInput->InputValue.BufferLen);\r
-        FreePool (UserInput->InputValue.Buffer);\r
+      case EFI_IFR_ACTION_OP:\r
         //\r
-        // Two password match, send it to Configuration Driver\r
+        // Process the Config string <ConfigResp>\r
         //\r
-        if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          PasswordCheck (NULL, UserInput->SelectedStatement, (CHAR16 *) Statement->BufferValue);\r
-          //\r
-          // Clean the value after saved it.\r
-          //\r
-          ZeroMem (Statement->BufferValue, (UINTN) UserInput->InputValue.BufferLen);\r
-          HiiSetString (gCurrentSelection->FormSet->HiiHandle, Statement->HiiValue.Value.string, (CHAR16*)Statement->BufferValue, NULL);\r
-        } else {\r
-          SetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithHiiDriver);\r
-        }\r
+        Status = ProcessQuestionConfig (gCurrentSelection, Statement);\r
         break;\r
 \r
-      case EFI_IFR_ORDERED_LIST_OP:\r
-        CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, UserInput->InputValue.BufferLen);\r
+      case EFI_IFR_RESET_BUTTON_OP:\r
+        //\r
+        // Reset Question to default value specified by DefaultId\r
+        //\r
+        Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE, FALSE);\r
+        UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel);\r
         break;\r
 \r
       default:\r
-        CopyMem (&Statement->HiiValue, &UserInput->InputValue, sizeof (EFI_HII_VALUE));\r
+        switch (Statement->Operand) {\r
+          case EFI_IFR_STRING_OP:\r
+            DeleteString (Statement->HiiValue.Value.string, gCurrentSelection->FormSet->HiiHandle);\r
+            Statement->HiiValue.Value.string = UserInput->InputValue.Value.string;\r
+            CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, (UINTN)UserInput->InputValue.BufferLen);\r
+            FreePool (UserInput->InputValue.Buffer);\r
+            break;\r
+\r
+          case EFI_IFR_PASSWORD_OP:\r
+            if (UserInput->InputValue.Buffer == NULL) {\r
+              //\r
+              // User not input new password, just return.\r
+              //\r
+              break;\r
+            }\r
+\r
+            DeleteString (Statement->HiiValue.Value.string, gCurrentSelection->FormSet->HiiHandle);\r
+            Statement->HiiValue.Value.string = UserInput->InputValue.Value.string;\r
+            CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, (UINTN)UserInput->InputValue.BufferLen);\r
+            ZeroMem (UserInput->InputValue.Buffer, (UINTN)UserInput->InputValue.BufferLen);\r
+            FreePool (UserInput->InputValue.Buffer);\r
+            //\r
+            // Two password match, send it to Configuration Driver\r
+            //\r
+            if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+              PasswordCheck (NULL, UserInput->SelectedStatement, (CHAR16 *)Statement->BufferValue);\r
+              //\r
+              // Clean the value after saved it.\r
+              //\r
+              ZeroMem (Statement->BufferValue, (UINTN)UserInput->InputValue.BufferLen);\r
+              HiiSetString (gCurrentSelection->FormSet->HiiHandle, Statement->HiiValue.Value.string, (CHAR16 *)Statement->BufferValue, NULL);\r
+            } else {\r
+              SetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithHiiDriver);\r
+            }\r
+\r
+            break;\r
+\r
+          case EFI_IFR_ORDERED_LIST_OP:\r
+            CopyMem (Statement->BufferValue, UserInput->InputValue.Buffer, UserInput->InputValue.BufferLen);\r
+            break;\r
+\r
+          default:\r
+            CopyMem (&Statement->HiiValue, &UserInput->InputValue, sizeof (EFI_HII_VALUE));\r
+            break;\r
+        }\r
+\r
         break;\r
-      }\r
-      break;\r
     }\r
   }\r
 \r
@@ -1610,10 +1696,9 @@ DisplayForm (
   VOID\r
   )\r
 {\r
-  EFI_STATUS               Status;\r
-  USER_INPUT               UserInput;\r
-  FORM_ENTRY_INFO          *CurrentMenu;\r
-  BOOLEAN                  ChangeHighlight;\r
+  EFI_STATUS       Status;\r
+  USER_INPUT       UserInput;\r
+  FORM_ENTRY_INFO  *CurrentMenu;\r
 \r
   ZeroMem (&UserInput, sizeof (USER_INPUT));\r
 \r
@@ -1625,21 +1710,22 @@ DisplayForm (
     //\r
     // Current menu not found, add it to the menu tree\r
     //\r
-    CurrentMenu = UiAddMenuList (gCurrentSelection->Handle, &gCurrentSelection->FormSetGuid,\r
-                                 gCurrentSelection->FormId, gCurrentSelection->QuestionId);\r
+    CurrentMenu = UiAddMenuList (\r
+                    gCurrentSelection->Handle,\r
+                    &gCurrentSelection->FormSetGuid,\r
+                    gCurrentSelection->FormId,\r
+                    gCurrentSelection->QuestionId\r
+                    );\r
     ASSERT (CurrentMenu != NULL);\r
   }\r
 \r
   //\r
   // Back up the form view history data for this form.\r
   //\r
-  UiCopyMenuList(&gCurrentSelection->Form->FormViewListHead, &mPrivateData.FormBrowserEx2.FormViewHistoryHead);\r
+  UiCopyMenuList (&gCurrentSelection->Form->FormViewListHead, &mPrivateData.FormBrowserEx2.FormViewHistoryHead);\r
 \r
   gCurrentSelection->CurrentMenu = CurrentMenu;\r
 \r
-  //\r
-  // Find currrent highlight statement.\r
-  //\r
   if (gCurrentSelection->QuestionId == 0) {\r
     //\r
     // Highlight not specified, fetch it from cached menu\r
@@ -1647,9 +1733,6 @@ DisplayForm (
     gCurrentSelection->QuestionId = CurrentMenu->QuestionId;\r
   }\r
 \r
-  //\r
-  // Evaluate all the Expressions in this Form\r
-  //\r
   Status = EvaluateFormExpressions (gCurrentSelection->FormSet, gCurrentSelection->Form);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1657,34 +1740,17 @@ DisplayForm (
 \r
   UpdateDisplayFormData ();\r
 \r
-  //\r
-  // Three possible status maybe return.\r
-  //\r
-  // EFI_INVALID_PARAMETER: The input dimension info is not valid.\r
-  // EFI_NOT_FOUND:         The input value for oneof/orderedlist opcode is not valid\r
-  //                        and an valid value has return.\r
-  // EFI_SUCCESS:           Success shows form and get user input in UserInput paramenter.\r
-  //\r
   ASSERT (gDisplayFormData.BrowserStatus == BROWSER_SUCCESS);\r
   Status = mFormDisplay->FormDisplay (&gDisplayFormData, &UserInput);\r
-  if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {\r
-    FreeDisplayFormData();\r
+  if (EFI_ERROR (Status)) {\r
+    FreeDisplayFormData ();\r
     return Status;\r
   }\r
 \r
-  //\r
-  // If status is EFI_SUCCESS, means user has change the highlight menu and new user input return.\r
-  //                           in this case, browser need to change the highlight menu.\r
-  // If status is EFI_NOT_FOUND, means the input DisplayFormData has error for oneof/orderedlist \r
-  //                          opcode and new valid value has return, browser core need to adjust\r
-  //                          value for this opcode and shows this form again.\r
-  //\r
-  ChangeHighlight = (Status == EFI_SUCCESS ? TRUE :FALSE);\r
-\r
-  Status = ProcessUserInput (&UserInput, ChangeHighlight);\r
-\r
-  FreeDisplayFormData();\r
+  CheckConfigAccess (gCurrentSelection->FormSet);\r
 \r
+  Status = ProcessUserInput (&UserInput);\r
+  FreeDisplayFormData ();\r
   return Status;\r
 }\r
 \r
@@ -1717,14 +1783,15 @@ DisplayForm (
 EFI_STATUS\r
 EFIAPI\r
 FormUpdateNotify (\r
-  IN UINT8                              PackageType,\r
-  IN CONST EFI_GUID                     *PackageGuid,\r
-  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
-  IN EFI_HII_HANDLE                     Handle,\r
-  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  IN UINT8                         PackageType,\r
+  IN CONST EFI_GUID                *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER  *Package,\r
+  IN EFI_HII_HANDLE                Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE  NotifyType\r
   )\r
 {\r
   mHiiPackageListUpdated = TRUE;\r
+  mDynamicFormUpdated    = TRUE;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -1740,9 +1807,9 @@ IsNvUpdateRequiredForFormSet (
   IN FORM_BROWSER_FORMSET  *FormSet\r
   )\r
 {\r
-  LIST_ENTRY              *Link;\r
-  FORM_BROWSER_FORM       *Form;\r
-  BOOLEAN                 RetVal;\r
+  LIST_ENTRY         *Link;\r
+  FORM_BROWSER_FORM  *Form;\r
+  BOOLEAN            RetVal;\r
 \r
   //\r
   // Not finished question initialization, return FALSE.\r
@@ -1757,7 +1824,7 @@ IsNvUpdateRequiredForFormSet (
   while (!IsNull (&FormSet->FormListHead, Link)) {\r
     Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
 \r
-    RetVal = IsNvUpdateRequiredForForm(Form);\r
+    RetVal = IsNvUpdateRequiredForForm (Form);\r
     if (RetVal) {\r
       break;\r
     }\r
@@ -1776,7 +1843,7 @@ IsNvUpdateRequiredForFormSet (
 **/\r
 BOOLEAN\r
 IsNvUpdateRequiredForForm (\r
-  IN FORM_BROWSER_FORM    *Form\r
+  IN FORM_BROWSER_FORM  *Form\r
   )\r
 {\r
   LIST_ENTRY              *Link;\r
@@ -1803,48 +1870,33 @@ IsNvUpdateRequiredForForm (
                          about the Selection, form and formset to be displayed.\r
                          On output, Selection return the screen item that is selected\r
                          by user.\r
-  @param SettingLevel    Input Settting level, if it is FormLevel, just exit current form. \r
+  @param SettingLevel    Input Settting level, if it is FormLevel, just exit current form.\r
                          else, we need to exit current formset.\r
-  \r
+\r
   @retval TRUE           Exit current form.\r
   @retval FALSE          User press ESC and keep in current form.\r
 **/\r
 BOOLEAN\r
 FindNextMenu (\r
-  IN OUT UI_MENU_SELECTION        *Selection,\r
-  IN       BROWSER_SETTING_SCOPE  SettingLevel\r
+  IN OUT UI_MENU_SELECTION      *Selection,\r
+  IN     BROWSER_SETTING_SCOPE  SettingLevel\r
   )\r
 {\r
-  FORM_ENTRY_INFO            *CurrentMenu;\r
-  FORM_ENTRY_INFO            *ParentMenu;\r
-  BROWSER_SETTING_SCOPE      Scope;\r
-  \r
+  FORM_ENTRY_INFO        *CurrentMenu;\r
+  FORM_ENTRY_INFO        *ParentMenu;\r
+  BROWSER_SETTING_SCOPE  Scope;\r
+\r
   CurrentMenu = Selection->CurrentMenu;\r
-  ParentMenu  = NULL;\r
   Scope       = FormSetLevel;\r
 \r
-  if (CurrentMenu != NULL && (ParentMenu = UiFindParentMenu(CurrentMenu)) != NULL) {\r
-    //\r
-    // we have a parent, so go to the parent menu\r
-    //\r
-    if (CompareGuid (&CurrentMenu->FormSetGuid, &ParentMenu->FormSetGuid)) {\r
-      if (SettingLevel == FormSetLevel) {\r
-        //\r
-        // Find a menu which has different formset guid with current.\r
-        //\r
-        while (CompareGuid (&CurrentMenu->FormSetGuid, &ParentMenu->FormSetGuid)) {\r
-          CurrentMenu = ParentMenu;\r
-          if ((ParentMenu = UiFindParentMenu(CurrentMenu)) == NULL) {\r
-            break;\r
-          }\r
-        }\r
+  ParentMenu = UiFindParentMenu (CurrentMenu, SettingLevel);\r
+  while (ParentMenu != NULL && !ValidateHiiHandle (ParentMenu->HiiHandle)) {\r
+    ParentMenu = UiFindParentMenu (ParentMenu, SettingLevel);\r
+  }\r
 \r
-        if (ParentMenu != NULL) {\r
-          Scope = FormSetLevel;\r
-        }\r
-      } else {\r
-        Scope = FormLevel;\r
-      }\r
+  if (ParentMenu != NULL) {\r
+    if (CompareGuid (&CurrentMenu->FormSetGuid, &ParentMenu->FormSetGuid)) {\r
+      Scope = FormLevel;\r
     } else {\r
       Scope = FormSetLevel;\r
     }\r
@@ -1853,9 +1905,10 @@ FindNextMenu (
   //\r
   // Form Level Check whether the data is changed.\r
   //\r
-  if ((gBrowserSettingScope == FormLevel && IsNvUpdateRequiredForForm (Selection->Form)) ||\r
-      (gBrowserSettingScope == FormSetLevel && IsNvUpdateRequiredForFormSet(Selection->FormSet) && Scope == FormSetLevel)) {\r
-    if (!ProcessChangedData(Selection, gBrowserSettingScope)) {\r
+  if (((gBrowserSettingScope == FormLevel) && IsNvUpdateRequiredForForm (Selection->Form)) ||\r
+      ((gBrowserSettingScope == FormSetLevel) && IsNvUpdateRequiredForFormSet (Selection->FormSet) && (Scope == FormSetLevel)))\r
+  {\r
+    if (!ProcessChangedData (Selection, gBrowserSettingScope)) {\r
       return FALSE;\r
     }\r
   }\r
@@ -1874,7 +1927,7 @@ FindNextMenu (
 \r
     Selection->Statement = NULL;\r
 \r
-    Selection->FormId = ParentMenu->FormId;\r
+    Selection->FormId     = ParentMenu->FormId;\r
     Selection->QuestionId = ParentMenu->QuestionId;\r
 \r
     //\r
@@ -1892,6 +1945,30 @@ FindNextMenu (
   return TRUE;\r
 }\r
 \r
+/**\r
+  Reconnect the controller.\r
+\r
+  @param DriverHandle          The controller handle which need to be reconnect.\r
+\r
+  @retval   TRUE     do the reconnect behavior success.\r
+  @retval   FALSE    do the reconnect behavior failed.\r
+\r
+**/\r
+BOOLEAN\r
+ReconnectController (\r
+  IN EFI_HANDLE  DriverHandle\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = gBS->DisconnectController (DriverHandle, NULL, NULL);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = gBS->ConnectController (DriverHandle, NULL, NULL, TRUE);\r
+  }\r
+\r
+  return Status == EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Call the call back function for the question and process the return action.\r
 \r
@@ -1905,20 +1982,21 @@ FindNextMenu (
   @param Action                The action request.\r
   @param SkipSaveOrDiscard     Whether skip save or discard action.\r
 \r
-  @retval EFI_SUCCESS          The call back function excutes successfully.\r
-  @return Other value if the call back function failed to excute.  \r
+  @retval EFI_SUCCESS          The call back function executes successfully.\r
+  @return Other value if the call back function failed to execute.\r
 **/\r
-EFI_STATUS \r
+EFI_STATUS\r
 ProcessCallBackFunction (\r
-  IN OUT UI_MENU_SELECTION               *Selection,\r
-  IN     FORM_BROWSER_FORMSET            *FormSet,\r
-  IN     FORM_BROWSER_FORM               *Form,\r
-  IN     FORM_BROWSER_STATEMENT          *Question,\r
-  IN     EFI_BROWSER_ACTION              Action,\r
-  IN     BOOLEAN                         SkipSaveOrDiscard\r
+  IN OUT UI_MENU_SELECTION       *Selection,\r
+  IN     FORM_BROWSER_FORMSET    *FormSet,\r
+  IN     FORM_BROWSER_FORM       *Form,\r
+  IN     FORM_BROWSER_STATEMENT  *Question,\r
+  IN     EFI_BROWSER_ACTION      Action,\r
+  IN     BOOLEAN                 SkipSaveOrDiscard\r
   )\r
 {\r
   EFI_STATUS                      Status;\r
+  EFI_STATUS                      InternalStatus;\r
   EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   EFI_HII_VALUE                   *HiiValue;\r
@@ -1933,7 +2011,7 @@ ProcessCallBackFunction (
   UINT8                           *BackUpBuffer;\r
   CHAR16                          *NewString;\r
 \r
-  ConfigAccess = FormSet->ConfigAccess;\r
+  ConfigAccess          = FormSet->ConfigAccess;\r
   SubmitFormIsRequired  = FALSE;\r
   SettingLevel          = FormSetLevel;\r
   DiscardFormIsRequired = FALSE;\r
@@ -1949,7 +2027,7 @@ ProcessCallBackFunction (
   Link = GetFirstNode (&Form->StatementListHead);\r
   while (!IsNull (&Form->StatementListHead, Link)) {\r
     Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&Form->StatementListHead, Link);\r
+    Link      = GetNextNode (&Form->StatementListHead, Link);\r
 \r
     //\r
     // if Question != NULL, only process the question. Else, process all question in this form.\r
@@ -1957,7 +2035,7 @@ ProcessCallBackFunction (
     if ((Question != NULL) && (Statement != Question)) {\r
       continue;\r
     }\r
-    \r
+\r
     if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {\r
       continue;\r
     }\r
@@ -1966,18 +2044,18 @@ ProcessCallBackFunction (
     // Check whether Statement is disabled.\r
     //\r
     if (Statement->Expression != NULL) {\r
-      if (EvaluateExpressionList(Statement->Expression, TRUE, FormSet, Form) == ExpressDisable) {\r
+      if (EvaluateExpressionList (Statement->Expression, TRUE, FormSet, Form) == ExpressDisable) {\r
         continue;\r
       }\r
     }\r
 \r
-    HiiValue = &Statement->HiiValue;\r
+    HiiValue  = &Statement->HiiValue;\r
     TypeValue = &HiiValue->Value;\r
     if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
       //\r
       // For OrderedList, passing in the value buffer to Callback()\r
       //\r
-      TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
+      TypeValue = (EFI_IFR_TYPE_VALUE *)Statement->BufferValue;\r
     }\r
 \r
     //\r
@@ -1985,7 +2063,7 @@ ProcessCallBackFunction (
     //\r
     if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
       if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
-        BackUpBuffer = AllocateCopyPool(Statement->StorageWidth + sizeof(CHAR16), Statement->BufferValue);\r
+        BackUpBuffer = AllocateCopyPool (Statement->StorageWidth, Statement->BufferValue);\r
         ASSERT (BackUpBuffer != NULL);\r
       } else {\r
         CopyMem (&BackUpValue, &HiiValue->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
@@ -1993,14 +2071,14 @@ ProcessCallBackFunction (
     }\r
 \r
     ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-    Status = ConfigAccess->Callback (\r
-                             ConfigAccess,\r
-                             Action,\r
-                             Statement->QuestionId,\r
-                             HiiValue->Type,\r
-                             TypeValue,\r
-                             &ActionRequest\r
-                             );\r
+    Status        = ConfigAccess->Callback (\r
+                                    ConfigAccess,\r
+                                    Action,\r
+                                    Statement->QuestionId,\r
+                                    HiiValue->Type,\r
+                                    TypeValue,\r
+                                    &ActionRequest\r
+                                    );\r
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Need to sync the value between Statement->HiiValue->Value and Statement->BufferValue\r
@@ -2011,10 +2089,12 @@ ProcessCallBackFunction (
 \r
         ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth);\r
         if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) {\r
+          ZeroMem (Statement->BufferValue, Statement->StorageWidth);\r
           CopyMem (Statement->BufferValue, NewString, StrSize (NewString));\r
         } else {\r
           CopyMem (Statement->BufferValue, NewString, Statement->StorageWidth);\r
         }\r
+\r
         FreePool (NewString);\r
       }\r
 \r
@@ -2022,105 +2102,129 @@ ProcessCallBackFunction (
       // Only for EFI_BROWSER_ACTION_CHANGED need to handle this ActionRequest.\r
       //\r
       switch (Action) {\r
-      case EFI_BROWSER_ACTION_CHANGED:\r
-        switch (ActionRequest) {\r
-        case EFI_BROWSER_ACTION_REQUEST_RESET:\r
-          DiscardFormIsRequired = TRUE;\r
-          gResetRequired = TRUE;\r
-          NeedExit              = TRUE;\r
-          break;\r
-\r
-        case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
-          SubmitFormIsRequired = TRUE;\r
-          NeedExit              = TRUE;\r
-          break;\r
-\r
-        case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
-          DiscardFormIsRequired = TRUE;\r
-          NeedExit              = TRUE;\r
-          break;\r
-\r
-        case EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT:\r
-          SubmitFormIsRequired  = TRUE;\r
-          SettingLevel          = FormLevel;\r
-          NeedExit              = TRUE;\r
-          break;\r
-\r
-        case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT:\r
-          DiscardFormIsRequired = TRUE;\r
-          SettingLevel          = FormLevel;\r
-          NeedExit              = TRUE;\r
-          break;\r
+        case EFI_BROWSER_ACTION_CHANGED:\r
+          switch (ActionRequest) {\r
+            case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+              DiscardFormIsRequired     = TRUE;\r
+              gResetRequiredFormLevel   = TRUE;\r
+              gResetRequiredSystemLevel = TRUE;\r
+              NeedExit                  = TRUE;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+              SubmitFormIsRequired = TRUE;\r
+              NeedExit             = TRUE;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+              DiscardFormIsRequired = TRUE;\r
+              NeedExit              = TRUE;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT:\r
+              SubmitFormIsRequired = TRUE;\r
+              SettingLevel         = FormLevel;\r
+              NeedExit             = TRUE;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT:\r
+              DiscardFormIsRequired = TRUE;\r
+              SettingLevel          = FormLevel;\r
+              NeedExit              = TRUE;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_FORM_APPLY:\r
+              SubmitFormIsRequired = TRUE;\r
+              SettingLevel         = FormLevel;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD:\r
+              DiscardFormIsRequired = TRUE;\r
+              SettingLevel          = FormLevel;\r
+              break;\r
+\r
+            case EFI_BROWSER_ACTION_REQUEST_RECONNECT:\r
+              gCallbackReconnect = TRUE;\r
+              break;\r
+\r
+            default:\r
+              break;\r
+          }\r
 \r
-        case EFI_BROWSER_ACTION_REQUEST_FORM_APPLY:\r
-          SubmitFormIsRequired  = TRUE;\r
-          SettingLevel          = FormLevel;\r
           break;\r
 \r
-        case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD:\r
-          DiscardFormIsRequired = TRUE;\r
-          SettingLevel          = FormLevel;\r
-          break;\r
+        case EFI_BROWSER_ACTION_CHANGING:\r
+          //\r
+          // Do the question validation.\r
+          //\r
+          Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
+          if (!EFI_ERROR (Status)) {\r
+            //\r
+            // check whether the question value  changed compared with edit buffer before updating edit buffer\r
+            // if changed, set the ValueChanged flag to TRUE,in order to trig the CHANGED callback function\r
+            //\r
+            IsQuestionValueChanged (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
+            //\r
+            // According the spec, return value from call back of "changing" and\r
+            // "retrieve" should update to the question's temp buffer.\r
+            //\r
+            SetQuestionValue (FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+          }\r
 \r
-        default:\r
           break;\r
-        }\r
-        break;\r
 \r
-      case EFI_BROWSER_ACTION_CHANGING:\r
-        //\r
-        // Do the question validation.\r
-        //\r
-        Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
-        if (!EFI_ERROR (Status)) {\r
+        case EFI_BROWSER_ACTION_RETRIEVE:\r
           //\r
-          // According the spec, return value from call back of "changing" and \r
+          // According the spec, return value from call back of "changing" and\r
           // "retrieve" should update to the question's temp buffer.\r
           //\r
-          SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
-        }\r
-        break;\r
-\r
-      case EFI_BROWSER_ACTION_RETRIEVE:\r
-        //\r
-        // According the spec, return value from call back of "changing" and \r
-        // "retrieve" should update to the question's temp buffer.\r
-        //\r
-        SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
-        break;\r
+          SetQuestionValue (FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+          break;\r
 \r
-      default:\r
-        break;\r
+        default:\r
+          break;\r
       }\r
     } else {\r
       //\r
-      // If the callback returns EFI_UNSUPPORTED for EFI_BROWSER_ACTION_CHANGING, \r
-      // then the browser will use the value passed to Callback() and ignore the \r
-      // value returned by Callback(). \r
+      // If the callback returns EFI_UNSUPPORTED for EFI_BROWSER_ACTION_CHANGING,\r
+      // then the browser will use the value passed to Callback() and ignore the\r
+      // value returned by Callback().\r
       //\r
-      if (Action  == EFI_BROWSER_ACTION_CHANGING && Status == EFI_UNSUPPORTED) {\r
+      if ((Action  == EFI_BROWSER_ACTION_CHANGING) && (Status == EFI_UNSUPPORTED)) {\r
         if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
-          CopyMem (Statement->BufferValue, BackUpBuffer, Statement->StorageWidth + sizeof(CHAR16));\r
+          CopyMem (Statement->BufferValue, BackUpBuffer, Statement->StorageWidth);\r
         } else {\r
           CopyMem (&HiiValue->Value, &BackUpValue, sizeof (EFI_IFR_TYPE_VALUE));\r
         }\r
-        \r
+\r
         //\r
         // Do the question validation.\r
         //\r
-        Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
-        if (!EFI_ERROR (Status)) {\r
-          SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+        InternalStatus = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
+        if (!EFI_ERROR (InternalStatus)) {\r
+          //\r
+          // check whether the question value  changed compared with edit buffer before updating edit buffer\r
+          // if changed, set the ValueChanged flag to TRUE,in order to trig the CHANGED callback function\r
+          //\r
+          IsQuestionValueChanged (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
+          SetQuestionValue (FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
         }\r
       }\r
 \r
       //\r
-      // According the spec, return fail from call back of "changing" and \r
+      // According the spec, return fail from call back of "changing" and\r
       // "retrieve", should restore the question's value.\r
       //\r
-      if ((Action == EFI_BROWSER_ACTION_CHANGING && Status != EFI_UNSUPPORTED) || \r
-           Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
-        GetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+      if ((Action == EFI_BROWSER_ACTION_CHANGING) && (Status != EFI_UNSUPPORTED)) {\r
+        if (Statement->Storage != NULL) {\r
+          GetQuestionValue (FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+        } else if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+          ProcessCallBackFunction (Selection, FormSet, Form, Question, EFI_BROWSER_ACTION_RETRIEVE, FALSE);\r
+        }\r
+      }\r
+\r
+      if (Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
+        GetQuestionValue (FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
       }\r
 \r
       if (Status == EFI_UNSUPPORTED) {\r
@@ -2134,6 +2238,37 @@ ProcessCallBackFunction (
     if (BackUpBuffer != NULL) {\r
       FreePool (BackUpBuffer);\r
     }\r
+\r
+    //\r
+    // If Question != NULL, means just process one question\r
+    // and if code reach here means this question has finished\r
+    // processing, so just break.\r
+    //\r
+    if (Question != NULL) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (gCallbackReconnect && (EFI_BROWSER_ACTION_CHANGED == Action)) {\r
+    //\r
+    // Confirm changes with user first.\r
+    //\r
+    if (IsNvUpdateRequiredForFormSet (FormSet)) {\r
+      if (BROWSER_ACTION_DISCARD == PopupErrorMessage (BROWSER_RECONNECT_SAVE_CHANGES, NULL, NULL, NULL)) {\r
+        gCallbackReconnect    = FALSE;\r
+        DiscardFormIsRequired = TRUE;\r
+      } else {\r
+        SubmitFormIsRequired = TRUE;\r
+      }\r
+    } else {\r
+      PopupErrorMessage (BROWSER_RECONNECT_REQUIRED, NULL, NULL, NULL);\r
+    }\r
+\r
+    //\r
+    // Exit current formset before do the reconnect.\r
+    //\r
+    NeedExit     = TRUE;\r
+    SettingLevel = FormSetLevel;\r
   }\r
 \r
   if (SubmitFormIsRequired && !SkipSaveOrDiscard) {\r
@@ -2153,34 +2288,34 @@ ProcessCallBackFunction (
 \r
 /**\r
   Call the retrieve type call back function for one question to get the initialize data.\r
-  \r
-  This function only used when in the initialize stage, because in this stage, the \r
+\r
+  This function only used when in the initialize stage, because in this stage, the\r
   Selection->Form is not ready. For other case, use the ProcessCallBackFunction instead.\r
 \r
   @param ConfigAccess          The config access protocol produced by the hii driver.\r
   @param Statement             The Question which need to call.\r
   @param FormSet               The formset this question belong to.\r
 \r
-  @retval EFI_SUCCESS          The call back function excutes successfully.\r
-  @return Other value if the call back function failed to excute.  \r
+  @retval EFI_SUCCESS          The call back function executes successfully.\r
+  @return Other value if the call back function failed to execute.\r
 **/\r
-EFI_STATUS \r
+EFI_STATUS\r
 ProcessRetrieveForQuestion (\r
   IN     EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess,\r
   IN     FORM_BROWSER_STATEMENT          *Statement,\r
   IN     FORM_BROWSER_FORMSET            *FormSet\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
-  EFI_HII_VALUE                   *HiiValue;\r
-  EFI_IFR_TYPE_VALUE              *TypeValue;\r
-  CHAR16                          *NewString;\r
+  EFI_STATUS                  Status;\r
+  EFI_BROWSER_ACTION_REQUEST  ActionRequest;\r
+  EFI_HII_VALUE               *HiiValue;\r
+  EFI_IFR_TYPE_VALUE          *TypeValue;\r
+  CHAR16                      *NewString;\r
 \r
-  Status                = EFI_SUCCESS;\r
-  ActionRequest         = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+  Status        = EFI_SUCCESS;\r
+  ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
 \r
-  if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) || ConfigAccess == NULL) {\r
+  if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) || (ConfigAccess == NULL)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
@@ -2190,28 +2325,30 @@ ProcessRetrieveForQuestion (
     //\r
     // For OrderedList, passing in the value buffer to Callback()\r
     //\r
-    TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
+    TypeValue = (EFI_IFR_TYPE_VALUE *)Statement->BufferValue;\r
   }\r
-    \r
+\r
   ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-  Status = ConfigAccess->Callback (\r
-                           ConfigAccess,\r
-                           EFI_BROWSER_ACTION_RETRIEVE,\r
-                           Statement->QuestionId,\r
-                           HiiValue->Type,\r
-                           TypeValue,\r
-                           &ActionRequest\r
-                           );\r
-  if (!EFI_ERROR (Status) && HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+  Status        = ConfigAccess->Callback (\r
+                                  ConfigAccess,\r
+                                  EFI_BROWSER_ACTION_RETRIEVE,\r
+                                  Statement->QuestionId,\r
+                                  HiiValue->Type,\r
+                                  TypeValue,\r
+                                  &ActionRequest\r
+                                  );\r
+  if (!EFI_ERROR (Status) && (HiiValue->Type == EFI_IFR_TYPE_STRING)) {\r
     NewString = GetToken (Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
     ASSERT (NewString != NULL);\r
 \r
     ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth);\r
     if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) {\r
+      ZeroMem (Statement->BufferValue, Statement->StorageWidth);\r
       CopyMem (Statement->BufferValue, NewString, StrSize (NewString));\r
     } else {\r
       CopyMem (Statement->BufferValue, NewString, Statement->StorageWidth);\r
     }\r
+\r
     FreePool (NewString);\r
   }\r
 \r
@@ -2233,7 +2370,7 @@ ProcessRetrieveForQuestion (
 **/\r
 EFI_STATUS\r
 SetupBrowser (\r
-  IN OUT UI_MENU_SELECTION    *Selection\r
+  IN OUT UI_MENU_SELECTION  *Selection\r
   )\r
 {\r
   EFI_STATUS                      Status;\r
@@ -2275,11 +2412,18 @@ SetupBrowser (
   mCurFakeQestId = 0;\r
 \r
   do {\r
+    //\r
+    // Reset Status to prevent the next break from returning incorrect error status.\r
+    //\r
+    Status = EFI_SUCCESS;\r
+\r
     //\r
     // IFR is updated, force to reparse the IFR binary\r
+    // This check is shared by EFI_BROWSER_ACTION_FORM_CLOSE and\r
+    // EFI_BROWSER_ACTION_RETRIEVE, so code place here.\r
     //\r
     if (mHiiPackageListUpdated) {\r
-      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+      Selection->Action      = UI_ACTION_REFRESH_FORMSET;\r
       mHiiPackageListUpdated = FALSE;\r
       break;\r
     }\r
@@ -2293,7 +2437,7 @@ SetupBrowser (
       //\r
       Link = GetFirstNode (&Selection->FormSet->FormListHead);\r
 \r
-      Selection->Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+      Selection->Form   = FORM_BROWSER_FORM_FROM_LINK (Link);\r
       Selection->FormId = Selection->Form->FormId;\r
     } else {\r
       Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);\r
@@ -2311,11 +2455,11 @@ SetupBrowser (
     // Check Form is suppressed.\r
     //\r
     if (Selection->Form->SuppressExpression != NULL) {\r
-      if (EvaluateExpressionList(Selection->Form->SuppressExpression, TRUE, Selection->FormSet, Selection->Form) == ExpressSuppress) {\r
+      if (EvaluateExpressionList (Selection->Form->SuppressExpression, TRUE, Selection->FormSet, Selection->Form) == ExpressSuppress) {\r
         //\r
-        // Form is suppressed. \r
+        // Form is suppressed.\r
         //\r
-        PopupErrorMessage(BROWSER_FORM_SUPPRESS, NULL, NULL, NULL);\r
+        PopupErrorMessage (BROWSER_FORM_SUPPRESS, NULL, NULL, NULL);\r
         Status = EFI_NOT_FOUND;\r
         goto Done;\r
       }\r
@@ -2327,8 +2471,9 @@ SetupBrowser (
     // New form may be the first form, or the different form after another form close.\r
     //\r
     if (((Selection->Handle != mCurrentHiiHandle) ||\r
-        (!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
-        (Selection->FormId != mCurrentFormId))) {\r
+         (!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
+         (Selection->FormId != mCurrentFormId)))\r
+    {\r
       //\r
       // Update Retrieve flag.\r
       //\r
@@ -2337,9 +2482,9 @@ SetupBrowser (
       //\r
       // Keep current form information\r
       //\r
-      mCurrentHiiHandle   = Selection->Handle;\r
+      mCurrentHiiHandle = Selection->Handle;\r
       CopyGuid (&mCurrentFormSetGuid, &Selection->FormSetGuid);\r
-      mCurrentFormId      = Selection->FormId;\r
+      mCurrentFormId = Selection->FormId;\r
 \r
       if (ConfigAccess != NULL) {\r
         Status = ProcessCallBackFunction (Selection, Selection->FormSet, Selection->Form, NULL, EFI_BROWSER_ACTION_FORM_OPEN, FALSE);\r
@@ -2348,10 +2493,10 @@ SetupBrowser (
         }\r
 \r
         //\r
-        // IFR is updated during callback of open form, force to reparse the IFR binary\r
+        // IFR is updated during callback of EFI_BROWSER_ACTION_FORM_OPEN, force to reparse the IFR binary\r
         //\r
         if (mHiiPackageListUpdated) {\r
-          Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+          Selection->Action      = UI_ACTION_REFRESH_FORMSET;\r
           mHiiPackageListUpdated = FALSE;\r
           break;\r
         }\r
@@ -2382,7 +2527,7 @@ SetupBrowser (
         // IFR is updated during callback of open form, force to reparse the IFR binary\r
         //\r
         if (mHiiPackageListUpdated) {\r
-          Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+          Selection->Action      = UI_ACTION_REFRESH_FORMSET;\r
           mHiiPackageListUpdated = FALSE;\r
           break;\r
         }\r
@@ -2402,37 +2547,47 @@ SetupBrowser (
     //\r
     Statement = Selection->Statement;\r
     if (Statement != NULL) {\r
-      if ((ConfigAccess != NULL) && \r
-          ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) && \r
-          (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
-        Status = ProcessCallBackFunction(Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGING, FALSE);\r
+      if ((ConfigAccess != NULL) &&\r
+          ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) &&\r
+          (Statement->Operand != EFI_IFR_PASSWORD_OP))\r
+      {\r
+        Status = ProcessCallBackFunction (Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGING, FALSE);\r
         if (Statement->Operand == EFI_IFR_REF_OP) {\r
           //\r
           // Process dynamic update ref opcode.\r
           //\r
           if (!EFI_ERROR (Status)) {\r
-            Status = ProcessGotoOpCode(Statement, Selection);\r
+            Status = ProcessGotoOpCode (Statement, Selection);\r
           }\r
-          \r
+\r
           //\r
           // Callback return error status or status return from process goto opcode.\r
           //\r
           if (EFI_ERROR (Status)) {\r
             //\r
-            // Cross reference will not be taken\r
+            // Cross reference will not be taken, restore all essential field\r
             //\r
-            Selection->FormId = Selection->Form->FormId;\r
+            Selection->Handle = mCurrentHiiHandle;\r
+            CopyMem (&Selection->FormSetGuid, &mCurrentFormSetGuid, sizeof (EFI_GUID));\r
+            Selection->FormId     = mCurrentFormId;\r
             Selection->QuestionId = 0;\r
+            Selection->Action     = UI_ACTION_REFRESH_FORM;\r
           }\r
         }\r
 \r
-        //\r
-        // Verify whether question value has checked, update the ValueChanged flag in Question.\r
-        //\r
-        IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
-\r
-        if (!EFI_ERROR (Status) && Statement->Operand != EFI_IFR_REF_OP) {\r
-          ProcessCallBackFunction(Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGED, FALSE);\r
+        if (!EFI_ERROR (Status) &&\r
+            (Statement->Operand != EFI_IFR_REF_OP) &&\r
+            ((Statement->Storage == NULL) || ((Statement->Storage != NULL) && Statement->ValueChanged)))\r
+        {\r
+          //\r
+          // Only question value has been changed, browser will trig CHANGED callback.\r
+          //\r
+          ProcessCallBackFunction (Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGED, FALSE);\r
+          //\r
+          // check whether the question value changed compared with buffer value\r
+          // if doesn't change ,set the ValueChanged flag to FALSE ,in order not to display the "configuration changed "information on the screen\r
+          //\r
+          IsQuestionValueChanged (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
         }\r
       } else {\r
         //\r
@@ -2444,18 +2599,25 @@ SetupBrowser (
           //\r
           // Verify whether question value has checked, update the ValueChanged flag in Question.\r
           //\r
-          IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
+          IsQuestionValueChanged (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
         }\r
       }\r
 \r
       //\r
-      // If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage and process question success till here, \r
-      // trig the gResetFlag.\r
+      // If question has EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without storage\r
+      // and process question success till here, trig the gResetFlag/gFlagReconnect.\r
       //\r
-      if ((Status == EFI_SUCCESS) && \r
-          (Statement->Storage == NULL) && \r
-          ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {\r
-        gResetRequired = TRUE;\r
+      if ((Status == EFI_SUCCESS) &&\r
+          (Statement->Storage == NULL))\r
+      {\r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {\r
+          gResetRequiredFormLevel   = TRUE;\r
+          gResetRequiredSystemLevel = TRUE;\r
+        }\r
+\r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {\r
+          gFlagReconnect = TRUE;\r
+        }\r
       }\r
     }\r
 \r
@@ -2464,17 +2626,17 @@ SetupBrowser (
     //\r
     if (gExitRequired) {\r
       switch (gBrowserSettingScope) {\r
-      case SystemLevel:\r
-        Selection->Action = UI_ACTION_EXIT;\r
-        break;\r
+        case SystemLevel:\r
+          Selection->Action = UI_ACTION_EXIT;\r
+          break;\r
 \r
-      case FormSetLevel:\r
-      case FormLevel:\r
-        FindNextMenu (Selection, gBrowserSettingScope);\r
-        break;\r
+        case FormSetLevel:\r
+        case FormLevel:\r
+          FindNextMenu (Selection, gBrowserSettingScope);\r
+          break;\r
 \r
-      default:\r
-        break;\r
+        default:\r
+          break;\r
       }\r
 \r
       gExitRequired = FALSE;\r
@@ -2484,12 +2646,12 @@ SetupBrowser (
     // Before exit the form, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE\r
     // for each question with callback flag.\r
     //\r
-    if ((ConfigAccess != NULL) && \r
-        ((Selection->Action == UI_ACTION_EXIT) || \r
+    if ((ConfigAccess != NULL) &&\r
+        ((Selection->Action == UI_ACTION_EXIT) ||\r
          (Selection->Handle != mCurrentHiiHandle) ||\r
          (!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
-         (Selection->FormId != mCurrentFormId))) {\r
-\r
+         (Selection->FormId != mCurrentFormId)))\r
+    {\r
       Status = ProcessCallBackFunction (Selection, Selection->FormSet, Selection->Form, NULL, EFI_BROWSER_ACTION_FORM_CLOSE, FALSE);\r
       if (EFI_ERROR (Status)) {\r
         goto Done;\r
@@ -2501,7 +2663,7 @@ Done:
   //\r
   // Reset current form information to the initial setting when error happens or form exit.\r
   //\r
-  if (EFI_ERROR (Status) || Selection->Action == UI_ACTION_EXIT) {\r
+  if (EFI_ERROR (Status) || (Selection->Action == UI_ACTION_EXIT)) {\r
     mCurrentHiiHandle = NULL;\r
     CopyGuid (&mCurrentFormSetGuid, &gZeroGuid);\r
     mCurrentFormId = 0;\r
@@ -2511,8 +2673,8 @@ Done:
   // Unregister notify for Form package update\r
   //\r
   mHiiDatabase->UnregisterPackageNotify (\r
-                   mHiiDatabase,\r
-                   NotifyHandle\r
-                   );\r
+                  mHiiDatabase,\r
+                  NotifyHandle\r
+                  );\r
   return Status;\r
 }\r