--- ./source/private_module/nic/hioce_main.c	2020-10-28 09:23:24.286501375 +0000
+++ ./source/private_module/nic/hioce_main.c.hotpatch	2020-10-29 02:19:21.774501375 +0000
@@ -1804,23 +1804,23 @@
 }
 /*END:Add for AR-0000219925-044-012 by h00379789 2016/11/29 */
 
-/*****************************************************************************
-     : HIOCE_Watchdog_Task
-   : ⹤
-   : HIOC_WORK_STRUCT_S *workָ
-   : 
-   ֵ  : 
- ú  :
-   :
-
- ޸ʷ      :
-  1.       : 20141120
-           : w00204075
-    ޸   : ɺ
-
-*****************************************************************************/
-/* modify by h00379789 for DTS2016111102798 2016.11.11 */
-/* ԭϱchiprecoveryʱ䱣һ */
+typedef struct {
+	OSP_U32 valid;
+    OSP_ULONG chipLastNormalTime;
+} ChipTimeINfo;
+#define HIOC_CHIP_TEST_TIMEOUT (18*HZ)
+#define MAX_SLOT_NUM 8
+ChipTimeINfo chipTime[MAX_SLOT_NUM] = {{ 0 }};
+OSP_U32 HIOCE_GetSlotIndex(OSP_U32 portId)
+{
+    OSP_U32 boardId = PORT_BOARD_ID(portId);
+    OSP_U32 boardType = PORT_BOARD_TYPE(portId);
+    if (boardType == DRV_BOARD_TYPE_CONTROLLER) {
+        return MAX_SLOT_NUM - 1;
+    } else {
+        return boardId;
+    }
+}
 #define CHANNELERRORMAXCNT 9
 /* end */
 #define HIOC_SETMACADDR_TIMEOUT (4*HZ)
@@ -1831,16 +1831,14 @@
     HIOCE_NET_DEV_PRIV_S *pstNetDevPriv = (HIOCE_NET_DEV_PRIV_S *) HIOC_NETDEV_PRIV(pstAdapter->apstNetDev[0]);
     HIOC_NET_DEVICE_S *pstNetDev = OSP_NULL;
     OSP_U32 uiPortId = 0;
-    /*BEGIN:Add for AR-0000219925-044-012 by h00379789 2016/12/02*/
     OSP_S32 iRet = 0;
     struct cpumask stCpuMask;
     OSP_U32 uiVector = 0;
     OSP_U32 uiQueueIndex = 0;
     HIOCE_QUEUE_S *pstQueue = NULL;
     OSP_U32 uiPerPortQueueNum = (OSP_U32)(1 << pstAdapter->stInsmodParam.uiPortQNumShift);
-    /*END:Add for AR-0000219925-044-012 by h00379789 2016/12/02*/
     OSP_ULONG ulSetMacaddrTimeout = pstAdapter->ulSetMacaddrtime + HIOC_SETMACADDR_TIMEOUT;
-    
+    OSP_U32 slotIndex = HIOCE_GetSlotIndex(pstNetDevPriv->uiFramePortId);
     if ((HIOC_TEST_BIT(TO_BE_SURPRISE_REMOVED, (OSP_VOID *) (&pstAdapter->ulFlags)))||
         (HIOC_TEST_BIT(TO_BE_REMOVED, (OSP_VOID *) (&pstAdapter->ulFlags)))||
         (0 == pstAdapter->uiWatchdogStart))
@@ -1849,26 +1847,28 @@
                 ,pstAdapter->uiHioceIndx);
         return ;
     }
-
-	/*Begin:modified by w00294390 for DTS2017080901012, 2017-08-10*/
     if(time_after(jiffies, ulSetMacaddrTimeout)) {
         HIOC_CLEAR_BIT(IN_SET_MACADDR, (OSP_VOID *) (&pstAdapter->ulFlags));
     }
-	/*End:modified by w00294390 for DTS2017080901012, 2017-08-10*/
     
     if (HIOC_SUCCESS != MBOX_DftTest(pstAdapter) || HIOC_SUCCESS != IOB_DftTest(pstAdapter))
     {
         pstAdapter->uiChannelErrorCnt++;
-        if(CHANNELERRORMAXCNT == pstAdapter->uiChannelErrorCnt)
+        if (chipTime[slotIndex].valid == 0) { /* Чĵһ⼴ʧܵĳ */
+            chipTime[slotIndex].valid = 1;
+            chipTime[slotIndex].chipLastNormalTime = jiffies - WATCHDOGDELAY * HZ;
+        }
+        if ((CHANNELERRORMAXCNT == pstAdapter->uiChannelErrorCnt) || time_after_eq(jiffies, chipTime[slotIndex].chipLastNormalTime + HIOC_CHIP_TEST_TIMEOUT))
         {
-            /*modyfied for DTS2015040804943 by minwen, 2015/04/13 */
             HIOCE_ChipRecovery(pstAdapter,OSP_TRUE, OSP_FALSE);
         }  
-        HIOCE_LOG(HIOC_LOG_ERR, HIOCE_LOG_ID_225, "Hioc channel error! Mbox or IOB dft fail %d times, portid 0x%x", 
-            pstAdapter->uiChannelErrorCnt, pstNetDevPriv->uiFramePortId);
+        HIOCE_LOG(HIOC_LOG_ERR, HIOCE_LOG_ID_225, "Hioc channel error! Mbox or IOB dft fail %d times, or slot index %u channel fault over %u ms, last normal %llu current %llu, portid 0x%x", 
+            pstAdapter->uiChannelErrorCnt, slotIndex, jiffies_to_msecs(jiffies - chipTime[slotIndex].chipLastNormalTime), chipTime[slotIndex].chipLastNormalTime, jiffies, pstNetDevPriv->uiFramePortId);
         return ;
     }
     pstAdapter->uiChannelErrorCnt = 0;
+    chipTime[slotIndex].valid = 1;
+    chipTime[slotIndex].chipLastNormalTime = jiffies;
     HIOCE_FOR_EACH_PORT(pstAdapter, uiPortId)
     {
         pstNetDev = pstAdapter->apstNetDev[uiPortId];
@@ -3614,7 +3614,7 @@
     HIOCE_NET_DEV_PRIV_S *pstNetDevPriv = OSP_NULL;
     HIOCE_ADAPTER_S *pstAdapter = (HIOCE_ADAPTER_S *) HIOC_PCI_GET_DRVDATA(pstDev);
     OSP_U16 usVendorId = 0;
-
+    OSP_U32 slotIndex;
 	HIOCE_ReportWarningInfoWhileChipRecovery(DRV_DEVT_SCALE_OUT_CARD_REPAIR,
 											PCIEERR_INREPAIR,
 											pstDev,
@@ -3684,11 +3684,11 @@
     }
 
     (OSP_VOID)HIOC_DEL_TIMER_SYNC(&pstAdapter->stWatchdogTimer);
-
     (OSP_VOID)HIOC_CANCLE_WORK_SYNC(&pstAdapter->stWatchdogWork);
 	HIOC_DESTROY_WORKQUEUE(pstAdapter->stWatchdogQueue);
-    /* Net_UnRegisterFreePortǰرȶ˿ڣ˿ڶӦNetPort_Sṹ
-       g_port_listժ޷ҵ,link״̬¼ϱ */
+    slotIndex = HIOCE_GetSlotIndex(pstNetDevPriv->uiFramePortId);
+    chipTime[slotIndex].valid = 0;
+    chipTime[slotIndex].chipLastNormalTime = 0;
     HIOCE_FOR_EACH_PORT(pstAdapter, uiPortId)
     {
         (OSP_VOID)HIOCE_PortLaserCtrl(pstAdapter->apstNetDev[uiPortId],HIOCE_DISABLE);
