Commit 9e4c2cfc authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: provide ethtool_drvinfo on representors

Extend representors' ethtool ops to show basic info like firmware
version, driver version, and driver name.

While at it don't set drvinfo.n_stats and drvinfo.regdump_len,
core will invoke appropriate handlers to get those.

A helper is added to turn a netdev into nfp_app for convenience.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 06726f30
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "nfpcore/nfp_nffw.h" #include "nfpcore/nfp_nffw.h"
#include "nfp_app.h" #include "nfp_app.h"
#include "nfp_main.h" #include "nfp_main.h"
#include "nfp_net.h"
#include "nfp_net_repr.h" #include "nfp_net_repr.h"
static const struct nfp_app_type *apps[] = { static const struct nfp_app_type *apps[] = {
...@@ -48,6 +49,25 @@ static const struct nfp_app_type *apps[] = { ...@@ -48,6 +49,25 @@ static const struct nfp_app_type *apps[] = {
#endif #endif
}; };
struct nfp_app *nfp_app_from_netdev(struct net_device *netdev)
{
if (nfp_netdev_is_nfp_net(netdev)) {
struct nfp_net *nn = netdev_priv(netdev);
return nn->app;
}
if (nfp_netdev_is_nfp_repr(netdev)) {
struct nfp_repr *repr = netdev_priv(netdev);
return repr->app;
}
WARN(1, "Unknown netdev type for nfp_app\n");
return NULL;
}
const char *nfp_app_mip_name(struct nfp_app *app) const char *nfp_app_mip_name(struct nfp_app *app)
{ {
if (!app || !app->pf->mip) if (!app || !app->pf->mip)
......
...@@ -293,6 +293,8 @@ static inline struct net_device *nfp_app_repr_get(struct nfp_app *app, u32 id) ...@@ -293,6 +293,8 @@ static inline struct net_device *nfp_app_repr_get(struct nfp_app *app, u32 id)
return app->type->repr_get(app, id); return app->type->repr_get(app, id);
} }
struct nfp_app *nfp_app_from_netdev(struct net_device *netdev);
struct nfp_reprs * struct nfp_reprs *
nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type, nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type,
struct nfp_reprs *reprs); struct nfp_reprs *reprs);
......
...@@ -147,34 +147,53 @@ static void nfp_net_get_nspinfo(struct nfp_app *app, char *version) ...@@ -147,34 +147,53 @@ static void nfp_net_get_nspinfo(struct nfp_app *app, char *version)
if (IS_ERR(nsp)) if (IS_ERR(nsp))
return; return;
snprintf(version, ETHTOOL_FWVERS_LEN, "sp:%hu.%hu", snprintf(version, ETHTOOL_FWVERS_LEN, "%hu.%hu",
nfp_nsp_get_abi_ver_major(nsp), nfp_nsp_get_abi_ver_major(nsp),
nfp_nsp_get_abi_ver_minor(nsp)); nfp_nsp_get_abi_ver_minor(nsp));
nfp_nsp_close(nsp); nfp_nsp_close(nsp);
} }
static void nfp_net_get_drvinfo(struct net_device *netdev, static void
struct ethtool_drvinfo *drvinfo) nfp_get_drvinfo(struct nfp_app *app, struct pci_dev *pdev,
const char *vnic_version, struct ethtool_drvinfo *drvinfo)
{ {
char nsp_version[ETHTOOL_FWVERS_LEN] = {}; char nsp_version[ETHTOOL_FWVERS_LEN] = {};
struct nfp_net *nn = netdev_priv(netdev);
strlcpy(drvinfo->driver, nn->pdev->driver->name, strlcpy(drvinfo->driver, pdev->driver->name, sizeof(drvinfo->driver));
sizeof(drvinfo->driver));
strlcpy(drvinfo->version, nfp_driver_version, sizeof(drvinfo->version)); strlcpy(drvinfo->version, nfp_driver_version, sizeof(drvinfo->version));
nfp_net_get_nspinfo(nn->app, nsp_version); nfp_net_get_nspinfo(app, nsp_version);
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
"%d.%d.%d.%d %s %s %s", "%s %s %s %s", vnic_version, nsp_version,
nfp_app_mip_name(app), nfp_app_name(app));
}
static void
nfp_net_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
{
char vnic_version[ETHTOOL_FWVERS_LEN] = {};
struct nfp_net *nn = netdev_priv(netdev);
snprintf(vnic_version, sizeof(vnic_version), "%d.%d.%d.%d",
nn->fw_ver.resv, nn->fw_ver.class, nn->fw_ver.resv, nn->fw_ver.class,
nn->fw_ver.major, nn->fw_ver.minor, nsp_version, nn->fw_ver.major, nn->fw_ver.minor);
nfp_app_mip_name(nn->app), nfp_app_name(nn->app));
strlcpy(drvinfo->bus_info, pci_name(nn->pdev), strlcpy(drvinfo->bus_info, pci_name(nn->pdev),
sizeof(drvinfo->bus_info)); sizeof(drvinfo->bus_info));
drvinfo->n_stats = NN_ET_STATS_LEN; nfp_get_drvinfo(nn->app, nn->pdev, vnic_version, drvinfo);
drvinfo->regdump_len = NFP_NET_CFG_BAR_SZ; }
static void
nfp_app_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
{
struct nfp_app *app;
app = nfp_app_from_netdev(netdev);
if (!app)
return;
nfp_get_drvinfo(app, app->pdev, "*", drvinfo);
} }
/** /**
...@@ -940,6 +959,7 @@ static const struct ethtool_ops nfp_net_ethtool_ops = { ...@@ -940,6 +959,7 @@ static const struct ethtool_ops nfp_net_ethtool_ops = {
}; };
const struct ethtool_ops nfp_port_ethtool_ops = { const struct ethtool_ops nfp_port_ethtool_ops = {
.get_drvinfo = nfp_app_get_drvinfo,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment