| From 3b9c2f2e0e99bb67c96abcb659b3465efe3bee1f Mon Sep 17 00:00:00 2001 |
| From: Malcolm Priestley <tvboxspy@gmail.com> |
| Date: Sun, 24 Mar 2019 18:53:49 +0000 |
| Subject: staging: vt6655: Fix interrupt race condition on device start up. |
| |
| From: Malcolm Priestley <tvboxspy@gmail.com> |
| |
| commit 3b9c2f2e0e99bb67c96abcb659b3465efe3bee1f upstream. |
| |
| It appears on some slower systems that the driver can find its way |
| out of the workqueue while the interrupt is disabled by continuous polling |
| by it. |
| |
| Move MACvIntEnable to vnt_interrupt_work so that it is always enabled |
| on all routes out of vnt_interrupt_process. |
| |
| Move MACvIntDisable so that the device doesn't keep polling the system |
| while the workqueue is being processed. |
| |
| Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> |
| CC: stable@vger.kernel.org # v4.2+ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/staging/vt6655/device_main.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/staging/vt6655/device_main.c |
| +++ b/drivers/staging/vt6655/device_main.c |
| @@ -973,8 +973,6 @@ static void vnt_interrupt_process(struct |
| return; |
| } |
| |
| - MACvIntDisable(priv->PortOffset); |
| - |
| spin_lock_irqsave(&priv->lock, flags); |
| |
| /* Read low level stats */ |
| @@ -1062,8 +1060,6 @@ static void vnt_interrupt_process(struct |
| } |
| |
| spin_unlock_irqrestore(&priv->lock, flags); |
| - |
| - MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE); |
| } |
| |
| static void vnt_interrupt_work(struct work_struct *work) |
| @@ -1073,6 +1069,8 @@ static void vnt_interrupt_work(struct wo |
| |
| if (priv->vif) |
| vnt_interrupt_process(priv); |
| + |
| + MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE); |
| } |
| |
| static irqreturn_t vnt_interrupt(int irq, void *arg) |
| @@ -1081,6 +1079,8 @@ static irqreturn_t vnt_interrupt(int irq |
| |
| schedule_work(&priv->interrupt_work); |
| |
| + MACvIntDisable(priv->PortOffset); |
| + |
| return IRQ_HANDLED; |
| } |
| |