--- ./source/private_module/device/sfp.c	2022-03-25 09:59:26.064118440 +0000
+++ ./source/private_module/device/sfp.c.hotpatch	2022-03-26 01:44:19.384780053 +0000
@@ -695,8 +695,8 @@
   1.       : 2015625
            : l90006162
     ޸   : ɺ
-
 *****************************************************************************/
+#define DMI_SFP_SPEED_VALID_CHECK(speed) (((speed) > DRV_SPEED_100M) && ((speed) < DRV_SPEED_UNKNOW))
 DMI_STATIC OSP_VOID DPL_GetSfpSpeedMatch(SFP_PORT_INFO_S *Sfp,
     OSP_U32 *OpValue)
 {
@@ -737,7 +737,7 @@
     /*End:Md by z00211448 for AR-0000861428 ֧йģ*/
 
     if (((Sfp->PhyInfo.Base.Info.MaxSpeed != Sfp->PhyInfo.Ext.Info.Detail.Speed)
-          && (INVALID_VALUE32 != Sfp->PhyInfo.Ext.Info.Detail.Speed))
+          && (DMI_SFP_SPEED_VALID_CHECK(Sfp->PhyInfo.Ext.Info.Detail.Speed)))
         || SpeedUnmatch)
     {
         *OpValue = SFP_CHECK_SPEED_UNMATCH;
@@ -1681,7 +1681,7 @@
 
         /*¹ģһʱΪ0,֤²ģ龡һ*/
         Sfp->MgmtInfo.Private.LastRoutineSfpInfoTime = 0;
-        /*²ιģʱģ澯Ҫָ*/
+        Sfp->MgmtInfo.Private.ConfMode = 0; //Ĭ
         Sfp->MgmtInfo.Private.SfpFaultNoResumeBit = 0;
     }
     else
@@ -1778,20 +1778,7 @@
     Detail->ChannelNum = 0;
 }
 
-/*****************************************************************************
-     : DPL_RoutineSfpEeprom
-   : ģEEPROM⺯
-   : NODE_INFO_S* Node
-   : OSP_U64* SetFaultBitMask
-             OSP_U64 *ClrFaultBitMask
-   ֵ  : OSP_U32:״̬仯
-
- ޸ʷ      :
-  1.       : 2015625
-           : l90006162
-    ޸   : ɺ
-
-*****************************************************************************/
+extern OSP_VOID DMI_GetFatherFruType(NODE_INFO_S* Node, OSP_U32* FruType);
 DMI_STATIC OSP_U32 DPL_RoutineSfpEeprom(NODE_INFO_S* Node,
    OSP_U64* SetFaultBitMask, OSP_U64 *ClrFaultBitMask)
 {
@@ -1808,7 +1795,7 @@
     OSP_U32 InfoChgCnt = 0;
     OSP_BOOL NeedCheck = B_TRUE;
     DRV_SFP_INFO_DETAIL_S LastSfpDetail;
-
+    OSP_U32 FruType = 0;
     DRV_ASSERT(NULL != Node, return 0);
 
     Id = Node->Id;
@@ -1846,8 +1833,34 @@
 
     DPL_InitSfpInfoInvalid(&SfpDetail);
     Ret = Op->GetInfo(EnclAddr, Id, &SfpDetail);
-    if (RETURN_OK == Ret)
-    {
+    if (RETURN_OK == Ret) {
+        if (LastSfpDetail.Speed != SfpDetail.Speed) {
+            DMI_LOG_LMT(INFO, 0, 3, SECONDS_PER_HOUR, "Sfp(0x%llx) speed change from %d to %d", 
+                        Sfp->PhyInfo.Base.Info.Id, LastSfpDetail.Speed, SfpDetail.Speed);
+        }
+        if (Sfp->MgmtInfo.Private.ConfMode == DRV_TOPOLOGY_AUTO) {
+            Sfp->MgmtInfo.Private.ConfMode = 0;
+        }
+        
+        if (DMI_SFP_SPEED_VALID_CHECK(LastSfpDetail.Speed) && DMI_SFP_SPEED_VALID_CHECK(SfpDetail.Speed)) {
+            if (Sfp->MgmtInfo.Private.ConfMode >= 3) {
+                SfpDetail.Speed = LastSfpDetail.Speed;
+                Sfp->MgmtInfo.Private.ConfMode = 3;
+                DMI_LOG(DBG, 6471, "Sfp(0x%llx) change from %d to %d conf %d", 
+                            Sfp->PhyInfo.Base.Info.Id, LastSfpDetail.Speed, SfpDetail.Speed, Sfp->MgmtInfo.Private.ConfMode);
+
+            } else {
+                if (LastSfpDetail.Speed == SfpDetail.Speed) {
+                    Sfp->MgmtInfo.Private.ConfMode++;
+                    DMI_LOG_LMT(INFO, 0, 3, 60, "Sfp(0x%llx) change from %d to %d conf %d", 
+                                Sfp->PhyInfo.Base.Info.Id, LastSfpDetail.Speed, SfpDetail.Speed, Sfp->MgmtInfo.Private.ConfMode);
+                    DMI_LOG(DBG, 6471, "Sfp(0x%llx) change from %d to %d conf %d", 
+                                Sfp->PhyInfo.Base.Info.Id, LastSfpDetail.Speed, SfpDetail.Speed, Sfp->MgmtInfo.Private.ConfMode);
+                } else {
+                    Sfp->MgmtInfo.Private.ConfMode = 0;
+                }
+            }
+        }
         IsI2cFault = B_FALSE;
         OSAL_MemCpy_s(&Info->Detail, sizeof(Info->Detail), &SfpDetail, sizeof(Info->Detail));
         /*жǷб仯,CHANGE¼*/
@@ -1868,7 +1881,10 @@
     {
         return 0;
     }
-
+    DMI_GetFatherFruType(Node, &FruType);
+    if ((DMI_FRU_8_8GFC_IOC_HD_IOCARD == FruType) || (DMI_FRU_8_16GFC_IOC_HD_IOCARD == FruType)) {
+        Sfp->MgmtInfo.Private.SfpIicFaultNum = 0;
+    }
     /*I2CжǷ͸澯߻ָ澯*/
     DPL_CheckSfpI2c(Sfp, SetFaultBitMask, ClrFaultBitMask);
 
@@ -1903,25 +1919,9 @@
         /*ģչ*/
         InfoChgCnt += DPL_CheckSfpRxPower(Sfp, &LastSfpDetail);
     }
-
     Sfp->MgmtInfo.Private.LastRoutineSfpInfoTime = jiffies;
-
     return InfoChgCnt;
 }
-
-/*****************************************************************************
-     : DPL_RoutineSwSfpInfo
-   : ģϢ仯
-   : SFP_PORT_INFO_S* Sfp  ģڵ
-   : 
-   ֵ  : DMI_STATIC OSP_U32
-
- ޸ʷ      :
-  1.       : 2015728
-           : d90003911
-    ޸   : ɺ
-
-*****************************************************************************/
 DMI_STATIC OSP_U32 DPL_RoutineSwSfpInfo(SFP_PORT_INFO_S* Sfp)
 {
     OSP_VOID *EnclAddr = NULL;
