Skip to content

Commit

Permalink
octeon_ep: defer probe if firmware not ready
Browse files Browse the repository at this point in the history
Defer probe if firmware is not ready for device usage.

Signed-off-by: Veerasenareddy Burru <[email protected]>
Signed-off-by: Abhijit Ayarekar <[email protected]>
Signed-off-by: Satananda Burla <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Veerasenareddy Burru authored and davem330 committed Mar 27, 2023
1 parent fbf8ba5 commit 10c073e
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions drivers/net/ethernet/marvell/octeon_ep/octep_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,26 @@ static void octep_device_cleanup(struct octep_device *oct)
oct->conf = NULL;
}

static bool get_fw_ready_status(struct pci_dev *pdev)
{
u32 pos = 0;
u16 vsec_id;
u8 status;

while ((pos = pci_find_next_ext_capability(pdev, pos,
PCI_EXT_CAP_ID_VNDR))) {
pci_read_config_word(pdev, pos + 4, &vsec_id);
#define FW_STATUS_VSEC_ID 0xA3
if (vsec_id != FW_STATUS_VSEC_ID)
continue;

pci_read_config_byte(pdev, (pos + 8), &status);
dev_info(&pdev->dev, "Firmware ready status = %u\n", status);
return status;
}
return false;
}

/**
* octep_probe() - Octeon PCI device probe handler.
*
Expand Down Expand Up @@ -1051,6 +1071,12 @@ static int octep_probe(struct pci_dev *pdev, const struct pci_device_id *ent)

pci_set_master(pdev);

if (!get_fw_ready_status(pdev)) {
dev_notice(&pdev->dev, "Firmware not ready; defer probe.\n");
err = -EPROBE_DEFER;
goto err_alloc_netdev;
}

netdev = alloc_etherdev_mq(sizeof(struct octep_device),
OCTEP_MAX_QUEUES);
if (!netdev) {
Expand Down

0 comments on commit 10c073e

Please sign in to comment.