From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B015FC43381 for ; Fri, 15 Feb 2019 10:24:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7232321924 for ; Fri, 15 Feb 2019 10:24:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="MdL1HLcF" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729051AbfBOKYp (ORCPT ); Fri, 15 Feb 2019 05:24:45 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:42023 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726202AbfBOKYp (ORCPT ); Fri, 15 Feb 2019 05:24:45 -0500 Received: by mail-wr1-f67.google.com with SMTP id q18so9718589wrx.9 for ; Fri, 15 Feb 2019 02:24:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=2MIo0QeLkbi7b/DWm2tdXtdIvRt2o+fuS0PW217GfEI=; b=MdL1HLcFs852E3GCN+xTsIN1KwVe98vb77grG6WvQzwvPcMLf99hP1V9pPeqWJF7rk VtjdN4GzENjnXofo6/0sk8EQALNV9F2drmkHDTvlHKFLTPYxOiRAGBvqJqOwuiW302/A S8MXZ2Rlle1X95xcbq01SfMFsN4a0YLqT0FcXkY5oXx+DsBtNOpYiQAySL6BQPlLRC4m D1gg3f21xxzj5UW7gFftjaHUJZNB1wgLsUr0k08nONbKLUUH+BJ2q4zi0VH6eZROFS/Z lFlfLYsh24LGCFhyqblozQUCusZuGL4NkXhYQ0vpte3FGwdX3TsQKUUk1bXhxVAQC1p9 5xPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=2MIo0QeLkbi7b/DWm2tdXtdIvRt2o+fuS0PW217GfEI=; b=OxDz07WpQgbqDaaPBaNZS/1BHzUaCbQ3QajbUemFET9cufm65o76lUgNYS8EifM2yS bltzLUK+ZhWIbgnpSa/UCXEuM/ST2Q4PPXeVSCaDp5zViifvfF/AFR6K8XHBZUSHslFo itb1sOpR9Yk7Fla46RmsBhPgymNxjFRYmFguvGPowdGzMLtYfJAb7/HYCj6crcPGbdFU 2G5xOnY7h0nM9JJWLhySbvoTQ+5aMaR90+UAlyotqAD8lDBgpdp932RFY4JBopBTgNUb Ctz1C2YtDZXNJ+SntUX5RCHnBAiy6GUXSFWz2TUUs0Nvqq35eH8qhBlAEDhrENPjF5mM G/4A== X-Gm-Message-State: AHQUAuZsFc4iwUE8K4tpveNJNHGsQTuztdEHVmJTyT0Pty49vdGLb+qJ SPA/3NtwM67j/ih8b+rHXmsEjA== X-Google-Smtp-Source: AHgI3IYQjn3ro5W/RkmOnBBxxePJhByMrxdIV8VXQnAfDZxO0BrgFIwBWsOWcQxwaIqmgL25LLVHow== X-Received: by 2002:adf:e5c5:: with SMTP id a5mr6266299wrn.13.1550226282750; Fri, 15 Feb 2019 02:24:42 -0800 (PST) Received: from localhost (ip-89-177-129-54.net.upcbroadband.cz. [89.177.129.54]) by smtp.gmail.com with ESMTPSA id o5sm5499041wmh.12.2019.02.15.02.24.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Feb 2019 02:24:42 -0800 (PST) Date: Fri, 15 Feb 2019 11:15:14 +0100 From: Jiri Pirko To: Jakub Kicinski 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 Message-ID: <20190215101514.GD2343@nanopsycho> References: <20190214214046.19182-1-jakub.kicinski@netronome.com> <20190214214046.19182-4-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190214214046.19182-4-jakub.kicinski@netronome.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 >--- > .../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 >