staging: dwc2: fix wrong setting of DMA masks
We were setting the DMA masks in dwc2_driver_probe(), but that is
before the driver parameters have been set to their default values.
That meant the DMA masks could be set wrong. Fix it by moving the
DMA mask setting into dwc2_hcd_init(), after the driver parameters
have been set.
Reported-by: Matthijs Kooijman <matthijs@stdin.nl>
Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
diff --git a/drivers/staging/dwc2/hcd.c b/drivers/staging/dwc2/hcd.c
index af1a15c..91ff504 100644
--- a/drivers/staging/dwc2/hcd.c
+++ b/drivers/staging/dwc2/hcd.c
@@ -2707,16 +2707,6 @@
goto error1;
}
- hcd = usb_create_hcd(&dwc2_hc_driver, hsotg->dev, dev_name(hsotg->dev));
- if (!hcd)
- goto error1;
-
- hcd->has_tt = 1;
-
- spin_lock_init(&hsotg->lock);
- ((struct wrapper_priv_data *) &hcd->hcd_priv)->hsotg = hsotg;
- hsotg->priv = hcd;
-
/*
* Store the contents of the hardware configuration registers here for
* easy access later
@@ -2775,18 +2765,18 @@
hsotg->frame_num_array = kzalloc(sizeof(*hsotg->frame_num_array) *
FRAME_NUM_ARRAY_SIZE, GFP_KERNEL);
if (!hsotg->frame_num_array)
- goto error2;
+ goto error1;
hsotg->last_frame_num_array = kzalloc(
sizeof(*hsotg->last_frame_num_array) *
FRAME_NUM_ARRAY_SIZE, GFP_KERNEL);
if (!hsotg->last_frame_num_array)
- goto error2;
+ goto error1;
hsotg->last_frame_num = HFNUM_MAX_FRNUM;
#endif
hsotg->core_params = kzalloc(sizeof(*hsotg->core_params), GFP_KERNEL);
if (!hsotg->core_params)
- goto error2;
+ goto error1;
dwc2_set_uninitialized((int *)hsotg->core_params,
sizeof(*hsotg->core_params) / sizeof(int));
@@ -2794,6 +2784,29 @@
/* Validate parameter values */
dwc2_set_parameters(hsotg, params);
+ /* Set device flags indicating whether the HCD supports DMA */
+ if (hsotg->core_params->dma_enable > 0) {
+ if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0)
+ dev_warn(hsotg->dev,
+ "can't enable workaround for >2GB RAM\n");
+ if (dma_set_coherent_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0)
+ dev_warn(hsotg->dev,
+ "can't enable workaround for >2GB RAM\n");
+ } else {
+ dma_set_mask(hsotg->dev, 0);
+ dma_set_coherent_mask(hsotg->dev, 0);
+ }
+
+ hcd = usb_create_hcd(&dwc2_hc_driver, hsotg->dev, dev_name(hsotg->dev));
+ if (!hcd)
+ goto error1;
+
+ hcd->has_tt = 1;
+
+ spin_lock_init(&hsotg->lock);
+ ((struct wrapper_priv_data *) &hcd->hcd_priv)->hsotg = hsotg;
+ hsotg->priv = hcd;
+
/* Initialize the DWC_otg core, and select the Phy type */
retval = dwc2_core_init(hsotg, true);
if (retval)
@@ -2903,6 +2916,8 @@
error3:
dwc2_hcd_release(hsotg);
error2:
+ usb_put_hcd(hcd);
+error1:
kfree(hsotg->core_params);
#ifdef CONFIG_USB_DWC2_TRACK_MISSED_SOFS
@@ -2910,8 +2925,6 @@
kfree(hsotg->frame_num_array);
#endif
- usb_put_hcd(hcd);
-error1:
dev_err(hsotg->dev, "%s() FAILED, returning %d\n", __func__, retval);
return retval;
}
@@ -2939,12 +2952,11 @@
usb_remove_hcd(hcd);
hsotg->priv = NULL;
dwc2_hcd_release(hsotg);
+ usb_put_hcd(hcd);
#ifdef CONFIG_USB_DWC2_TRACK_MISSED_SOFS
kfree(hsotg->last_frame_num_array);
kfree(hsotg->frame_num_array);
#endif
-
- usb_put_hcd(hcd);
}
EXPORT_SYMBOL_GPL(dwc2_hcd_remove);
diff --git a/drivers/staging/dwc2/pci.c b/drivers/staging/dwc2/pci.c
index 539f859..0825eef 100644
--- a/drivers/staging/dwc2/pci.c
+++ b/drivers/staging/dwc2/pci.c
@@ -146,18 +146,6 @@
pci_set_master(dev);
- if (dwc2_module_params.dma_enable > 0) {
- if (pci_set_dma_mask(dev, DMA_BIT_MASK(31)) < 0)
- dev_warn(&dev->dev,
- "can't enable workaround for >2GB RAM\n");
- if (pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(31)) < 0)
- dev_warn(&dev->dev,
- "can't enable workaround for >2GB RAM\n");
- } else {
- pci_set_dma_mask(dev, 0);
- pci_set_consistent_dma_mask(dev, 0);
- }
-
retval = dwc2_hcd_init(hsotg, dev->irq, &dwc2_module_params);
if (retval) {
pci_disable_device(dev);