Skip to content

Commit

Permalink
nfp: wait for board state before talking to the NSP
Browse files Browse the repository at this point in the history
Board state informs us which low-level initialization stages the card
has completed.  We should wait for the card to be fully initialized
before trying to communicate with it, not only before we configure
passing traffic.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jakub Kicinski authored and David S. Miller committed Sep 13, 2017
1 parent b95a2d8 commit 4cbe94f
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 23 deletions.
43 changes: 43 additions & 0 deletions drivers/net/ethernet/netronome/nfp/nfp_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,45 @@ static const struct pci_device_id nfp_pci_device_ids[] = {
};
MODULE_DEVICE_TABLE(pci, nfp_pci_device_ids);

static bool nfp_board_ready(struct nfp_pf *pf)
{
const char *cp;
long state;
int err;

cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
if (!cp)
return false;

err = kstrtol(cp, 0, &state);
if (err < 0)
return false;

return state == 15;
}

static int nfp_pf_board_state_wait(struct nfp_pf *pf)
{
const unsigned long wait_until = jiffies + 10 * HZ;

while (!nfp_board_ready(pf)) {
if (time_is_before_eq_jiffies(wait_until)) {
nfp_err(pf->cpp, "NFP board initialization timeout\n");
return -EINVAL;
}

nfp_info(pf->cpp, "waiting for board initialization\n");
if (msleep_interruptible(500))
return -ERESTARTSYS;

/* Refresh cached information */
kfree(pf->hwinfo);
pf->hwinfo = nfp_hwinfo_read(pf->cpp);
}

return 0;
}

static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
{
int err;
Expand Down Expand Up @@ -425,6 +464,10 @@ static int nfp_pci_probe(struct pci_dev *pdev,
nfp_hwinfo_lookup(pf->hwinfo, "assembly.revision"),
nfp_hwinfo_lookup(pf->hwinfo, "cpld.version"));

err = nfp_pf_board_state_wait(pf);
if (err)
goto err_hwinfo_free;

err = devlink_register(devlink, &pdev->dev);
if (err)
goto err_hwinfo_free;
Expand Down
23 changes: 0 additions & 23 deletions drivers/net/ethernet/netronome/nfp/nfp_net_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,6 @@

#define NFP_PF_CSR_SLICE_SIZE (32 * 1024)

static int nfp_is_ready(struct nfp_pf *pf)
{
const char *cp;
long state;
int err;

cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
if (!cp)
return 0;

err = kstrtol(cp, 0, &state);
if (err < 0)
return 0;

return state == 15;
}

/**
* nfp_net_get_mac_addr() - Get the MAC address.
* @pf: NFP PF handle
Expand Down Expand Up @@ -725,12 +708,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf)

INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics);

/* Verify that the board has completed initialization */
if (!nfp_is_ready(pf)) {
nfp_err(pf->cpp, "NFP is not ready for NIC operation.\n");
return -EINVAL;
}

if (!pf->rtbl) {
nfp_err(pf->cpp, "No %s, giving up.\n",
pf->fw_loaded ? "symbol table" : "firmware found");
Expand Down

0 comments on commit 4cbe94f

Please sign in to comment.