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.
+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
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
+@@ -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;
- 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;
+ }
+
+ DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
-+ "Autoboot restart executed" DSL_CPE_CRLF));
++ "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();
+
- #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
- for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
+ 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;
+ }
--- a/src/dsl_cpe_control.c
+++ b/src/dsl_cpe_control.c
-@@ -6504,7 +6504,7 @@ DSL_CPE_STATIC void DSL_CPE_Termination
+@@ -6555,7 +6555,7 @@ DSL_CPE_STATIC void DSL_CPE_Termination
/* ignore the signal, we'll handle by ourself */
signal (sig, SIG_IGN);
{
DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX "terminated" DSL_CPE_CRLF));
DSL_CPE_Termination ();
-@@ -6803,6 +6803,7 @@ DSL_int_t dsl_cpe_daemon (
+@@ -6809,6 +6809,7 @@ DSL_int_t dsl_cpe_daemon (
#ifndef RTEMS
signal (SIGINT, DSL_CPE_TerminationHandler);
DSL_char_t *g_sFirmwareName1 = DSL_NULL;
DSL_FirmwareFeatures_t g_nFwFeatures1 = {DSL_FW_XDSLMODE_CLEANED, DSL_FW_XDSLFEATURE_CLEANED,
DSL_FW_XDSLFEATURE_CLEANED};
-@@ -6806,6 +6809,8 @@ DSL_int_t dsl_cpe_daemon (
+@@ -6812,6 +6815,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++)
{
-@@ -7260,6 +7265,7 @@ DSL_int_t dsl_cpe_daemon (
+@@ -7266,6 +7271,7 @@ DSL_int_t dsl_cpe_daemon (
#endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
DSL_CPE_CONTROL_EXIT: