aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/lantiq/ltq-adsl/patches/202-g997_danube-dynamically-allocate-hlogdata.patch
blob: c3b1047a2ab427db43cc6c9b97c3e680ec021ee8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
--- a/src/g997/drv_dsl_cpe_api_g997_danube.c
+++ b/src/g997/drv_dsl_cpe_api_g997_danube.c
@@ -1984,41 +1984,53 @@ DSL_Error_t DSL_DRV_DEV_G997_DeltHlogGet(
       {
          if (nDirection == DSL_DOWNSTREAM)
          {
-            DSL_G997_DeltHlogData_t HlogData;
+            DSL_G997_DeltHlogData_t *HlogData;
 
-            memset(&HlogData, 0x0, sizeof(DSL_G997_DeltHlogData_t));
+            HlogData = kzalloc(sizeof(*HlogData), GFP_KERNEL);
+            if (!HlogData)
+            {
+               DSL_DEBUG(DSL_DBG_ERR,
+                  (pContext, "DSL[%02d]: ERROR - Alloc HlogData failed!"DSL_DRV_CRLF,
+                  DSL_DEV_NUM(pContext)));
+               return DSL_ERR_MEMORY;
+            }
+
+            memset(HlogData, 0x0, sizeof(DSL_G997_DeltHlogData_t));
 
             /* Get SHOWTIME Hlog values*/
             nErrCode = DSL_DRV_DANUBE_G997_DeltHlogGet(
-                          pContext, nDirection, &HlogData);
+                          pContext, nDirection, HlogData);
             if (nErrCode != DSL_SUCCESS)
             {
                DSL_DEBUG(DSL_DBG_ERR,
                   (pContext, "DSL[%02d]: ERROR - Showtime Hlog get failed!"DSL_DRV_CRLF,
                   DSL_DEV_NUM(pContext)));
+               kfree(HlogData);
                return nErrCode;
             }
 
             /* if actual group size != 1, values should be spread */
-            if (HlogData.nGroupSize != 1)
+            if (HlogData->nGroupSize != 1)
             {
                nErrCode = DSL_DRV_DANUBE_G997_DeltValuesSpread(
-                             0x1, HlogData.nGroupSize, HlogData.deltHlog.nNumData,
-                             HlogData.deltHlog.nNSCData, pData->deltHlog.nNSCData);
+                             0x1, HlogData->nGroupSize, HlogData->deltHlog.nNumData,
+                             HlogData->deltHlog.nNSCData, pData->deltHlog.nNSCData);
 
                if (nErrCode == DSL_SUCCESS)
                {
                   pData->deltHlog.nNumData = 
-                     (DSL_uint16_t)(HlogData.deltHlog.nNumData * HlogData.nGroupSize);
+                     (DSL_uint16_t)(HlogData->deltHlog.nNumData * HlogData->nGroupSize);
                   pData->nGroupSize        = 1;
-                  pData->nMeasurementTime  = HlogData.nMeasurementTime;
+                  pData->nMeasurementTime  = HlogData->nMeasurementTime;
                }
             }
             else
             {
                /* No spread needed, copy data*/
-               memcpy(pData, &HlogData, sizeof(DSL_G997_DeltHlogData_t));
+               memcpy(pData, HlogData, sizeof(DSL_G997_DeltHlogData_t));
             }
+
+            kfree(HlogData);
          }
          else
          {