From: Jakub Kicinski <jakub.kicinski@netronome.com>
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 <jakub.kicinski@netronome.com>
Subject: [PATCH net-next 7/7] ethtool: add compat for devlink info
Date: Mon, 28 Jan 2019 19:34:20 -0800 [thread overview]
Message-ID: <20190129033420.27235-8-jakub.kicinski@netronome.com> (raw)
In-Reply-To: <20190129033420.27235-1-jakub.kicinski@netronome.com>
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 <jakub.kicinski@netronome.com>
---
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 14da3632e8fc..b047360b88a9 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -616,6 +616,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
@@ -896,6 +898,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 f0c5f9bd96b7..99037bf15fb8 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -3598,12 +3598,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);
@@ -3611,6 +3617,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);
@@ -3626,7 +3634,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;
@@ -3672,6 +3688,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)
@@ -4962,6 +4979,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 <linux/rtnetlink.h>
#include <linux/sched/signal.h>
#include <linux/net.h>
+#include <net/devlink.h>
#include <net/xdp_sock.h>
/*
@@ -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
prev parent reply other threads:[~2019-01-29 3:34 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-29 3:34 [PATCH net-next 0/7] devlink: add device (driver) information API Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 1/7] devlink: add device " Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 2/7] devlink: add version reporting to devlink info API Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 3/7] nfp: devlink: report driver name and serial number Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 4/7] nfp: devlink: report fixed versions Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 5/7] nfp: nsp: add support for versions command Jakub Kicinski
2019-01-29 3:34 ` [PATCH net-next 6/7] nfp: devlink: report the running and flashed versions Jakub Kicinski
2019-01-29 3:34 ` Jakub Kicinski [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190129033420.27235-8-jakub.kicinski@netronome.com \
--to=jakub.kicinski@netronome.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=eugenem@fb.com \
--cc=f.fainelli@gmail.com \
--cc=jiri@resnulli.us \
--cc=jonathan.lemon@gmail.com \
--cc=mkubecek@suse.cz \
--cc=netdev@vger.kernel.org \
--cc=oss-drivers@netronome.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).