diff --git a/ChangeLog b/ChangeLog index 6ddc83dbb43cbc827b72a8907e0936a14cd6a0da..ff68bdea5c8598cdec70f0a048131fe45ac31e7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ NEXT VERSION +V1.8.1.1.0 - 2019-01-15 +- VRX (DSLCPE_SW-1163) IRQ mode is possible to used within UGW-8.x again +- VRX (DSLCPE_SW-1097) Message dump printout within MEI Driver is not as expected +- (DSLCPE_SW-1139) Generation of UMPR for API 4.19.x / R5 release + Make sure that IOCtl's which shall be part of the API UMPR are classified + accordingly +- VRX (DSLCPE_SW-1149) Debug stream segmentation fault fix +- VRX (DSLCPE_SW-1173) [VRX518][Power Saving] Switching BND->Single + V1.8.1.1 - 2018-08-02 common: - VRX (DSLCPE_SW-1150) Shutdown sequence does not work correctly for UGW-8.x @@ -19,6 +28,9 @@ common: V1.8.0 - 2018-05-30 common: +- VRX518 (DSLCPE_SW-1131) Power Saving for Disabled DSL Lines in VRX518 + + Entities disabling implementation + + Separate function for sending TC Request / setting callback - VRX518 (DSLCPE_SW-1122) Power Saving Support by the MEI-Driver (fallback) + Support GRX350 platform (DSL clock gating flag: 0x20ec0305) - VRX (DSLCPE_SW-1119) Update MCAT header files to latest revision (Rev.3.1) diff --git a/configure b/configure index 5da4ec6eb99c05223c6d16ed3900a6f34245a478..c0ea165588284d6ddded34fa4be6a41b58e4a2e9 100755 --- a/configure +++ b/configure @@ -1,7 +1,7 @@ #! /bin/sh # From configure.in Revision: 1.21 . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for IFX MEI CPE Driver 1.8.1.1. +# Generated by GNU Autoconf 2.69 for IFX MEI CPE Driver 1.8.1.1.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -577,8 +577,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='IFX MEI CPE Driver' PACKAGE_TARNAME='drv_mei_cpe' -PACKAGE_VERSION='1.8.1.1' -PACKAGE_STRING='IFX MEI CPE Driver 1.8.1.1' +PACKAGE_VERSION='1.8.1.1.0' +PACKAGE_STRING='IFX MEI CPE Driver 1.8.1.1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1312,7 +1312,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures IFX MEI CPE Driver 1.8.1.1 to adapt to many kinds of systems. +\`configure' configures IFX MEI CPE Driver 1.8.1.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1378,7 +1378,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of IFX MEI CPE Driver 1.8.1.1:";; + short | recursive ) echo "Configuration of IFX MEI CPE Driver 1.8.1.1.0:";; esac cat <<\_ACEOF @@ -1525,7 +1525,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -IFX MEI CPE Driver configure 1.8.1.1 +IFX MEI CPE Driver configure 1.8.1.1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1580,7 +1580,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by IFX MEI CPE Driver $as_me 1.8.1.1, which was +It was created by IFX MEI CPE Driver $as_me 1.8.1.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2445,7 +2445,7 @@ fi # Define the identity of the package. PACKAGE='drv_mei_cpe' - VERSION='1.8.1.1' + VERSION='1.8.1.1.0' cat >>confdefs.h <<_ACEOF @@ -5576,7 +5576,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by IFX MEI CPE Driver $as_me 1.8.1.1, which was +This file was extended by IFX MEI CPE Driver $as_me 1.8.1.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5642,7 +5642,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -IFX MEI CPE Driver config.status 1.8.1.1 +IFX MEI CPE Driver config.status 1.8.1.1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.in b/configure.in index 69d58980774d43718ab8fed95bede010368f0d03..5f02645069f450f4dcfedd35f796b9705115796d 100644 --- a/configure.in +++ b/configure.in @@ -1,7 +1,7 @@ AC_REVISION($Revision: 1.21 $) -AC_INIT(IFX MEI CPE Driver, 1.8.1.1, , drv_mei_cpe) +AC_INIT(IFX MEI CPE Driver, 1.8.1.1.0, , drv_mei_cpe) AC_CONFIG_SRCDIR(src/Makefile.am) AM_INIT_AUTOMAKE([tar-pax]) diff --git a/doc/doxyconfig b/doc/doxyconfig index e9c8f864e8f601ab197dfe750e3fbd9251c7ec5e..2ffd1e507d37d5ad7170f0bd05031b55e21eb5e0 100644 --- a/doc/doxyconfig +++ b/doc/doxyconfig @@ -22,7 +22,7 @@ PROJECT_NAME = "MEI CPE Driver" # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 1.8.1.1 +PROJECT_NUMBER = 1.8.1.1.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/src/debug_stream_dump/mei_cpe_drv_dbg_strm_dmp.c b/src/debug_stream_dump/mei_cpe_drv_dbg_strm_dmp.c index e210c2886ff8a9ce1ab86334ac9522b899e0fe42..5636b7e12a947c5f3ef002024d86f046f46f497c 100644 --- a/src/debug_stream_dump/mei_cpe_drv_dbg_strm_dmp.c +++ b/src/debug_stream_dump/mei_cpe_drv_dbg_strm_dmp.c @@ -772,10 +772,9 @@ static MEIOS_File_t* MEI_debug_stream_dump_new_file(MEIOS_File_t *dumpFd) return dumpFd; } -static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, +static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t **pDumpFd, unsigned short *pBuffer, - unsigned long *pCurLength, - MEIOS_File_t **pDumpFd) + unsigned long *pCurLength) { unsigned short i = 0; static unsigned long nWrittenBytesToFlush = 0; @@ -787,6 +786,14 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, data.maxStreamEntries = 20; data.pData = (unsigned char*)pBuffer; data.timeout_ms = 0; + + if (pDumpFd == NULL) + { + MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX + "ERROR - pDumpFd is NULL" MEIOS_CRLF); + return -1; + } + if ((MEIOS_DeviceControl(fd, FIO_MEI_DEBUG_STREAM_DATA_GET, (MEI_IOCTL_ARG)&data)) < 0 ) @@ -799,52 +806,61 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, if ((bText != 1) && (bFile == 1)) { - if (data.dataBufferSize_byte >= g_nFileLength) + if(*pDumpFd != NULL) { - for (; data.dataBufferSize_byte >= g_nFileLength; - data.dataBufferSize_byte -= g_nFileLength) + if (data.dataBufferSize_byte >= g_nFileLength) { - *pCurLength = (data.dataBufferSize_byte < g_nFileLength)? + for (; data.dataBufferSize_byte >= g_nFileLength; + data.dataBufferSize_byte -= g_nFileLength) + { + *pCurLength = (data.dataBufferSize_byte < g_nFileLength)? data.dataBufferSize_byte : g_nFileLength; - fwrite(data.pData, sizeof(char), *pCurLength, dumpFd); - data.pData += *pCurLength; - dumpFd = MEI_debug_stream_dump_new_file(dumpFd); - if (dumpFd == NULL) - { - MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX - "ERROR - could not open new dump file" MEIOS_CRLF); - return -1; + fwrite(data.pData, sizeof(char), *pCurLength, *pDumpFd); + data.pData += *pCurLength; + *pDumpFd = MEI_debug_stream_dump_new_file(*pDumpFd); + if (*pDumpFd == NULL) + { + MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX + "ERROR - could not open new dump file" MEIOS_CRLF); + return -1; + } } + *pCurLength = 0; } - *pCurLength = 0; - } - else - { - *pCurLength += data.dataBufferSize_byte; - if (*pCurLength >= g_nFileLength) + else { - dumpFd = MEI_debug_stream_dump_new_file(dumpFd); - if (dumpFd == NULL) + *pCurLength += data.dataBufferSize_byte; + if (*pCurLength >= g_nFileLength) { - MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX - "ERROR - could not open new dump file" MEIOS_CRLF); - return -1; + *pDumpFd = MEI_debug_stream_dump_new_file(*pDumpFd); + if (*pDumpFd == NULL) + { + MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX + "ERROR - could not open new dump file" MEIOS_CRLF); + return -1; + } + *pCurLength = data.dataBufferSize_byte; } - *pCurLength = data.dataBufferSize_byte; - } - if (dumpFd != NULL) - { - fwrite(data.pData, sizeof(char), data.dataBufferSize_byte, dumpFd); - nWrittenBytesToFlush += data.dataBufferSize_byte; - if (nWrittenBytesToFlush >= DBG_STRM_DMP_MEI_BYTES_TO_FLUSH) + if (*pDumpFd != NULL) { - fflush(dumpFd); - nWrittenBytesToFlush = 0; + fwrite(data.pData, sizeof(char), data.dataBufferSize_byte, *pDumpFd); + nWrittenBytesToFlush += data.dataBufferSize_byte; + if (nWrittenBytesToFlush >= DBG_STRM_DMP_MEI_BYTES_TO_FLUSH) + { + fflush(*pDumpFd); + nWrittenBytesToFlush = 0; + } } } } + else + { + MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX + "ERROR - *pDumpFd is empty" MEIOS_CRLF); + return -1; + } } else { @@ -855,16 +871,16 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, /* Reset cycle byte counter */ nWrittenBytes = 0; - if((dumpFd == stdout) && (dumpFd != NULL) && + if((*pDumpFd == stdout) && (*pDumpFd != NULL) && ((((unsigned short*)data.pData)[i]) == DBG_STRM_DMP_MEI_EVENT_NUM)) { - nWrittenBytes += MEIOS_FPrintf(dumpFd, "\n"); + nWrittenBytes += MEIOS_FPrintf(*pDumpFd, "\n"); } if((((unsigned short*)data.pData)[i]) != DBG_STRM_DMP_MEI_EVENT_NUM) { - if (dumpFd != NULL) + if (*pDumpFd != NULL) { - nWrittenBytes += MEIOS_FPrintf(dumpFd, "%04X ", + nWrittenBytes += MEIOS_FPrintf(*pDumpFd, "%04X ", ((unsigned short*)data.pData)[i]); } } @@ -876,10 +892,10 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, *pCurLength += nWrittenBytes; nWrittenBytesToFlush += nWrittenBytes; - if ((dumpFd != NULL) && + if ((*pDumpFd != NULL) && (nWrittenBytesToFlush >= DBG_STRM_DMP_MEI_BYTES_TO_FLUSH)) { - fflush(dumpFd); + fflush(*pDumpFd); nWrittenBytesToFlush = 0; } @@ -887,8 +903,8 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, { if(*pCurLength >= g_nFileLength) { - dumpFd = MEI_debug_stream_dump_new_file(dumpFd); - if (dumpFd == NULL) + *pDumpFd = MEI_debug_stream_dump_new_file(*pDumpFd); + if (*pDumpFd == NULL) { MEIOS_FPrintf(stdout, DBG_STRM_DMP_MEI_DBG_PREFIX "ERROR - could not open new dump file" MEIOS_CRLF); @@ -898,9 +914,9 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, nWrittenBytes = 0; nWrittenBytesToFlush = 0; } - if (dumpFd != NULL) + if (*pDumpFd != NULL) { - MEIOS_FPrintf(dumpFd, "%04X ", DBG_STRM_DMP_MEI_EVENT_NUM); + MEIOS_FPrintf(*pDumpFd, "%04X ", DBG_STRM_DMP_MEI_EVENT_NUM); } } } @@ -909,13 +925,9 @@ static int MEI_debug_stream_dump_save_to_file(MEIOS_File_t *dumpFd, if (data.dataBufferSize_byte == 0) { /* The data from the buffer was written fully */ - if (dumpFd != NULL) + if (*pDumpFd != NULL) { - if (pDumpFd != NULL) - { - *pDumpFd = dumpFd; - } - fflush(dumpFd); + fflush(*pDumpFd); nWrittenBytesToFlush = 0; } @@ -1173,10 +1185,9 @@ int MEI_debug_stream_dump_daemon(void) do { - ret = MEI_debug_stream_dump_save_to_file(dumpFd, + ret = MEI_debug_stream_dump_save_to_file(&dumpFd, pBuffer, - &nCurrentLength, - &dumpFd); + &nCurrentLength); } while (ret == 0); if (ret == -1) diff --git a/src/drv_mei_cpe_api_atm_ptm_intern.c b/src/drv_mei_cpe_api_atm_ptm_intern.c index 27eea02feb4be56a85da3452025019fbed2c0601..ac86c0e25acbb5649c60ac28d87fe783e185625d 100644 --- a/src/drv_mei_cpe_api_atm_ptm_intern.c +++ b/src/drv_mei_cpe_api_atm_ptm_intern.c @@ -265,7 +265,7 @@ IFX_int32_t MEI_TcRequest(void *data) MEI_DynCntrlStructFree(&pMeiDynCntrl); } -#ifdef IRQ_POLLING_FORCE +#ifdef IRQ_POLLING_FORCE do_exit(retVal); #endif /* IRQ_POLLING_FORCE */ @@ -339,7 +339,12 @@ IFX_int32_t MEI_InternalTcRequest( return retVal; } -IFX_int32_t MEI_InternalLineTCModeSwitch(IFX_int8_t nEntity, IFX_int8_t nInstance, IFX_boolean_t bPowerUp) { +IFX_int32_t MEI_InternalLineTCModeSwitch( + IFX_int8_t nEntity, + IFX_int8_t nInstance, + IFX_boolean_t bPowerUp, + IFX_boolean_t bKillMEIControlThread) +{ IFX_int32_t retVal = IFX_SUCCESS; #if defined(PPA_SUPPORTS_CALLBACKS) && defined(PPA_SUPPORTS_TC_CALLBACKS) @@ -349,7 +354,7 @@ IFX_int32_t MEI_InternalLineTCModeSwitch(IFX_int8_t nEntity, IFX_int8_t nInstanc #endif /* defined(PPA_SUPPORTS_CALLBACKS) && defined(PPA_SUPPORTS_TC_CALLBACKS) */ #if (MEI_SUPPORT_PERIODIC_TASK == 1) - if (bPowerUp == IFX_FALSE) + if (bKillMEIControlThread == IFX_TRUE) { if ( MEI_DrvCntrlThreadParams.bValid == IFX_TRUE) { @@ -365,7 +370,7 @@ IFX_int32_t MEI_InternalLineTCModeSwitch(IFX_int8_t nEntity, IFX_int8_t nInstanc pMeiDynCntrl = NULL; nLineNum = MEIX_Cntrl[nEntity]->MeiDevice[nInstance]->meiDrvCntrl.dslLineNum; MEI_DynCntrlStructAlloc(nLineNum, &pMeiDynCntrl); - + if (pMeiDynCntrl != NULL) { pMeiDynCntrl->openInstance = 0xFF; @@ -377,7 +382,7 @@ IFX_int32_t MEI_InternalLineTCModeSwitch(IFX_int8_t nEntity, IFX_int8_t nInstanc retVal = MEI_InternalTcRequest(pMeiDynCntrl, &argsTcRequest); - MEI_DRVOS_Wait_ms(200); + MEI_DRVOS_Wait_ms(200); MEI_DynCntrlStructFree(&pMeiDynCntrl); @@ -407,7 +412,7 @@ IFX_int32_t MEI_InternalLineTCModeSwitch(IFX_int8_t nEntity, IFX_int8_t nInstanc ("MEI_DRV[%02d]: PPA Callbacks disabled by compile option, " "to use this functionality you will need to enable them" MEI_DRV_CRLF, nEntity)); - + #endif /* defined(PPA_SUPPORTS_CALLBACKS) && defined(PPA_SUPPORTS_TC_CALLBACKS) */ return retVal; diff --git a/src/drv_mei_cpe_api_atm_ptm_intern.h b/src/drv_mei_cpe_api_atm_ptm_intern.h index 4aa147882b85d69b3833d16976df619b379e4aca..36f606329544d1e0f7dd09b7886cc8e6c6f22eed 100644 --- a/src/drv_mei_cpe_api_atm_ptm_intern.h +++ b/src/drv_mei_cpe_api_atm_ptm_intern.h @@ -75,10 +75,10 @@ extern IFX_int32_t MEI_InternalErbAddrUpdate( MEI_DYN_CNTRL_T *pMeiDynCntrl); extern IFX_int32_t MEI_InternalLineTCModeSwitch( - IFX_int8_t nEntity, - IFX_int8_t nInstance, - IFX_boolean_t bPowerUp); - + IFX_int8_t nEntity, + IFX_int8_t nInstance, + IFX_boolean_t bPowerUp, + IFX_boolean_t bKillMEIControlThread); #ifdef PPA_SUPPORTS_CALLBACKS extern int ppa_callback_set(e_ltq_mei_cb_type type, void *func); diff --git a/src/drv_mei_cpe_api_intern.c b/src/drv_mei_cpe_api_intern.c index 7ed5a3cf714d883b86bbaede222f227039864888..909d9dedd7daf78a7d26c11798fdd7828662e15e 100644 --- a/src/drv_mei_cpe_api_intern.c +++ b/src/drv_mei_cpe_api_intern.c @@ -1,7 +1,6 @@ /****************************************************************************** - - Copyright (c) 2007-2015 - Lantiq Beteiligungs-GmbH & Co. KG + Copyright 2018 Intel Corporation + Copyright 2007 - 2015 Lantiq Beteiligungs-GmbH & Co. KG For licensing information, see the file 'LICENSE' in the root folder of this software module. @@ -434,6 +433,13 @@ static IFX_void_t MEI_Internal_DumpMessage( static const IFX_uint32_t *pMsg32; IFX_boolean_t bDirSet = IFX_FALSE; IFX_uint8_t i; + const IFX_uint32_t nCommonPayloadSize = 5*nSize/2; + const IFX_uint8_t nInfoSize = 35; + const IFX_uint8_t nBufSize = 10; + IFX_uint32_t nMsgSize = nCommonPayloadSize + nInfoSize; + IFX_uint32_t nCharsWrittenToBuf = 0; + char msg[nMsgSize]; + char buf[nBufSize]; if((pData == IFX_NULL) || (nSize < 4)) { @@ -445,11 +451,12 @@ static IFX_void_t MEI_Internal_DumpMessage( bDirSet = (nMsgId & 0x40) ? IFX_TRUE : IFX_FALSE; - PRN_DBG_USR_RAW(MEI_MSG_DUMP_API, dbg_level, - ("MEI[%02d/%s]: 0x%04x 0x%04x 0x%04x", - MEI_DRV_DYN_LINENUM_GET(pMeiDynCntrl), - (bReceive == IFX_TRUE ? "rx" : "tx"), nMsgId, - pData[0], pData[1])); + snprintf(msg, nInfoSize, + "MEI[%02d/%s]: 0x%04x 0x%04x 0x%04x", + MEI_DRV_DYN_LINENUM_GET(pMeiDynCntrl), + (bReceive == IFX_TRUE ? "rx" : "tx"), nMsgId, + pData[0], pData[1]); + nMsgSize -= nInfoSize; /* decide wether to interpret the rest as 16 or 32 bit */ if (nMsgId & 0x0010) @@ -457,7 +464,9 @@ static IFX_void_t MEI_Internal_DumpMessage( /* 32-bit payload elements */ for (i=0; i<((nSize-4)/4); i++) { - PRN_DBG_USR_RAW(MEI_MSG_DUMP_API, dbg_level, (" %08X", pMsg32[i])); + nCharsWrittenToBuf = snprintf(buf, nBufSize, " %08X", pMsg32[i]); + strncat(msg, buf, nMsgSize); + nMsgSize -= nCharsWrittenToBuf; } } else @@ -465,11 +474,14 @@ static IFX_void_t MEI_Internal_DumpMessage( /* 16-bit payload elements */ for (i=0; i<((nSize-4)/2); i++) { - PRN_DBG_USR_RAW(MEI_MSG_DUMP_API, dbg_level, (" %04X", pMsg16[i])); + nCharsWrittenToBuf = snprintf(buf, nBufSize, " %04X", pMsg16[i]); + strncat(msg, buf, nMsgSize); + nMsgSize -= nCharsWrittenToBuf; } } + strncat(msg, MEI_DRV_CRLF, nMsgSize); - PRN_DBG_USR_RAW(MEI_MSG_DUMP_API, dbg_level, (MEI_DRV_CRLF)); + PRN_DBG_USR_RAW(MEI_MSG_DUMP_API, dbg_level, (msg)); } IFX_int32_t MEI_InternalSendMessage( @@ -501,7 +513,7 @@ IFX_int32_t MEI_InternalSendMessage( { MEI_Internal_DumpMessage(pMeiDynCntrl, msg.ack_msg.msgId, (IFX_uint16_t *)msg.ack_msg.pPayload, msg.ack_msg.paylSize_byte, - IFX_TRUE, MEI_DRV_PRN_LEVEL_LOW); + IFX_TRUE, MEI_DRV_PRN_LEVEL_NORMAL); } return ret; diff --git a/src/drv_mei_cpe_interface.h b/src/drv_mei_cpe_interface.h index cb0dac0044d367618f74706b13407ca30dc7ae2c..354a5447fa07ca9056176a632ffc15aeab7ef4a0 100644 --- a/src/drv_mei_cpe_interface.h +++ b/src/drv_mei_cpe_interface.h @@ -73,6 +73,18 @@ \ingroup MEI_CEOC */ +/** \defgroup MEI_API Functions for common usage within Linux user space + This Group contains all the common functions for general purpose that might + be used from within Linux user space, independent from DSL CPE API Driver + usage. + \ingroup MEI_INTERFACE +*/ + +/** + \defgroup MEI_API_IOCTL IOCtl's + \ingroup MEI_API +*/ + /** \defgroup MEI_DSM Functions for Digital Spectrum Management (DSM/vectoring) This Group contains all the commonly used functions for configuration, control and status request of the [D]igital [S]pectrum [M]anagement related @@ -248,6 +260,7 @@ \ingroup MEI_COMMON_IOCTL */ #define FIO_MEI_DRV_INIT _IO(MEI_IOC_MAGIC, 4) +#endif /* #ifndef DSL_DOC_GENERATION_EXCLUDE_UNWANTED */ /** This returns information about the successfully detected respective available devices/lines. @@ -269,9 +282,10 @@ memset(&devInfo, 0x00, sizeof(IOCTL_MEI_drvDevinfoGet_t)); ret = ioctl(fd, FIO_MEI_DRV_DEVINFO_GET, &devInfo) \endcode - \ingroup MEI_COMMON_IOCTL */ + \ingroup MEI_API_IOCTL */ #define FIO_MEI_DRV_DEVINFO_GET _IO(MEI_IOC_MAGIC, 5) +#ifndef DSL_DOC_GENERATION_EXCLUDE_UNWANTED /** This service resets the MEI CPE Device Driver and optional the device blocks via MEI register. @@ -2133,6 +2147,7 @@ typedef struct unsigned int bmWaitStates; } IOCTL_MEI_drvInit_t; +#endif /* #ifndef DSL_DOC_GENERATION_EXCLUDE_UNWANTED */ /** ioctl structure to get the device/line availibility. */ typedef struct @@ -2150,6 +2165,7 @@ typedef struct unsigned int entitiesEnabled; } IOCTL_MEI_devinfo_t ; +#ifndef DSL_DOC_GENERATION_EXCLUDE_UNWANTED /** modem Driver Reset Modes */ typedef enum diff --git a/src/drv_mei_cpe_linux.c b/src/drv_mei_cpe_linux.c index 928e1744f2d2719bb166105a7f160fd9a2719858..3b965d2e2424ac7c096ccd0edc5d42c5958c6c8e 100644 --- a/src/drv_mei_cpe_linux.c +++ b/src/drv_mei_cpe_linux.c @@ -1937,6 +1937,8 @@ static int MEI_EntitiesEnableCtrl(struct file *file, char proc_str[16] = { '\0' }; int nEntity = 0, nInstance = 0, ret = 0; int nEntitiesEnableCtrl = 0, nEntitiesEnabled = MEI_DEVICE_CFG_VALUE_GET(EntitiesEnabled); + IFX_uint8_t nDisabledLinesCounter = 0; + IFX_boolean_t bKillMEIControlThread = IFX_FALSE; MEIX_CNTRL_T *pXCntrl; if (count > sizeof(proc_str) - 1) @@ -1952,7 +1954,7 @@ static int MEI_EntitiesEnableCtrl(struct file *file, proc_str[count] = 0; sscanf(proc_str, "%d", &nEntitiesEnableCtrl); - if(nEntitiesEnableCtrl > MEI_DFEX_ENTITIES || nEntitiesEnableCtrl < 0) + if(nEntitiesEnableCtrl > MEI_DFEX_ENTITIES || nEntitiesEnableCtrl < 0) { PRN_DBG_USR_NL( MEI_DRV,MEI_DRV_PRN_LEVEL_HIGH, ("MEI_DRV: Incorrect parameter" MEI_DRV_CRLF)); @@ -1960,15 +1962,23 @@ static int MEI_EntitiesEnableCtrl(struct file *file, return e_MEI_ERR_INVAL_ARG; } - if(nEntitiesEnableCtrl < nEntitiesEnabled) + if(nEntitiesEnableCtrl < nEntitiesEnabled) { - for(nEntity = nEntitiesEnabled - 1; nEntity >= nEntitiesEnableCtrl; --nEntity) + nDisabledLinesCounter = 0; + for(nEntity = nEntitiesEnabled - 1; nEntity >= nEntitiesEnableCtrl; --nEntity) { + ++nDisabledLinesCounter; + + if (nEntitiesEnabled == nDisabledLinesCounter) + { + bKillMEIControlThread = IFX_TRUE; + } + if ((pXCntrl = MEIX_Cntrl[nEntity]) != NULL) { for (nInstance = 0; nInstance < MEI_DFE_INSTANCE_PER_ENTITY; ++nInstance) { - ret = MEI_InternalLineTCModeSwitch(nEntity, nInstance, IFX_FALSE); + ret = MEI_InternalLineTCModeSwitch(nEntity, nInstance, IFX_FALSE, bKillMEIControlThread); } } } @@ -1981,7 +1991,7 @@ static int MEI_EntitiesEnableCtrl(struct file *file, { for (nInstance = 0; nInstance < MEI_DFE_INSTANCE_PER_ENTITY; ++nInstance) { - ret = MEI_InternalLineTCModeSwitch(nEntity, nInstance, IFX_TRUE); + ret = MEI_InternalLineTCModeSwitch(nEntity, nInstance, IFX_TRUE, bKillMEIControlThread); } } } @@ -1991,7 +2001,7 @@ static int MEI_EntitiesEnableCtrl(struct file *file, { MEI_DEVICE_CFG_VALUE_SET(EntitiesEnabled, nEntitiesEnableCtrl); } - + return count; } @@ -3088,6 +3098,7 @@ IFX_int32_t MEI_IoctlInitDevice( pMeiDev->intMask = ME_ARC2ME_INTERRUPT_UNMASK_ALL; #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) \ + || (LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)) \ || (MEI_SUPPORT_DEVICE_VR10_320 == 1) \ || (MEI_TARGET_x86 == 1) virq = (IFX_uint32_t)pInitDev->usedIRQ;