int register_vio_slot(struct device_node *dn) { u32 *index; char *name; int rc = 1; struct slot *slot = NULL; index = (u32 *) get_property(dn, "ibm,my-drc-index", NULL); if (!index) goto exit_rc; name = get_property(dn, "ibm,loc-code", NULL); if (!name) goto exit_rc; if (!(slot = alloc_slot_struct(dn, *index, name, 0))) { rc = -ENOMEM; goto exit_rc; } slot->dev_type = VIO_DEV; slot->dev.vio_dev = vio_find_node(dn); if (!slot->dev.vio_dev) slot->dev.vio_dev = vio_register_device(dn); if (slot->dev.vio_dev) slot->state = CONFIGURED; else slot->state = NOT_CONFIGURED; if (setup_vio_hotplug_slot_info(slot)) goto exit_rc; info("%s: registered VIO device[name=%s vio_dev=%p]\n", __FUNCTION__, slot->name, slot->dev.vio_dev); rc = register_slot(slot); exit_rc: if (rc && slot) dealloc_slot_struct(slot); return (rc); }
int register_vio_slot(struct device_node *dn) { u32 *index; char *name; int rc = 1; struct slot *slot = NULL; rc = rpaphp_get_drc_props(dn, NULL, &name, NULL, NULL); if (rc) goto exit_rc; index = (u32 *) get_property(dn, "ibm,my-drc-index", NULL); if (!index) goto exit_rc; if (!(slot = alloc_slot_struct(dn, *index, name, 0))) { rc = -ENOMEM; goto exit_rc; } slot->dev_type = VIO_DEV; slot->dev.vio_dev = vio_find_node(dn); if (slot->dev.vio_dev) { /* * rpaphp is the only owner of vio devices and * does not need extra reference taken by * vio_find_node */ put_device(&slot->dev.vio_dev->dev); } else slot->dev.vio_dev = vio_register_device_node(dn); if (slot->dev.vio_dev) slot->state = CONFIGURED; else slot->state = NOT_CONFIGURED; if (setup_vio_hotplug_slot_info(slot)) goto exit_rc; strcpy(slot->name, slot->dev.vio_dev->dev.bus_id); info("%s: registered VIO device[name=%s vio_dev=%p]\n", __FUNCTION__, slot->name, slot->dev.vio_dev); rc = register_slot(slot); exit_rc: if (rc && slot) dealloc_slot_struct(slot); return (rc); }