Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.d...@intel.com>
---
 .../Universal/SetupBrowserDxe/Presentation.c       | 44 +++++++++++++++++++---
 MdeModulePkg/Universal/SetupBrowserDxe/Setup.c     | 25 +++++++++++-
 MdeModulePkg/Universal/SetupBrowserDxe/Setup.h     | 13 +++++++
 3 files changed, 75 insertions(+), 7 deletions(-)

diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c 
b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
index 251025b..08d6a1c 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
@@ -1883,10 +1883,29 @@ FindNextMenu (
 
   return TRUE;
 }
 
 /**
+  Reconnect the controller.
+
+  @param DriverHandle          The controller handle which need to be 
reconnect.
+  
+**/
+VOID
+ReconnectController (
+  IN EFI_HANDLE   DriverHandle
+  )
+{
+  EFI_STATUS                      Status;
+
+  Status = gBS->DisconnectController(DriverHandle, NULL, NULL);
+  if (!EFI_ERROR (Status)) {
+    gBS->ConnectController(DriverHandle, NULL, NULL, FALSE);
+  }
+}
+
+/**
   Call the call back function for the question and process the return action.
 
   @param Selection             On input, Selection tell setup browser the 
information
                                about the Selection, form and formset to be 
displayed.
                                On output, Selection return the screen item 
that is selected
@@ -1923,19 +1942,21 @@ ProcessCallBackFunction (
   LIST_ENTRY                      *Link;
   BROWSER_SETTING_SCOPE           SettingLevel;
   EFI_IFR_TYPE_VALUE              BackUpValue;
   UINT8                           *BackUpBuffer;
   CHAR16                          *NewString;
+  BOOLEAN                         Reconnect;
 
   ConfigAccess = FormSet->ConfigAccess;
   SubmitFormIsRequired  = FALSE;
   SettingLevel          = FormSetLevel;
   DiscardFormIsRequired = FALSE;
   NeedExit              = FALSE;
   Status                = EFI_SUCCESS;
   ActionRequest         = EFI_BROWSER_ACTION_REQUEST_NONE;
   BackUpBuffer          = NULL;
+  Reconnect             = FALSE;
 
   if (ConfigAccess == NULL) {
     return EFI_SUCCESS;
   }
 
@@ -2053,10 +2074,14 @@ ProcessCallBackFunction (
         case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD:
           DiscardFormIsRequired = TRUE;
           SettingLevel          = FormLevel;
           break;
 
+        case EFI_BROWSER_ACTION_REQUEST_RECONNECT:
+          Reconnect             = TRUE;
+          break;
+
         default:
           break;
         }
         break;
 
@@ -2155,10 +2180,14 @@ ProcessCallBackFunction (
 
   if (NeedExit) {
     FindNextMenu (Selection, SettingLevel);
   }
 
+  if (Reconnect) {
+    ReconnectController (FormSet->DriverHandle);
+  }
+
   return Status;
 }
 
 /**
   Call the retrieve type call back function for one question to get the 
initialize data.
@@ -2463,17 +2492,22 @@ SetupBrowser (
           IsQuestionValueChanged(gCurrentSelection->FormSet, 
gCurrentSelection->Form, Statement, GetSetValueWithBuffer);
         }
       }
 
       //
-      // If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage 
and process question success till here, 
-      // trig the gResetFlag.
+      // If question has 
EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without 
storage 
+      // and process question success till here, trig the 
gResetFlag/gReconnectRequired.
       //
       if ((Status == EFI_SUCCESS) && 
-          (Statement->Storage == NULL) && 
-          ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
-        gResetRequired = TRUE;
+          (Statement->Storage == NULL)) { 
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
+          gResetRequired = TRUE;
+        }
+
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) 
{
+          gReconnectRequired = TRUE;
+        }
       }
     }
 
     //
     // Check whether Exit flag is TRUE.
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c 
b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
index ea9205a..5cf6adf 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
@@ -53,10 +53,11 @@ LIST_ENTRY      gBrowserStorageList = 
INITIALIZE_LIST_HEAD_VARIABLE (gBrowserSto
 LIST_ENTRY      gBrowserSaveFailFormSetList = INITIALIZE_LIST_HEAD_VARIABLE 
(gBrowserSaveFailFormSetList);
 
 BOOLEAN               mSystemSubmit = FALSE;
 BOOLEAN               gResetRequired;
 BOOLEAN               gExitRequired;
+BOOLEAN               gReconnectRequired;
 BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;
 BOOLEAN               mBrowserScopeFirstSet = TRUE;
 EXIT_HANDLER          ExitHandlerFunction = NULL;
 FORM_BROWSER_FORMSET  *mSystemLevelFormSet;
 
@@ -481,10 +482,11 @@ SendForm (
   EFI_STATUS                    Status;
   UI_MENU_SELECTION             *Selection;
   UINTN                         Index;
   FORM_BROWSER_FORMSET          *FormSet;
   FORM_ENTRY_INFO               *MenuList;
+  EFI_HANDLE                    Controller;
 
   //
   // If EDKII_FORM_DISPLAY_ENGINE_PROTOCOL not found, return EFI_UNSUPPORTED.
   //
   if (mFormDisplay == NULL) {
@@ -494,10 +496,12 @@ SendForm (
   //
   // Save globals used by SendForm()
   //
   SaveBrowserContext ();
 
+  Controller     = NULL;
+  gReconnectRequired = FALSE;
   gResetRequired = FALSE;
   gExitRequired  = FALSE;
   Status         = EFI_SUCCESS;
   gEmptyString   = L"";
   gDisplayFormData.ScreenDimensions = (EFI_SCREEN_DESCRIPTOR *) 
ScreenDimensions;
@@ -545,10 +549,14 @@ SendForm (
       Status = SetupBrowser (Selection);
 
       gCurrentSelection = NULL;
       mSystemLevelFormSet = NULL;
 
+      if (gReconnectRequired) {
+        Controller = FormSet->DriverHandle;
+      }
+
       //
       // If no data is changed, don't need to save current FormSet into the 
maintain list.
       //
       if (!IsNvUpdateRequiredForFormSet (FormSet)) {
         CleanBrowserStorage(FormSet);
@@ -559,10 +567,15 @@ SendForm (
       if (EFI_ERROR (Status)) {
         break;
       }
     } while (Selection->Action == UI_ACTION_REFRESH_FORMSET);
 
+    if (gReconnectRequired && Controller != NULL) {
+      ReconnectController (Controller);
+      gReconnectRequired = FALSE;
+    }
+
     FreePool (Selection);
   }
 
   if (ActionRequest != NULL) {
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
@@ -2521,12 +2534,18 @@ UpdateFlagForForm (
     Question->ValueChanged = IsQuestionValueChanged(FormSet, Form, Question, 
GetSetValueWithBothBuffer);
 
     //
     // Only the changed data has been saved, then need to set the reset flag.
     //
-    if (SetFlag && OldValue && !Question->ValueChanged && 
((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
-      gResetRequired = TRUE;
+    if (SetFlag && OldValue && !Question->ValueChanged) {
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
+        gResetRequired = TRUE;
+      }
+
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {
+        gReconnectRequired = TRUE;
+      }
     } 
   }
 }
 
 /**
@@ -5522,10 +5541,11 @@ SaveBrowserContext (
   //
   // Save FormBrowser context
   //
   Context->Selection            = gCurrentSelection;
   Context->ResetRequired        = gResetRequired;
+  Context->ReconnectRequired    = gReconnectRequired;
   Context->ExitRequired         = gExitRequired;
   Context->HiiHandle            = mCurrentHiiHandle;
   Context->FormId               = mCurrentFormId;
   CopyGuid (&Context->FormSetGuid, &mCurrentFormSetGuid);
 
@@ -5577,10 +5597,11 @@ RestoreBrowserContext (
   //
   // Restore FormBrowser context
   //
   gCurrentSelection     = Context->Selection;
   gResetRequired        = Context->ResetRequired;
+  gReconnectRequired    = Context->ReconnectRequired;
   gExitRequired         = Context->ExitRequired;
   mCurrentHiiHandle     = Context->HiiHandle;
   mCurrentFormId        = Context->FormId;
   CopyGuid (&mCurrentFormSetGuid, &Context->FormSetGuid);
 
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h 
b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
index 8fabf6f..52c0c3b 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
@@ -526,10 +526,11 @@ typedef struct {
   LIST_ENTRY            Link;
 
   //
   // Globals defined in Setup.c
   //
+  BOOLEAN                  ReconnectRequired;
   BOOLEAN                  ResetRequired;
   BOOLEAN                  ExitRequired;
   EFI_HII_HANDLE           HiiHandle;
   EFI_GUID                 FormSetGuid;
   EFI_FORM_ID              FormId;
@@ -564,10 +565,11 @@ typedef enum {
 extern EFI_HII_DATABASE_PROTOCOL         *mHiiDatabase;
 extern EFI_HII_CONFIG_ROUTING_PROTOCOL   *mHiiConfigRouting;
 extern EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *mPathFromText;
 extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;
 
+extern BOOLEAN               gReconnectRequired;
 extern BOOLEAN               gResetRequired;
 extern BOOLEAN               gExitRequired;
 extern LIST_ENTRY            gBrowserFormSetList;
 extern LIST_ENTRY            gBrowserHotKeyList;
 extern BROWSER_SETTING_SCOPE gBrowserSettingScope;
@@ -1829,6 +1831,17 @@ GetFstStgFromVarId (
 FORMSET_STORAGE *
 GetFstStgFromBrsStg (
   IN BROWSER_STORAGE       *Storage
   );
 
+/**
+  Reconnect the controller.
+
+  @param DriverHandle          The controller handle which need to be 
reconnect.
+  
+**/
+VOID
+ReconnectController (
+  IN EFI_HANDLE   DriverHandle
+  );
+
 #endif
-- 
1.9.5.msysgit.1


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to