| 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; |
| } |