|
@@ -204,6 +204,8 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
.fw_recovery = wil_platform_rop_fw_recovery,
|
|
|
};
|
|
|
u32 bar_size = pci_resource_len(pdev, 0);
|
|
|
+ int dma_addr_size[] = {48, 40, 32}; /* keep descending order */
|
|
|
+ int i;
|
|
|
|
|
|
/* check HW */
|
|
|
dev_info(&pdev->dev, WIL_NAME
|
|
@@ -239,21 +241,23 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
}
|
|
|
/* rollback to err_plat */
|
|
|
|
|
|
- /* device supports 48bit addresses */
|
|
|
- rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48));
|
|
|
- if (rc) {
|
|
|
- dev_err(dev, "dma_set_mask_and_coherent(48) failed: %d\n", rc);
|
|
|
- rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
|
|
|
+ /* device supports >32bit addresses */
|
|
|
+ for (i = 0; i < ARRAY_SIZE(dma_addr_size); i++) {
|
|
|
+ rc = dma_set_mask_and_coherent(dev,
|
|
|
+ DMA_BIT_MASK(dma_addr_size[i]));
|
|
|
if (rc) {
|
|
|
- dev_err(dev,
|
|
|
- "dma_set_mask_and_coherent(32) failed: %d\n",
|
|
|
- rc);
|
|
|
- goto err_plat;
|
|
|
+ dev_err(dev, "dma_set_mask_and_coherent(%d) failed: %d\n",
|
|
|
+ dma_addr_size[i], rc);
|
|
|
+ continue;
|
|
|
}
|
|
|
- } else {
|
|
|
- wil->use_extended_dma_addr = 1;
|
|
|
+ dev_info(dev, "using dma mask %d", dma_addr_size[i]);
|
|
|
+ wil->dma_addr_size = dma_addr_size[i];
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
+ if (wil->dma_addr_size == 0)
|
|
|
+ goto err_plat;
|
|
|
+
|
|
|
rc = pci_enable_device(pdev);
|
|
|
if (rc && pdev->msi_enabled == 0) {
|
|
|
wil_err(wil,
|