--- ./source/private_module/device/alarm.c	2019-06-24 09:48:55.584962597 +0000
+++ ./source/private_module/device/alarm.c.hotpatch	2019-06-27 13:17:04.070123000 +0000
@@ -945,8 +945,8 @@
 
   ޸ʷ  :
   1.l90006113 20131125 create for: 
-
  ****************************************************************************/
+OSP_BOOL DMI_GetProductStartWorkStatus(OSP_VOID);
 DMI_STATIC OSP_VOID DPL_AlarmRoutine(NODE_INFO_S* Node, 
     ROUTINE_DATA_S *Data)
 {
@@ -1570,8 +1570,8 @@
   1.       : 2014417
            : d90003911
     ޸   : ɺ
-
 *****************************************************************************/
+extern OSP_BOOL DPL_CheckBBUbackupFaultHandle(OSP_BOOL IsBbuBackUpAlarm);
 DMI_STATIC OSP_VOID DPL_AlarmSetRoutine(NODE_INFO_S* Node, 
     ROUTINE_DATA_S *Data)
 {
@@ -1585,7 +1585,7 @@
     OSP_U32 *AlmInfo = NULL;
     OSP_U32 i = 0;
     NODE_STATE_E AlarmState = STATE_INITIAL;
-
+    OSP_BOOL IsBbuBackUpAlarm = B_FALSE;
     DRV_ASSERT(NULL != Node, return);
     REFERNCE_VAR(Data);
     
@@ -1662,25 +1662,25 @@
                 AlarmSet->MgmtInfo.EnclTemp = STATE_NORMAL;
             }
         }
+        
+        if (ALARM_BBU_BACKUP == Info->Member[i].Type)
+        {
+            if (B_TRUE != DMI_GetProductStartWorkStatus())
+            {
+                DMI_LOG(DBG, 6383, "Product not start work, status(%d).", AlmInfo[i]);
+                return;
+            }
+            IsBbuBackUpAlarm = (AlmInfo[i] & 0x1);
+            if(B_FALSE == DPL_CheckBBUbackupFaultHandle(IsBbuBackUpAlarm))
+            {
+                AlmInfo[i] = 0x0;
+            }
+        }
     }
 }
-
 /*****************************************************************************
-     : DPL_GetAlarmSetChgState
-   : ȡAlarmSetĽڵ仯״̬
-   : NODE_INFO_S* Node          ڵ
-             STATE_CHG_INFO_S *ChgInfo  仯
-             OSP_U32 ChgSize 仯ݻС
    : 
    ֵ  : DMI_STATIC OSP_S32 仯
- 
- ޸ʷ      :
-  1.       : 201457
-           : d90003911
-    ޸   : ɺ
-  2.       : 2017317
-           : ywx291300
-    ޸   : ͬDTS2017031502186
 *****************************************************************************/
 DMI_STATIC OSP_S32 DPL_GetAlarmSetChgState(NODE_INFO_S* Node, STATE_CHG_INFO_S *ChgInfo,
     OSP_U32 ChgSize)
@@ -2359,6 +2359,108 @@
         return;
     }
 }
+/*****************************************************************************
+    : DPL_CheckBBUbackupFaultChangeThreshold
+  :  ڵϱ仯FaultThresholdβŻȷϱ仯
+  : CurrentFault ڵ㵱ǰ״̬Ƿ
+                         FaultCount ڵϴ
+                         FaultThreshold ڵȷϵֵ
+  :OSP_BOOL *HandleChg ϱ仯ȷϽ
+  ֵ: VOID
+˵    : None
+޸ʷ      :
+ 1.       : 20160308
+          : chenzhi 00219029
+   ޸   : ɺ
+*****************************************************************************/
+OSP_VOID DPL_CheckBBUbackupFaultChangeThreshold(OSP_BOOL CurrentFault,
+    OSP_U32 *FaultCount, OSP_U32 FaultThreshold, OSP_BOOL *HandleChg)
+{
+    DRV_ASSERT(NULL != FaultCount, return);
+    DRV_ASSERT(NULL != HandleChg, return);
+
+    if (CurrentFault)
+    {
+        /* һνڵѾȷΪ */
+        if (0 != GET_NODE_FAULT_FLAG(*FaultCount))
+        {
+            *FaultCount = SET_NODE_FAULT_FLAG(FaultThreshold);
+            *HandleChg = B_TRUE;
+
+            return;
+        }
+
+        SAFE_INCREASE_U32(*FaultCount);
+
+        if (*FaultCount >= FaultThreshold)
+        {
+            *FaultCount = SET_NODE_FAULT_FLAG(FaultThreshold);
+            *HandleChg = B_TRUE;
+
+            return;
+        }
+
+        *HandleChg = B_FALSE;
+    }
+    else
+    {
+            *FaultCount = 0;
+            *HandleChg = B_TRUE;
+            return;
+    }
+}
+/*****************************************************************************
+    : DPL_CheckBBUbackupFaultHandle
+  :  ڵϱ仯FaultThresholdβŻȷϱ仯
+  : CurrentFault ڵ㵱ǰ״̬Ƿ
+                         FaultCount ڵϴ
+                         FaultThreshold ڵȷϵֵ
+  :OSP_BOOL *HandleChg ϱ仯ȷϽ
+  ֵ: VOID
+˵    : None
+޸ʷ      :
+ 1.       : 20160308
+          : chenzhi 00219029
+   ޸   : ɺ
+*****************************************************************************/
+OSP_BOOL DPL_CheckBBUbackupFaultHandle(OSP_BOOL IsBbuBackUpAlarm)
+{
+    OSP_BOOL IsNeedHandle = B_FALSE;
+    OSP_U32 DownThreshold= 3;
+    static OSP_U32 BBUbackupChgCount = 0;
+    static OSP_U64 BBURoutineTime = 0;
+	
+    if (0 == BBURoutineTime)
+    {
+        BBURoutineTime = jiffies;
+    }	
+    
+    if(OSAL_time_after64((OSP_U64)jiffies, BBURoutineTime +SECOND_TO_JIFFS(60)))
+    {
+        DMI_LOG(INFO, 6383, "Check bbu backup alarm timeout clear change count last time(%llu).",BBURoutineTime);
+        if(B_TRUE == IsBbuBackUpAlarm)
+        {
+            if(0 !=BBUbackupChgCount)
+            {
+                DownThreshold = 3;
+                BBUbackupChgCount = SET_NODE_FAULT_FLAG(DownThreshold);
+            }
+        }
+        else
+        {
+            BBUbackupChgCount = 0;
+        }
+    }
+    
+    DPL_CheckBBUbackupFaultChangeThreshold(IsBbuBackUpAlarm, &BBUbackupChgCount, 3, &IsNeedHandle);
+    DMI_LOG(DBG, 6383, "Bbu State is %u need handle %u, change count(0x%x), time(%llu).",
+            IsBbuBackUpAlarm, IsNeedHandle, BBUbackupChgCount, BBURoutineTime);
+    if (B_TRUE == IsNeedHandle)
+    {
+        BBURoutineTime = jiffies;
+    }
+    return IsNeedHandle;
+}
 
 #ifdef __cplusplus
 }
