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=-9.0 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,USER_AGENT_GIT 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 A6D50C43381 for ; Thu, 14 Feb 2019 21:41:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 751452147C for ; Thu, 14 Feb 2019 21:41:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="LT2k2azi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387641AbfBNVlM (ORCPT ); Thu, 14 Feb 2019 16:41:12 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:40680 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732405AbfBNVlK (ORCPT ); Thu, 14 Feb 2019 16:41:10 -0500 Received: by mail-qt1-f195.google.com with SMTP id j36so8654433qta.7 for ; Thu, 14 Feb 2019 13:41:09 -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=f2gy3TqHD1DjvvQQast2c/kBnbTiX6UZm1TSm4C/kYo=; b=LT2k2azicmToi5uG0VKvDmTCmW6CnCv0qfUGyBGk921/CBkGhERx44K7Zb0VkaR4T9 VkFeMKdWK/+nMBnw82KzHInJPsuQcHdgLOF08wEr4iRJVJ6eTAdYjhqNc4iEq3mboXXU nKmZg7HCdD8k57xA/0TBbXwWXtAo6QrgjT5hrhDGDModghs65hwwkSnFVniuRAzGvw1V KhuSn1tezfv1mf56jT7QC+z3+TrzliXsBMo67Uy1ipqoGQkQCj6TH1+hOX+z19e1Ixmh jAdFLSj6TU6H7uqw0+uR0UJhMkk3p7E/sYoKquTGqwOxNFrLKdeclo4FroFS6mpbpmUw 78ww== 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=f2gy3TqHD1DjvvQQast2c/kBnbTiX6UZm1TSm4C/kYo=; b=QeR4ZH3iGAHA1x5sW2eIVH12Gx0DGClAKQYbinsg5mZhcU4Msycuyd1UOfdp8gN+ap J7mclKKyvC43FneApfAAHRla4B5hTkBTfzXKSeCCOa+8NF3/4B01QEvsmfikGLX/GHaX XQeQn9iJybRV26iu5MB17x5I5yiLCI96KqMe5SGPmXO79ckGA9jUmJIF8M/Mmqtn+DOs iD/b/ypLTVevBxV1FBSENTnUvBfcCjD2j54jCy0lbmj8wQUgDU640UkLAvYbvKcykpVO CK1OdDxQLg+PdnTqcif9PW8Q95ZjfIYOyhgVh2AVgawmAQ9bF8jIPuZwXuTdSpwlKCby Vvlw== X-Gm-Message-State: AHQUAuYR0uI2KHxJJvwLoRLBE41z6x+aoyLIWAEPmw5BTftidXcFWWjS KvFM6FHc21RU50mVmaqDeFzvJg== X-Google-Smtp-Source: AHgI3IbL+0Fs/fBh1i/pNYkSaBYQ1srH/mLZvajkoPik3T8z8WEivVcCBzTwXKRaGBxz2H9soypFsw== X-Received: by 2002:ac8:2c93:: with SMTP id 19mr5026713qtw.126.1550180469116; Thu, 14 Feb 2019 13:41:09 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id g25sm1587307qki.29.2019.02.14.13.41.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Feb 2019 13:41:08 -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: [PATCH net-next 2/3] ethtool: add compat for flash update Date: Thu, 14 Feb 2019 13:40:45 -0800 Message-Id: <20190214214046.19182-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190214214046.19182-1-jakub.kicinski@netronome.com> References: <20190214214046.19182-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 | 7 +++++++ net/core/devlink.c | 30 ++++++++++++++++++++++++++++++ net/core/ethtool.c | 12 +++++++++--- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 18d7a051f412..a2da49dd9147 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -1195,11 +1195,18 @@ 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); #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) +{ + return -EOPNOTSUPP; +} #endif #endif /* _NET_DEVLINK_H_ */ diff --git a/net/core/devlink.c b/net/core/devlink.c index bd507e13bb7b..d169b5426d3d 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -6435,6 +6435,36 @@ 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) +{ + 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, + NULL, 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..1320e8dce559 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); + rtnl_lock(); + + return ret; + } return dev->ethtool_ops->flash_device(dev, &efl); } -- 2.19.2