From 2dc96021dc08d24eed822f66cb8fb5a454fee236 Mon Sep 17 00:00:00 2001 From: Ioana Radulescu 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 Signed-off-by: Ioana Radulescu --- 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: