lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20180830004046.9417-2-mdf@kernel.org> Date: Wed, 29 Aug 2018 17:40:44 -0700 From: Moritz Fischer <mdf@...nel.org> To: davem@...emloft.net Cc: keescook@...omium.org, f.fainelli@...il.com, linux-kernel@...r.kernel.org, netdev@...r.kernel.org, alex.williams@...com, Moritz Fischer <mdf@...nel.org> Subject: [PATCH net-next 1/3] net: nixge: Add support for fixed-link subnodes Add support for fixed-link cases where no MDIO is actually required to run the device. In that case no MDIO bus is instantiated since the actual registers are not available in hardware. Signed-off-by: Moritz Fischer <mdf@...nel.org> --- drivers/net/ethernet/ni/nixge.c | 72 ++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index 74cf52e3fb09..670249313ff0 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c @@ -1189,9 +1189,36 @@ static int nixge_mdio_write(struct mii_bus *bus, int phy_id, int reg, u16 val) return err; } +static int nixge_of_get_phy(struct nixge_priv *priv, struct device_node *np) +{ + priv->phy_mode = of_get_phy_mode(np); + if (priv->phy_mode < 0) { + dev_err(priv->dev, "not find \"phy-mode\" property\n"); + return -EINVAL; + } + + if (of_phy_is_fixed_link(np)) { + if (of_phy_register_fixed_link(np) < 0) { + dev_err(priv->dev, "broken fixed link spec\n"); + return -EINVAL; + } + + priv->phy_node = of_node_get(np); + } else { + priv->phy_node = of_parse_phandle(np, "phy-handle", 0); + if (!priv->phy_node) { + dev_err(priv->dev, "not find \"phy-handle\" property\n"); + return -EINVAL; + } + } + + return 0; +} + static int nixge_mdio_setup(struct nixge_priv *priv, struct device_node *np) { struct mii_bus *bus; + int err; bus = devm_mdiobus_alloc(priv->dev); if (!bus) @@ -1230,6 +1257,7 @@ static int nixge_probe(struct platform_device *pdev) struct nixge_priv *priv; struct net_device *ndev; struct resource *dmares; + struct device_node *np; const u8 *mac_addr; int err; @@ -1237,6 +1265,8 @@ static int nixge_probe(struct platform_device *pdev) if (!ndev) return -ENOMEM; + np = pdev->dev.of_node; + platform_set_drvdata(pdev, ndev); SET_NETDEV_DEV(ndev, &pdev->dev); @@ -1286,24 +1316,19 @@ static int nixge_probe(struct platform_device *pdev) priv->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD; priv->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD; - err = nixge_mdio_setup(priv, pdev->dev.of_node); - if (err) { - netdev_err(ndev, "error registering mdio bus"); - goto free_netdev; - } - - priv->phy_mode = of_get_phy_mode(pdev->dev.of_node); - if (priv->phy_mode < 0) { - netdev_err(ndev, "not find \"phy-mode\" property\n"); - err = -EINVAL; - goto unregister_mdio; + if (np) { + err = nixge_of_get_phy(priv, np); + if (err) + goto free_netdev; } - priv->phy_node = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); - if (!priv->phy_node) { - netdev_err(ndev, "not find \"phy-handle\" property\n"); - err = -EINVAL; - goto unregister_mdio; + /* only if it's not a fixed link, do we care about MDIO at all */ + if (priv->phy_node && !of_phy_is_fixed_link(np)) { + err = nixge_mdio_setup(priv, np); + if (err) { + dev_err(&pdev->dev, "error registering mdio bus"); + goto free_phy; + } } err = register_netdev(priv->ndev); @@ -1315,8 +1340,13 @@ static int nixge_probe(struct platform_device *pdev) return 0; unregister_mdio: - mdiobus_unregister(priv->mii_bus); - + if (priv->mii_bus) + mdiobus_unregister(priv->mii_bus); +free_phy: + if (np && of_phy_is_fixed_link(np)) { + of_phy_deregister_fixed_link(np); + of_node_put(np); + } free_netdev: free_netdev(ndev); @@ -1330,7 +1360,11 @@ static int nixge_remove(struct platform_device *pdev) unregister_netdev(ndev); - mdiobus_unregister(priv->mii_bus); + if (priv->mii_bus) + mdiobus_unregister(priv->mii_bus); + + if (np && of_phy_is_fixed_link(np)) + of_phy_deregister_fixed_link(np); free_netdev(ndev); -- 2.18.0
Powered by blists - more mailing lists