Driver's .submit_control() callback can and will be called with buffer
set to NULL (and length set to 0), so we need to make sure that we
don't try to DMA sync the buffer in that case. Add appropriate gurads
to make sure that doesn't happen.

Signed-off-by: Andrey Smirnov <andrew.smir...@gmail.com>
---
 drivers/usb/host/xhci-hcd.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c
index 91ddcbb30..657a49f8a 100644
--- a/drivers/usb/host/xhci-hcd.c
+++ b/drivers/usb/host/xhci-hcd.c
@@ -1200,10 +1200,12 @@ static int xhci_submit_control(struct usb_device *udev, 
unsigned long pipe,
                        return ret;
        }
 
-       /* Pass ownership of data buffer to device */
-       dma_sync_single_for_device((unsigned long)buffer, length,
-                                  (req->requesttype & USB_DIR_IN) ?
-                                  DMA_FROM_DEVICE : DMA_TO_DEVICE);
+       if (length > 0) {
+               /* Pass ownership of data buffer to device */
+               dma_sync_single_for_device((unsigned long)buffer, length,
+                                          (req->requesttype & USB_DIR_IN) ?
+                                          DMA_FROM_DEVICE : DMA_TO_DEVICE);
+       }
 
        /* Setup TRB */
        memset(&trb, 0, sizeof(union xhci_trb));
@@ -1259,10 +1261,13 @@ static int xhci_submit_control(struct usb_device *udev, 
unsigned long pipe,
        xhci_print_trb(xhci, &trb, "Response Status");
 
 dma_regain:
-       /* Regain ownership of data buffer from device */
-       dma_sync_single_for_cpu((unsigned long)buffer, length,
-                               (req->requesttype & USB_DIR_IN) ?
-                               DMA_FROM_DEVICE : DMA_TO_DEVICE);
+       if (length > 0) {
+               /* Regain ownership of data buffer from device */
+               dma_sync_single_for_cpu((unsigned long)buffer, length,
+                                       (req->requesttype & USB_DIR_IN) ?
+                                       DMA_FROM_DEVICE : DMA_TO_DEVICE);
+       }
+
        if (ret < 0)
                return ret;
 
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to