Skip to content

Commit 435cdbe

Browse files
mrgolinrleon
authored andcommitted
RDMA/efa: Fail probe on missing BARs
In case any of PCI BARs is missing during device probe we would like to fail as early as possible. Fail if any of the required BARs isn't listed as a memory BAR. Reviewed-by: Daniel Kranzdorf <[email protected]> Reviewed-by: Firas Jahjah <[email protected]> Signed-off-by: Michael Margolin <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Gal Pressman <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 6f6bfbc commit 435cdbe

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

drivers/infiniband/hw/efa/efa_main.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,23 @@ static int efa_request_doorbell_bar(struct efa_dev *dev)
190190
{
191191
u8 db_bar_idx = dev->dev_attr.db_bar;
192192
struct pci_dev *pdev = dev->pdev;
193-
int bars;
193+
int pci_mem_bars;
194+
int db_bar;
194195
int err;
195196

196-
if (!(BIT(db_bar_idx) & EFA_BASE_BAR_MASK)) {
197-
bars = pci_select_bars(pdev, IORESOURCE_MEM) & BIT(db_bar_idx);
197+
db_bar = BIT(db_bar_idx);
198+
if (!(db_bar & EFA_BASE_BAR_MASK)) {
199+
pci_mem_bars = pci_select_bars(pdev, IORESOURCE_MEM);
200+
if (db_bar & ~pci_mem_bars) {
201+
dev_err(&pdev->dev,
202+
"Doorbells BAR unavailable. Requested %#x, available %#x\n",
203+
db_bar, pci_mem_bars);
204+
return -ENODEV;
205+
}
198206

199-
err = pci_request_selected_regions(pdev, bars, DRV_MODULE_NAME);
207+
err = pci_request_selected_regions(pdev, db_bar, DRV_MODULE_NAME);
200208
if (err) {
201-
dev_err(&dev->pdev->dev,
209+
dev_err(&pdev->dev,
202210
"pci_request_selected_regions for bar %d failed %d\n",
203211
db_bar_idx, err);
204212
return err;
@@ -531,7 +539,7 @@ static struct efa_dev *efa_probe_device(struct pci_dev *pdev)
531539
{
532540
struct efa_com_dev *edev;
533541
struct efa_dev *dev;
534-
int bars;
542+
int pci_mem_bars;
535543
int err;
536544

537545
err = pci_enable_device_mem(pdev);
@@ -556,8 +564,14 @@ static struct efa_dev *efa_probe_device(struct pci_dev *pdev)
556564
dev->pdev = pdev;
557565
xa_init(&dev->cqs_xa);
558566

559-
bars = pci_select_bars(pdev, IORESOURCE_MEM) & EFA_BASE_BAR_MASK;
560-
err = pci_request_selected_regions(pdev, bars, DRV_MODULE_NAME);
567+
pci_mem_bars = pci_select_bars(pdev, IORESOURCE_MEM);
568+
if (EFA_BASE_BAR_MASK & ~pci_mem_bars) {
569+
dev_err(&pdev->dev, "BARs unavailable. Requested %#x, available %#x\n",
570+
(int)EFA_BASE_BAR_MASK, pci_mem_bars);
571+
err = -ENODEV;
572+
goto err_ibdev_destroy;
573+
}
574+
err = pci_request_selected_regions(pdev, EFA_BASE_BAR_MASK, DRV_MODULE_NAME);
561575
if (err) {
562576
dev_err(&pdev->dev, "pci_request_selected_regions failed %d\n",
563577
err);

0 commit comments

Comments
 (0)