nfp: refactor NSP initialization and add error message

When acquiring NSP communication resource fails user is left with
"probe failed with error -2" PCI code message but no info on what
caused the problem.  Some development boards may not have NSP FW
in the flash image.  Help users with a more verbouse message.

While at it move the whole NSP init to a separate function to keep
.probe() callback nice and simple.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jakub Kicinski 2017-02-19 11:58:08 -08:00 committed by David S. Miller
parent c1ceee5efe
commit a9c83f7bc7

View File

@ -228,6 +228,40 @@ exit_release_fw:
return err < 0 ? err : 1; return err < 0 ? err : 1;
} }
static int nfp_nsp_init(struct pci_dev *pdev, struct nfp_pf *pf)
{
struct nfp_nsp *nsp;
int err;
nsp = nfp_nsp_open(pf->cpp);
if (IS_ERR(nsp)) {
err = PTR_ERR(nsp);
dev_err(&pdev->dev, "Failed to access the NSP: %d\n", err);
return err;
}
err = nfp_nsp_wait(nsp);
if (err < 0)
goto exit_close_nsp;
pf->eth_tbl = __nfp_eth_read_ports(pf->cpp, nsp);
err = nfp_fw_load(pdev, pf, nsp);
if (err < 0) {
kfree(pf->eth_tbl);
dev_err(&pdev->dev, "Failed to load FW\n");
goto exit_close_nsp;
}
pf->fw_loaded = !!err;
err = 0;
exit_close_nsp:
nfp_nsp_close(nsp);
return err;
}
static void nfp_fw_unload(struct nfp_pf *pf) static void nfp_fw_unload(struct nfp_pf *pf)
{ {
struct nfp_nsp *nsp; struct nfp_nsp *nsp;
@ -251,7 +285,6 @@ static void nfp_fw_unload(struct nfp_pf *pf)
static int nfp_pci_probe(struct pci_dev *pdev, static int nfp_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *pci_id) const struct pci_device_id *pci_id)
{ {
struct nfp_nsp *nsp;
struct nfp_pf *pf; struct nfp_pf *pf;
int err; int err;
@ -289,28 +322,9 @@ static int nfp_pci_probe(struct pci_dev *pdev,
goto err_disable_msix; goto err_disable_msix;
} }
nsp = nfp_nsp_open(pf->cpp); err = nfp_nsp_init(pdev, pf);
if (IS_ERR(nsp)) { if (err)
err = PTR_ERR(nsp);
goto err_cpp_free; goto err_cpp_free;
}
err = nfp_nsp_wait(nsp);
if (err < 0) {
nfp_nsp_close(nsp);
goto err_cpp_free;
}
pf->eth_tbl = __nfp_eth_read_ports(pf->cpp, nsp);
err = nfp_fw_load(pdev, pf, nsp);
nfp_nsp_close(nsp);
if (err < 0) {
dev_err(&pdev->dev, "Failed to load FW\n");
goto err_eth_tbl_free;
}
pf->fw_loaded = !!err;
err = nfp_net_pci_probe(pf); err = nfp_net_pci_probe(pf);
if (err) if (err)
@ -321,7 +335,6 @@ static int nfp_pci_probe(struct pci_dev *pdev,
err_fw_unload: err_fw_unload:
if (pf->fw_loaded) if (pf->fw_loaded)
nfp_fw_unload(pf); nfp_fw_unload(pf);
err_eth_tbl_free:
kfree(pf->eth_tbl); kfree(pf->eth_tbl);
err_cpp_free: err_cpp_free:
nfp_cpp_free(pf->cpp); nfp_cpp_free(pf->cpp);