Thread (4 messages) flat view 4 messages, 3 authors, 2009-03-19
STALE6394d

[PATCH -next] gianfar, ucc_geth: Use proper address translation for MDIO buses

From: Anton Vorontsov <hidden>
Date: 2009-03-18 19:21:54
Also in: netdev
Subsystem: networking drivers, the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

Currently the drivers just read "reg" property for constructing MDIO
bus IDs, but this won't work when we'll start using "ranges = <>" in
the device tree, so this will pop up:

Gianfar MII Bus: probed
sysfs: duplicate filename 'mdio@520' can not be created
------------[ cut here ]------------
Badness at c00c70c8 [verbose debug info unavailable]
NIP: c00c70c8 LR: c00c70c8 CTR: c018220c
REGS: cf82fc80 TRAP: 0700   Not tainted  (2.6.29-rc7-00607-g8deffe6)
MSR: 00029032 <EE,ME,CE,IR,DR>  CR: 22044022  XER: 20000000
TASK = cf821bd0[1] 'swapper' THREAD: cf82e000
GPR00: c00c70c8 cf82fd30 cf821bd0 0000003b 000013a4 ffffffff c017f4f0 000013a4
GPR08: c03becbc c03b1f5c 000013a4 c03be810 22044022 00000000 0ffcd000 00000000
GPR16: 0ffc2420 0ffc6eb8 00000000 00000000 00000000 00000000 00000000 00000000
GPR24: 00000000 00000000 cf9d8c40 cf82fd78 cf86ec14 cf82fd48 cf9d78a4 ffffffef
NIP [c00c70c8] sysfs_add_one+0x4c/0x54
LR [c00c70c8] sysfs_add_one+0x4c/0x54
Call Trace:
[cf82fd30] [c00c70c8] sysfs_add_one+0x4c/0x54 (unreliable)
[cf82fd40] [c00c7628] create_dir+0x58/0xc0
[cf82fd70] [c00c76d0] sysfs_create_dir+0x40/0x70
[cf82fd90] [c0154d58] create_dir+0x28/0x78
[cf82fda0] [c01551f4] kobject_add_internal+0x98/0x13c
[cf82fdc0] [c0155868] kobject_add+0x60/0x98
[cf82fdf0] [c01854f4] device_add+0x98/0x2ac
[cf82fe10] [c01985d8] mdiobus_register+0xb4/0x1b8
[cf82fe30] [c0194f1c] gfar_mdio_probe+0x188/0x204
...

This patch fixes the issue by translating the "reg" property to a full
address, and thus avoids the duplicate names.

Signed-off-by: Anton Vorontsov <redacted>
---

This is for 2.6.30 since we don't use ranges = <> yet.

David, I believe Kumar would like to pick this patch into his tree
along with a patch set that adds "ranges = <>" properties to the
device tree... So would you mind if we take it via powerpc.git?

Thanks,

 drivers/net/gianfar_mii.c  |   10 +++++++---
 drivers/net/ucc_geth_mii.c |   10 +++++++---
 2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/net/gianfar_mii.c b/drivers/net/gianfar_mii.c
index f49a426..92bc1a7 100644
--- a/drivers/net/gianfar_mii.c
+++ b/drivers/net/gianfar_mii.c
@@ -193,11 +193,15 @@ static int *create_irq_map(struct device_node *np)
 
 void gfar_mdio_bus_name(char *name, struct device_node *np)
 {
-	const u32 *reg;
+	const u32 *addr;
+	u64 taddr = OF_BAD_ADDR;
 
-	reg = of_get_property(np, "reg", NULL);
+	addr = of_get_address(np, 0, NULL, NULL);
+	if (addr)
+		taddr = of_translate_address(np, addr);
 
-	snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0);
+	snprintf(name, MII_BUS_ID_SIZE, "%s@%llx", np->name,
+		(unsigned long long)taddr);
 }
 
 /* Scan the bus in reverse, looking for an empty spot */
diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c
index 0ada4ed..99cbd14 100644
--- a/drivers/net/ucc_geth_mii.c
+++ b/drivers/net/ucc_geth_mii.c
@@ -286,10 +286,14 @@ void uec_mdio_exit(void)
 
 void uec_mdio_bus_name(char *name, struct device_node *np)
 {
-        const u32 *reg;
+	const u32 *addr;
+	u64 taddr = OF_BAD_ADDR;
 
-        reg = of_get_property(np, "reg", NULL);
+	addr = of_get_address(np, 0, NULL, NULL);
+	if (addr)
+		taddr = of_translate_address(np, addr);
 
-        snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0);
+	snprintf(name, MII_BUS_ID_SIZE, "%s@%llx", np->name,
+		(unsigned long long)taddr);
 }
 
-- 
1.5.6.5
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help