[openwrt/openwrt] ltq-vdsl/ltq-adsl: fix elapsed time calculation

LEDE Commits lede-commits at lists.infradead.org
Tue May 3 17:38:49 PDT 2022


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/db4bf4b968c0da035d98e7771fc993af9d6f742b

commit db4bf4b968c0da035d98e7771fc993af9d6f742b
Author: Jan Hoffmann <jan at 3e8.eu>
AuthorDate: Mon Apr 25 21:52:39 2022 +0200

    ltq-vdsl/ltq-adsl: fix elapsed time calculation
    
    The driver maintains elapsed times by repeatedly accumulating the time
    since the previous update in a loop. For the elapsed showtime time, the
    time difference is truncated to seconds before adding it, leading to a
    sizable error over time.
    
    Move the truncation to before calculation of the time difference in
    order to remove this error. Also maintain the total elapsed time in the
    same way in full seconds, to prevent the unsigned 32-bit counter from
    wrapping around after about 50 days.
    
    Testing on a VR9 device shows that the reported line uptime now matches
    the actual elapsed wall time. The ADSL variant is only compile-tested,
    but it should also work as the relevant code is identical.
    
    Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
    Tested-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
---
 package/kernel/lantiq/ltq-adsl/Makefile            |   2 +-
 .../ltq-adsl/patches/200-fix-elapsed-time.patch    | 122 +++++++++++++++++++++
 package/kernel/lantiq/ltq-vdsl/Makefile            |   2 +-
 .../ltq-vdsl/patches/200-fix-elapsed-time.patch    | 122 +++++++++++++++++++++
 4 files changed, 246 insertions(+), 2 deletions(-)

diff --git a/package/kernel/lantiq/ltq-adsl/Makefile b/package/kernel/lantiq/ltq-adsl/Makefile
index 31874acaca..ac96674933 100644
--- a/package/kernel/lantiq/ltq-adsl/Makefile
+++ b/package/kernel/lantiq/ltq-adsl/Makefile
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=ltq-adsl
 PKG_VERSION:=3.24.4.4
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 PKG_SOURCE:=drv_dsl_cpe_api_danube-$(PKG_VERSION).tar.gz
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/ltq-dsl-$(BUILD_VARIANT)/drv_dsl_cpe_api-$(PKG_VERSION)
 PKG_SOURCE_URL:=@OPENWRT
diff --git a/package/kernel/lantiq/ltq-adsl/patches/200-fix-elapsed-time.patch b/package/kernel/lantiq/ltq-adsl/patches/200-fix-elapsed-time.patch
new file mode 100644
index 0000000000..42ec214371
--- /dev/null
+++ b/package/kernel/lantiq/ltq-adsl/patches/200-fix-elapsed-time.patch
@@ -0,0 +1,122 @@
+--- a/src/include/drv_dsl_cpe_pm_core.h
++++ b/src/include/drv_dsl_cpe_pm_core.h
+@@ -1525,9 +1525,9 @@ typedef struct
+    DSL_boolean_t bShowtimeProcessingStart;
+    /** Showtime reached flag*/
+    DSL_boolean_t bShowtimeInvTrigger;
+-   /** Current Showtime synchronization time to be used, (msec) */
++   /** Current Showtime synchronization time to be used, (sec) */
+    DSL_uint32_t nCurrShowtimeTime;
+-   /** Showtime synchronization time to be used, (msec) */
++   /** Showtime synchronization time to be used, (sec) */
+    DSL_uint32_t nElapsedShowtimeTime;
+    /** Actual Line state*/
+    DSL_LineStateValue_t nLineState;
+--- a/src/pm/drv_dsl_cpe_api_pm.c
++++ b/src/pm/drv_dsl_cpe_api_pm.c
+@@ -1445,7 +1445,7 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersTo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pChCounters = DSL_DRV_PM_PTR_CHANNEL_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -1501,7 +1501,7 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersEx
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pChCounters = DSL_DRV_PM_PTR_CHANNEL_COUNTERS_TOTAL_EXT(pCounters->nChannel);
+ 
+@@ -2418,7 +2418,7 @@ DSL_Error_t DSL_DRV_PM_DataPathCountersT
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pDpCounters = DSL_DRV_PM_PTR_DATAPATH_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -3190,7 +3190,7 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pDpCounters = DSL_DRV_PM_PTR_DATAPATH_FAILURE_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -3950,7 +3950,7 @@ DSL_Error_t DSL_DRV_PM_LineSecCountersTo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLineCounters = DSL_DRV_PM_PTR_LINE_SEC_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+@@ -4602,7 +4602,7 @@ DSL_Error_t DSL_DRV_PM_LineInitCountersT
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLinitCounters = DSL_DRV_PM_PTR_LINE_INIT_COUNTERS_TOTAL();
+ 
+@@ -5131,7 +5131,7 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtime
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLfCounters = DSL_DRV_PM_PTR_LINE_EVENT_SHOWTIME_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+@@ -5670,7 +5670,7 @@ DSL_Error_t DSL_DRV_PM_ReTxCountersTotal
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pReTxCounters = DSL_DRV_PM_PTR_RETX_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+--- a/src/pm/drv_dsl_cpe_pm_core.c
++++ b/src/pm/drv_dsl_cpe_pm_core.c
+@@ -61,6 +61,7 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+ {
+    DSL_Error_t nErrCode = DSL_SUCCESS;
+    DSL_uint32_t msecTimeFrame = DSL_PM_COUNTER_POLLING_CYCLE,
++                secTimeFrame = DSL_PM_COUNTER_POLLING_CYCLE/DSL_PM_MSEC,
+                 nCurrMsTime = 0;
+ #ifdef INCLUDE_DSL_CPE_PM_HISTORY
+    DSL_uint32_t nCurrSysTime = 0, nPrevElapsedTime = 0;
+@@ -100,10 +101,13 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+    {
+       /* Get elapsed time [msec] since the last entry*/
+       msecTimeFrame = nCurrMsTime  - DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck;
++
++      /* Get elapsed time [sec] since the last entry*/
++      secTimeFrame = (nCurrMsTime/DSL_PM_MSEC) - (DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck/DSL_PM_MSEC);
+    }
+ 
+    /* Get Total Elapsed Time Since the PM module startup*/
+-   DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime += msecTimeFrame;
++   DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime += secTimeFrame;
+ 
+    /* Set last time check to the current time*/
+    DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck = nCurrMsTime;
+@@ -141,7 +145,7 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+       else
+       {
+          /* Update current showtime elapsed time*/
+-         DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime   += (msecTimeFrame/DSL_PM_MSEC);
++         DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime   += secTimeFrame;
+          DSL_DRV_PM_CONTEXT(pContext)->nElapsedShowtimeTime =
+             DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime;
+       }
diff --git a/package/kernel/lantiq/ltq-vdsl/Makefile b/package/kernel/lantiq/ltq-vdsl/Makefile
index 248615fb59..da924e861e 100644
--- a/package/kernel/lantiq/ltq-vdsl/Makefile
+++ b/package/kernel/lantiq/ltq-vdsl/Makefile
@@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=ltq-vdsl-vr9
 PKG_VERSION:=4.17.18.6
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 
 PKG_BASE_NAME:=drv_dsl_cpe_api
 PKG_SOURCE:=$(PKG_BASE_NAME)_vrx-$(PKG_VERSION).tar.gz
diff --git a/package/kernel/lantiq/ltq-vdsl/patches/200-fix-elapsed-time.patch b/package/kernel/lantiq/ltq-vdsl/patches/200-fix-elapsed-time.patch
new file mode 100644
index 0000000000..3ec85460b2
--- /dev/null
+++ b/package/kernel/lantiq/ltq-vdsl/patches/200-fix-elapsed-time.patch
@@ -0,0 +1,122 @@
+--- a/src/include/drv_dsl_cpe_pm_core.h
++++ b/src/include/drv_dsl_cpe_pm_core.h
+@@ -1552,9 +1552,9 @@ typedef struct
+    DSL_boolean_t bShowtimeProcessingStart;
+    /** Showtime reached flag*/
+    DSL_boolean_t bShowtimeInvTrigger;
+-   /** Current Showtime synchronization time to be used, (msec) */
++   /** Current Showtime synchronization time to be used, (sec) */
+    DSL_uint32_t nCurrShowtimeTime;
+-   /** Showtime synchronization time to be used, (msec) */
++   /** Showtime synchronization time to be used, (sec) */
+    DSL_uint32_t nElapsedShowtimeTime;
+    /** Actual Line state*/
+    DSL_LineStateValue_t nLineState;
+--- a/src/pm/drv_dsl_cpe_api_pm.c
++++ b/src/pm/drv_dsl_cpe_api_pm.c
+@@ -1475,7 +1475,7 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersTo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pChCounters = DSL_DRV_PM_PTR_CHANNEL_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -1535,7 +1535,7 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersEx
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pChCounters = DSL_DRV_PM_PTR_CHANNEL_COUNTERS_TOTAL_EXT(pCounters->nChannel);
+ 
+@@ -2518,7 +2518,7 @@ DSL_Error_t DSL_DRV_PM_DataPathCountersT
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pDpCounters = DSL_DRV_PM_PTR_DATAPATH_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -3352,7 +3352,7 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pDpCounters = DSL_DRV_PM_PTR_DATAPATH_FAILURE_COUNTERS_TOTAL(pCounters->nChannel,pCounters->nDirection);
+ 
+@@ -4130,7 +4130,7 @@ DSL_Error_t DSL_DRV_PM_LineSecCountersTo
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLineCounters = DSL_DRV_PM_PTR_LINE_SEC_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+@@ -4787,7 +4787,7 @@ DSL_Error_t DSL_DRV_PM_LineInitCountersT
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLinitCounters = DSL_DRV_PM_PTR_LINE_INIT_COUNTERS_TOTAL();
+ 
+@@ -5240,7 +5240,7 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtime
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pLfCounters = DSL_DRV_PM_PTR_LINE_EVENT_SHOWTIME_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+@@ -5720,7 +5720,7 @@ DSL_Error_t DSL_DRV_PM_ReTxCountersTotal
+    }
+ 
+    /* Fill Total Counters elapsed time*/
+-   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime/DSL_PM_MSEC;
++   pCounters->total.nElapsedTime = DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime;
+ 
+    pReTxCounters = DSL_DRV_PM_PTR_RETX_COUNTERS_TOTAL(pCounters->nDirection);
+ 
+--- a/src/pm/drv_dsl_cpe_pm_core.c
++++ b/src/pm/drv_dsl_cpe_pm_core.c
+@@ -60,6 +60,7 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+ {
+    DSL_Error_t nErrCode = DSL_SUCCESS;
+    DSL_uint32_t msecTimeFrame = DSL_PM_COUNTER_POLLING_CYCLE,
++                secTimeFrame = DSL_PM_COUNTER_POLLING_CYCLE/DSL_PM_MSEC,
+                 nCurrMsTime = 0;
+ #ifdef INCLUDE_DSL_CPE_PM_HISTORY
+    DSL_uint32_t nCurrSysTime = 0, nPrevElapsedTime = 0;
+@@ -99,10 +100,13 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+    {
+       /* Get elapsed time [msec] since the last entry*/
+       msecTimeFrame = nCurrMsTime  - DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck;
++
++      /* Get elapsed time [sec] since the last entry*/
++      secTimeFrame = (nCurrMsTime/DSL_PM_MSEC) - (DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck/DSL_PM_MSEC);
+    }
+ 
+    /* Get Total Elapsed Time Since the PM module startup*/
+-   DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime += msecTimeFrame;
++   DSL_DRV_PM_CONTEXT(pContext)->nPmTotalElapsedTime += secTimeFrame;
+ 
+    /* Set last time check to the current time*/
+    DSL_DRV_PM_CONTEXT(pContext)->nLastMsTimeCheck = nCurrMsTime;
+@@ -140,7 +144,7 @@ static DSL_Error_t DSL_DRV_PM_SyncTimeUp
+       else
+       {
+          /* Update current showtime elapsed time*/
+-         DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime   += (msecTimeFrame/DSL_PM_MSEC);
++         DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime   += secTimeFrame;
+          DSL_DRV_PM_CONTEXT(pContext)->nElapsedShowtimeTime =
+             DSL_DRV_PM_CONTEXT(pContext)->nCurrShowtimeTime;
+       }




More information about the lede-commits mailing list