diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-06 01:02:38 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-06 01:02:38 +0000 |
commit | 08b74a000942a380fe028845f92cd3a0dee827d5 (patch) | |
tree | aa78b4e12607c3e1fcce8d5cc42df4330792f118 /debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch | |
parent | Adding upstream version 4.19.249. (diff) | |
download | linux-debian/4.19.249-2.tar.xz linux-debian/4.19.249-2.zip |
Adding debian version 4.19.249-2.debian/4.19.249-2debian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch')
-rw-r--r-- | debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch b/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch new file mode 100644 index 000000000..341018e58 --- /dev/null +++ b/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch @@ -0,0 +1,110 @@ +From: Christoph Hellwig <hch@lst.de> +Date: Sun, 11 Aug 2019 10:05:16 +0200 +Subject: usb: add a hcd_uses_dma helper +Origin: https://git.kernel.org/linus/edfbcb321faf07ca970e4191abe061deeb7d3788 + +The USB buffer allocation code is the only place in the usb core (and in +fact the whole kernel) that uses is_device_dma_capable, while the URB +mapping code uses the uses_dma flag in struct usb_bus. Switch the buffer +allocation to use the uses_dma flag used by the rest of the USB code, +and create a helper in hcd.h that checks this flag as well as the +CONFIG_HAS_DMA to simplify the caller a bit. + +Signed-off-by: Christoph Hellwig <hch@lst.de> +Link: https://lore.kernel.org/r/20190811080520.21712-3-hch@lst.de +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/usb/core/buffer.c | 10 +++------- + drivers/usb/core/hcd.c | 4 ++-- + drivers/usb/dwc2/hcd.c | 2 +- + include/linux/usb.h | 2 +- + include/linux/usb/hcd.h | 3 +++ + 5 files changed, 10 insertions(+), 11 deletions(-) + +--- a/drivers/usb/core/buffer.c ++++ b/drivers/usb/core/buffer.c +@@ -66,9 +66,7 @@ + char name[16]; + int i, size; + +- if (hcd->localmem_pool || +- !IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(hcd->self.sysdev)) ++ if (hcd->localmem_pool || !hcd_uses_dma(hcd)) + return 0; + + for (i = 0; i < HCD_BUFFER_POOLS; i++) { +@@ -133,8 +131,7 @@ + return gen_pool_dma_alloc(hcd->localmem_pool, size, dma); + + /* some USB hosts just use PIO */ +- if (!IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(bus->sysdev)) { ++ if (!hcd_uses_dma(hcd)) { + *dma = ~(dma_addr_t) 0; + return kmalloc(size, mem_flags); + } +@@ -164,8 +161,7 @@ + return; + } + +- if (!IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(bus->sysdev)) { ++ if (!hcd_uses_dma(hcd)) { + kfree(addr); + return; + } +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -1511,7 +1511,7 @@ + if (usb_endpoint_xfer_control(&urb->ep->desc)) { + if (hcd->self.uses_pio_for_control) + return ret; +- if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (is_vmalloc_addr(urb->setup_packet)) { + WARN_ONCE(1, "setup packet is not dma capable\n"); + return -EAGAIN; +@@ -1545,7 +1545,7 @@ + dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + if (urb->transfer_buffer_length != 0 + && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) { +- if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (urb->num_sgs) { + int n; + +--- a/drivers/usb/dwc2/hcd.c ++++ b/drivers/usb/dwc2/hcd.c +@@ -4770,7 +4770,7 @@ + + buf = urb->transfer_buffer; + +- if (hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (!buf && (urb->transfer_dma & 3)) { + dev_err(hsotg->dev, + "%s: unaligned transfer with no transfer_buffer", +--- a/include/linux/usb.h ++++ b/include/linux/usb.h +@@ -1455,7 +1455,7 @@ + * field rather than determining a dma address themselves. + * + * Note that transfer_buffer must still be set if the controller +- * does not support DMA (as indicated by bus.uses_dma) and when talking ++ * does not support DMA (as indicated by hcd_uses_dma()) and when talking + * to root hub. If you have to trasfer between highmem zone and the device + * on such controller, create a bounce buffer or bail out with an error. + * If transfer_buffer cannot be set (is in highmem) and the controller is DMA +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -422,6 +422,9 @@ + return hcd->high_prio_bh.completing_ep == ep; + } + ++#define hcd_uses_dma(hcd) \ ++ (IS_ENABLED(CONFIG_HAS_DMA) && (hcd)->self.uses_dma) ++ + extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); + extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, + int status); |