diff options
| -rw-r--r-- | drivers/net/ucc_geth.c | 20 | ||||
| -rw-r--r-- | drivers/net/ucc_geth.h | 2 | ||||
| -rw-r--r-- | drivers/net/ucc_geth_mii.c | 12 | ||||
| -rw-r--r-- | drivers/net/ucc_geth_mii.h | 1 |
4 files changed, 32 insertions, 3 deletions
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 11441225bf41..e87986867ba5 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
| @@ -1536,6 +1536,11 @@ static void adjust_link(struct net_device *dev) | |||
| 1536 | static int init_phy(struct net_device *dev) | 1536 | static int init_phy(struct net_device *dev) |
| 1537 | { | 1537 | { |
| 1538 | struct ucc_geth_private *priv = netdev_priv(dev); | 1538 | struct ucc_geth_private *priv = netdev_priv(dev); |
| 1539 | struct device_node *np = priv->node; | ||
| 1540 | struct device_node *phy, *mdio; | ||
| 1541 | const phandle *ph; | ||
| 1542 | char bus_name[MII_BUS_ID_SIZE]; | ||
| 1543 | const unsigned int *id; | ||
| 1539 | struct phy_device *phydev; | 1544 | struct phy_device *phydev; |
| 1540 | char phy_id[BUS_ID_SIZE]; | 1545 | char phy_id[BUS_ID_SIZE]; |
| 1541 | 1546 | ||
| @@ -1543,8 +1548,18 @@ static int init_phy(struct net_device *dev) | |||
| 1543 | priv->oldspeed = 0; | 1548 | priv->oldspeed = 0; |
| 1544 | priv->oldduplex = -1; | 1549 | priv->oldduplex = -1; |
| 1545 | 1550 | ||
| 1546 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, priv->ug_info->mdio_bus, | 1551 | ph = of_get_property(np, "phy-handle", NULL); |
| 1547 | priv->ug_info->phy_address); | 1552 | phy = of_find_node_by_phandle(*ph); |
| 1553 | mdio = of_get_parent(phy); | ||
| 1554 | |||
| 1555 | id = of_get_property(phy, "reg", NULL); | ||
| 1556 | |||
| 1557 | of_node_put(phy); | ||
| 1558 | of_node_put(mdio); | ||
| 1559 | |||
| 1560 | uec_mdio_bus_name(bus_name, mdio); | ||
| 1561 | snprintf(phy_id, sizeof(phy_id), "%s:%02x", | ||
| 1562 | bus_name, *id); | ||
| 1548 | 1563 | ||
| 1549 | phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface); | 1564 | phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface); |
| 1550 | 1565 | ||
| @@ -3748,6 +3763,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
| 3748 | 3763 | ||
| 3749 | ugeth->ug_info = ug_info; | 3764 | ugeth->ug_info = ug_info; |
| 3750 | ugeth->dev = dev; | 3765 | ugeth->dev = dev; |
| 3766 | ugeth->node = np; | ||
| 3751 | 3767 | ||
| 3752 | return 0; | 3768 | return 0; |
| 3753 | } | 3769 | } |
diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 8f699cb773ee..16cbe42ba43c 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h | |||
| @@ -1186,6 +1186,8 @@ struct ucc_geth_private { | |||
| 1186 | int oldspeed; | 1186 | int oldspeed; |
| 1187 | int oldduplex; | 1187 | int oldduplex; |
| 1188 | int oldlink; | 1188 | int oldlink; |
| 1189 | |||
| 1190 | struct device_node *node; | ||
| 1189 | }; | 1191 | }; |
| 1190 | 1192 | ||
| 1191 | void uec_set_ethtool_ops(struct net_device *netdev); | 1193 | void uec_set_ethtool_ops(struct net_device *netdev); |
diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c index c001d261366b..54635911305c 100644 --- a/drivers/net/ucc_geth_mii.c +++ b/drivers/net/ucc_geth_mii.c | |||
| @@ -156,7 +156,7 @@ static int uec_mdio_probe(struct of_device *ofdev, const struct of_device_id *ma | |||
| 156 | if (err) | 156 | if (err) |
| 157 | goto reg_map_fail; | 157 | goto reg_map_fail; |
| 158 | 158 | ||
| 159 | snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start); | 159 | uec_mdio_bus_name(new_bus->id, np); |
| 160 | 160 | ||
| 161 | new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL); | 161 | new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL); |
| 162 | 162 | ||
| @@ -283,3 +283,13 @@ void uec_mdio_exit(void) | |||
| 283 | { | 283 | { |
| 284 | of_unregister_platform_driver(&uec_mdio_driver); | 284 | of_unregister_platform_driver(&uec_mdio_driver); |
| 285 | } | 285 | } |
| 286 | |||
| 287 | void uec_mdio_bus_name(char *name, struct device_node *np) | ||
| 288 | { | ||
| 289 | const u32 *reg; | ||
| 290 | |||
| 291 | reg = of_get_property(np, "reg", NULL); | ||
| 292 | |||
| 293 | snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0); | ||
| 294 | } | ||
| 295 | |||
diff --git a/drivers/net/ucc_geth_mii.h b/drivers/net/ucc_geth_mii.h index 1e45b2028a50..840cf80235b7 100644 --- a/drivers/net/ucc_geth_mii.h +++ b/drivers/net/ucc_geth_mii.h | |||
| @@ -97,4 +97,5 @@ int uec_mdio_read(struct mii_bus *bus, int mii_id, int regnum); | |||
| 97 | int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value); | 97 | int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value); |
| 98 | int __init uec_mdio_init(void); | 98 | int __init uec_mdio_init(void); |
| 99 | void uec_mdio_exit(void); | 99 | void uec_mdio_exit(void); |
| 100 | void uec_mdio_bus_name(char *name, struct device_node *np); | ||
| 100 | #endif /* __UEC_MII_H */ | 101 | #endif /* __UEC_MII_H */ |
