Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp183689imm; Wed, 29 Aug 2018 17:51:41 -0700 (PDT) X-Google-Smtp-Source: ANB0VdbjCR4h4c/fqx1aONOSQMeGBi5WZqhI4Yw7Y89/JTWJwqrrIM3PcjW6myUA69I87+sL8enE X-Received: by 2002:a63:bc0a:: with SMTP id q10-v6mr7599908pge.60.1535590301208; Wed, 29 Aug 2018 17:51:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535590301; cv=none; d=google.com; s=arc-20160816; b=HWB0pG8f2TcUkk6PaeZS7JgsK7iyMqHK+Q0sNAmBXQ3Dg6Jd0/+axlV2a2ZVOsp9YM GwUMi6bFa9eNwdIhZf2WuALL5DVA6Xoe6ohrrDSG71AcAwuMzz3ZIzQDJPSi38+FJDsF 4tJ4gVIAfenWuhcMv1zbu40iDza6OFNT3j9RxCV3SKWARRY6SW3tccJhhM2pD7k2GHsQ NSJLosGTlXPyV+XJvxBqrB1bzLkQz7JLuphbVjEm2JDPSL6MFdTRvs6cH+QFJylC4jFo LTG0mbmShWHU+EWz7u+xl5543REPtDcKPONVpT3vykuq/0AfcPjAToZ0gtcDqDHxJzHW TT0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=sZdAF1HX9BbdV1yfLCar67yxiHmtRQzQeHqMiNrKbPs=; b=j5vJglk2x9bUJx9tjUbjJWzEdBNLr29JtuLATwwLxAj/ibKcaMIgSOYrAjafaofZ0g 5P33g1jvFIpo/dDsXBTE+PRbSuA5zWnB5O+lKXmSkYUFC7WMpvKrg6IBeaRwvPev8HbM BFfZIXde2V6LRf2VIfgCBYjky7oe9EMxC2Sy5dU2NV+IKE4rQFdSKfeghhoTnxESXfyU cN6mepBpqYzGBIzTH+kbauZZ2MxsSZY6gL2aPcuZESZflp+jRKaetxUrLl/e9ED9CSYU F5HIm4RnEvM0eGGs7b0BwU2gDM1QEcmR7XLj/OTtxy3UgG318ognQ6WpGryMSuUnXbJW KfVQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r3-v6si4850129plb.221.2018.08.29.17.51.26; Wed, 29 Aug 2018 17:51:41 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727265AbeH3EtZ (ORCPT + 99 others); Thu, 30 Aug 2018 00:49:25 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:41365 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727193AbeH3EtY (ORCPT ); Thu, 30 Aug 2018 00:49:24 -0400 Received: by mail-pl1-f195.google.com with SMTP id b12-v6so3045492plr.8 for ; Wed, 29 Aug 2018 17:49:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sZdAF1HX9BbdV1yfLCar67yxiHmtRQzQeHqMiNrKbPs=; b=f4WNoSpMFukfC0Q+4uXcObGS56rFQuRPdhno4HgA+5dUevRGkvegzbvy1oFqJZ6KXd mqKv3jjD2kw0vPKov2Aycq7tslzxkS+JNjiWwlhfC42v/+NEGk258Bbd83+AkY1wr7bt UvigpKn2O68P2Egevt01tqcVKeAtxHu95fZ3CjyS/Hf4yeXffBr+ciZ9dUoAa0zek1Ja lTGiKtmL5jYt2EUP8RuX8NR67bWaO09nsiSXA6evwFvF1r+4IH2NJetVD8dhqlgm5NfU fatN0VJ6pje2t/MyyaqAKT3BTOlXU+IxO9PIrju3O2YtIP380JWkWl+3ucWGmkbF1+z5 uTog== X-Gm-Message-State: APzg51CCCxHiqqWJiT8i0bpl6nA2WqefcCcARe0E1/D+pF56t6XTKG9W 3O6krarK8OW//Pln3ghOtmDtc7ZIbGk= X-Received: by 2002:a17:902:b7c5:: with SMTP id v5-v6mr8142653plz.49.1535590195049; Wed, 29 Aug 2018 17:49:55 -0700 (PDT) Received: from localhost ([207.114.172.147]) by smtp.gmail.com with ESMTPSA id c68-v6sm8942472pfj.51.2018.08.29.17.49.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 29 Aug 2018 17:49:54 -0700 (PDT) From: Moritz Fischer To: davem@davemloft.net Cc: keescook@chromium.org, f.fainelli@gmail.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, alex.williams@ni.com, Moritz Fischer Subject: [PATCH net-next 1/3] net: nixge: Add support for fixed-link subnodes Date: Wed, 29 Aug 2018 17:40:44 -0700 Message-Id: <20180830004046.9417-2-mdf@kernel.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180830004046.9417-1-mdf@kernel.org> References: <20180830004046.9417-1-mdf@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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