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

Using the autoboot restart command (in combination with configuring the
state machine to wait) is necessary because the stop command doesn't
actually stop the connection, and would also leave the driver in a state
where an explicit start command is necessary to connect again.

--- 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
@@ -6491,6 +6491,57 @@ DSL_int32_t DSL_CPE_DeviceInit (
    return ret;
 }
 
+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_MAX_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));
+}
 
 /**
    Termination handler. Will clean up in case of ctrl-c.
@@ -6521,6 +6572,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termi
 
    DSL_CPE_Control_Context_t *pCtrlCtx;
 
+   DSL_CPE_ShutdownConnection();
+
    pCtrlCtx = DSL_CPE_GetGlobalContext();
    if (pCtrlCtx != DSL_NULL)
    {
@@ -7416,6 +7469,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;
 }
