|
@@ -163,7 +163,6 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
{
|
|
|
struct wil6210_priv *wil;
|
|
|
struct device *dev = &pdev->dev;
|
|
|
- void __iomem *csr;
|
|
|
int rc;
|
|
|
|
|
|
/* check HW */
|
|
@@ -178,9 +177,28 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ wil = wil_if_alloc(dev);
|
|
|
+ if (IS_ERR(wil)) {
|
|
|
+ rc = (int)PTR_ERR(wil);
|
|
|
+ dev_err(dev, "wil_if_alloc failed: %d\n", rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+ wil->pdev = pdev;
|
|
|
+ pci_set_drvdata(pdev, wil);
|
|
|
+ /* rollback to if_free */
|
|
|
+
|
|
|
+ wil->platform_handle =
|
|
|
+ wil_platform_init(&pdev->dev, &wil->platform_ops);
|
|
|
+ if (!wil->platform_handle) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ wil_err(wil, "wil_platform_init failed\n");
|
|
|
+ goto if_free;
|
|
|
+ }
|
|
|
+ /* rollback to err_plat */
|
|
|
+
|
|
|
rc = pci_enable_device(pdev);
|
|
|
if (rc) {
|
|
|
- dev_err(&pdev->dev,
|
|
|
+ wil_err(wil,
|
|
|
"pci_enable_device failed, retry with MSI only\n");
|
|
|
/* Work around for platforms that can't allocate IRQ:
|
|
|
* retry with MSI only
|
|
@@ -188,47 +206,37 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
pdev->msi_enabled = 1;
|
|
|
rc = pci_enable_device(pdev);
|
|
|
}
|
|
|
- if (rc)
|
|
|
- return -ENODEV;
|
|
|
+ if (rc) {
|
|
|
+ wil_err(wil,
|
|
|
+ "pci_enable_device failed, even with MSI only\n");
|
|
|
+ goto err_plat;
|
|
|
+ }
|
|
|
/* rollback to err_disable_pdev */
|
|
|
|
|
|
rc = pci_request_region(pdev, 0, WIL_NAME);
|
|
|
if (rc) {
|
|
|
- dev_err(&pdev->dev, "pci_request_region failed\n");
|
|
|
+ wil_err(wil, "pci_request_region failed\n");
|
|
|
goto err_disable_pdev;
|
|
|
}
|
|
|
/* rollback to err_release_reg */
|
|
|
|
|
|
- csr = pci_ioremap_bar(pdev, 0);
|
|
|
- if (!csr) {
|
|
|
- dev_err(&pdev->dev, "pci_ioremap_bar failed\n");
|
|
|
+ wil->csr = pci_ioremap_bar(pdev, 0);
|
|
|
+ if (!wil->csr) {
|
|
|
+ wil_err(wil, "pci_ioremap_bar failed\n");
|
|
|
rc = -ENODEV;
|
|
|
goto err_release_reg;
|
|
|
}
|
|
|
/* rollback to err_iounmap */
|
|
|
- dev_info(&pdev->dev, "CSR at %pR -> 0x%p\n", &pdev->resource[0], csr);
|
|
|
-
|
|
|
- wil = wil_if_alloc(dev, csr);
|
|
|
- if (IS_ERR(wil)) {
|
|
|
- rc = (int)PTR_ERR(wil);
|
|
|
- dev_err(dev, "wil_if_alloc failed: %d\n", rc);
|
|
|
- goto err_iounmap;
|
|
|
- }
|
|
|
- /* rollback to if_free */
|
|
|
+ wil_info(wil, "CSR at %pR -> 0x%p\n", &pdev->resource[0], wil->csr);
|
|
|
|
|
|
- pci_set_drvdata(pdev, wil);
|
|
|
- wil->pdev = pdev;
|
|
|
wil_set_capabilities(wil);
|
|
|
wil6210_clear_irq(wil);
|
|
|
|
|
|
- wil->platform_handle =
|
|
|
- wil_platform_init(&pdev->dev, &wil->platform_ops);
|
|
|
-
|
|
|
/* FW should raise IRQ when ready */
|
|
|
rc = wil_if_pcie_enable(wil);
|
|
|
if (rc) {
|
|
|
wil_err(wil, "Enable device failed\n");
|
|
|
- goto if_free;
|
|
|
+ goto err_iounmap;
|
|
|
}
|
|
|
/* rollback to bus_disable */
|
|
|
|
|
@@ -243,18 +251,19 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- bus_disable:
|
|
|
+bus_disable:
|
|
|
wil_if_pcie_disable(wil);
|
|
|
- if_free:
|
|
|
+err_iounmap:
|
|
|
+ pci_iounmap(pdev, wil->csr);
|
|
|
+err_release_reg:
|
|
|
+ pci_release_region(pdev, 0);
|
|
|
+err_disable_pdev:
|
|
|
+ pci_disable_device(pdev);
|
|
|
+err_plat:
|
|
|
if (wil->platform_ops.uninit)
|
|
|
wil->platform_ops.uninit(wil->platform_handle);
|
|
|
+if_free:
|
|
|
wil_if_free(wil);
|
|
|
- err_iounmap:
|
|
|
- pci_iounmap(pdev, csr);
|
|
|
- err_release_reg:
|
|
|
- pci_release_region(pdev, 0);
|
|
|
- err_disable_pdev:
|
|
|
- pci_disable_device(pdev);
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
@@ -269,12 +278,12 @@ static void wil_pcie_remove(struct pci_dev *pdev)
|
|
|
wil6210_debugfs_remove(wil);
|
|
|
wil_if_remove(wil);
|
|
|
wil_if_pcie_disable(wil);
|
|
|
- if (wil->platform_ops.uninit)
|
|
|
- wil->platform_ops.uninit(wil->platform_handle);
|
|
|
- wil_if_free(wil);
|
|
|
pci_iounmap(pdev, csr);
|
|
|
pci_release_region(pdev, 0);
|
|
|
pci_disable_device(pdev);
|
|
|
+ if (wil->platform_ops.uninit)
|
|
|
+ wil->platform_ops.uninit(wil->platform_handle);
|
|
|
+ wil_if_free(wil);
|
|
|
}
|
|
|
|
|
|
static const struct pci_device_id wil6210_pcie_ids[] = {
|