ltq-vdsl: fix PM thread suspend and resume handling
[oweals/openwrt.git] / package / kernel / lantiq / ltq-vdsl / patches / 110-semaphore-lock.patch
1 --- a/src/include/drv_dsl_cpe_pm_core.h
2 +++ b/src/include/drv_dsl_cpe_pm_core.h
3 @@ -1510,9 +1510,9 @@ typedef struct
4     /** Common PM module mutex*/
5     DSL_DRV_Mutex_t pmMutex;
6     /** PM module direction Near-End mutex*/
7 -   DSL_DRV_Mutex_t pmNeMutex;
8 +   struct semaphore pmNeMutex;
9     /** PM module direction Far-End mutex*/
10 -   DSL_DRV_Mutex_t pmFeMutex;
11 +   struct semaphore pmFeMutex;
12     /** PM module Near-End access mutex*/
13     DSL_DRV_Mutex_t pmNeAccessMutex;
14     /** PM module Far-End access mutex*/
15 --- a/src/pm/drv_dsl_cpe_api_pm.c
16 +++ b/src/pm/drv_dsl_cpe_api_pm.c
17 @@ -220,9 +220,9 @@ DSL_Error_t DSL_DRV_PM_Start(
18     /* init PM module common mutex */
19     DSL_DRV_MUTEX_INIT(DSL_DRV_PM_CONTEXT(pContext)->pmMutex);
20     /* init PM module direction Near-End mutex */
21 -   DSL_DRV_MUTEX_INIT(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex);
22 +   sema_init(&(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex),1);
23     /* init PM module direction Far-End mutex */
24 -   DSL_DRV_MUTEX_INIT(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex);
25 +   sema_init(&(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex),1);
26     /* init PM module Near-End access mutex */
27     DSL_DRV_MUTEX_INIT(DSL_DRV_PM_CONTEXT(pContext)->pmNeAccessMutex);
28     /* init PM module Far-End access mutex */
29 @@ -592,7 +592,7 @@ DSL_Error_t DSL_DRV_PM_Stop(
30     if( DSL_DRV_PM_CONTEXT(pContext)->pmThreadFe.bRun != DSL_TRUE )
31     {
32        DSL_DEBUG(DSL_DBG_WRN,
33 -         (pContext, SYS_DBG_WRN"DSL[%02d]: PM module Near-End thread already stopped"
34 +         (pContext, SYS_DBG_WRN"DSL[%02d]: PM module Far-End thread already stopped"
35           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
36     }
37     else
38 --- a/src/pm/drv_dsl_cpe_pm_core.c
39 +++ b/src/pm/drv_dsl_cpe_pm_core.c
40 @@ -1022,7 +1022,7 @@ DSL_Error_t DSL_DRV_PM_DirectionMutexCon
41     {
42        if( bLock )
43        {
44 -         if( DSL_DRV_MUTEX_LOCK(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex) )
45 +         if(down_interruptible(&(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex)))
46           {
47              DSL_DEBUG( DSL_DBG_ERR,
48                 (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock PM NE mutex!"
49 @@ -1034,14 +1034,14 @@ DSL_Error_t DSL_DRV_PM_DirectionMutexCon
50        else
51        {
52            /* Unlock PM module NE Mutex*/
53 -          DSL_DRV_MUTEX_UNLOCK(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex);
54 +          up(&(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex));
55        }
56     }
57     else
58     {
59        if( bLock )
60        {
61 -         if( DSL_DRV_MUTEX_LOCK(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex) )
62 +         if(down_interruptible(&(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex)))
63           {
64              DSL_DEBUG( DSL_DBG_ERR,
65                 (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock PM FE mutex!"
66 @@ -1053,7 +1053,7 @@ DSL_Error_t DSL_DRV_PM_DirectionMutexCon
67        else
68        {
69           /* Unlock PM module FE Mutex*/
70 -         DSL_DRV_MUTEX_UNLOCK(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex);
71 +         up(&(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex));
72        }
73     }
74  
75 @@ -1139,7 +1139,7 @@ DSL_Error_t DSL_DRV_PM_Lock(DSL_Context_
76     if( !(DSL_DRV_PM_CONTEXT(pContext)->bPmLock) )
77     {
78        /* Lock PM module Near-End Mutex*/
79 -      if( DSL_DRV_MUTEX_LOCK(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex) )
80 +      if(down_interruptible(&(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex)))
81        {
82           DSL_DEBUG( DSL_DBG_ERR,
83              (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock PM NE mutex!"
84 @@ -1148,8 +1148,8 @@ DSL_Error_t DSL_DRV_PM_Lock(DSL_Context_
85           return DSL_ERR_SEMAPHORE_GET;
86        }
87  
88 -      /* Lock PM module Near-End Mutex*/
89 -      if( DSL_DRV_MUTEX_LOCK(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex) )
90 +      /* Lock PM module Far-End Mutex*/
91 +      if( down_interruptible(&(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex)) )
92        {
93           DSL_DEBUG( DSL_DBG_ERR,
94              (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock PM FE mutex!"
95 @@ -1193,10 +1193,10 @@ DSL_Error_t DSL_DRV_PM_UnLock(DSL_Contex
96     if( DSL_DRV_PM_CONTEXT(pContext)->bPmLock )
97     {
98        /* Unlock PM module NE Mutex*/
99 -      DSL_DRV_MUTEX_UNLOCK(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex);
100 +      up(&(DSL_DRV_PM_CONTEXT(pContext)->pmNeMutex));
101  
102        /* Unlock PM module FE Mutex*/
103 -      DSL_DRV_MUTEX_UNLOCK(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex);
104 +      up(&(DSL_DRV_PM_CONTEXT(pContext)->pmFeMutex));
105  
106        /* Clear bPmLock flag*/
107        DSL_DRV_PM_CONTEXT(pContext)->bPmLock = DSL_FALSE;