You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.2 KiB
Diff
100 lines
3.2 KiB
Diff
From 2dc96021dc08d24eed822f66cb8fb5a454fee236 Mon Sep 17 00:00:00 2001
|
|
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
|
Date: Fri, 19 Oct 2018 16:20:07 +0300
|
|
Subject: [PATCH] staging: fsl-dpaa2/mac: Check DPMAC version
|
|
|
|
Read the current API version exposed by the DPMAC object.
|
|
Add a check at probe time to make sure it is compatible with
|
|
the set of MC commands we intend to use on it.
|
|
Also, print the version number through ethtool driver info.
|
|
|
|
Signed-off-by: Catalin Neacsu <valentin-catalin.neacsu@nxp.com>
|
|
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
|
---
|
|
drivers/staging/fsl-dpaa2/mac/mac.c | 39 +++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 39 insertions(+)
|
|
|
|
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
|
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
|
@@ -56,6 +56,8 @@ struct dpaa2_mac_priv {
|
|
struct fsl_mc_device *mc_dev;
|
|
struct dpmac_attr attr;
|
|
struct dpmac_link_state old_state;
|
|
+ u16 dpmac_ver_major;
|
|
+ u16 dpmac_ver_minor;
|
|
};
|
|
|
|
/* TODO: fix the 10G modes, mapping can't be right:
|
|
@@ -81,6 +83,14 @@ static phy_interface_t dpaa2_mac_iface_m
|
|
PHY_INTERFACE_MODE_XGMII, /* DPMAC_ETH_IF_USXGMII */
|
|
};
|
|
|
|
+static int cmp_dpmac_ver(struct dpaa2_mac_priv *priv,
|
|
+ u16 ver_major, u16 ver_minor)
|
|
+{
|
|
+ if (priv->dpmac_ver_major == ver_major)
|
|
+ return priv->dpmac_ver_minor - ver_minor;
|
|
+ return priv->dpmac_ver_major - ver_major;
|
|
+}
|
|
+
|
|
static void dpaa2_mac_link_changed(struct net_device *netdev)
|
|
{
|
|
struct phy_device *phydev;
|
|
@@ -154,6 +164,18 @@ static netdev_tx_t dpaa2_mac_drop_frame(
|
|
return NETDEV_TX_OK;
|
|
}
|
|
|
|
+static void dpaa2_mac_get_drvinfo(struct net_device *net_dev,
|
|
+ struct ethtool_drvinfo *drvinfo)
|
|
+{
|
|
+ struct dpaa2_mac_priv *priv = netdev_priv(net_dev);
|
|
+
|
|
+ strlcpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver));
|
|
+ snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
|
|
+ "%u.%u", priv->dpmac_ver_major, priv->dpmac_ver_minor);
|
|
+ strlcpy(drvinfo->bus_info, dev_name(net_dev->dev.parent->parent),
|
|
+ sizeof(drvinfo->bus_info));
|
|
+}
|
|
+
|
|
static int dpaa2_mac_get_link_ksettings(struct net_device *netdev,
|
|
struct ethtool_link_ksettings *ks)
|
|
{
|
|
@@ -323,6 +345,7 @@ static const struct net_device_ops dpaa2
|
|
};
|
|
|
|
static const struct ethtool_ops dpaa2_mac_ethtool_ops = {
|
|
+ .get_drvinfo = &dpaa2_mac_get_drvinfo,
|
|
.get_link_ksettings = &dpaa2_mac_get_link_ksettings,
|
|
.set_link_ksettings = &dpaa2_mac_set_link_ksettings,
|
|
.get_strings = &dpaa2_mac_get_strings,
|
|
@@ -510,6 +533,21 @@ static int dpaa2_mac_probe(struct fsl_mc
|
|
goto err_free_mcp;
|
|
}
|
|
|
|
+ err = dpmac_get_api_version(mc_dev->mc_io, 0, &priv->dpmac_ver_major,
|
|
+ &priv->dpmac_ver_minor);
|
|
+ if (err) {
|
|
+ dev_err(dev, "dpmac_get_api_version failed\n");
|
|
+ goto err_version;
|
|
+ }
|
|
+
|
|
+ if (cmp_dpmac_ver(priv, DPMAC_VER_MAJOR, DPMAC_VER_MINOR) < 0) {
|
|
+ dev_err(dev, "DPMAC version %u.%u lower than supported %u.%u\n",
|
|
+ priv->dpmac_ver_major, priv->dpmac_ver_minor,
|
|
+ DPMAC_VER_MAJOR, DPMAC_VER_MINOR);
|
|
+ err = -ENOTSUPP;
|
|
+ goto err_version;
|
|
+ }
|
|
+
|
|
err = dpmac_get_attributes(mc_dev->mc_io, 0,
|
|
mc_dev->mc_handle, &priv->attr);
|
|
if (err) {
|
|
@@ -622,6 +660,7 @@ err_no_phy:
|
|
err_free_irq:
|
|
#endif
|
|
teardown_irqs(mc_dev);
|
|
+err_version:
|
|
err_close:
|
|
dpmac_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
|
err_free_mcp:
|