staging: vt6655: Fix interrupt race condition on device start up.
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>
This commit is contained in:
parent
6a8ca24590
commit
3b9c2f2e0e
|
@ -1033,8 +1033,6 @@ static void vnt_interrupt_process(struct vnt_private *priv)
|
|||
return;
|
||||
}
|
||||
|
||||
MACvIntDisable(priv->PortOffset);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* Read low level stats */
|
||||
|
@ -1122,8 +1120,6 @@ static void vnt_interrupt_process(struct vnt_private *priv)
|
|||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
|
||||
}
|
||||
|
||||
static void vnt_interrupt_work(struct work_struct *work)
|
||||
|
@ -1133,6 +1129,8 @@ static void vnt_interrupt_work(struct work_struct *work)
|
|||
|
||||
if (priv->vif)
|
||||
vnt_interrupt_process(priv);
|
||||
|
||||
MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
|
||||
}
|
||||
|
||||
static irqreturn_t vnt_interrupt(int irq, void *arg)
|
||||
|
@ -1142,6 +1140,8 @@ static irqreturn_t vnt_interrupt(int irq, void *arg)
|
|||
if (priv->vif)
|
||||
schedule_work(&priv->interrupt_work);
|
||||
|
||||
MACvIntDisable(priv->PortOffset);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue