2019-10-07 12:07:44

by Pawel Laszczak

[permalink] [raw]
Subject: [PATCH] usb: cdns3: Fix for incorrect DMA mask.

This patch restores the correct DMA mask after switching back to device
mode.
The issue occurred because Device part of controller use 32 bits DMA and
Host side use 64 bits DMA. During loading XHCI driver the DMA mask
used by driver is overwritten by XHCI driver so it must be restored
to 32 bits.

Reported-by: Pawel Laszczak <[email protected]>
Signed-off-by: Roger Quadros <[email protected]>
Signed-off-by: Pawel Laszczak <[email protected]>
Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
---
drivers/usb/cdns3/gadget.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index 157536753b8c..2ca280f4c054 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -2663,6 +2663,13 @@ static int __cdns3_gadget_init(struct cdns3 *cdns)
{
int ret = 0;

+ /* Ensure 32-bit DMA Mask in case we switched back from Host mode */
+ ret = dma_set_mask_and_coherent(cdns->dev, DMA_BIT_MASK(32));
+ if (ret) {
+ dev_err(cdns->dev, "Failed to set dma mask: %d\n", ret);
+ return ret;
+ }
+
cdns3_drd_switch_gadget(cdns, 1);
pm_runtime_get_sync(cdns->dev);

--
2.17.1


2019-10-07 12:23:25

by Roger Quadros

[permalink] [raw]
Subject: Re: [PATCH] usb: cdns3: Fix for incorrect DMA mask.



On 07/10/2019 15:03, Pawel Laszczak wrote:
> This patch restores the correct DMA mask after switching back to device
> mode.
> The issue occurred because Device part of controller use 32 bits DMA and
> Host side use 64 bits DMA. During loading XHCI driver the DMA mask
> used by driver is overwritten by XHCI driver so it must be restored
> to 32 bits.
>
> Reported-by: Pawel Laszczak <[email protected]>
> Signed-off-by: Roger Quadros <[email protected]>
> Signed-off-by: Pawel Laszczak <[email protected]>
> Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")

Tested-by: Roger Quadros <[email protected]>

> ---
> drivers/usb/cdns3/gadget.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
> index 157536753b8c..2ca280f4c054 100644
> --- a/drivers/usb/cdns3/gadget.c
> +++ b/drivers/usb/cdns3/gadget.c
> @@ -2663,6 +2663,13 @@ static int __cdns3_gadget_init(struct cdns3 *cdns)
> {
> int ret = 0;
>
> + /* Ensure 32-bit DMA Mask in case we switched back from Host mode */
> + ret = dma_set_mask_and_coherent(cdns->dev, DMA_BIT_MASK(32));
> + if (ret) {
> + dev_err(cdns->dev, "Failed to set dma mask: %d\n", ret);
> + return ret;
> + }
> +
> cdns3_drd_switch_gadget(cdns, 1);
> pm_runtime_get_sync(cdns->dev);
>
>

--
cheers,
-roger

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

2019-10-08 08:04:43

by Peter Chen

[permalink] [raw]
Subject: Re: [PATCH] usb: cdns3: Fix for incorrect DMA mask.

On 19-10-07 13:03:23, Pawel Laszczak wrote:
> This patch restores the correct DMA mask after switching back to device
> mode.
> The issue occurred because Device part of controller use 32 bits DMA and
> Host side use 64 bits DMA. During loading XHCI driver the DMA mask
> used by driver is overwritten by XHCI driver so it must be restored
> to 32 bits.
>
> Reported-by: Pawel Laszczak <[email protected]>
> Signed-off-by: Roger Quadros <[email protected]>
> Signed-off-by: Pawel Laszczak <[email protected]>
> Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
> ---
> drivers/usb/cdns3/gadget.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
> index 157536753b8c..2ca280f4c054 100644
> --- a/drivers/usb/cdns3/gadget.c
> +++ b/drivers/usb/cdns3/gadget.c
> @@ -2663,6 +2663,13 @@ static int __cdns3_gadget_init(struct cdns3 *cdns)
> {
> int ret = 0;
>
> + /* Ensure 32-bit DMA Mask in case we switched back from Host mode */
> + ret = dma_set_mask_and_coherent(cdns->dev, DMA_BIT_MASK(32));
> + if (ret) {
> + dev_err(cdns->dev, "Failed to set dma mask: %d\n", ret);
> + return ret;
> + }
> +
> cdns3_drd_switch_gadget(cdns, 1);
> pm_runtime_get_sync(cdns->dev);
>

Reviewed-by: Peter Chen <[email protected]>

--

Thanks,
Peter Chen