[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230724094821.14295-4-louis.peens@corigine.com>
Date: Mon, 24 Jul 2023 11:48:12 +0200
From: Louis Peens <louis.peens@...igine.com>
To: David Miller <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>
Cc: Simon Horman <simon.horman@...igine.com>,
Yinjun Zhang <yinjun.zhang@...igine.com>,
Tianyu Yuan <tianyu.yuan@...igine.com>,
netdev@...r.kernel.org,
oss-drivers@...igine.com
Subject: [PATCH net-next 03/12] nfp: change application firmware loading flow in multi-PF setup
From: Yinjun Zhang <yinjun.zhang@...igine.com>
In multi-PF setup, all PFs share the single application firmware.
Each PF is treated equally, and first-come-first-served. So the
first step is to check firmware is loaded or not. And also loading
firmware from disk and flash are treated consistently, both
propagating the failure and setting `fw_loaded` flag. At last,
firmware shouldn't be unloaded in this setup. The following commit
will introduce a keepalive mechanism to let management firmware
manage unloading.
The flow is not changed in non-multi-PF setup.
Signed-off-by: Yinjun Zhang <yinjun.zhang@...igine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@...igine.com>
Acked-by: Simon Horman <simon.horman@...igine.com>
Signed-off-by: Louis Peens <louis.peens@...igine.com>
---
drivers/net/ethernet/netronome/nfp/nfp_main.c | 33 +++++++++++++++----
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index 39c1327625fa..c81784a626a6 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -528,6 +528,10 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
if (err)
return err;
+ /* Skip firmware loading in multi-PF setup if firmware is loaded. */
+ if (pf->multi_pf.en && nfp_nsp_fw_loaded(nsp))
+ return 1;
+
fw = nfp_net_fw_find(pdev, pf);
do_reset = reset == NFP_NSP_DRV_RESET_ALWAYS ||
(fw && reset == NFP_NSP_DRV_RESET_DISK);
@@ -556,16 +560,30 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
fw_loaded = true;
} else if (policy != NFP_NSP_APP_FW_LOAD_DISK &&
nfp_nsp_has_stored_fw_load(nsp)) {
+ err = nfp_nsp_load_stored_fw(nsp);
- /* Don't propagate this error to stick with legacy driver
+ /* For single-PF setup:
+ * Don't propagate this error to stick with legacy driver
* behavior, failure will be detected later during init.
+ * Don't flag the fw_loaded in this case since other devices
+ * may reuse the firmware when configured this way.
+ *
+ * For multi-PF setup:
+ * We only reach here when firmware is freshly loaded from
+ * flash, so need propagate the error and flow the fw_loaded
+ * as it does when loading firmware from disk.
*/
- if (!nfp_nsp_load_stored_fw(nsp))
+ if (!err) {
dev_info(&pdev->dev, "Finished loading stored FW image\n");
- /* Don't flag the fw_loaded in this case since other devices
- * may reuse the firmware when configured this way
- */
+ if (pf->multi_pf.en)
+ fw_loaded = true;
+ } else {
+ if (pf->multi_pf.en)
+ dev_err(&pdev->dev, "Stored FW loading failed: %d\n", err);
+ else
+ err = 0;
+ }
} else {
dev_warn(&pdev->dev, "Didn't load firmware, please update flash or reconfigure card\n");
}
@@ -575,9 +593,10 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
/* We don't want to unload firmware when other devices may still be
* dependent on it, which could be the case if there are multiple
- * devices that could load firmware.
+ * devices that could load firmware or the case multiple PFs are
+ * running.
*/
- if (fw_loaded && ifcs == 1)
+ if (fw_loaded && ifcs == 1 && !pf->multi_pf.en)
pf->unload_fw_on_remove = true;
return err < 0 ? err : fw_loaded;
--
2.34.1
Powered by blists - more mailing lists