FAILED: patch "[PATCH] xhci: Fix immediate data transfer if buffer is already DMA" failed to apply to 5.2-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 13b82b746310b51b064bc855993a1c84bf862726 Mon Sep 17 00:00:00 2001
From: Mathias Nyman <[email protected]>
Date: Wed, 22 May 2019 14:34:00 +0300
Subject: [PATCH] xhci: Fix immediate data transfer if buffer is already DMA
mapped
xhci immediate data transfer (IDT) support in 5.2-rc1 caused regression on various Samsung Exynos boards with ASIX USB 2.0 ethernet dongle.
If the transfer buffer in the URB is already DMA mapped then IDT should not be used. urb->transfer_dma will already contain a valid dma address, and there is no guarantee the data in urb->transfer_buffer is valid.
The IDT support patch used urb->transfer_dma as a temporary storage, copying data from urb->transfer_buffer into it.
Issue was solved by preventing IDT if transfer buffer is already dma mapped, and by not using urb->transfer_dma as temporary storage.
drivers/usb/host/xhci-ring.c +6 -3
@@ -3432,11 +3432,14 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,if (urb->transfer_buffer_length >0 ) {u32 length_field, remainder; +u64 addr;if (xhci_urb_suitable_for_idt (urb)) { -memcpy (&urb->transfer_dma, urb->transfer_buffer, +memcpy (&addr, urb->transfer_buffer, urb->transfer_buffer_length); field |=TRB_IDT ; + }else { + addr = (u64 ) urb->transfer_dma; } remainder = xhci_td_remainder(xhci, 0,
@@ -3449,8 +3452,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,if (setup->bRequestType &USB_DIR_IN ) field |=TRB_DIR_IN ;queue_trb (xhci, ep_ring, true, -lower_32_bits (urb->transfer_dma), -upper_32_bits (urb->transfer_dma), +lower_32_bits (addr), +upper_32_bits (addr), length_field, field | ep_ring->cycle_state); }
drivers/usb/host/xhci.h +2 -1
@@ -2160,7 +2160,8 @@ static inline bool xhci_urb_suitable_for_idt(struct urb *urb) {if (!usb_endpoint_xfer_isoc (&urb->ep->desc) &&usb_urb_dir_out (urb) &&usb_endpoint_maxp (&urb->ep->desc) >=TRB_IDT_MAX_SIZE && - urb->transfer_buffer_length <=TRB_IDT_MAX_SIZE ) + urb->transfer_buffer_length <=TRB_IDT_MAX_SIZE && + !(urb->transfer_flags &URB_NO_TRANSFER_DMA_MAP ))return true;return false;
Quoted 9 lines · On Wed, 2019-07-24 at 17:43 +0200, [email protected] wrote:
The patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
For the record, just so it doesn't get lost, it is indeed needed. I'll take care of it as long as Matthias doesn't prefer to do it himself.
Quoted 77 lines
------------------ original commit in Linus's tree ------------------
From
13b82b746310b51b064bc855993a1c84bf862726Mon Sep 17 00:00:00 2001
From: Mathias Nyman <[email protected]>
Date: Wed, 22 May 2019 14:34:00 +0300
Subject: [PATCH] xhci: Fix immediate data transfer if buffer is already DMA
mappedxhci immediate data transfer (IDT) support in 5.2-rc1 caused regression on various Samsung Exynos boards with ASIX USB 2.0 ethernet dongle.
If the transfer buffer in the URB is already DMA mapped then IDT should not be used.
urb->transfer_dmawill already contain a valid dma address, and there is no guarantee the data inurb->transfer_bufferis valid.The IDT support patch used
urb->transfer_dmaas a temporary storage, copying data fromurb->transfer_bufferinto it.Issue was solved by preventing IDT if transfer buffer is already dma mapped, and by not using
urb->transfer_dmaas temporary storage.Fixes 33e39350ebd2 ("usb: xhci: add Immediate Data Transfer support")Reported-by Marek Szyprowski <[email protected]>Tested-by Marek Szyprowski <[email protected]>CC Nicolas Saenz Julienne <[email protected]>Signed-off-by Mathias Nyman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>drivers/usb/host/xhci-ring.c +4
-1@@ -3432,11 +3432,14 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, if (urb->transfer_buffer_length > 0) {u32 length_field, remainder; +u64 addr;if (xhci_urb_suitable_for_idt (urb)) { -memcpy (&urb->transfer_dma, urb->transfer_buffer, +memcpy (&addr, urb->transfer_buffer, urb->transfer_buffer_length); field |=TRB_IDT ; + }else { + addr = (u64 ) urb->transfer_dma; }drivers/usb/host/xhci-ring.c +2
-2remainder = xhci_td_remainder(xhci, 0,@@ -3449,8 +3452,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, if (setup->bRequestType & USB_DIR_IN) field |= TRB_DIR_IN;queue_trb (xhci, ep_ring, true, -lower_32_bits (urb->transfer_dma), -upper_32_bits (urb->transfer_dma), +lower_32_bits (addr), +upper_32_bits (addr), length_field, field | ep_ring->cycle_state);drivers/usb/host/xhci-ring.c +0
-0}drivers/usb/host/xhci.h +2
-1@@ -2160,7 +2160,8 @@ static inline bool xhci_urb_suitable_for_idt(struct urb *urb) {if (!usb_endpoint_xfer_isoc (&urb->ep->desc) &&usb_urb_dir_out (urb) &&usb_endpoint_maxp (&urb->ep->desc) >=TRB_IDT_MAX_SIZE && - urb->transfer_buffer_length <=TRB_IDT_MAX_SIZE ) + urb->transfer_buffer_length <=TRB_IDT_MAX_SIZE && + !(urb->transfer_flags &URB_NO_TRANSFER_DMA_MAP ))return true;return false;
Greg KH
maintainerQuoted 31 lines · On Wed, Jul 24, 2019 at 05:43:47PM +0200, [email protected] wrote:
The patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
13b82b746310b51b064bc855993a1c84bf862726Mon Sep 17 00:00:00 2001From: Mathias Nyman <[email protected]>
Date: Wed, 22 May 2019 14:34:00 +0300
Subject: [PATCH] xhci: Fix immediate data transfer if buffer is already DMA
mappedxhci immediate data transfer (IDT) support in 5.2-rc1 caused regression on various Samsung Exynos boards with ASIX USB 2.0 ethernet dongle.
If the transfer buffer in the URB is already DMA mapped then IDT should not be used.
urb->transfer_dmawill already contain a valid dma address, and there is no guarantee the data inurb->transfer_bufferis valid.The IDT support patch used
urb->transfer_dmaas a temporary storage, copying data fromurb->transfer_bufferinto it.Issue was solved by preventing IDT if transfer buffer is already dma mapped, and by not using
urb->transfer_dmaas temporary storage.
Quoted 6 lines
Fixes 33e39350ebd2 ("usb: xhci: add Immediate Data Transfer support")Reported-by Marek Szyprowski <[email protected]>Tested-by Marek Szyprowski <[email protected]>CC Nicolas Saenz Julienne <[email protected]>Signed-off-by Mathias Nyman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
Oh nevermind, this should be a 5.2-only thing.
it shouldn't affect anyone, sorry for the noise.
greg k-h
Quoted 31 lines · Greg KH
Quoted 30 lines · On Wed, Jul 24, 2019 at 05:43:47PM +0200, [email protected] wrote:
The patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
13b82b746310b51b064bc855993a1c84bf862726Mon Sep 17 00:00:00 2001From: Mathias Nyman <[email protected]>
Date: Wed, 22 May 2019 14:34:00 +0300
Subject: [PATCH] xhci: Fix immediate data transfer if buffer is already DMA
mappedxhci immediate data transfer (IDT) support in 5.2-rc1 caused regression on various Samsung Exynos boards with ASIX USB 2.0 ethernet dongle.
If the transfer buffer in the URB is already DMA mapped then IDT should not be used.
urb->transfer_dmawill already contain a valid dma address, and there is no guarantee the data inurb->transfer_bufferis valid.The IDT support patch used
urb->transfer_dmaas a temporary storage, copying data fromurb->transfer_bufferinto it.Issue was solved by preventing IDT if transfer buffer is already dma mapped, and by not using
urb->transfer_dmaas temporary storage.
Quoted 8 lines
Quoted 6 lines
Fixes 33e39350ebd2 ("usb: xhci: add Immediate Data Transfer support")Reported-by Marek Szyprowski <[email protected]>Tested-by Marek Szyprowski <[email protected]>CC Nicolas Saenz Julienne <[email protected]>Signed-off-by Mathias Nyman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Oh nevermind, this should be a 5.2-only thing.
You're right, I reacted too fast.
Regards,
Nicolas