aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/lantiq/ltq-vdsl-mei/patches/200-interrupt-lock.patch
blob: a677ccec554e96c287b27b84804308d1c541c59d (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
--- a/src/drv_mei_cpe_common.c
+++ b/src/drv_mei_cpe_common.c
@@ -104,6 +104,8 @@ IFX_uint32_t MEI_FsmStateSetMsgPreAction
 MEI_DEVCFG_DATA_T MEI_DevCfgData;
 #endif
 
+static DEFINE_SPINLOCK(MEI_InterruptLock);
+
 /* ============================================================================
    Proc-FS and debug variable definitions
    ========================================================================= */
@@ -2134,6 +2136,9 @@ IFX_int32_t MEI_ProcessIntPerIrq(MEIX_CN
 #if (MEI_SUPPORT_DEBUG_STREAMS == 1)
    IFX_int_t   extraDbgStreamLoop = 0;
 #endif
+   unsigned long flags;
+
+   spin_lock_irqsave(&MEI_InterruptLock, flags);
 
    /* get the actual chip device from the list and step through the VRX devices */
    while(pNextXCntrl)
@@ -2167,6 +2172,8 @@ IFX_int32_t MEI_ProcessIntPerIrq(MEIX_CN
    }
 #endif
 
+   spin_unlock_irqrestore(&MEI_InterruptLock, flags);
+
    return meiIntCnt;
 }
 
@@ -2639,9 +2646,14 @@ IFX_int32_t MEI_MsgSendPreAction(
 */
 IFX_void_t MEI_DisableDeviceInt(MEI_DEV_T *pMeiDev)
 {
+   unsigned long flags;
+   spin_lock_irqsave(&MEI_InterruptLock, flags);
+
    MEI_MaskInterrupts( &pMeiDev->meiDrvCntrl,
                        ME_ARC2ME_INTERRUPT_MASK_ALL);
 
+   spin_unlock_irqrestore(&MEI_InterruptLock, flags);
+
    return;
 }