--- ./source/private_module/hdm/hdm_debug.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/hdm/hdm_debug.c.hotpatch	2019-05-16 07:00:56.000000000 +0000
@@ -429,7 +429,7 @@
 }
 
 
-
+void hdmPatchPreFailSwitchDebugInit(void);
 /**************************************************************************
     : ӲPHY
 : argc: 
@@ -459,7 +459,11 @@
     frameId = (uint32_t)LVOS_StrToU64(argv[2]);
     slotId = (uint32_t)LVOS_StrToU64(argv[3]);
     switchFlag = (uint8_t)LVOS_StrToU64(argv[4]);
-
+    if ((0xFFFE == frameId) && (0xFFFE == slotId) && (1 == switchFlag))
+    {
+        hdmPatchPreFailSwitchDebugInit();
+        return RETURN_OK;
+    }
     ret = hdmPhySwitch(frameId,
                        slotId,
                        switchFlag,
@@ -470,16 +474,12 @@
         DBG_Print("Disk switch phy fail\n");
         return RETURN_OK;
     }
-
     LVOS_WaitForCompletion(&myContext.completion);
     DBG_Print("Switch phy %s \n", myContext.state ? "succeed" : "fail");
-     /*Begin Modified by y00406735 DTS2017103001796 20171102*/
     BDM_PRINT_LIMIT_PERIOD(60*HZ, 2, DBG_LOG_INFO, LOG_ID_HDM_0026,
         "Somebody set disk(frameId:%u, slot:%u) phy switch(%u), ret(%d).",
         frameId, slotId, switchFlag, ret);
-    /*End Modified by y00406735 DTS2017103001796 20171102*/
-    
-    return RETURN_OK;    
+    return RETURN_OK;
 }
 
 /**************************************************************************
@@ -5266,27 +5266,24 @@
         infoIndex++;
     }
 }
-
+void hdmPatchDebugPreFailSwitch(uint32_t sdId);
 static int32_t hdmDebugCliShowDiagRecord(int32_t argc, char *argv[])
 {
     BDM_DBG_OPT_S opt;
     HDM_DBG_STATE_S myContext;
     uint32_t sdevId = 0;
     int32_t ret = RETURN_ERROR;
-    
     if (argc != 2)
     {
         DBG_Print("The number of parameters is incorrect.\n");
         return RETURN_ERROR;
     }
-
     ret = BDM_DBG_GetCliOpt(argv[1], &opt);
     if (RETURN_OK != ret)
     {
         DBG_Print("Parameter %s is incorrect.\n", argv[1]);
         return RETURN_ERROR;
     }
-
     /*Begin Modified by j90006936 DTS2014042903188 2014.5.8*/
     ret = LVOS_IsUnsignedNumbericStr(opt.varValue);
     if (RETURN_OK != ret)
@@ -5295,14 +5292,22 @@
         return RETURN_ERROR;
     }
     /*End Modified by j90006936 DTS2014042903188 2014.5.8*/
-
     if (0 != strcmp(opt.varName, "sdid"))
     {
         DBG_Print("Parameter %s is incorrect.\n", argv[1]);
         return RETURN_ERROR;
     }
     sdevId = (uint32_t)LVOS_StrToU64(opt.varValue);
-
+    if (48 == sdevId)
+    {
+        DBG_Print("FW upgrade supported parallel\n");
+        return RETURN_OK;
+    }
+    if ((0xFFFF == sdevId) || (0xFFFE == sdevId) || (0xFFFD == sdevId))
+    {
+        hdmPatchDebugPreFailSwitch(sdevId);
+        return RETURN_OK;
+    }
     memset(&myContext, 0, sizeof(HDM_DBG_STATE_S));
     myContext.state = FALSE;
     LVOS_InitCompletion(&myContext.completion);
@@ -5311,15 +5316,13 @@
     {
         DBG_Print("Malloc memory space fail, please try again later.\n");
         return RETURN_OK;
-    }
-    
+    }   
     if (hdmDebugIsRootDiskBySdId(sdevId))
     {
         DBG_Print("Can not operate root disk \n");
         LVOS_Free(myContext.data);
         return RETURN_OK;
-    }
-    
+    }   
     ret = hdmDebugGetDiagRecord(sdevId, &myContext);
     if (RETURN_OK != ret)
     {
@@ -5328,10 +5331,8 @@
         /*End Modified by j90006936 DTS2014042903188 2014.5.8*/
         LVOS_Free(myContext.data);
         return RETURN_OK;
-    }
-    
+    }   
     LVOS_WaitForCompletion(&myContext.completion);   
-
     if (!myContext.state)
     {
         /*Begin Modified by j90006936 DTS2014042903188 2014.5.8*/
@@ -5340,7 +5341,6 @@
         LVOS_Free(myContext.data);
         return RETURN_OK; 
     }
-
     hdmDebugParaseDiagRecord(myContext.data, sdevId); 
 
     LVOS_Free(myContext.data);
@@ -5989,6 +5989,108 @@
 };
 
 
+/*Begin modified by l00472145 DTS2019051400667 2019-05-13 MIPֵ24SSDϱʧЧ澯*/
+bool g_hdmPatchReportPreFailSwitch = FALSE; //ΪTRUEʱΣΪFALSEʱȡ
+#define HDM_PATCH_DECIDE_REPORT_FILE    "/OSM/coffer_data/patch_bdm_DTS2019051400667_file"
+
+#define HDM_PATCH_PRE_FAIL_CMD_QUERY    (0xFFFF)     /*ѯȱʡֵ*/
+#define HDM_PATCH_PRE_FAIL_CMD_OPEN     (0xFFFE)     /**/
+#define HDM_PATCH_PRE_FAIL_CMD_CLOSE    (0xFFFD)     /*ر*/
+
+/**************************************************************************
+  : hdmPatchDebugPreFailSwitch
+    : ޸ԤʧЧ澯οأɾ־ûļ
+: sdId
+: 
+  ֵ: 
+    : ΪTRUEʱΣΪFALSEʱȡ
+**************************************************************************/
+void hdmPatchDebugPreFailSwitch(uint32_t sdId)
+{  
+    int32_t ret = RETURN_ERROR;
+    switch(sdId)
+    {
+        /*򿪵ģʽ,ָļ*/
+        case HDM_PATCH_PRE_FAIL_CMD_OPEN:
+            /*ļѴڣظҲOK*/
+            ret = LVOS_CmdTouch(HDM_PATCH_DECIDE_REPORT_FILE, MODE_EXIST);
+            if (RETURN_OK == ret)
+            {
+                g_hdmPatchReportPreFailSwitch = TRUE;
+                DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: create %s, ret %d.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                DBG_Print("create %s, ret %d.\n", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+            }
+            else
+            {
+                g_hdmPatchReportPreFailSwitch = FALSE;
+                DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: create %s failed, ret %d.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                DBG_Print("create %s failed, ret %d.\n", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+            }          
+            break;        
+        /*رյģʽ,ɾָļ*/   
+        case HDM_PATCH_PRE_FAIL_CMD_CLOSE:
+            g_hdmPatchReportPreFailSwitch = FALSE;
+            /*ļѲ,ɾ᷵*/
+            ret = LVOS_access(HDM_PATCH_DECIDE_REPORT_FILE, MODE_EXIST);
+            if (RETURN_OK != ret)
+            {
+                DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: access %s failed, ret %d.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                DBG_Print("access %s failed, ret %d\n.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+            }
+            else
+            {
+                ret = LVOS_CmdRm(HDM_PATCH_DECIDE_REPORT_FILE, FALSE);
+                if (RETURN_OK != ret)
+                {
+                    DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: rm %s failed, ret %d.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                    DBG_Print("rm %s failed, ret %d.\n", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                }
+                else
+                {
+                    DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: rm %s, ret %d.", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                    DBG_Print("rm %s, ret %d.\n", HDM_PATCH_DECIDE_REPORT_FILE, ret);
+                }
+            }          
+            break;
+        case HDM_PATCH_PRE_FAIL_CMD_QUERY:
+        default:
+            break;
+    }
+
+    DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: ReportPreFailSwitch %d, cmd %d.", g_hdmPatchReportPreFailSwitch, sdId);
+    DBG_Print("ReportPreFailSwitch %d, cmd %u.\n", g_hdmPatchReportPreFailSwitch, sdId);
+    return;
+}
+ 
+/**************************************************************************
+  : hdmPatchPreFailSwitchDebugInit
+    : ԤʧЧ澯οسʼΪTRUEʱΣΪFALSEʱȡ
+: 
+: 
+  ֵ: 
+    : 
+**************************************************************************/
+void hdmPatchPreFailSwitchDebugInit(void)
+{
+    int32_t ret = RETURN_ERROR;
+
+    /*ָļǷ*/
+    ret = LVOS_access(HDM_PATCH_DECIDE_REPORT_FILE, MODE_EXIST);
+    if (RETURN_OK != ret)
+    {
+        g_hdmPatchReportPreFailSwitch = FALSE;
+        DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: access %s failed, ret %d, ReportPreFailSwitch %d.",
+                    HDM_PATCH_DECIDE_REPORT_FILE, ret, g_hdmPatchReportPreFailSwitch);
+    }
+    else
+    {
+        g_hdmPatchReportPreFailSwitch = TRUE;
+        DBG_LogInfo(DBG_LOGID_BUTT, "HDM_DBG: %s is exist, ret %d, ReportPreFailSwitch %d.",
+                    HDM_PATCH_DECIDE_REPORT_FILE, ret, g_hdmPatchReportPreFailSwitch);
+    }
 
+    return;
+}
+/*End modified by l00472145 DTS2019051400667 2019-05-13 MIPֵ24SSDϱʧЧ澯*/
 
 
--- ./source/private_module/hdm/stub_v3/stub_hdm_routine.c	2018-03-30 08:15:22.000000000 +0000
+++ ./source/private_module/hdm/stub_v3/stub_hdm_routine.c.hotpatch	2019-05-16 10:27:19.000000000 +0000
@@ -129,7 +129,7 @@
 
 extern void *g_hdmTPool;
 /* RootDiskRoutine add by y00376877 20160715 end */
-
+extern bool g_hdmPatchReportPreFailSwitch; //ΪTRUEʱΣΪFALSEʱȡ
 /*Begin Modified by y00352978 DTS2016092705873 20160927*/
 /**************************************************************************
   : hdmRtDealDiskLife
@@ -192,10 +192,10 @@
             unuseLife = HDM_ROUTE_SSD_LIFE_MAX_HOUR;
         }
     }
-
+    DBG_LogDebug(LOG_ID_HDM_0241, "BDM_HDM_RT: g_hdmPatchReportPreFailSwitch: %d.", g_hdmPatchReportPreFailSwitch);
     hdmDiskPriv->routineInfo.unUsedLifeHour = unuseLife;
-
-    if (HDM_ROUTE_SSD_HALF_LIFE_MONTH > unuseLife)
+    //ж: 澯οΪر״̬(FALSE)ʱ澯
+    if ((HDM_ROUTE_SSD_HALF_LIFE_MONTH > unuseLife) && (FALSE == g_hdmPatchReportPreFailSwitch))
     {
         DBG_LogWarning(LOG_ID_HDM_036D,
                     "Disk(sdev id %u) unused life is less than 1 month. Disk is half life, please replce it with a new SSD Disk as early as possibly.",
@@ -207,7 +207,7 @@
         return;
     }
     /* Dorado 5000 modified begin */
-    else if (HDM_ROUTE_SSD_SEND_EVENT_MONTH > unuseLife)
+    else if ((HDM_ROUTE_SSD_SEND_EVENT_MONTH > unuseLife) && (FALSE == g_hdmPatchReportPreFailSwitch))
     /* Dorado 5000 modified end */
     {
         DBG_LogWarning(LOG_ID_HDM_0370,
