This enables automatic connection after the control daemon is started,
and also changes the way the connection is stopped on termination.

Using the autoboot restart command (in combination with configuring the
state machine to wait) is necessary because the stop command would stop
the autoboot thread, and the driver offers no working way to start it
again later, short of unloading and reloading the module.

The disconnection code is also moved to a separate function, so it can
be called in other exit code paths than the one for SIGTERM.

--- a/src/dsl_cpe_init_cfg.c
+++ b/src/dsl_cpe_init_cfg.c
@@ -27,7 +27,7 @@ DSL_InitData_t gInitCfgData =
    DSL_CPE_FW2_SET(DSL_NULL, 0x0),
    DSL_CPE_XTU_SET(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7),
    DSL_CPE_LINE_INV_NE_SET(DSL_NULL),
-   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_STOP),
+   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_START),
    DSL_CPE_AUTOBOOT_CFG_SET(DSL_FALSE, DSL_FALSE, DSL_FALSE),
    DSL_CPE_TEST_MODE_CTRL_SET(DSL_TESTMODE_DISABLE),
    DSL_CPE_LINE_ACTIVATE_CTRL_SET(DSL_G997_INHIBIT_LDSF, DSL_G997_INHIBIT_ACSF, DSL_G997_NORMAL_STARTUP),
--- a/src/dsl_cpe_control.c
+++ b/src/dsl_cpe_control.c
@@ -7252,6 +7252,58 @@ static DSL_boolean_t DSL_CPE_DebugAndTes
 #endif /* defined(DSL_DEBUG_TOOL_INTERFACE) || defined(INCLUDE_DSL_CPE_DTI_SUPPORT) */
 #endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
 
+DSL_CPE_STATIC DSL_void_t DSL_CPE_ShutdownConnection(void)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_int_t nDevice = 0;
+   DSL_AutobootConfig_t sAutobootCfg;
+   DSL_AutobootControl_t sAutobootCtl;
+
+   for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; ++nDevice)
+   {
+      g_bWaitBeforeConfigWrite[nDevice]    = DSL_TRUE;
+      g_bWaitBeforeLinkActivation[nDevice] = DSL_TRUE;
+      g_bWaitBeforeRestart[nDevice]        = DSL_TRUE;
+
+      g_bAutoContinueWaitBeforeConfigWrite[nDevice]    = DSL_FALSE;
+      g_bAutoContinueWaitBeforeLinkActivation[nDevice] = DSL_FALSE;
+      g_bAutoContinueWaitBeforeRestart[nDevice]        = DSL_FALSE;
+
+      memset(&sAutobootCfg, 0x0, sizeof(DSL_AutobootConfig_t));
+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeConfigWrite    = DSL_TRUE;
+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeLinkActivation = DSL_TRUE;
+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeRestart        = DSL_TRUE;
+
+      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
+         DSL_CPE_GetGlobalContext()->fd[nDevice],
+         DSL_FIO_AUTOBOOT_CONFIG_SET, (DSL_int_t)&sAutobootCfg);
+
+      if (nRet < DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "Autoboot configuration for device (%d) failed!, nRet = %d!"
+            DSL_CPE_CRLF, nDevice, sAutobootCfg.accessCtl.nReturn));
+      }
+
+      memset(&sAutobootCtl, 0, sizeof(DSL_AutobootControl_t));
+      sAutobootCtl.data.nCommand = DSL_AUTOBOOT_CTRL_RESTART;
+
+      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
+         DSL_CPE_GetGlobalContext()->fd[nDevice],
+         DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t)&sAutobootCtl);
+
+      if (nRet < DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "Autoboot restart for device (%d) failed!, nRet = %d!"
+            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
+      }
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "Connection shutdown finished." DSL_CPE_CRLF));
+}
+
 #ifndef RTEMS
 /**
    Signal handler.
@@ -7327,6 +7379,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_CLI_Q
 
 DSL_CPE_STATIC  DSL_void_t DSL_CPE_Interruption(void)
 {
+   DSL_CPE_ShutdownConnection();
+
    DSL_CPE_DaemonExit();
 
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
@@ -7336,37 +7390,16 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Inter
 
 DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination(void)
 {
-   DSL_Error_t nRet = DSL_SUCCESS;
-   DSL_int_t nDevice = 0;
-   DSL_AutobootControl_t sAutobootCtl;
    DSL_CPE_Control_Context_t *pCtrlCtx = DSL_NULL;
 
+   DSL_CPE_ShutdownConnection();
+
    pCtrlCtx = DSL_CPE_GetGlobalContext();
    if (pCtrlCtx != DSL_NULL)
    {
       pCtrlCtx->bEvtRun = DSL_FALSE;
    }
 
-   for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; ++nDevice)
-   {
-      memset(&sAutobootCtl, 0, sizeof(DSL_AutobootControl_t));
-      sAutobootCtl.data.nCommand = DSL_AUTOBOOT_CTRL_STOP;
-
-      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
-         DSL_CPE_GetGlobalContext()->fd[nDevice],
-         DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t)&sAutobootCtl);
-
-      if (nRet < DSL_SUCCESS)
-      {
-         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
-            "Autoboot stop for device (%d) failed!, nRet = %d!"
-            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
-      }
-   }
-
-   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
-      "Autoboot stop executed" DSL_CPE_CRLF));
-
    DSL_CPE_DaemonExit();
 
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
@@ -8551,6 +8584,9 @@ void DSL_CPE_main(void)
 DSL_CPE_STATIC  DSL_Error_t DSL_CPE_Control_Exit (DSL_void_t * pContext)
 {
    dummy_console_t *pConsole = pContext;
+
+   DSL_CPE_ShutdownConnection();
+
    pConsole->bRun = DSL_FALSE;
    return DSL_SUCCESS;
 }
@@ -8798,4 +8834,4 @@ DSL_CPE_STATIC DSL_Error_t DSL_CPE_Firmw
       pDecimal));
 
    return nErrCode;
-}
\ No newline at end of file
+}
