Blob Blame History Raw
From 12b94da411f9c6d950beb067d913024fd5617a61 Mon Sep 17 00:00:00 2001
From: Cristian Birsan <cristian.birsan@microchip.com>
Date: Fri, 10 Apr 2020 15:14:52 +0300
Subject: [PATCH] usb: gadget: udc: atmel: Fix vbus disconnect handling
Git-commit: 12b94da411f9c6d950beb067d913024fd5617a61
References: git-fixes
Patch-mainline: v5.7-rc3

A DMA transfer can be in progress while vbus is lost due to a cable
disconnect. For endpoints that use DMA, this condition can lead to
peripheral hang. The patch ensures that endpoints are disabled before
the clocks are stopped to prevent this issue.

Fixes: a64ef71ddc13 ("usb: gadget: atmel_usba_udc: condition clocks to vbus state")
Signed-off-by: Cristian Birsan <cristian.birsan@microchip.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/usb/gadget/udc/atmel_usba_udc.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -1952,10 +1952,10 @@ static irqreturn_t usba_vbus_irq_thread(
 		if (vbus) {
 			usba_start(udc);
 		} else {
-			usba_stop(udc);
-
 			if (udc->driver->disconnect)
 				udc->driver->disconnect(&udc->gadget);
+
+			usba_stop(udc);
 		}
 		udc->vbus_prev = vbus;
 	}