Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1502404ybl; Fri, 31 Jan 2020 23:48:39 -0800 (PST) X-Google-Smtp-Source: APXvYqyKsxHR8O+WB1TunJYZbyGnZkJ+ddrMiJxZUVB/IbQVa/SWDn6vkEM2FEEcAp3/rJjoItZ/ X-Received: by 2002:aca:c08b:: with SMTP id q133mr8559743oif.46.1580543319141; Fri, 31 Jan 2020 23:48:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580543319; cv=none; d=google.com; s=arc-20160816; b=Knh5b9/L2zBXeFPT7482uQWFtEOBe65iX8lTaJdQVOj7yPIjcYZumPU0HQycBgtneI 6ZLZ368pUsn+xaRTJTuigK65aWLT0/bIoEGUmGcxtOyaxOJWifKDl68DucwhrhlB7zOn OMVFvOIBW9zHfkri6dZhV1sPt1haY2rm8NFrSxYNlzxge98sdhV+HDXsUP0lmzAKBoeX xmtrs9emNmLC6eo1MPj2sBYhN8FqMLkmA+YSL6DCuO6+H/51Q4KK1YYXVg/NtDbn+w2l nI8Sy1NZtcblFEppd5K+2nWakiVSC4baA+Cq5fetEozO8P9XlKK00S3HEprAORQA2DMg s1bQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=hZX9edccsaZdYd2Q8C3XDHU20UtW2Bf0ntyIdxX04zc=; b=ZW+CCFULaU8ENg/yFukVIdCX3qr/tjFgs1xOcR/0LY8b9M6+YZo4iEfv4RXteHloLq K2C0HYEsf1xkcanS0L0191O3g5IEOAM6fTFcWofECBOdD8+NszCThkA6YwWVb8gauTDg onL32OCTLqQl8XrKlsVvTAJjDAlG7q5CpZYO+/bK4gvrpNpeYrUxDKV6eAIaQZTOCEIa xeDX3LT4yIj6Y84QSn4cFWIeCjz8cyZ9E/MDCeHIy2P0fha6wu0hwFEj7KZ8j4KY2wpH 6l+1v+j8haLzN5TcbB4vobqgEOScVCO0+bDdBK1iFNJYWsfwWBSBcn+U/wlSIBorM+bi GhBA== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f4si5602030oto.169.2020.01.31.23.48.14; Fri, 31 Jan 2020 23:48:39 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727164AbgBAHqh (ORCPT + 99 others); Sat, 1 Feb 2020 02:46:37 -0500 Received: from foss.arm.com ([217.140.110.172]:41144 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726156AbgBAHqg (ORCPT ); Sat, 1 Feb 2020 02:46:36 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2C780FEC; Fri, 31 Jan 2020 23:46:36 -0800 (PST) Received: from u200856.usa.arm.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9F7283F52E; Fri, 31 Jan 2020 23:50:14 -0800 (PST) From: Jeremy Linton To: netdev@vger.kernel.org Cc: opendmb@gmail.com, f.fainelli@gmail.com, davem@davemloft.net, bcm-kernel-feedback-list@broadcom.com, linux-kernel@vger.kernel.org, wahrenst@gmx.net, andrew@lunn.ch, hkallweit1@gmail.com, Jeremy Linton Subject: [PATCH 3/6] net: bcmgenet: enable automatic phy discovery Date: Sat, 1 Feb 2020 01:46:22 -0600 Message-Id: <20200201074625.8698-4-jeremy.linton@arm.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200201074625.8698-1-jeremy.linton@arm.com> References: <20200201074625.8698-1-jeremy.linton@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The unimac mdio driver falls back to scanning the entire bus if its given an appropriate mask. In ACPI mode we expect that the system is well behaved and conforms to recent versions of the specification. We then utilize phy_find_first(), and phy_connect_direct() to find and attach to the discovered phy during net_device open. Signed-off-by: Jeremy Linton --- drivers/net/ethernet/broadcom/genet/bcmmii.c | 40 +++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c index 2049f8218589..f3271975b375 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c @@ -5,7 +5,7 @@ * Copyright (c) 2014-2017 Broadcom */ - +#include #include #include #include @@ -311,7 +311,9 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) int bcmgenet_mii_probe(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); - struct device_node *dn = priv->pdev->dev.of_node; + struct device *kdev = &priv->pdev->dev; + struct device_node *dn = kdev->of_node; + struct phy_device *phydev; u32 phy_flags = 0; int ret; @@ -334,7 +336,27 @@ int bcmgenet_mii_probe(struct net_device *dev) return -ENODEV; } } else { - phydev = dev->phydev; + if (has_acpi_companion(kdev)) { + char mdio_bus_id[MII_BUS_ID_SIZE]; + struct mii_bus *unimacbus; + + snprintf(mdio_bus_id, MII_BUS_ID_SIZE, "%s-%d", + UNIMAC_MDIO_DRV_NAME, priv->pdev->id); + + unimacbus = mdio_find_bus(mdio_bus_id); + if (!unimacbus) { + pr_err("Unable to find mii\n"); + return -ENODEV; + } + phydev = phy_find_first(unimacbus); + put_device(&unimacbus->dev); + if (!phydev) { + pr_err("Unable to find PHY\n"); + return -ENODEV; + } + } else { + phydev = dev->phydev; + } phydev->dev_flags = phy_flags; ret = phy_connect_direct(dev, phydev, bcmgenet_mii_setup, @@ -455,9 +477,12 @@ static int bcmgenet_mii_register(struct bcmgenet_priv *priv) /* Retain this platform_device pointer for later cleanup */ priv->mii_pdev = ppdev; ppdev->dev.parent = &pdev->dev; - ppdev->dev.of_node = bcmgenet_mii_of_find_mdio(priv); - if (pdata) + if (dn) + ppdev->dev.of_node = bcmgenet_mii_of_find_mdio(priv); + else if (pdata) bcmgenet_mii_pdata_init(priv, &ppd); + else + ppd.phy_mask = ~0; ret = platform_device_add_resources(ppdev, &res, 1); if (ret) @@ -586,10 +611,13 @@ static int bcmgenet_mii_pd_init(struct bcmgenet_priv *priv) static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv) { - struct device_node *dn = priv->pdev->dev.of_node; + struct device *kdev = &priv->pdev->dev; + struct device_node *dn = kdev->of_node; if (dn) return bcmgenet_mii_of_init(priv); + else if (has_acpi_companion(kdev)) + return bcmgenet_phy_interface_init(priv); else return bcmgenet_mii_pd_init(priv); } -- 2.24.1