From patchwork Mon Feb 11 06:59:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1039664 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Fl6mHb+d"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43yc9J0Pjjz9s4Z for ; Mon, 11 Feb 2019 17:59:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726308AbfBKG7p (ORCPT ); Mon, 11 Feb 2019 01:59:45 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:40736 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726207AbfBKG7o (ORCPT ); Mon, 11 Feb 2019 01:59:44 -0500 Received: by mail-qt1-f196.google.com with SMTP id j36so11002105qta.7 for ; Sun, 10 Feb 2019 22:59:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6RkyC9PGBuDgr+IFSK99uJJs8PpwvDHf9heOto2lqgQ=; b=Fl6mHb+dISCAt1GReB3+r0qt/LpZnbjeEOTGXAd01QwApvdBEeyGoLQ7QbKDgi7Y/b r8MjMefggev73INR3WkANHxJnZFakbLgPSs1xKnjJL4Duwl0uDcnxhKS9n6iNs9rw3Xu 1uN4gDZNgCpF3kbVkjC8YpqRgttcoGIX5h+6ygQqV63Swlj3VmC8PvWkDmBYHl845PVk qco/CWJp1JRZLPI0MHnQeOWL1H7bM0iE/mxd33IG/WLzk7RRjDGEyTXfRCiBdBkwhkFB 8H0ao2hHysExuG9kzaHtwfmoELL5e6DP8gWe/DtqaxEIFeBi4cF6i1uKigpdFEzuD4/9 S/IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6RkyC9PGBuDgr+IFSK99uJJs8PpwvDHf9heOto2lqgQ=; b=mPy7s2aB9hCKgKwt64UI6nTCbQMBzxiMIhFosi2W9680rk6zZwXt4AbjLfL5/+2tc+ FyBQcWgglCxBfp2I3Li0G+z3DOeh7FGRBFh6eDOwWrt0py2UE6r4/QvRVkDY9g2s3op0 WMKzTCH5+FisSKExG8PPC/72mmTIAGPXLnpVnM7GjfBdJRshxiA4nsxEQvXey6EHbOF7 /0c0xudywu8aqNgD2sCxb5/3zZeAllSW1f12SGGyMq3hOq0/7BLOsqWoR6ej8M0Y+Pe8 O3TxfH4evPbJbj2nl1NED7q7BVnXZdLA/z5M+xmyyk9XkJbNVpG5WYWI6abSJcP/+/hJ z4XQ== X-Gm-Message-State: AHQUAuZNzlsLhuKS/bgKJY5Jc8xcP5jS4UG6m3muB3lipAGGmPyi9TuK K0CxE4F0d1itp8tZjc5bOteaKA== X-Google-Smtp-Source: AHgI3IaeVIcseomF39Fyvx5xZKL4EmbPFeU1uFPjPOUbcSGbeTtREYxo3meC2Kw76+nnqHIMfIH32A== X-Received: by 2002:ac8:25d0:: with SMTP id f16mr26323112qtf.129.1549868383028; Sun, 10 Feb 2019 22:59:43 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id c68sm9677990qkf.65.2019.02.10.22.59.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Feb 2019 22:59:42 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net, jiri@resnulli.us Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, mkubecek@suse.cz, andrew@lunn.ch, Jakub Kicinski Subject: [RFC 3/3] nfp: devlink: allow flashing the device via devlink Date: Sun, 10 Feb 2019 22:59:22 -0800 Message-Id: <20190211065923.22670-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190211065923.22670-1-jakub.kicinski@netronome.com> References: <20190211065923.22670-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 | 9 ++++ drivers/net/ethernet/netronome/nfp/nfp_main.c | 44 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_main.h | 2 + .../ethernet/netronome/nfp/nfp_net_ethtool.c | 39 ++-------------- 4 files changed, 59 insertions(+), 35 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index 080a301f379e..ee45a6f9030a 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -330,6 +330,14 @@ 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, + u32 target, struct netlink_ext_ack *extack) +{ + return nfp_flash_update_common(devlink_priv(devlink), path, target, + extack); +} + const struct devlink_ops nfp_devlink_ops = { .port_split = nfp_devlink_port_split, .port_unsplit = nfp_devlink_port_unsplit, @@ -338,6 +346,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..3f55575c2929 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c @@ -300,6 +300,50 @@ 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, + u32 target, struct netlink_ext_ack *extack) +{ + struct device *dev = &pf->pdev->dev; + const struct firmware *fw; + struct nfp_nsp *nsp; + int err; + + if (target != ETHTOOL_FLASH_ALL_REGIONS) + return -EOPNOTSUPP; + + 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..6e4b509017c1 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, + u32 target, 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..244b60f406c2 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -1237,52 +1237,21 @@ 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; - - if (flash->region != ETHTOOL_FLASH_ALL_REGIONS) - return -EOPNOTSUPP; + int ret; app = nfp_app_from_netdev(netdev); 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, flash->region, + 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 = {