| From foo@baz Mon Dec 18 15:03:25 CET 2017 |
| From: Doug Berger <opendmb@gmail.com> |
| Date: Thu, 9 Mar 2017 16:58:48 -0800 |
| Subject: net: bcmgenet: Power up the internal PHY before probing the MII |
| |
| From: Doug Berger <opendmb@gmail.com> |
| |
| |
| [ Upstream commit 6be371b053dc86f11465cc1abce2e99bda0a0574 ] |
| |
| When using the internal PHY it must be powered up when the MII is probed |
| or the PHY will not be detected. Since the PHY is powered up at reset |
| this has not been a problem. However, when the kernel is restarted with |
| kexec the PHY will likely be powered down when the kernel starts so it |
| will not be detected and the Ethernet link will not be established. |
| |
| This commit explicitly powers up the internal PHY when the GENET driver |
| is probed to correct this behavior. |
| |
| Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file") |
| Signed-off-by: Doug Berger <opendmb@gmail.com> |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/broadcom/genet/bcmgenet.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| @@ -2598,6 +2598,7 @@ static int bcmgenet_probe(struct platfor |
| const void *macaddr; |
| struct resource *r; |
| int err = -EIO; |
| + const char *phy_mode_str; |
| |
| /* Up to GENET_MAX_MQ_CNT + 1 TX queues and a single RX queue */ |
| dev = alloc_etherdev_mqs(sizeof(*priv), GENET_MAX_MQ_CNT + 1, 1); |
| @@ -2685,6 +2686,13 @@ static int bcmgenet_probe(struct platfor |
| if (IS_ERR(priv->clk_wol)) |
| dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n"); |
| |
| + /* If this is an internal GPHY, power it on now, before UniMAC is |
| + * brought out of reset as absolutely no UniMAC activity is allowed |
| + */ |
| + if (dn && !of_property_read_string(dn, "phy-mode", &phy_mode_str) && |
| + !strcasecmp(phy_mode_str, "internal")) |
| + bcmgenet_power_up(priv, GENET_POWER_PASSIVE); |
| + |
| err = reset_umac(priv); |
| if (err) |
| goto err_clk_disable; |