Message ID | 20211210112945.660-1-pawell@gli-login.cadence.com |
---|---|
State | New |
Headers | show |
Series | usb: cdnsp: Fix incorrect calling of cdnsp_died function | expand |
On 21-12-10 12:29:45, Pawel Laszczak wrote: > From: Pawel Laszczak <pawell@cadence.com> > > Patch restrict calling of cdnsp_died function during removing modules > or software disconnect. > This function was called because after transition controller to HALT > state the driver starts handling the deferred interrupt. > In this case such interrupt can be simple ignored. > > Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") > cc: <stable@vger.kernel.org> > Signed-off-by: Pawel Laszczak <pawell@cadence.com> > --- > drivers/usb/cdns3/cdnsp-ring.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c > index e8f5ecbb5c75..e45c3d6e1536 100644 > --- a/drivers/usb/cdns3/cdnsp-ring.c > +++ b/drivers/usb/cdns3/cdnsp-ring.c > @@ -1525,7 +1525,14 @@ irqreturn_t cdnsp_thread_irq_handler(int irq, void *data) > spin_lock_irqsave(&pdev->lock, flags); > > if (pdev->cdnsp_state & (CDNSP_STATE_HALTED | CDNSP_STATE_DYING)) { > - cdnsp_died(pdev); > + /* > + * While removing or stopping driver there may still be deferred > + * not handled interrupt which should not be treated as error. > + * Driver should simply ignore it. > + */ > + if (pdev->gadget_driver) > + cdnsp_died(pdev); > + Reviewed-by: Peter Chen <peter.chen@kernel.org>
diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index e8f5ecbb5c75..e45c3d6e1536 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -1525,7 +1525,14 @@ irqreturn_t cdnsp_thread_irq_handler(int irq, void *data) spin_lock_irqsave(&pdev->lock, flags); if (pdev->cdnsp_state & (CDNSP_STATE_HALTED | CDNSP_STATE_DYING)) { - cdnsp_died(pdev); + /* + * While removing or stopping driver there may still be deferred + * not handled interrupt which should not be treated as error. + * Driver should simply ignore it. + */ + if (pdev->gadget_driver) + cdnsp_died(pdev); + spin_unlock_irqrestore(&pdev->lock, flags); return IRQ_HANDLED; }