usb: core: Allow compilation on platforms where NO_DMA=y
authorGeert Uytterhoeven <geert@linux-m68k.org>
Tue, 16 Feb 2016 15:10:57 +0000 (16:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 21 Feb 2016 04:22:55 +0000 (20:22 -0800)
Some platforms don't have DMA, but we should still be able to build USB
drivers for these platforms. They could still be used through vhci_hcd,
usbip_host, or maybe something like USB passthrough in UML from a
capable host.

If NO_DMA=y:

    ERROR: "dma_pool_destroy" [drivers/usb/core/usbcore.ko] undefined!
    ERROR: "bad_dma_ops" [drivers/usb/core/usbcore.ko] undefined!
    ERROR: "dma_pool_free" [drivers/usb/core/usbcore.ko] undefined!
    ERROR: "dma_pool_alloc" [drivers/usb/core/usbcore.ko] undefined!
    ERROR: "dma_pool_create" [drivers/usb/core/usbcore.ko] undefined!

Add a few checks for CONFIG_HAS_DMA to fix this.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/buffer.c
drivers/usb/core/hcd.c

index 89f2e77..2741566 100644 (file)
@@ -62,8 +62,9 @@ int hcd_buffer_create(struct usb_hcd *hcd)
        char            name[16];
        int             i, size;
 
-       if (!hcd->self.controller->dma_mask &&
-           !(hcd->driver->flags & HCD_LOCAL_MEM))
+       if (!IS_ENABLED(CONFIG_HAS_DMA) ||
+           (!hcd->self.controller->dma_mask &&
+            !(hcd->driver->flags & HCD_LOCAL_MEM)))
                return 0;
 
        for (i = 0; i < HCD_BUFFER_POOLS; i++) {
@@ -93,6 +94,9 @@ void hcd_buffer_destroy(struct usb_hcd *hcd)
 {
        int i;
 
+       if (!IS_ENABLED(CONFIG_HAS_DMA))
+               return;
+
        for (i = 0; i < HCD_BUFFER_POOLS; i++) {
                struct dma_pool *pool = hcd->pool[i];
 
@@ -119,8 +123,9 @@ void *hcd_buffer_alloc(
        int                     i;
 
        /* some USB hosts just use PIO */
-       if (!bus->controller->dma_mask &&
-           !(hcd->driver->flags & HCD_LOCAL_MEM)) {
+       if (!IS_ENABLED(CONFIG_HAS_DMA) ||
+           (!bus->controller->dma_mask &&
+            !(hcd->driver->flags & HCD_LOCAL_MEM))) {
                *dma = ~(dma_addr_t) 0;
                return kmalloc(size, mem_flags);
        }
@@ -145,8 +150,9 @@ void hcd_buffer_free(
        if (!addr)
                return;
 
-       if (!bus->controller->dma_mask &&
-           !(hcd->driver->flags & HCD_LOCAL_MEM)) {
+       if (!IS_ENABLED(CONFIG_HAS_DMA) ||
+           (!bus->controller->dma_mask &&
+            !(hcd->driver->flags & HCD_LOCAL_MEM))) {
                kfree(addr);
                return;
        }
index 0b8a910..2ca2cef 100644 (file)
@@ -1428,7 +1428,8 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,
 
 void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)
 {
-       if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)
+       if (IS_ENABLED(CONFIG_HAS_DMA) &&
+           (urb->transfer_flags & URB_SETUP_MAP_SINGLE))
                dma_unmap_single(hcd->self.controller,
                                urb->setup_dma,
                                sizeof(struct usb_ctrlrequest),
@@ -1460,17 +1461,20 @@ void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
        usb_hcd_unmap_urb_setup_for_dma(hcd, urb);
 
        dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
-       if (urb->transfer_flags & URB_DMA_MAP_SG)
+       if (IS_ENABLED(CONFIG_HAS_DMA) &&
+           (urb->transfer_flags & URB_DMA_MAP_SG))
                dma_unmap_sg(hcd->self.controller,
                                urb->sg,
                                urb->num_sgs,
                                dir);
-       else if (urb->transfer_flags & URB_DMA_MAP_PAGE)
+       else if (IS_ENABLED(CONFIG_HAS_DMA) &&
+                (urb->transfer_flags & URB_DMA_MAP_PAGE))
                dma_unmap_page(hcd->self.controller,
                                urb->transfer_dma,
                                urb->transfer_buffer_length,
                                dir);
-       else if (urb->transfer_flags & URB_DMA_MAP_SINGLE)
+       else if (IS_ENABLED(CONFIG_HAS_DMA) &&
+                (urb->transfer_flags & URB_DMA_MAP_SINGLE))
                dma_unmap_single(hcd->self.controller,
                                urb->transfer_dma,
                                urb->transfer_buffer_length,
@@ -1512,7 +1516,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
        if (usb_endpoint_xfer_control(&urb->ep->desc)) {
                if (hcd->self.uses_pio_for_control)
                        return ret;
-               if (hcd->self.uses_dma) {
+               if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) {
                        urb->setup_dma = dma_map_single(
                                        hcd->self.controller,
                                        urb->setup_packet,
@@ -1538,7 +1542,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
        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 (hcd->self.uses_dma) {
+               if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) {
                        if (urb->num_sgs) {
                                int n;