2013-07-11 13:54:17

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 1/6] usb: dwc3: USB_DWC3 should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `dwc3_free_one_event_buffer':
drivers/usb/dwc3/core.c:132: undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `dwc3_alloc_one_event_buffer':
drivers/usb/dwc3/core.c:154: undefined reference to `dma_alloc_coherent'
drivers/built-in.o: In function `dma_set_coherent_mask':
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
drivers/built-in.o: In function `dwc3_free_trb_pool':
drivers/usb/dwc3/gadget.c:407: undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `dwc3_gadget_exit':
drivers/usb/dwc3/gadget.c:2693: undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `dwc3_alloc_trb_pool':
drivers/usb/dwc3/gadget.c:391: undefined reference to `dma_alloc_coherent'
drivers/built-in.o: In function `dwc3_gadget_init':
drivers/usb/dwc3/gadget.c:2598: undefined reference to `dma_alloc_coherent'
drivers/usb/dwc3/gadget.c:2667: undefined reference to `dma_free_coherent'
drivers/usb/dwc3/gadget.c:2674: undefined reference to `dma_free_coherent'
drivers/usb/dwc3/gadget.c:2678: undefined reference to `dma_free_coherent'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
drivers/usb/dwc3/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 757aa18..2378958 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -1,6 +1,6 @@
config USB_DWC3
tristate "DesignWare USB3 DRD Core Support"
- depends on (USB || USB_GADGET) && GENERIC_HARDIRQS
+ depends on (USB || USB_GADGET) && GENERIC_HARDIRQS && HAS_DMA
select USB_XHCI_PLATFORM if USB_SUPPORT && USB_XHCI_HCD
help
Say Y or M here if your system has a Dual Role SuperSpeed
--
1.7.9.5


2013-07-11 13:54:16

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 6/6] [RFC] usb: gadget: USB_GADGET should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `dma_set_coherent_mask':
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
drivers/built-in.o: In function `usb_gadget_unmap_request':
drivers/usb/gadget/udc-core.c:91: undefined reference to `dma_unmap_sg'
drivers/usb/gadget/udc-core.c:96: undefined reference to `dma_unmap_single'
drivers/built-in.o: In function `usb_gadget_map_request':
drivers/usb/gadget/udc-core.c:62: undefined reference to `dma_map_sg'
drivers/usb/gadget/udc-core.c:71: undefined reference to `dma_map_single'
drivers/usb/gadget/udc-core.c:74: undefined reference to `dma_mapping_error'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
This one is very debatable: probably the parts using the DMA API should
be factored out, instead of disabling the whole USB gadget subsystem.

drivers/usb/gadget/Kconfig | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 3f8df56..a88fc47 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -15,6 +15,7 @@

menuconfig USB_GADGET
tristate "USB Gadget Support"
+ depends on HAS_DMA
select NLS
help
USB is a master/slave protocol, organized with one master
--
1.7.9.5

2013-07-11 13:54:15

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 2/6] usb: chipidea: USB_CHIPIDEA_UDC should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `dma_set_coherent_mask':
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
drivers/built-in.o: In function `destroy_eps':
drivers/usb/chipidea/udc.c:1598: undefined reference to `dma_pool_free'
drivers/built-in.o: In function `free_pending_td':
drivers/usb/chipidea/udc.c:540: undefined reference to `dma_pool_free'
drivers/built-in.o: In function `add_td_to_list':
drivers/usb/chipidea/udc.c:383: undefined reference to `dma_pool_alloc'
drivers/built-in.o: In function `_ep_nuke':
drivers/usb/chipidea/udc.c:639: undefined reference to `dma_pool_free'
drivers/built-in.o: In function `udc_stop':
drivers/usb/chipidea/udc.c:1855: undefined reference to `dma_pool_destroy'
drivers/built-in.o: In function `init_eps':
drivers/usb/chipidea/udc.c:1564: undefined reference to `dma_pool_alloc'
drivers/built-in.o: In function `udc_start':
drivers/usb/chipidea/udc.c:1766: undefined reference to `dma_pool_create'
drivers/usb/chipidea/udc.c:1835: undefined reference to `dma_pool_destroy'
drivers/usb/chipidea/udc.c:1837: undefined reference to `dma_pool_destroy'
drivers/built-in.o: In function `ep_free_request':
drivers/usb/chipidea/udc.c:1268: undefined reference to `dma_pool_free'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
drivers/usb/chipidea/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig
index eb2aa2e..189dbc6 100644
--- a/drivers/usb/chipidea/Kconfig
+++ b/drivers/usb/chipidea/Kconfig
@@ -12,7 +12,7 @@ if USB_CHIPIDEA

config USB_CHIPIDEA_UDC
bool "ChipIdea device controller"
- depends on USB_GADGET=y || USB_CHIPIDEA=m
+ depends on (USB_GADGET=y || USB_CHIPIDEA=m) && HAS_DMA
help
Say Y here to enable device controller functionality of the
ChipIdea driver.
--
1.7.9.5

2013-07-11 13:54:14

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 3/6] usb: gadget: USB_MV_UDC should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `done':
drivers/usb/gadget/mv_udc_core.c:239: undefined reference to `dma_pool_free'
drivers/built-in.o: In function `build_dtd':
drivers/usb/gadget/mv_udc_core.c:371: undefined reference to `dma_pool_alloc'
drivers/built-in.o: In function `udc_prime_status':
drivers/usb/gadget/mv_udc_core.c:1465: undefined reference to `dma_map_single'
drivers/built-in.o: In function `mv_udc_remove':
drivers/usb/gadget/mv_udc_core.c:2087: undefined reference to `dma_pool_destroy'
drivers/usb/gadget/mv_udc_core.c:2090: undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `mv_udc_probe':
drivers/usb/gadget/mv_udc_core.c:2190: undefined reference to `dma_alloc_coherent'
drivers/usb/gadget/mv_udc_core.c:2201: undefined reference to `dma_pool_create'
drivers/usb/gadget/mv_udc_core.c:2315: undefined reference to `dma_pool_destroy'
drivers/usb/gadget/mv_udc_core.c:2317: undefined reference to `dma_free_coherent'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
drivers/usb/gadget/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 62f6802..95375d1 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -328,7 +328,7 @@ config USB_S3C_HSUDC

config USB_MV_UDC
tristate "Marvell USB2.0 Device Controller"
- depends on GENERIC_HARDIRQS
+ depends on GENERIC_HARDIRQS && HAS_DMA
help
Marvell Socs (including PXA and MMP series) include a high speed
USB2.0 OTG controller, which can be configured as high speed or
--
1.7.9.5

2013-07-11 13:54:12

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 4/6] usb: gadget: USB_FOTG210_UDC should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `fotg210_start_dma':
drivers/usb/gadget/fotg210-udc.c:354: undefined reference to `dma_map_single'
drivers/usb/gadget/fotg210-udc.c:357: undefined reference to `dma_mapping_error'
drivers/usb/gadget/fotg210-udc.c:362: undefined reference to `dma_sync_single_for_cpu'
drivers/usb/gadget/fotg210-udc.c:376: undefined reference to `dma_unmap_single'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
drivers/usb/gadget/Kconfig | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 95375d1..8743742 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -193,6 +193,7 @@ config USB_FUSB300
Faraday usb device controller FUSB300 driver

config USB_FOTG210_UDC
+ depends on HAS_DMA
tristate "Faraday FOTG210 USB Peripheral Controller"
help
Faraday USB2.0 OTG controller which can be configured as
--
1.7.9.5

2013-07-11 13:56:46

by Geert Uytterhoeven

[permalink] [raw]
Subject: [PATCH 5/6] usb: gadget: USB_MV_U3D should depend on HAS_DMA

If NO_DMA=y:

drivers/built-in.o: In function `mv_u3d_done':
drivers/usb/gadget/mv_u3d_core.c:206: undefined reference to `dma_pool_free'
drivers/usb/gadget/mv_u3d_core.c:209: undefined reference to `dma_unmap_single'
drivers/built-in.o: In function `mv_u3d_build_trb_one':
drivers/usb/gadget/mv_u3d_core.c:311: undefined reference to `dma_pool_alloc'
drivers/built-in.o: In function `mv_u3d_req_to_trb':
drivers/usb/gadget/mv_u3d_core.c:480: undefined reference to `dma_map_single'
drivers/built-in.o: In function `mv_u3d_remove':
drivers/usb/gadget/mv_u3d_core.c:1770: undefined reference to `dma_pool_destroy'
drivers/usb/gadget/mv_u3d_core.c:1773: undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `mv_u3d_probe':
drivers/usb/gadget/mv_u3d_core.c:1880: undefined reference to `dma_alloc_coherent'
drivers/usb/gadget/mv_u3d_core.c:1890: undefined reference to `dma_pool_create'
drivers/usb/gadget/mv_u3d_core.c:1984: undefined reference to `dma_pool_destroy'
drivers/usb/gadget/mv_u3d_core.c:1986: undefined reference to `dma_free_coherent'

Signed-off-by: Geert Uytterhoeven <[email protected]>
---
drivers/usb/gadget/Kconfig | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 8743742..3f8df56 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -336,6 +336,7 @@ config USB_MV_UDC
full speed USB peripheral.

config USB_MV_U3D
+ depends on HAS_DMA
tristate "MARVELL PXA2128 USB 3.0 controller"
help
MARVELL PXA2128 Processor series include a super speed USB3.0 device
--
1.7.9.5

2013-07-11 15:51:12

by Alan Stern

[permalink] [raw]
Subject: Re: [PATCH 6/6] [RFC] usb: gadget: USB_GADGET should depend on HAS_DMA

On Thu, 11 Jul 2013, Geert Uytterhoeven wrote:

> If NO_DMA=y:
>
> drivers/built-in.o: In function `dma_set_coherent_mask':
> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
> drivers/built-in.o: In function `usb_gadget_unmap_request':
> drivers/usb/gadget/udc-core.c:91: undefined reference to `dma_unmap_sg'
> drivers/usb/gadget/udc-core.c:96: undefined reference to `dma_unmap_single'
> drivers/built-in.o: In function `usb_gadget_map_request':
> drivers/usb/gadget/udc-core.c:62: undefined reference to `dma_map_sg'
> drivers/usb/gadget/udc-core.c:71: undefined reference to `dma_map_single'
> drivers/usb/gadget/udc-core.c:74: undefined reference to `dma_mapping_error'
>
> Signed-off-by: Geert Uytterhoeven <[email protected]>
> ---
> This one is very debatable: probably the parts using the DMA API should
> be factored out, instead of disabling the whole USB gadget subsystem.

Indeed. How does this look instead?

Alan Stern



Index: usb-3.10/drivers/usb/gadget/udc-core.c
===================================================================
--- usb-3.10.orig/drivers/usb/gadget/udc-core.c
+++ usb-3.10/drivers/usb/gadget/udc-core.c
@@ -50,6 +50,8 @@ static DEFINE_MUTEX(udc_lock);

/* ------------------------------------------------------------------------- */

+#ifdef CONFIG_HAS_DMA
+
int usb_gadget_map_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in)
{
@@ -99,6 +101,8 @@ void usb_gadget_unmap_request(struct usb
}
EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);

+#endif /* CONFIG_HAS_DMA */
+
/* ------------------------------------------------------------------------- */

void usb_gadget_set_state(struct usb_gadget *gadget,
@@ -194,9 +198,11 @@ int usb_add_gadget_udc_release(struct de
dev_set_name(&gadget->dev, "gadget");
gadget->dev.parent = parent;

+#ifdef CONFIG_HAS_DMA
dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask);
gadget->dev.dma_parms = parent->dma_parms;
gadget->dev.dma_mask = parent->dma_mask;
+#endif

if (release)
gadget->dev.release = release;

2013-07-12 07:21:18

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH 6/6] [RFC] usb: gadget: USB_GADGET should depend on HAS_DMA

Hi Alan,

On Thu, Jul 11, 2013 at 5:51 PM, Alan Stern <[email protected]> wrote:
> On Thu, 11 Jul 2013, Geert Uytterhoeven wrote:
>
>> If NO_DMA=y:
>>
>> drivers/built-in.o: In function `dma_set_coherent_mask':
>> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
>> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
>> drivers/built-in.o: In function `usb_gadget_unmap_request':
>> drivers/usb/gadget/udc-core.c:91: undefined reference to `dma_unmap_sg'
>> drivers/usb/gadget/udc-core.c:96: undefined reference to `dma_unmap_single'
>> drivers/built-in.o: In function `usb_gadget_map_request':
>> drivers/usb/gadget/udc-core.c:62: undefined reference to `dma_map_sg'
>> drivers/usb/gadget/udc-core.c:71: undefined reference to `dma_map_single'
>> drivers/usb/gadget/udc-core.c:74: undefined reference to `dma_mapping_error'
>>
>> Signed-off-by: Geert Uytterhoeven <[email protected]>
>> ---
>> This one is very debatable: probably the parts using the DMA API should
>> be factored out, instead of disabling the whole USB gadget subsystem.
>
> Indeed. How does this look instead?
>
> Alan Stern
>
>
>
> Index: usb-3.10/drivers/usb/gadget/udc-core.c
> ===================================================================
> --- usb-3.10.orig/drivers/usb/gadget/udc-core.c
> +++ usb-3.10/drivers/usb/gadget/udc-core.c
> @@ -50,6 +50,8 @@ static DEFINE_MUTEX(udc_lock);
>
> /* ------------------------------------------------------------------------- */
>
> +#ifdef CONFIG_HAS_DMA
> +
> int usb_gadget_map_request(struct usb_gadget *gadget,
> struct usb_request *req, int is_in)
> {
> @@ -99,6 +101,8 @@ void usb_gadget_unmap_request(struct usb
> }
> EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
>
> +#endif /* CONFIG_HAS_DMA */
> +
> /* ------------------------------------------------------------------------- */
>
> void usb_gadget_set_state(struct usb_gadget *gadget,
> @@ -194,9 +198,11 @@ int usb_add_gadget_udc_release(struct de
> dev_set_name(&gadget->dev, "gadget");
> gadget->dev.parent = parent;
>
> +#ifdef CONFIG_HAS_DMA
> dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask);
> gadget->dev.dma_parms = parent->dma_parms;
> gadget->dev.dma_mask = parent->dma_mask;
> +#endif
>
> if (release)
> gadget->dev.release = release;

Thanks, that works!

(after adding a few more dependencies on HAS_DMA for drivers that call
into usb_gadget_{,un}map_request() and/or dma_set_coherent_mask(),
for which I'll send separate patches).

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2013-07-12 07:39:24

by Alexander Shishkin

[permalink] [raw]
Subject: Re: [PATCH 6/6] [RFC] usb: gadget: USB_GADGET should depend on HAS_DMA

Alan Stern <[email protected]> writes:

> On Thu, 11 Jul 2013, Geert Uytterhoeven wrote:
>
>> If NO_DMA=y:
>>
>> drivers/built-in.o: In function `dma_set_coherent_mask':
>> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
>> include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
>> drivers/built-in.o: In function `usb_gadget_unmap_request':
>> drivers/usb/gadget/udc-core.c:91: undefined reference to `dma_unmap_sg'
>> drivers/usb/gadget/udc-core.c:96: undefined reference to `dma_unmap_single'
>> drivers/built-in.o: In function `usb_gadget_map_request':
>> drivers/usb/gadget/udc-core.c:62: undefined reference to `dma_map_sg'
>> drivers/usb/gadget/udc-core.c:71: undefined reference to `dma_map_single'
>> drivers/usb/gadget/udc-core.c:74: undefined reference to `dma_mapping_error'
>>
>> Signed-off-by: Geert Uytterhoeven <[email protected]>
>> ---
>> This one is very debatable: probably the parts using the DMA API should
>> be factored out, instead of disabling the whole USB gadget subsystem.
>
> Indeed. How does this look instead?

This one is much better. FWIW,

Acked-by: Alexander Shishkin <[email protected]>

Regards,
--
Alex

2013-07-12 15:06:24

by Alan Stern

[permalink] [raw]
Subject: [PATCH] USB: GADGET: don't fail when DMA isn't present

When CONFIG_HAS_DMA isn't enabled, the UDC core gets build errors:

drivers/built-in.o: In function `dma_set_coherent_mask':
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
drivers/built-in.o: In function `usb_gadget_unmap_request':
drivers/usb/gadget/udc-core.c:91: undefined reference to `dma_unmap_sg'
drivers/usb/gadget/udc-core.c:96: undefined reference to `dma_unmap_single'
drivers/built-in.o: In function `usb_gadget_map_request':
drivers/usb/gadget/udc-core.c:62: undefined reference to `dma_map_sg'
drivers/usb/gadget/udc-core.c:71: undefined reference to `dma_map_single'
drivers/usb/gadget/udc-core.c:74: undefined reference to `dma_mapping_error'

Prevent this by protecting the DMA API routines with preprocessor tests.

Signed-off-by: Alan Stern <[email protected]>
CC: Geert Uytterhoeven <[email protected]>
Acked-by: Alexander Shishkin <[email protected]>

---


[as1693]

drivers/usb/gadget/udc-core.c | 6 ++++++
1 file changed, 6 insertions(+)

Index: usb-3.10/drivers/usb/gadget/udc-core.c
===================================================================
--- usb-3.10.orig/drivers/usb/gadget/udc-core.c
+++ usb-3.10/drivers/usb/gadget/udc-core.c
@@ -50,6 +50,8 @@ static DEFINE_MUTEX(udc_lock);

/* ------------------------------------------------------------------------- */

+#ifdef CONFIG_HAS_DMA
+
int usb_gadget_map_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in)
{
@@ -99,6 +101,8 @@ void usb_gadget_unmap_request(struct usb
}
EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);

+#endif /* CONFIG_HAS_DMA */
+
/* ------------------------------------------------------------------------- */

void usb_gadget_set_state(struct usb_gadget *gadget,
@@ -194,9 +198,11 @@ int usb_add_gadget_udc_release(struct de
dev_set_name(&gadget->dev, "gadget");
gadget->dev.parent = parent;

+#ifdef CONFIG_HAS_DMA
dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask);
gadget->dev.dma_parms = parent->dma_parms;
gadget->dev.dma_mask = parent->dma_mask;
+#endif

if (release)
gadget->dev.release = release;