+This enables automatic connection after the control daemon is started,
+and also stops the connection on termination.
+
+Using the autoboot restart command 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_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
+@@ -6515,10 +6515,13 @@ DSL_CPE_STATIC void DSL_CPE_Termination
+ DSL_CPE_STATIC DSL_void_t DSL_CPE_Termination (void)
+ {
+ #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+- DSL_int_t nDevice = 0;
+ DSL_char_t buf[32] = "quit";
+ #endif
+
++ DSL_Error_t nRet = DSL_SUCCESS;
++ DSL_int_t nDevice = 0;
++ DSL_AutobootConfig_t sAutobootCfg;
++ DSL_AutobootControl_t sAutobootCtl;
+ DSL_CPE_Control_Context_t *pCtrlCtx;
+
+ pCtrlCtx = DSL_CPE_GetGlobalContext();
+@@ -6527,6 +6530,50 @@ DSL_CPE_STATIC DSL_void_t DSL_CPE_Termi
+ pCtrlCtx->bRun = DSL_FALSE;
+ }
+
++ 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, sAutobootCtl.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
++ "Autoboot restart executed" DSL_CPE_CRLF));
++
+ #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+ for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
+ {
DSL_char_t *g_sFirmwareName1 = DSL_NULL;
DSL_FirmwareFeatures_t g_nFwFeatures1 = {DSL_FW_XDSLMODE_CLEANED, DSL_FW_XDSLFEATURE_CLEANED,
DSL_FW_XDSLFEATURE_CLEANED};
-@@ -6759,6 +6762,8 @@ DSL_int_t dsl_cpe_daemon (
+@@ -6806,6 +6809,8 @@ DSL_int_t dsl_cpe_daemon (
signal (SIGTERM, DSL_CPE_TerminationHandler);
#endif /* RTEMS*/
/* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
{
-@@ -7213,6 +7218,7 @@ DSL_int_t dsl_cpe_daemon (
+@@ -7260,6 +7265,7 @@ DSL_int_t dsl_cpe_daemon (
#endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
DSL_CPE_CONTROL_EXIT: