diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-07-18 18:15:45 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-07-20 00:27:18 -0400 |
commit | 91ba3c2128e9ee490a9f04bcd5b54749b18e4410 (patch) | |
tree | c90f5711b990468dc684a8859cc9c498b8d4163d /arch/sparc64/kernel/vio.c | |
parent | 48db7b7c50cdb06c85f0ff01b5c19ac34903048b (diff) |
[SPARC64]: Fix handling of multiple vdc-port nodes.
The "id" property in vdc-port nodes are not unique, they
are all zero. Therefore assign ID's using the parent's
"cfg-handle" property which will be unique.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/vio.c')
-rw-r--r-- | arch/sparc64/kernel/vio.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/vio.c b/arch/sparc64/kernel/vio.c index 7e65b5a28bff..9ae1f61d4db9 100644 --- a/arch/sparc64/kernel/vio.c +++ b/arch/sparc64/kernel/vio.c | |||
@@ -221,6 +221,27 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
221 | return NULL; | 221 | return NULL; |
222 | } | 222 | } |
223 | 223 | ||
224 | if (!strcmp(type, "vdc-port")) { | ||
225 | u64 a; | ||
226 | |||
227 | id = NULL; | ||
228 | mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_BACK) { | ||
229 | u64 target; | ||
230 | |||
231 | target = mdesc_arc_target(hp, a); | ||
232 | id = mdesc_get_property(hp, target, | ||
233 | "cfg-handle", NULL); | ||
234 | if (id) | ||
235 | break; | ||
236 | } | ||
237 | if (!id) { | ||
238 | printk(KERN_ERR "VIO: vdc-prot lacks parent " | ||
239 | "cfg-handle.\n"); | ||
240 | return NULL; | ||
241 | } | ||
242 | } else | ||
243 | id = mdesc_get_property(hp, mp, "id", NULL); | ||
244 | |||
224 | bus_id_name = type; | 245 | bus_id_name = type; |
225 | if (!strcmp(type, "domain-services-port")) | 246 | if (!strcmp(type, "domain-services-port")) |
226 | bus_id_name = "ds"; | 247 | bus_id_name = "ds"; |
@@ -260,13 +281,15 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
260 | 281 | ||
261 | vio_fill_channel_info(hp, mp, vdev); | 282 | vio_fill_channel_info(hp, mp, vdev); |
262 | 283 | ||
263 | id = mdesc_get_property(hp, mp, "id", NULL); | 284 | if (!id) { |
264 | if (!id) | ||
265 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s", | 285 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s", |
266 | bus_id_name); | 286 | bus_id_name); |
267 | else | 287 | vdev->dev_no = ~(u64)0; |
288 | } else { | ||
268 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s-%lu", | 289 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s-%lu", |
269 | bus_id_name, *id); | 290 | bus_id_name, *id); |
291 | vdev->dev_no = *id; | ||
292 | } | ||
270 | 293 | ||
271 | vdev->dev.parent = parent; | 294 | vdev->dev.parent = parent; |
272 | vdev->dev.bus = &vio_bus_type; | 295 | vdev->dev.bus = &vio_bus_type; |