net: mv643xx_eth: Fetch the phy connection type from DT
The MAC is capable of RGMII mode and that is probably a more typical connection type than GMII today (eg it is used by Marvell Reference designs for several SOCs). Let DT users specify the standard phy-connection-type = "rgmii-id"; On a phy node. Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>hifive-unleashed-5.1
parent
ad60133909
commit
fd33b2447b
|
@ -49,6 +49,7 @@ Optional port properties:
|
||||||
and
|
and
|
||||||
|
|
||||||
- phy-handle: See ethernet.txt file in the same directory.
|
- phy-handle: See ethernet.txt file in the same directory.
|
||||||
|
- phy-mode: See ethernet.txt file in the same directory.
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
|
|
|
@ -2968,6 +2968,22 @@ static void set_params(struct mv643xx_eth_private *mp,
|
||||||
mp->txq_count = pd->tx_queue_count ? : 1;
|
mp->txq_count = pd->tx_queue_count ? : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_phy_mode(struct mv643xx_eth_private *mp)
|
||||||
|
{
|
||||||
|
struct device *dev = mp->dev->dev.parent;
|
||||||
|
int iface = -1;
|
||||||
|
|
||||||
|
if (dev->of_node)
|
||||||
|
iface = of_get_phy_mode(dev->of_node);
|
||||||
|
|
||||||
|
/* Historical default if unspecified. We could also read/write
|
||||||
|
* the interface state in the PSC1
|
||||||
|
*/
|
||||||
|
if (iface < 0)
|
||||||
|
iface = PHY_INTERFACE_MODE_GMII;
|
||||||
|
return iface;
|
||||||
|
}
|
||||||
|
|
||||||
static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
|
static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
|
||||||
int phy_addr)
|
int phy_addr)
|
||||||
{
|
{
|
||||||
|
@ -2994,7 +3010,7 @@ static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
|
||||||
"orion-mdio-mii", addr);
|
"orion-mdio-mii", addr);
|
||||||
|
|
||||||
phydev = phy_connect(mp->dev, phy_id, mv643xx_eth_adjust_link,
|
phydev = phy_connect(mp->dev, phy_id, mv643xx_eth_adjust_link,
|
||||||
PHY_INTERFACE_MODE_GMII);
|
get_phy_mode(mp));
|
||||||
if (!IS_ERR(phydev)) {
|
if (!IS_ERR(phydev)) {
|
||||||
phy_addr_set(mp, addr);
|
phy_addr_set(mp, addr);
|
||||||
break;
|
break;
|
||||||
|
@ -3090,6 +3106,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||||
mp = netdev_priv(dev);
|
mp = netdev_priv(dev);
|
||||||
platform_set_drvdata(pdev, mp);
|
platform_set_drvdata(pdev, mp);
|
||||||
|
|
||||||
|
@ -3129,7 +3146,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
|
||||||
if (pd->phy_node) {
|
if (pd->phy_node) {
|
||||||
mp->phy = of_phy_connect(mp->dev, pd->phy_node,
|
mp->phy = of_phy_connect(mp->dev, pd->phy_node,
|
||||||
mv643xx_eth_adjust_link, 0,
|
mv643xx_eth_adjust_link, 0,
|
||||||
PHY_INTERFACE_MODE_GMII);
|
get_phy_mode(mp));
|
||||||
if (!mp->phy)
|
if (!mp->phy)
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
else
|
else
|
||||||
|
@ -3187,8 +3204,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
|
||||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
dev->gso_max_segs = MV643XX_MAX_TSO_SEGS;
|
dev->gso_max_segs = MV643XX_MAX_TSO_SEGS;
|
||||||
|
|
||||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
|
||||||
|
|
||||||
if (mp->shared->win_protect)
|
if (mp->shared->win_protect)
|
||||||
wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect);
|
wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue