ltq-vdsl: fix PM thread suspend and resume handling
[openwrt/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;