summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2017-09-13 13:15:59 -0400
committerDavid S. Miller <davem@davemloft.net>2017-09-13 16:29:13 -0400
commit4cbe94f2af25bf8f4d5dea56c770937d896342bf (patch)
treedf8620d3cc89fb118b4afc169b39e8a17a69d1dc
parentb95a2d831b815189618d18e3e89bcfa5072351a1 (diff)
nfp: wait for board state before talking to the NSP
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>
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_main.c43
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_main.c23
2 files changed, 43 insertions, 23 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index f055b1774d65..424707d41fbd 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -74,6 +74,45 @@ static const struct pci_device_id nfp_pci_device_ids[] = {
74}; 74};
75MODULE_DEVICE_TABLE(pci, nfp_pci_device_ids); 75MODULE_DEVICE_TABLE(pci, nfp_pci_device_ids);
76 76
77static bool nfp_board_ready(struct nfp_pf *pf)
78{
79 const char *cp;
80 long state;
81 int err;
82
83 cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
84 if (!cp)
85 return false;
86
87 err = kstrtol(cp, 0, &state);
88 if (err < 0)
89 return false;
90
91 return state == 15;
92}
93
94static int nfp_pf_board_state_wait(struct nfp_pf *pf)
95{
96 const unsigned long wait_until = jiffies + 10 * HZ;
97
98 while (!nfp_board_ready(pf)) {
99 if (time_is_before_eq_jiffies(wait_until)) {
100 nfp_err(pf->cpp, "NFP board initialization timeout\n");
101 return -EINVAL;
102 }
103
104 nfp_info(pf->cpp, "waiting for board initialization\n");
105 if (msleep_interruptible(500))
106 return -ERESTARTSYS;
107
108 /* Refresh cached information */
109 kfree(pf->hwinfo);
110 pf->hwinfo = nfp_hwinfo_read(pf->cpp);
111 }
112
113 return 0;
114}
115
77static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf) 116static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
78{ 117{
79 int err; 118 int err;
@@ -425,6 +464,10 @@ static int nfp_pci_probe(struct pci_dev *pdev,
425 nfp_hwinfo_lookup(pf->hwinfo, "assembly.revision"), 464 nfp_hwinfo_lookup(pf->hwinfo, "assembly.revision"),
426 nfp_hwinfo_lookup(pf->hwinfo, "cpld.version")); 465 nfp_hwinfo_lookup(pf->hwinfo, "cpld.version"));
427 466
467 err = nfp_pf_board_state_wait(pf);
468 if (err)
469 goto err_hwinfo_free;
470
428 err = devlink_register(devlink, &pdev->dev); 471 err = devlink_register(devlink, &pdev->dev);
429 if (err) 472 if (err)
430 goto err_hwinfo_free; 473 goto err_hwinfo_free;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
index 5abb9ba31e7d..ff373acd28f3 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
@@ -64,23 +64,6 @@
64 64
65#define NFP_PF_CSR_SLICE_SIZE (32 * 1024) 65#define NFP_PF_CSR_SLICE_SIZE (32 * 1024)
66 66
67static int nfp_is_ready(struct nfp_pf *pf)
68{
69 const char *cp;
70 long state;
71 int err;
72
73 cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
74 if (!cp)
75 return 0;
76
77 err = kstrtol(cp, 0, &state);
78 if (err < 0)
79 return 0;
80
81 return state == 15;
82}
83
84/** 67/**
85 * nfp_net_get_mac_addr() - Get the MAC address. 68 * nfp_net_get_mac_addr() - Get the MAC address.
86 * @pf: NFP PF handle 69 * @pf: NFP PF handle
@@ -725,12 +708,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
725 708
726 INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics); 709 INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics);
727 710
728 /* Verify that the board has completed initialization */
729 if (!nfp_is_ready(pf)) {
730 nfp_err(pf->cpp, "NFP is not ready for NIC operation.\n");
731 return -EINVAL;
732 }
733
734 if (!pf->rtbl) { 711 if (!pf->rtbl) {
735 nfp_err(pf->cpp, "No %s, giving up.\n", 712 nfp_err(pf->cpp, "No %s, giving up.\n",
736 pf->fw_loaded ? "symbol table" : "firmware found"); 713 pf->fw_loaded ? "symbol table" : "firmware found");