Eric:
  I add my comments for one case.  

Thanks
Liming
-----Original Message-----
From: Dong, Eric 
Sent: Tuesday, May 26, 2015 11:46 AM
To: edk2-devel@lists.sourceforge.net; Gao, Liming
Subject: RE: [edk2] [Patch 2/3] MdeModulePkg: Enable reconnect request from 
action request or question flag.

Update logic in SetupBrowserDxe and DisplayEngine, current behavior for 
reconnect is below:

If one question return EFI_BROWSER_ACTION_REQUEST_RECONNECT in the callback 
function, and current formset still has questions whose changed value still not 
saved, browser will follow below step:
1.       popup dialog to let user to select whether need to save the changed 
value.
2.       If user agree to save the value, after saved the value, exit current 
formset and do the reconnect action. Else just exit the formset and do nothing.
[Liming] If this dialog is same to normal save dialog or the specific dialog to 
let user know the reconnect action will happen after save?  

If the reconnect return fail, browser will pop up an dialog to let user know 
that the reconnect is failed and it will return to the parent formset.
 
If one question has EFI_IFR_FLAG_RECONNECT_REQUIRED flag, browser will follow 
below steps:
1.       When user change value for this question, nothing happened.
2.       When user save the changed question value (through hotkey or other 
solution), browser will update reconnect flag to TRUE.
3.       When browser exit current formset, it will trig the reconnect behavior.
4.       Browser will return to the parent formset.

Thanks,
Eric
-----Original Message-----
From: Eric Dong [mailto:eric.d...@intel.com]
Sent: Tuesday, May 19, 2015 4:57 PM
To: edk2-devel@lists.sourceforge.net; Gao, Liming
Subject: [edk2] [Patch 2/3] MdeModulePkg: Enable reconnect request from action 
request or question flag.

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

------------------------------------------------------------------------------
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