Commit 4f8d81b7 authored by Stefan Wahren's avatar Stefan Wahren Committed by David S. Miller

net: bcmgenet: Refactor register access in bcmgenet_mii_config

The register access in bcmgenet_mii_config() is a little bit opaque and
not easy to extend. In preparation for the missing RGMII PHY modes
move all the phy name assignments into the switch statement and the
register access to the end of the function. This make the code easier
to read and extend.
Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a50e3a99
...@@ -213,11 +213,10 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) ...@@ -213,11 +213,10 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
udelay(2); udelay(2);
} }
priv->ext_phy = !priv->internal_phy &&
(priv->phy_interface != PHY_INTERFACE_MODE_MOCA);
switch (priv->phy_interface) { switch (priv->phy_interface) {
case PHY_INTERFACE_MODE_INTERNAL: case PHY_INTERFACE_MODE_INTERNAL:
phy_name = "internal PHY";
/* fall through */
case PHY_INTERFACE_MODE_MOCA: case PHY_INTERFACE_MODE_MOCA:
/* Irrespective of the actually configured PHY speed (100 or /* Irrespective of the actually configured PHY speed (100 or
* 1000) GENETv4 only has an internal GPHY so we will just end * 1000) GENETv4 only has an internal GPHY so we will just end
...@@ -229,11 +228,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) ...@@ -229,11 +228,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
else else
port_ctrl = PORT_MODE_INT_EPHY; port_ctrl = PORT_MODE_INT_EPHY;
bcmgenet_sys_writel(priv, port_ctrl, SYS_PORT_CTRL); if (!phy_name) {
if (priv->internal_phy) {
phy_name = "internal PHY";
} else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
phy_name = "MoCA"; phy_name = "MoCA";
bcmgenet_moca_phy_setup(priv); bcmgenet_moca_phy_setup(priv);
} }
...@@ -242,11 +237,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) ...@@ -242,11 +237,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
case PHY_INTERFACE_MODE_MII: case PHY_INTERFACE_MODE_MII:
phy_name = "external MII"; phy_name = "external MII";
phy_set_max_speed(phydev, SPEED_100); phy_set_max_speed(phydev, SPEED_100);
bcmgenet_sys_writel(priv, port_ctrl = PORT_MODE_EXT_EPHY;
PORT_MODE_EXT_EPHY, SYS_PORT_CTRL);
/* Restore the MII PHY after isolation */
if (bmcr >= 0)
phy_write(phydev, MII_BMCR, bmcr);
break; break;
case PHY_INTERFACE_MODE_REVMII: case PHY_INTERFACE_MODE_REVMII:
...@@ -261,31 +252,38 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) ...@@ -261,31 +252,38 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
port_ctrl = PORT_MODE_EXT_RVMII_50; port_ctrl = PORT_MODE_EXT_RVMII_50;
else else
port_ctrl = PORT_MODE_EXT_RVMII_25; port_ctrl = PORT_MODE_EXT_RVMII_25;
bcmgenet_sys_writel(priv, port_ctrl, SYS_PORT_CTRL);
break; break;
case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII:
/* RGMII_NO_ID: TXC transitions at the same time as TXD /* RGMII_NO_ID: TXC transitions at the same time as TXD
* (requires PCB or receiver-side delay) * (requires PCB or receiver-side delay)
* RGMII: Add 2ns delay on TXC (90 degree shift)
* *
* ID is implicitly disabled for 100Mbps (RG)MII operation. * ID is implicitly disabled for 100Mbps (RG)MII operation.
*/ */
phy_name = "external RGMII (no delay)";
id_mode_dis = BIT(16); id_mode_dis = BIT(16);
/* fall through */ port_ctrl = PORT_MODE_EXT_GPHY;
break;
case PHY_INTERFACE_MODE_RGMII_TXID: case PHY_INTERFACE_MODE_RGMII_TXID:
if (id_mode_dis) /* RGMII_TXID: Add 2ns delay on TXC (90 degree shift) */
phy_name = "external RGMII (no delay)"; phy_name = "external RGMII (TX delay)";
else port_ctrl = PORT_MODE_EXT_GPHY;
phy_name = "external RGMII (TX delay)";
bcmgenet_sys_writel(priv,
PORT_MODE_EXT_GPHY, SYS_PORT_CTRL);
break; break;
default: default:
dev_err(kdev, "unknown phy mode: %d\n", priv->phy_interface); dev_err(kdev, "unknown phy mode: %d\n", priv->phy_interface);
return -EINVAL; return -EINVAL;
} }
bcmgenet_sys_writel(priv, port_ctrl, SYS_PORT_CTRL);
/* Restore the MII PHY after isolation */
if (bmcr >= 0)
phy_write(phydev, MII_BMCR, bmcr);
priv->ext_phy = !priv->internal_phy &&
(priv->phy_interface != PHY_INTERFACE_MODE_MOCA);
/* This is an external PHY (xMII), so we need to enable the RGMII /* This is an external PHY (xMII), so we need to enable the RGMII
* block for the interface to work * block for the interface to work
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment