[rft/rfc/patch-v2.6.29-rc5+ 06/23] usb: host: ehci: sanitize error path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch:
	- sanitizes error path in ehci_hcd_omap_drv_probe();
	- removes two unnecessary debugging messages, we only need
	  debugging in the failing case generally;
	- fix a memory leak when omap_start_ehc() fails: the recently
	  created hcd was never put in that case;

Signed-off-by: Felipe Balbi <me@xxxxxxxxxxxxxxx>
---
 drivers/usb/host/ehci-omap.c |   53 +++++++++++++++++++++++++----------------
 1 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index d994392..db4576d 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -418,21 +418,24 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev)
 	struct usb_hcd *hcd;
 
 	int irq = platform_get_irq(pdev, 0);
-	int retval = 0;
-
-	dev_dbg(&pdev->dev, "ehci_hcd_omap_drv_probe()\n");
+	int ret = -ENODEV;
 
 	if (usb_disabled())
-		return -ENODEV;
+		goto err_disabled;
 
 	hcd = usb_create_hcd(&ehci_omap_hc_driver, &pdev->dev,
 			dev_name(&pdev->dev));
-	if (!hcd)
-		return -ENOMEM;
+	if (!hcd) {
+		dev_dbg(&pdev->dev, "failed to create hcd with err %d\n", ret);
+		ret = -ENOMEM;
+		goto err_create_hcd;
+	}
 
-	retval = omap_start_ehc(pdev, hcd);
-	if (retval)
-		return retval;
+	ret = omap_start_ehc(pdev, hcd);
+	if (ret) {
+		dev_dbg(&pdev->dev, "failed to start ehci\n");
+		goto err_start;
+	}
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
@@ -444,12 +447,12 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev)
 	hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
 	if (!hcd->regs) {
 		dev_err(&pdev->dev, "ioremap failed\n");
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto err_ioremap;
 	}
 
 	ehci = hcd_to_ehci(hcd);
 	ehci->caps = hcd->regs;
-
 	ehci->sbrn = 0x20;
 
 	ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));
@@ -459,16 +462,26 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev)
 	/* SET 1 micro-frame Interrupt interval */
 	writel(readl(&ehci->regs->command) | (1 << 16), &ehci->regs->command);
 
-	retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
-	if (retval == 0)
-		return retval;
+	ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
+	if (ret) {
+		dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret);
+		goto err_add_hcd;
+	}
 
-	dev_dbg(&pdev->dev, "ERR: add_hcd\n");
-	omap_stop_ehc(pdev, hcd);
+	return 0;
+
+err_add_hcd:
 	iounmap(hcd->regs);
+
+err_ioremap:
+	omap_stop_ehc(pdev, hcd);
+
+err_start:
 	usb_put_hcd(hcd);
 
-	return retval;
+err_create_hcd:
+err_disabled:
+	return ret;
 }
 
 /*-------------------------------------------------------------------------*/
@@ -490,12 +503,10 @@ static int ehci_hcd_omap_drv_remove(struct platform_device *pdev)
 {
 	struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
-	dev_dbg(&pdev->dev, "ehci_hcd_omap_drv_remove()\n");
-
-	iounmap(hcd->regs);
 	usb_remove_hcd(hcd);
-	usb_put_hcd(hcd);
+	iounmap(hcd->regs);
 	omap_stop_ehc(pdev, hcd);
+	usb_put_hcd(hcd);
 
 	return 0;
 }
-- 
1.6.1.3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux