]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.33/staging-vt6655-fix-interrupt-race-condition-on-device-start-up.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.19.33 / staging-vt6655-fix-interrupt-race-condition-on-device-start-up.patch
1 From 3b9c2f2e0e99bb67c96abcb659b3465efe3bee1f Mon Sep 17 00:00:00 2001
2 From: Malcolm Priestley <tvboxspy@gmail.com>
3 Date: Sun, 24 Mar 2019 18:53:49 +0000
4 Subject: staging: vt6655: Fix interrupt race condition on device start up.
5
6 From: Malcolm Priestley <tvboxspy@gmail.com>
7
8 commit 3b9c2f2e0e99bb67c96abcb659b3465efe3bee1f upstream.
9
10 It appears on some slower systems that the driver can find its way
11 out of the workqueue while the interrupt is disabled by continuous polling
12 by it.
13
14 Move MACvIntEnable to vnt_interrupt_work so that it is always enabled
15 on all routes out of vnt_interrupt_process.
16
17 Move MACvIntDisable so that the device doesn't keep polling the system
18 while the workqueue is being processed.
19
20 Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
21 CC: stable@vger.kernel.org # v4.2+
22 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23
24 ---
25 drivers/staging/vt6655/device_main.c | 8 ++++----
26 1 file changed, 4 insertions(+), 4 deletions(-)
27
28 --- a/drivers/staging/vt6655/device_main.c
29 +++ b/drivers/staging/vt6655/device_main.c
30 @@ -1040,8 +1040,6 @@ static void vnt_interrupt_process(struct
31 return;
32 }
33
34 - MACvIntDisable(priv->PortOffset);
35 -
36 spin_lock_irqsave(&priv->lock, flags);
37
38 /* Read low level stats */
39 @@ -1129,8 +1127,6 @@ static void vnt_interrupt_process(struct
40 }
41
42 spin_unlock_irqrestore(&priv->lock, flags);
43 -
44 - MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
45 }
46
47 static void vnt_interrupt_work(struct work_struct *work)
48 @@ -1140,6 +1136,8 @@ static void vnt_interrupt_work(struct wo
49
50 if (priv->vif)
51 vnt_interrupt_process(priv);
52 +
53 + MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
54 }
55
56 static irqreturn_t vnt_interrupt(int irq, void *arg)
57 @@ -1148,6 +1146,8 @@ static irqreturn_t vnt_interrupt(int irq
58
59 schedule_work(&priv->interrupt_work);
60
61 + MACvIntDisable(priv->PortOffset);
62 +
63 return IRQ_HANDLED;
64 }
65