//\r
// 4. Repair system through DriverHealth protocol\r
//\r
- BmRepairAllControllers ();\r
+ BmRepairAllControllers (0);\r
}\r
\r
PERF_START_EX (gImageHandle, "BdsAttempt", NULL, 0, (UINT32) OptionNumber);\r
\r
/**\r
Repair all the controllers according to the Driver Health status queried.\r
+\r
+ @param ReconnectRepairCount To record the number of recursive call of\r
+ this function itself.\r
**/\r
VOID\r
BmRepairAllControllers (\r
- VOID\r
+ UINTN ReconnectRepairCount\r
)\r
{\r
EFI_STATUS Status;\r
EfiBootManagerFreeDriverHealthInfo (DriverHealthInfo, Count);\r
\r
\r
- if (ReconnectRequired) {\r
- BmRepairAllControllers ();\r
- }\r
-\r
DEBUG_CODE (\r
CHAR16 *ControllerName;\r
\r
EfiBootManagerFreeDriverHealthInfo (DriverHealthInfo, Count);\r
);\r
\r
+ if (ReconnectRequired) {\r
+ if (ReconnectRepairCount < MAX_RECONNECT_REPAIR) {\r
+ BmRepairAllControllers (ReconnectRepairCount + 1);\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "[%a:%d] Repair failed after %d retries.\n",\r
+ __FUNCTION__, __LINE__, ReconnectRepairCount));\r
+ }\r
+ }\r
+\r
if (RebootRequired) {\r
DEBUG ((EFI_D_INFO, "[BDS] One of the Driver Health instances requires rebooting.\n"));\r
gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
#define BM_OPTION_NAME_LEN sizeof ("PlatformRecovery####")\r
extern CHAR16 *mBmLoadOptionName[];\r
\r
+//\r
+// Maximum number of reconnect retry to repair controller; it is to limit the\r
+// number of recursive call of BmRepairAllControllers.\r
+//\r
+#define MAX_RECONNECT_REPAIR 10\r
+\r
/**\r
Visitor function to be called by BmForEachVariable for each variable\r
in variable storage.\r
\r
/**\r
Repair all the controllers according to the Driver Health status queried.\r
+\r
+ @param ReconnectRepairCount To record the number of recursive call of\r
+ this function itself.\r
**/\r
VOID\r
BmRepairAllControllers (\r
- VOID\r
+ UINTN ReconnectRepairCount\r
);\r
\r
#define BM_HOTKEY_SIGNATURE SIGNATURE_32 ('b', 'm', 'h', 'k')\r
IN EFI_DEVICE_PATH_PROTOCOL *Single\r
);\r
\r
-/**\r
- Repair all the controllers according to the Driver Health status queried.\r
-**/\r
-VOID\r
-BmRepairAllControllers (\r
- VOID\r
- );\r
-\r
/**\r
Print the device path info.\r
\r