};
 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;
                 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;
 
 
 #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
 
        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");