Skip to content

Commit

Permalink
Merge branch 'altera_tse'
Browse files Browse the repository at this point in the history
Walter Lozano says:

====================
Altera TSE with no PHY

In some scenarios there is no PHY chip present, for example in optical links.
This serie of patches moves PHY get addr and MDIO create to a new function and
avoids PHY and MDIO probing in these cases.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Oct 6, 2014
2 parents a4b4a2b + 3354313 commit f13909c
Showing 1 changed file with 44 additions and 21 deletions.
65 changes: 44 additions & 21 deletions drivers/net/ethernet/altera/altera_tse_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,44 @@ static struct phy_device *connect_local_phy(struct net_device *dev)
return phydev;
}

static int altera_tse_phy_get_addr_mdio_create(struct net_device *dev)
{
struct altera_tse_private *priv = netdev_priv(dev);
struct device_node *np = priv->device->of_node;
int ret = 0;

priv->phy_iface = of_get_phy_mode(np);

/* Avoid get phy addr and create mdio if no phy is present */
if (!priv->phy_iface)
return 0;

/* try to get PHY address from device tree, use PHY autodetection if
* no valid address is given
*/

if (of_property_read_u32(priv->device->of_node, "phy-addr",
&priv->phy_addr)) {
priv->phy_addr = POLL_PHY;
}

if (!((priv->phy_addr == POLL_PHY) ||
((priv->phy_addr >= 0) && (priv->phy_addr < PHY_MAX_ADDR)))) {
netdev_err(dev, "invalid phy-addr specified %d\n",
priv->phy_addr);
return -ENODEV;
}

/* Create/attach to MDIO bus */
ret = altera_tse_mdio_create(dev,
atomic_add_return(1, &instance_count));

if (ret)
return -ENODEV;

return 0;
}

/* Initialize driver's PHY state, and attach to the PHY
*/
static int init_phy(struct net_device *dev)
Expand All @@ -736,6 +774,10 @@ static int init_phy(struct net_device *dev)
struct phy_device *phydev;
struct device_node *phynode;

/* Avoid init phy in case of no phy present */
if (!priv->phy_iface)
return 0;

priv->oldlink = 0;
priv->oldspeed = 0;
priv->oldduplex = -1;
Expand Down Expand Up @@ -1231,7 +1273,6 @@ static int altera_tse_probe(struct platform_device *pdev)
struct resource *dma_res;
struct altera_tse_private *priv;
const unsigned char *macaddr;
struct device_node *np = pdev->dev.of_node;
void __iomem *descmap;
const struct of_device_id *of_id = NULL;

Expand Down Expand Up @@ -1408,26 +1449,8 @@ static int altera_tse_probe(struct platform_device *pdev)
else
eth_hw_addr_random(ndev);

priv->phy_iface = of_get_phy_mode(np);

/* try to get PHY address from device tree, use PHY autodetection if
* no valid address is given
*/
if (of_property_read_u32(pdev->dev.of_node, "phy-addr",
&priv->phy_addr)) {
priv->phy_addr = POLL_PHY;
}

if (!((priv->phy_addr == POLL_PHY) ||
((priv->phy_addr >= 0) && (priv->phy_addr < PHY_MAX_ADDR)))) {
dev_err(&pdev->dev, "invalid phy-addr specified %d\n",
priv->phy_addr);
goto err_free_netdev;
}

/* Create/attach to MDIO bus */
ret = altera_tse_mdio_create(ndev,
atomic_add_return(1, &instance_count));
/* get phy addr and create mdio */
ret = altera_tse_phy_get_addr_mdio_create(ndev);

if (ret)
goto err_free_netdev;
Expand Down

0 comments on commit f13909c

Please sign in to comment.