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 790D6C282D7 for ; Wed, 30 Jan 2019 19:05:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3E5812087F for ; Wed, 30 Jan 2019 19:05:46 +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="JJ+AWcNm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387505AbfA3TFp (ORCPT ); Wed, 30 Jan 2019 14:05:45 -0500 Received: from mail-qt1-f194.google.com ([209.85.160.194]:35874 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387492AbfA3TFm (ORCPT ); Wed, 30 Jan 2019 14:05:42 -0500 Received: by mail-qt1-f194.google.com with SMTP id t13so783291qtn.3 for ; Wed, 30 Jan 2019 11:05: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=qNDXt8pd3yOqbII1aD7R3XXYjVt+GKAuqTTdhHVucMs=; b=JJ+AWcNm6jWIF7o/xaKRWpmpJPcaRIfgPvJ4PKHQtRwfIGQtU65XY3VXNctykJGHkd 0sPZyHc4RUK78dBwIP/YJ7eiiE4aiacED6XvT1SqFNE90oQ9ndu+XkW+OfpGTFQhX+UA 0B89qBgwI/bzK5pqIWuDjVaKv9VZZADHfKfuyKTXKt8SGtTJVYbLKhQjHIVdlb214+vB L96yOud4eNc42p6u2BUN+3j65EZJGj3UFpBLlfMrhdTK0cokIBKB0IGA6mkrMum9eI1Y ZMfWKlJHNBoMM4NZ7MEhSFqRUV8vhga8IOPwZ0WVOLqZX/tNm071WKIQFkhmKVN55XOQ YSpA== 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=qNDXt8pd3yOqbII1aD7R3XXYjVt+GKAuqTTdhHVucMs=; b=S9VTY0j87K7qye5L6XWoe65GQZd94OZGJtJxu6WfqORdzB0GW8R14t4TqEUX7/U5hx cwUPJhbNqGSR3peoy3Q8kxbdX3nojQdxhU3lYEd6gpk/+RADXcPMLZftPYtq4e7s8L07 hRTWlWCI5gG5MseAIm2BBcLlSLKMixhO08KDx80grWrn8Y81BGL6ZtKKpZIoH6Kuuxp3 vFCE8kb3b1alCOq4op5Mi587H0vgtMYMfP43CY2AtsT0RIHfp1dLc61/6GqI/j+GBOin Jbtrjps2e7M7JL4Th5bMIXO72KoZ0WtF6+z2tfqjvI85TEdAFEVQjv0PfprXLgoXQm83 AbUQ== X-Gm-Message-State: AJcUukel5aANtvfVrYCSO4rQUgxS17AwkjvtzqOVF6Jv22Xi3WmWG73v TxGJqr8QveybFgoqhgp90pXxIg== X-Google-Smtp-Source: ALg8bN6xXu1VWZ53rxkvPpF6oqKruVJKWlH/v3GMIKm0/6AszHd+L6MPRI1LhkG2Cvk3VmCQpYUAEA== X-Received: by 2002:a0c:d992:: with SMTP id y18mr30387508qvj.161.1548875141911; Wed, 30 Jan 2019 11:05:41 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id d14sm1929604qkl.64.2019.01.30.11.05.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Jan 2019 11:05:41 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, jiri@resnulli.us, andrew@lunn.ch, f.fainelli@gmail.com, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, Jakub Kicinski Subject: [PATCH net-next v2 7/7] ethtool: add compat for devlink info Date: Wed, 30 Jan 2019 11:05:13 -0800 Message-Id: <20190130190513.25718-8-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190130190513.25718-1-jakub.kicinski@netronome.com> References: <20190130190513.25718-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 did not fill the fw_version field, try to call into the new devlink get_info op and collect the versions that way. We assume ethtool was always reporting running versions. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 7 ++++++ net/core/devlink.c | 52 ++++++++++++++++++++++++++++++++++++++++++- net/core/ethtool.c | 7 ++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index c678ed0cb099..b4750e93303a 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -640,6 +640,8 @@ int devlink_info_report_version(struct devlink_info_req *req, enum devlink_version_type type, const char *version_name, const char *version_value); +void devlink_compat_running_versions(struct net_device *dev, + char *buf, size_t len); #else @@ -957,6 +959,11 @@ devlink_info_report_version(struct devlink_info_req *req, { return 0; } + +static inline void +devlink_compat_running_versions(struct net_device *dev, char *buf, size_t len) +{ +} #endif #endif /* _NET_DEVLINK_H_ */ diff --git a/net/core/devlink.c b/net/core/devlink.c index e2027d3a5e40..5313e5918ee2 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -3715,12 +3715,18 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb, } struct devlink_info_req { + bool compat; struct sk_buff *msg; + /* For compat call */ + char *buf; + size_t len; }; int devlink_info_report_driver_name(struct devlink_info_req *req, const char *name) { + if (req->compat) + return 0; return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRV_NAME, name); } EXPORT_SYMBOL_GPL(devlink_info_report_driver_name); @@ -3728,6 +3734,8 @@ EXPORT_SYMBOL_GPL(devlink_info_report_driver_name); int devlink_info_report_serial_number(struct devlink_info_req *req, const char *sn) { + if (req->compat) + return 0; return nla_put_string(req->msg, DEVLINK_ATTR_INFO_SERIAL_NUMBER, sn); } EXPORT_SYMBOL_GPL(devlink_info_report_serial_number); @@ -3743,7 +3751,15 @@ int devlink_info_report_version(struct devlink_info_req *req, [DEVLINK_VERSION_RUNNING] = DEVLINK_ATTR_INFO_VERSION_RUNNING, }; struct nlattr *nest; - int err; + int len, err; + + if (req->compat) { + if (type == DEVLINK_VERSION_RUNNING) { + len = strlcpy(req->buf, version_value, req->len); + req->len = max_t(size_t, 0, req->len - len); + } + return 0; + } if (type >= ARRAY_SIZE(type2attr) || !type2attr[type]) return -EINVAL; @@ -3789,6 +3805,7 @@ devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, if (devlink_nl_put_handle(msg, devlink)) goto err_cancel_msg; + memset(&req, 0, sizeof(req)); req.msg = msg; err = devlink->ops->info_get(devlink, &req, extack); if (err) @@ -5263,6 +5280,39 @@ int devlink_region_snapshot_create(struct devlink_region *region, u64 data_len, } EXPORT_SYMBOL_GPL(devlink_region_snapshot_create); +void devlink_compat_running_versions(struct net_device *dev, + char *buf, size_t len) +{ + struct devlink_port *devlink_port; + struct devlink_info_req req; + struct devlink *devlink; + bool found = false; + + 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) { + if (devlink_port->type == DEVLINK_PORT_TYPE_ETH || + devlink_port->type_dev == dev) { + mutex_unlock(&devlink->lock); + found = true; + goto out; + } + } + mutex_unlock(&devlink->lock); + } +out: + if (found && devlink->ops->info_get) { + memset(&req, 0, sizeof(req)); + req.compat = true; + req.buf = buf; + req.len = len; + + devlink->ops->info_get(devlink, &req, NULL); + } + mutex_unlock(&devlink_mutex); +} + 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 158264f7cfaf..176b17d11f08 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -27,6 +27,7 @@ #include #include #include +#include #include /* @@ -803,6 +804,12 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, if (ops->get_eeprom_len) info.eedump_len = ops->get_eeprom_len(dev); + rtnl_unlock(); + if (!info.fw_version[0]) + devlink_compat_running_versions(dev, info.fw_version, + ARRAY_SIZE(info.fw_version)); + rtnl_lock(); + if (copy_to_user(useraddr, &info, sizeof(info))) return -EFAULT; return 0; -- 2.19.2