diff -u -ur "/examples/ethernetip_adapter/AM335x/eip_soc.c" "/examples/ethernetip_adapter/AM335x/eip_soc.c"
--- "/examples/ethernetip_adapter/AM335x/eip_soc.c"	2018-12-01 09:03:48.000000000 +0530
+++ "/examples/ethernetip_adapter/AM335x/eip_soc.c"	2019-11-13 19:24:54.624786200 +0530
@@ -81,6 +81,10 @@
                BOARD_INIT_ICSS_PINMUX | BOARD_INIT_UART_STDIO | BOARD_INIT_ICSS_ETH_PHY);
 #endif
 
+	/* fix for disabling extended FD ability in SWSCR2 register */
+    CSL_MDIO_phyRegWrite(SOC_PRU_ICSS_MII_MDIO_REG, BOARD_ICSS_EMAC_PORT0_PHY_ADDR, PHY_1000BT_STATUS, 0x0104);
+    CSL_MDIO_phyRegWrite(SOC_PRU_ICSS_MII_MDIO_REG, BOARD_ICSS_EMAC_PORT1_PHY_ADDR, PHY_1000BT_STATUS, 0x0104);
+	
     PRCMModuleEnable(CHIPDB_MOD_ID_PWMSS, 0, 0);
     /* Clock source selection */
     SOCCtrlTimerClkSrcSelect(EIP_TIMER_ID + 2,

diff -u -ur "/examples/ethernetip_adapter/eip_main.c" "/examples/ethernetip_adapter/eip_main.c"
--- "/examples/ethernetip_adapter/eip_main.c"	2018-12-01 09:03:48.000000000 +0530
+++ "/examples/ethernetip_adapter/eip_main.c"	2019-11-15 16:50:48.185549100 +0530
@@ -608,8 +608,10 @@
     /* Do EIP Application specific Init*/
     EIPAPP_getInitParams(emachandle);
 
+    /*Set the PHY configuration before application init*/
+    EIPHAL_setEthernetLinkConfig();
 
-
+    /*Do ACD init if enabled*/
     if(eipDevInitConfig.acdEnable)
     {
         EIPACD_init();
@@ -618,11 +620,27 @@
                (ICSS_EmacCallBack)EIPACD_checkGratArp;
     }
 
+    /*Inform NDK task that application/ACD init is done  */
     Semaphore_post(appInitSem);
 
     EIPUTILS_displayMacid();
     EIPUTILS_displayApplicationDetails();
 
+    /*Do the EIP drv init here. This makes sure the DLR will work even without IP address*/
+    EIP_drvInit(eipHandle);
+    EIP_drvStart(eipHandle);
+
+    /*Link call back registration done here. In case ACD is enabled this is done after ACD start*/
+    if(!eipDevInitConfig.acdEnable)
+    {
+        ICSS_EmacRegisterPort0ISRCallback(eipicssEmacHandle,
+                                          (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port0ProcessLinkBrk, (void *)(eipHandle));
+        /*Port 1 Link break callback */
+        ICSS_EmacRegisterPort1ISRCallback(eipicssEmacHandle,
+                                          (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port1ProcessLinkBrk, (void *)(eipHandle));
+    }
+
+
     while(!acdIPAssign)
     {
         if(eipDevInitConfig.tcpipConfig.startupType == EIP_STARTUP_DHCP)
@@ -659,24 +677,8 @@
     }
 
     EIPUTILS_displayIPDetails();
-
     EIP_configurePHYLeds();
-    EIP_drvInit(eipHandle);
-    EIP_drvStart(eipHandle);
-
-    if(!eipDevInitConfig.acdEnable)
-    {
-        ICSS_EmacRegisterPort0ISRCallback(eipicssEmacHandle,
-                                          (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port0ProcessLinkBrk, (void *)(eipHandle));
-        /*Port 1 Link break callback */
-        ICSS_EmacRegisterPort1ISRCallback(eipicssEmacHandle,
-                                          (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port1ProcessLinkBrk, (void *)(eipHandle));
-
-        EIPHAL_setEthernetLinkConfig();
-
-        ptpDrvStackInit(timeSyncHandle);
-    }
-
+    ptpDrvStackInit(timeSyncHandle);
 
     EIPAPP_init();
 
@@ -918,6 +920,7 @@
         {
             if(eipAppStat != 1)
             {
+                ptpDrvStackInit(timeSyncHandle);
                 EIPAPP_init();
                 bStopped = !bStopped;
                 IO_SetModeRun();
@@ -930,11 +933,7 @@
 
         if(acdEIPStatus == EIP_ACD_RESTART)
         {
-
-            Board_phyMDIXFixDeInit();
-
             EIPAPP_exitSample();
-
             ptpDrvStackDeInit(timeSyncHandle);
             EIPACD_stop();
             NC_NetStop(ACD_LINKDOWN);
@@ -943,13 +942,9 @@
 
         if(acdEIPStatus == EIP_ACD_STOP)
         {
-
-            Board_phyMDIXFixDeInit();
-
             EIPAPP_exitSample();
-
             ptpDrvStackDeInit(timeSyncHandle);
-
+            EIPACD_stop();
             NC_NetStop(0);
             acdEIPStatus = EIP_ACD_DEFAULT;
         }
diff -u -ur "/examples/ethernetip_adapter/eip_ndk.c" "/examples/ethernetip_adapter/eip_ndk.c"
--- "/examples/ethernetip_adapter/eip_ndk.c"	2018-12-01 09:03:48.000000000 +0530
+++ "/examples/ethernetip_adapter/eip_ndk.c"	2019-11-13 19:24:00.371175100 +0530
@@ -485,6 +485,7 @@
     /* add the Tcp module configuration settings. */
     ti_ndk_config_tcp_init(hCfg);
 
+    /*Wait for ACD init to complete*/
     Semaphore_pend(appInitSem, BIOS_WAIT_FOREVER);
 
     /*
diff -u -ur "/examples/ethernetip_adapter/user_acd_ndk.c" "/examples/ethernetip_adapter/user_acd_ndk.c"
--- "/examples/ethernetip_adapter/user_acd_ndk.c"	2018-12-01 09:03:48.000000000 +0530
+++ "/examples/ethernetip_adapter/user_acd_ndk.c"	2019-11-13 20:41:07.601041200 +0530
@@ -268,32 +268,10 @@
         return FALSE;
     }
 
-
-
-    EIPACD_registerLinkCallBack(eipHandle->emacHandle);
-
+    /*Run ACD check with the address to be assigned*/
     ACD_Start(htonl(ipAddr), macAddr, 0);
     EIPACD_start();
 
-    /*Do Configs and Callback to be done before IP Assign*/
-    EIPHAL_setEthernetLinkConfig();
-
-    if((eipDevInitConfig.ethConfig[0].bAutoNegotiate)
-            && (eipDevInitConfig.tcpipConfig.startupType == EIP_STARTUP_DHCP))
-    {
-        if(((ICSS_EmacObject *)(eipHandle->emacHandle)->object)->linkStatus[0])
-        {
-            EIPACD_updateLinkStatus(1, 0);
-        }
-
-        if(((ICSS_EmacObject *)(eipHandle->emacHandle)->object)->linkStatus[1])
-        {
-            EIPACD_updateLinkStatus(1, 1);
-        }
-    }
-
-    ptpDrvStackInit(timeSyncHandle);
-
     /* wait for the ACD state machine to check address */
     Semaphore_pend(acdObj.validSem, BIOS_WAIT_FOREVER);
 
@@ -550,6 +528,24 @@
 }
 
 /**
+ *  @brief  Function to de register ACD Link change callback
+ *
+ *
+ *
+ *  @param   icssEmacHandle [in] ICSS EMAC handle
+ *  @retval  none
+ *
+ */
+void EIPACD_deregisterLinkCallBack(ICSSEMAC_Handle icssEmacHandle)
+{
+    ICSS_EmacRegisterPort0ISRCallback(icssEmacHandle,
+                                      (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port0ProcessLinkBrk, (void *)(icssEmacHandle));
+    /*Port 1 Link break callback */
+    ICSS_EmacRegisterPort1ISRCallback(icssEmacHandle,
+                                      (ICSS_EmacCallBack)EIP_DLR_TIMESYNC_port1ProcessLinkBrk, (void *)(icssEmacHandle));
+}
+
+/**
  *  @brief  Starts the ACD Monitor mechanism
  *
  *          Creates ACD monitor task, semaphore and acdobj mailbox
@@ -574,6 +570,13 @@
     acdObj.validSem = Semaphore_create(0, NULL, NULL);
 
     acdStart = 1;
+
+    EIPACD_registerLinkCallBack(eipHandle->emacHandle);
+
+    /*Call the ACD callback with current link status for the first time*/
+    EIPACD_updateLinkStatus(((ICSS_EmacObject *)(eipHandle->emacHandle)->object)->linkStatus[0], 0);
+    EIPACD_updateLinkStatus(((ICSS_EmacObject *)(eipHandle->emacHandle)->object)->linkStatus[1], 1);
+
     return (TRUE);
 }
 
@@ -590,6 +593,9 @@
 void EIPACD_stop()
 {
     uint32_t msg = MSG_NETSTOP;
+
+    EIPACD_deregisterLinkCallBack(eipHandle->emacHandle);
+
     Mailbox_post(acdObj.mbox, &msg, 0);
 
     do
diff -u -ur "/examples/ethernetip_adapter/user_acd_ndk.h" "/examples/ethernetip_adapter/user_acd_ndk.h"
--- "/examples/ethernetip_adapter/user_acd_ndk.h"	2018-12-01 09:03:48.000000000 +0530
+++ "/examples/ethernetip_adapter/user_acd_ndk.h"	2019-11-13 19:24:00.389126700 +0530
@@ -112,6 +112,16 @@
  */
 void EIPACD_registerLinkCallBack(ICSSEMAC_Handle pruIcssHandle);
 /**
+ *  @brief  Function to de register the ACD specific Link change callback
+ *
+ *
+ *
+ *  @param   icssEmacHandle [in] ICSS EMAC handle
+ *  @retval  none
+ *
+ */
+void EIPACD_deregisterLinkCallBack(ICSSEMAC_Handle pruIcssHandle);
+/**
  *  @brief  Function to get the current ACD status.
  *
  *          Used by the LED Task to know whether Conflict has occured or not
diff -u -ur "/protocols/ethernetip_adapter/drivers/icss_dlr.c" "/protocols/ethernetip_adapter/drivers/icss_dlr.c"
--- "/protocols/ethernetip_adapter/drivers/icss_dlr.c"	2018-12-01 09:03:48.000000000 +0530
+++ "/protocols/ethernetip_adapter/drivers/icss_dlr.c"	2019-11-13 19:24:00.418049300 +0530
@@ -2377,6 +2377,10 @@
     {
         dlrHandle->dlrObj->SMVariables.status = UNEXPECTED_LOOP;
     }
+    else
+    {
+        dlrHandle->dlrObj->SMVariables.status = NORMAL_STAT;
+    }
 
     /*Once both ports are connected and Ring is not operational, the device sends three packets on both ports at an interval of 1 second*/
     if((dlrHandle->checkForLoop) && ((dlrHandle->pktSendCounter) < 3))
@@ -2398,8 +2402,30 @@
 
     else
     {
-        dlrHandle->pktSendCounter = 0;
-        dlrHandle->checkForLoop = DLR_FALSE;
+        /*Handle the case when the physical ring got disconnected after the firmware reported Unexpected
+         * loop detected. Checks for the state and sends packets periodically*/
+        if(dlrHandle->dlrObj->SMVariables.status == UNEXPECTED_LOOP)
+        {
+            dlrHandle->tracePktIntervalCount++;
+            if(((dlrHandle->tracePktIntervalCount) & 0xf) == 0)
+            {
+                ICSS_EmacTxPacketEnqueue(dlricssEmacHandle, tracePkt, ICSS_EMAC_PORT_1, 1,
+                                         ETHERNET_FRAME_SIZE_60);
+                ICSS_EmacTxPacketEnqueue(dlricssEmacHandle, tracePkt, ICSS_EMAC_PORT_2, 1,
+                                         ETHERNET_FRAME_SIZE_60);
+                /*reset the counter*/
+                dlrHandle->tracePktIntervalCount = 0;
+                loopDetectedPtr = (uint8_t *)((((ICSS_EmacHwAttrs *)
+                                                dlricssEmacHandle->hwAttrs)->emacBaseAddrCfg)->sharedDataRamBaseAddr +
+                                              DLR_LOOP_DETECTED_OFFSET);
+                *(loopDetectedPtr) =  FALSE_VAL;
+            }
+        }
+        else
+        {
+            dlrHandle->pktSendCounter = 0;
+            dlrHandle->checkForLoop = DLR_FALSE;
+        }
     }
 
 }
@@ -2461,7 +2487,8 @@
     ICSS_EmacBaseAddressHandle_T emacBaseAddr = ((ICSS_EmacHwAttrs *)(
                 dlrHandle->emacHandle)->hwAttrs)->emacBaseAddrCfg;
 
-    uint32_t enableFlag = 0;
+    /*Make sure we are not overwriting Watchdog enable bit for the other port*/
+    uint32_t enableFlag = HWREG(emacBaseAddr->prussIepRegs + CSL_ICSSIEP_WD_CTRL_REG);
 
     if(PORT0_WATCH_DOG_ID == id)
     {
