| From 07235ccf98c81d45762db74acf9f9d77c3861766 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 17 Jun 2021 18:03:53 +0300 |
| Subject: xhci: handle failed buffer copy to URB sg list and fix a W=1 copiler |
| warning |
| |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| |
| [ Upstream commit 271a21d8b280b186f8cc9ca6f7151902efde9512 ] |
| |
| Set the urb->actual_length to bytes successfully copied in case all bytes |
| weren't copied from a temporary buffer to the URB sg list. |
| Also print a debug message |
| |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Link: https://lore.kernel.org/r/20210617150354.1512157-4-mathias.nyman@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/host/xhci.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
| index 0d2f1c37ab74..73cdaa3f3067 100644 |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -1362,12 +1362,17 @@ static void xhci_unmap_temp_buf(struct usb_hcd *hcd, struct urb *urb) |
| urb->transfer_buffer_length, |
| dir); |
| |
| - if (usb_urb_dir_in(urb)) |
| + if (usb_urb_dir_in(urb)) { |
| len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs, |
| urb->transfer_buffer, |
| buf_len, |
| 0); |
| - |
| + if (len != buf_len) { |
| + xhci_dbg(hcd_to_xhci(hcd), |
| + "Copy from tmp buf to urb sg list failed\n"); |
| + urb->actual_length = len; |
| + } |
| + } |
| urb->transfer_flags &= ~URB_DMA_MAP_SINGLE; |
| kfree(urb->transfer_buffer); |
| urb->transfer_buffer = NULL; |
| -- |
| 2.30.2 |
| |