From: Jiri Pirko <jiri@resnulli.us>
To: Jakub Kicinski <jakub.kicinski@netronome.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
oss-drivers@netronome.com, mkubecek@suse.cz, andrew@lunn.ch
Subject: Re: [PATCH net-next 3/3] nfp: devlink: allow flashing the device via devlink
Date: Fri, 15 Feb 2019 11:15:14 +0100 [thread overview]
Message-ID: <20190215101514.GD2343@nanopsycho> (raw)
In-Reply-To: <20190214214046.19182-4-jakub.kicinski@netronome.com>
Thu, Feb 14, 2019 at 10:40:46PM CET, jakub.kicinski@netronome.com wrote:
>Devlink now allows updating device flash. Implement this
>callback.
>
>Compared to ethtool update we no longer have to release
>the networking locks - devlink doesn't take them.
>
>Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
>---
> .../net/ethernet/netronome/nfp/nfp_devlink.c | 10 +++++
> drivers/net/ethernet/netronome/nfp/nfp_main.c | 41 +++++++++++++++++++
> drivers/net/ethernet/netronome/nfp/nfp_main.h | 2 +
> .../ethernet/netronome/nfp/nfp_net_ethtool.c | 35 ++--------------
> 4 files changed, 56 insertions(+), 32 deletions(-)
>
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>index 080a301f379e..db2da99f6aa7 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>@@ -330,6 +330,15 @@ nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
> return err;
> }
>
>+static int
>+nfp_devlink_flash_update(struct devlink *devlink, const char *path,
devlink code calles "path" a "file_name". It is good to be consistent in
this.
Other than this, the patch looks fine:
>+ const char *component, struct netlink_ext_ack *extack)
>+{
>+ if (component)
>+ return -EOPNOTSUPP;
>+ return nfp_flash_update_common(devlink_priv(devlink), path, extack);
>+}
>+
> const struct devlink_ops nfp_devlink_ops = {
> .port_split = nfp_devlink_port_split,
> .port_unsplit = nfp_devlink_port_unsplit,
>@@ -338,6 +347,7 @@ const struct devlink_ops nfp_devlink_ops = {
> .eswitch_mode_get = nfp_devlink_eswitch_mode_get,
> .eswitch_mode_set = nfp_devlink_eswitch_mode_set,
> .info_get = nfp_devlink_info_get,
>+ .flash_update = nfp_devlink_flash_update,
> };
>
> int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
>index 6c10e8d119e4..f4c8776e42b6 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
>@@ -300,6 +300,47 @@ static int nfp_pcie_sriov_configure(struct pci_dev *pdev, int num_vfs)
> return nfp_pcie_sriov_enable(pdev, num_vfs);
> }
>
>+int nfp_flash_update_common(struct nfp_pf *pf, const char *path,
>+ struct netlink_ext_ack *extack)
>+{
>+ struct device *dev = &pf->pdev->dev;
>+ const struct firmware *fw;
>+ struct nfp_nsp *nsp;
>+ int err;
>+
>+ nsp = nfp_nsp_open(pf->cpp);
>+ if (IS_ERR(nsp)) {
>+ err = PTR_ERR(nsp);
>+ if (extack)
>+ NL_SET_ERR_MSG_MOD(extack, "can't access NSP");
>+ else
>+ dev_err(dev, "Failed to access the NSP: %d\n", err);
>+ return err;
>+ }
>+
>+ err = request_firmware_direct(&fw, path, dev);
>+ if (err) {
>+ NL_SET_ERR_MSG_MOD(extack,
>+ "unable to read flash file from disk");
>+ goto exit_close_nsp;
>+ }
>+
>+ dev_info(dev, "Please be patient while writing flash image: %s\n",
>+ path);
>+
>+ err = nfp_nsp_write_flash(nsp, fw);
>+ if (err < 0)
>+ goto exit_release_fw;
>+ dev_info(dev, "Finished writing flash image\n");
>+ err = 0;
>+
>+exit_release_fw:
>+ release_firmware(fw);
>+exit_close_nsp:
>+ nfp_nsp_close(nsp);
>+ return err;
>+}
>+
> static const struct firmware *
> nfp_net_fw_request(struct pci_dev *pdev, struct nfp_pf *pf, const char *name)
> {
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.h b/drivers/net/ethernet/netronome/nfp/nfp_main.h
>index a3613a2e0aa5..b7211f200d22 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_main.h
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.h
>@@ -164,6 +164,8 @@ nfp_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt,
> unsigned int min_size, struct nfp_cpp_area **area);
> int nfp_mbox_cmd(struct nfp_pf *pf, u32 cmd, void *in_data, u64 in_length,
> void *out_data, u64 out_length);
>+int nfp_flash_update_common(struct nfp_pf *pf, const char *path,
>+ struct netlink_ext_ack *extack);
>
> enum nfp_dump_diag {
> NFP_DUMP_NSP_DIAG = 0,
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
>index cb9c512abc76..8f189149efc5 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
>@@ -1237,11 +1237,8 @@ static int nfp_net_set_channels(struct net_device *netdev,
> static int
> nfp_net_flash_device(struct net_device *netdev, struct ethtool_flash *flash)
> {
>- const struct firmware *fw;
> struct nfp_app *app;
>- struct nfp_nsp *nsp;
>- struct device *dev;
>- int err;
>+ int ret;
>
> if (flash->region != ETHTOOL_FLASH_ALL_REGIONS)
> return -EOPNOTSUPP;
>@@ -1250,39 +1247,13 @@ nfp_net_flash_device(struct net_device *netdev, struct ethtool_flash *flash)
> if (!app)
> return -EOPNOTSUPP;
>
>- dev = &app->pdev->dev;
>-
>- nsp = nfp_nsp_open(app->cpp);
>- if (IS_ERR(nsp)) {
>- err = PTR_ERR(nsp);
>- dev_err(dev, "Failed to access the NSP: %d\n", err);
>- return err;
>- }
>-
>- err = request_firmware_direct(&fw, flash->data, dev);
>- if (err)
>- goto exit_close_nsp;
>-
>- dev_info(dev, "Please be patient while writing flash image: %s\n",
>- flash->data);
> dev_hold(netdev);
> rtnl_unlock();
>-
>- err = nfp_nsp_write_flash(nsp, fw);
>- if (err < 0) {
>- dev_err(dev, "Flash write failed: %d\n", err);
>- goto exit_rtnl_lock;
>- }
>- dev_info(dev, "Finished writing flash image\n");
>-
>-exit_rtnl_lock:
>+ ret = nfp_flash_update_common(app->pf, flash->data, NULL);
> rtnl_lock();
> dev_put(netdev);
>- release_firmware(fw);
>
>-exit_close_nsp:
>- nfp_nsp_close(nsp);
>- return err;
>+ return ret;
> }
>
> static const struct ethtool_ops nfp_net_ethtool_ops = {
Why don't you use the compat fallback? I think you should.
>--
>2.19.2
>
next prev parent reply other threads:[~2019-02-15 10:24 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-14 21:40 [PATCH net-next 0/3] devlink: add the ability to update device flash Jakub Kicinski
2019-02-14 21:40 ` [PATCH net-next 1/3] devlink: add flash update command Jakub Kicinski
2019-02-15 10:10 ` Jiri Pirko
2019-02-14 21:40 ` [PATCH net-next 2/3] ethtool: add compat for flash update Jakub Kicinski
2019-02-15 8:53 ` Michal Kubecek
2019-02-15 10:17 ` Jiri Pirko
2019-02-15 15:51 ` Jakub Kicinski
2019-02-15 10:12 ` Jiri Pirko
2019-02-14 21:40 ` [PATCH net-next 3/3] nfp: devlink: allow flashing the device via devlink Jakub Kicinski
2019-02-15 10:15 ` Jiri Pirko [this message]
2019-02-15 15:44 ` Jakub Kicinski
2019-02-19 9:19 ` Jiri Pirko
2019-02-20 0:49 ` Jakub Kicinski
2019-02-20 8:37 ` Jiri Pirko
2019-02-21 2:59 ` Florian Fainelli
2019-02-21 3:20 ` Jakub Kicinski
2019-02-21 7:00 ` Jiri Pirko
2019-02-21 7:17 ` Michal Kubecek
2019-02-15 10:26 ` Michal Kubecek
2019-02-17 23:28 ` [PATCH net-next 0/3] devlink: add the ability to update device flash David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190215101514.GD2343@nanopsycho \
--to=jiri@resnulli.us \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=jakub.kicinski@netronome.com \
--cc=mkubecek@suse.cz \
--cc=netdev@vger.kernel.org \
--cc=oss-drivers@netronome.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).