From patchwork Mon Feb 11 06:59:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1039662 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="HA/qUg4o"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43yc9D5zqgz9sML for ; Mon, 11 Feb 2019 17:59:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726107AbfBKG7m (ORCPT ); Mon, 11 Feb 2019 01:59:42 -0500 Received: from mail-qt1-f194.google.com ([209.85.160.194]:43061 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725931AbfBKG7l (ORCPT ); Mon, 11 Feb 2019 01:59:41 -0500 Received: by mail-qt1-f194.google.com with SMTP id y4so10979793qtc.10 for ; Sun, 10 Feb 2019 22:59:40 -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=fa1D7xTzpGSJ1/Y3iBQ+NrEeWqLNKBcNmxvozXYCDAg=; b=HA/qUg4ofHsQPWiWKxWFyUFWD+g94zZ9N60z1TFrCKK6gDsquKBsnkpzFHOD7m1lke bPILR/yIQ33jKiP12HOLw6XjuWW04z1TtWCitOuHmBhbUHy4CO4bZEL0fwvHYEZ43P7F ee8bVQxuJ2SeoijVjdlfgmRCpnyhyXJvUHJSe2Jko4xYWQaWR2i3SSB1SYTa6GpYyD5j yO0yZMG+IHnz3Op8utq0/jSou0MworwTdsm6Fnl294P/hbsni1chPYP961cbr5KQXxqi 9NA77co/rqIXx/wuOU3n6zJmIZhSYVlBfIHScYOA7lgFU2qsnIm1ZpN6fy4/lWdKLum8 tlCw== 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=fa1D7xTzpGSJ1/Y3iBQ+NrEeWqLNKBcNmxvozXYCDAg=; b=tksMOpxeTh0Xkr5HUh6I+VEi240n3DtpTj+siqm1W3FMF67GhHXETWGjVXPWOiG9ij sF6bW4dq0daxDXLTGs5KetySrYcQzwXq4MdKmNtmvPl3RLOfu6qV8U3efRYgeApQJeWD h9fBtZcpE2F1/nWtrQFvMx2v3YDN6wj/iSOdsHCI2ovXyTlrtwoXmCVQ9n/ICNju2pzX 50xyKaXuOv8i3iRhNaZbigJn0CqRJvDtwhpebQ0yzd86HapflffFVJ9y0xgZ3lRgnvwH 3npLvTY/WFGL8LfhS/XrtE4yd1PTNK0zIop2VhLhbv9EF3b0/ahBECZtBHRbuGNGr9It nbkA== X-Gm-Message-State: AHQUAuY7iVbtbKJhQtE/2regCEbhxmRdlD1ASuCdljKmkuizp5HaoYKT S+vaV/TPuSRXx/0asBVwqb4nMQ== X-Google-Smtp-Source: AHgI3IaGADWR2dd5dgliKd0vYbbmsaVrEE9mPo4vc4F1vpacE6XkzygEfDpQDJo7A5FYwy8GWD+YAA== X-Received: by 2002:ac8:2524:: with SMTP id 33mr5866109qtm.165.1549868380057; Sun, 10 Feb 2019 22:59:40 -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.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Feb 2019 22:59:39 -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 1/3] devlink: add flash update command Date: Sun, 10 Feb 2019 22:59:20 -0800 Message-Id: <20190211065923.22670-2-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 Add devlink flash update command. Advanced NICs have firmware stored in flash and often cryptographically secured. Updating that flash is handled by management firmware. Ethtool has a flash update command which served us well, however, it has two shortcomings: - it takes rtnl_lock unnecessarily - really flash update has nothing to do with networking, so using a networking device as a handle is suboptimal, which leads us to the second one: - it requires a functioning netdev - in case device enters an error state and can't spawn a netdev (e.g. communication with the device fails) there is no netdev to use as a handle for flashing. Devlink already has the ability to report the firmware versions, now with the ability to update the firmware/flash we will be able to recover devices in bad state. To enable easy interoperability with ethtool add the target partition ID. We may or may not add a different method of identification, but there is no such immediate need. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 2 ++ include/uapi/linux/devlink.h | 6 ++++++ net/core/devlink.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index 07660fe4c0e3..55b3478b1291 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -529,6 +529,8 @@ struct devlink_ops { struct netlink_ext_ack *extack); int (*info_get)(struct devlink *devlink, struct devlink_info_req *req, struct netlink_ext_ack *extack); + int (*flash_update)(struct devlink *devlink, const char *path, + u32 target, struct netlink_ext_ack *extack); }; static inline void *devlink_priv(struct devlink *devlink) diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 72d9f7c89190..f4417283fd1b 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -103,6 +103,8 @@ enum devlink_command { DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET, DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR, + DEVLINK_CMD_FLASH_UPDATE, + /* add new commands above here */ __DEVLINK_CMD_MAX, DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 @@ -326,6 +328,10 @@ enum devlink_attr { DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS, /* u64 */ DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD, /* u64 */ DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER, /* u8 */ + + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, /* string */ + DEVLINK_ATTR_FLASH_UPDATE_TARGET_ID, /* u32 */ + /* add new attributes above here, update the policy in devlink.c */ __DEVLINK_ATTR_MAX, diff --git a/net/core/devlink.c b/net/core/devlink.c index 46c468a1f3dc..a4b5e194e33e 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -2660,6 +2660,27 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) return devlink->ops->reload(devlink, info->extack); } +static int devlink_nl_cmd_flash_update(struct sk_buff *skb, + struct genl_info *info) +{ + struct devlink *devlink = info->user_ptr[0]; + const char *file_name; + u32 target = 0; + + if (!devlink->ops->flash_update) + return -EOPNOTSUPP; + + if (!info->attrs[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME]) + return -EINVAL; + file_name = nla_data(info->attrs[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME]); + + if (info->attrs[DEVLINK_ATTR_FLASH_UPDATE_TARGET_ID]) + target = nla_get_u32(info->attrs[DEVLINK_ATTR_FLASH_UPDATE_TARGET_ID]); + + return devlink->ops->flash_update(devlink, file_name, target, + info->extack); +} + static const struct devlink_param devlink_param_generic[] = { { .id = DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET, @@ -4876,6 +4897,8 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64 }, [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .type = NLA_U8 }, + [DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME] = { .type = NLA_NUL_STRING }, + [DEVLINK_ATTR_FLASH_UPDATE_TARGET_ID] = { .type = NLA_U32 }, }; static const struct genl_ops devlink_nl_ops[] = { @@ -5164,6 +5187,13 @@ static const struct genl_ops devlink_nl_ops[] = { .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK | DEVLINK_NL_FLAG_NO_LOCK, }, + { + .cmd = DEVLINK_CMD_FLASH_UPDATE, + .doit = devlink_nl_cmd_flash_update, + .policy = devlink_nl_policy, + .flags = GENL_ADMIN_PERM, + .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, + }, }; static struct genl_family devlink_nl_family __ro_after_init = { From patchwork Mon Feb 11 06:59:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1039663 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="W/pGptXM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43yc9F4qpmz9s4Z for ; Mon, 11 Feb 2019 17:59:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726228AbfBKG7n (ORCPT ); Mon, 11 Feb 2019 01:59:43 -0500 Received: from mail-qk1-f169.google.com ([209.85.222.169]:41422 "EHLO mail-qk1-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726041AbfBKG7m (ORCPT ); Mon, 11 Feb 2019 01:59:42 -0500 Received: by mail-qk1-f169.google.com with SMTP id u188so5817147qkh.8 for ; Sun, 10 Feb 2019 22:59:42 -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=QBjy8du5L20NuHE4fD0jMHDl8jerhAg/Q35MnqPk/V0=; b=W/pGptXMbGVpCrJ5f1p8e6l7DPaMtW+cpdYQm6WGJJAodiK5YvrgWCdz4tYnI/VuSY 9YPVprmIWgxy6UzqxNGU/7t41rR8nkXNduf78RiJpovCzAQtFvKGMv+vDmp3TVw9dS/A r/8oivlPqzzXoLACV77rk5dqOPSVMdNe2XcGKQPm/I7t/5a42gIB9C7A7dag34gh5Fg3 jLybkRJ7aMcFJWi0h26TCsTvUqiXcBE0V9uqJCI6GY6DSezO9GLlddj0rtOBs4sHwypL 6oJxGkKF6bRDKEwIPnFClm/MQsdBmf9puZ51KAsvsM8WoAYRDikISy056HuKL343iLXT kxMA== 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=QBjy8du5L20NuHE4fD0jMHDl8jerhAg/Q35MnqPk/V0=; b=gfvQo2NjU08OiD3v2rMpL1V6eP9XAhzCjlVeWwm0eCfacqkZmQbaInvJSciSwvoOGT b4KaplXRMgDRjKYZrkqztYzrxLSAcv4KIfaj12Q/5RfK3x6E5IES4HBaYYtDsNPJVHz2 WmNFMCzdNCVJchj1PUgg9jz7opnWUR2lterlRZ/PB0Gm281JTWODIn/ZicD+VJtMwtG9 h+HJ6mheG9YHtwAQy6rokjoCL6nvaaUyJZMyI6wlufx6+07ZZtfCysl2A8AP7pBrqKyh ki6sNTjktKk/mB/56YMbQnwwGZ9olTGnDfLCygx83zscBsoGAzvIZ3JFMC43w+ny+152 MW1A== X-Gm-Message-State: AHQUAuadmmLJKwdjnL0scblUPeSYk+WMfAzkGGn9m54Jpp3qfdzuR71R Psg6rbPcVF3kxVPRWDplWZa89A== X-Google-Smtp-Source: AHgI3Ia/ieW4Q8pjdxSDg2nb3qZXy9D90hJUykTRaFPOwhAGTYE3oVcehxHCnV/xxOsPgnF4GDzCqA== X-Received: by 2002:a37:b381:: with SMTP id c123mr24485462qkf.346.1549868381554; Sun, 10 Feb 2019 22:59:41 -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.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Feb 2019 22:59:41 -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 2/3] ethtool: add compat for flash update Date: Sun, 10 Feb 2019 22:59:21 -0800 Message-Id: <20190211065923.22670-3-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 If driver does not support ethtool flash update operation call into devlink. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 9 +++++++++ net/core/devlink.c | 31 +++++++++++++++++++++++++++++++ net/core/ethtool.c | 12 +++++++++--- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 55b3478b1291..8fdadd0a43ce 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -1202,11 +1202,20 @@ devlink_health_report(struct devlink_health_reporter *reporter, #if IS_REACHABLE(CONFIG_NET_DEVLINK) void devlink_compat_running_version(struct net_device *dev, char *buf, size_t len); +int devlink_compat_flash_update(struct net_device *dev, const char *file_name, + u32 target); #else static inline void devlink_compat_running_version(struct net_device *dev, char *buf, size_t len) { } + +static inline int +devlink_compat_flash_update(struct net_device *dev, const char *file_name, + u32 target) +{ + return -EOPNOTSUPP; +} #endif #endif /* _NET_DEVLINK_H_ */ diff --git a/net/core/devlink.c b/net/core/devlink.c index a4b5e194e33e..fb1b0982281b 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -6435,6 +6435,37 @@ void devlink_compat_running_version(struct net_device *dev, mutex_unlock(&devlink_mutex); } +int devlink_compat_flash_update(struct net_device *dev, const char *file_name, + u32 target) +{ + struct devlink_port *devlink_port; + struct devlink *devlink; + + mutex_lock(&devlink_mutex); + list_for_each_entry(devlink, &devlink_list, list) { + mutex_lock(&devlink->lock); + list_for_each_entry(devlink_port, &devlink->port_list, list) { + int ret = -EOPNOTSUPP; + + if (devlink_port->type != DEVLINK_PORT_TYPE_ETH || + devlink_port->type_dev != dev) + continue; + + mutex_unlock(&devlink_mutex); + if (devlink->ops->flash_update) + ret = devlink->ops->flash_update(devlink, + file_name, + target, NULL); + mutex_unlock(&devlink->lock); + return ret; + } + mutex_unlock(&devlink->lock); + } + mutex_unlock(&devlink_mutex); + + return -EOPNOTSUPP; +} + static int __init devlink_module_init(void) { return genl_register_family(&devlink_nl_family); diff --git a/net/core/ethtool.c b/net/core/ethtool.c index d2c47cdf25da..389782ccd4c5 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -2038,11 +2038,17 @@ static noinline_for_stack int ethtool_flash_device(struct net_device *dev, if (copy_from_user(&efl, useraddr, sizeof(efl))) return -EFAULT; + efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0; - if (!dev->ethtool_ops->flash_device) - return -EOPNOTSUPP; + if (!dev->ethtool_ops->flash_device) { + int ret; - efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0; + rtnl_unlock(); + ret = devlink_compat_flash_update(dev, efl.data, efl.region); + rtnl_lock(); + + return ret; + } return dev->ethtool_ops->flash_device(dev, &efl); } 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 = {