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.
openwrt/target/linux/layerscape/patches-5.4/701-net-0171-staging-fsl-dp...

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: