aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/nfp_main.c
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2017-02-19 11:58:08 -0800
committerDavid S. Miller <davem@davemloft.net>2017-02-20 11:18:49 -0500
commita9c83f7bc7c121c99457553f8d1c3e231a9ba6df (patch)
treed3de7fe08e8737bdb8a405037f0d4776f635cea1 /drivers/net/ethernet/netronome/nfp/nfp_main.c
parentMerge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next (diff)
downloadlinux-dev-a9c83f7bc7c121c99457553f8d1c3e231a9ba6df.tar.xz
linux-dev-a9c83f7bc7c121c99457553f8d1c3e231a9ba6df.zip
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>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/nfp_main.c')
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_main.c59
1 files changed, 36 insertions, 23 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index db52b6a53c6f..ca2c464c15df 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -228,6 +228,40 @@ exit_release_fw:
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)
{
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,
const struct pci_device_id *pci_id)
{
- struct nfp_nsp *nsp;
struct nfp_pf *pf;
int err;
@@ -289,28 +322,9 @@ static int nfp_pci_probe(struct pci_dev *pdev,
goto err_disable_msix;
}
- nsp = nfp_nsp_open(pf->cpp);
- if (IS_ERR(nsp)) {
- err = PTR_ERR(nsp);
- goto err_cpp_free;
- }
-
- err = nfp_nsp_wait(nsp);
- if (err < 0) {
- nfp_nsp_close(nsp);
+ err = nfp_nsp_init(pdev, pf);
+ if (err)
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);
if (err)
@@ -321,7 +335,6 @@ static int nfp_pci_probe(struct pci_dev *pdev,
err_fw_unload:
if (pf->fw_loaded)
nfp_fw_unload(pf);
-err_eth_tbl_free:
kfree(pf->eth_tbl);
err_cpp_free:
nfp_cpp_free(pf->cpp);