diff options
Diffstat (limited to 'drivers/usb/cdns3/cdnsp-ring.c')
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-ring.c | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index 1b1438457fb0..e45c3d6e1536 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -1029,6 +1029,8 @@ static void cdnsp_process_ctrl_td(struct cdnsp_device *pdev,  		return;  	} +	*status = 0; +  	cdnsp_finish_td(pdev, td, event, pep, status);  } @@ -1523,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;  	} |