Use unique device names in procfs. Device name is not unique in /proc/acpi. http://bugzilla.kernel.org/show_bug.cgi?id=8798 Use acpi_device->dev.bus_id instead of acpi_device->pnp.bus_id, like what we've done in sysfs. ACPI proc I/F will change a lot with this patch applied. But as /proc/acpi/... won't be removed in a short time, I still think it's worth doing. Does this patch miss something? Or are there any better ideas to make the ACPI device name unique in procfs? Any comments are appreciated. Thanks. Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx> --- drivers/acpi/bus.c | 29 +++++++++++++++-------------- drivers/acpi/power.c | 10 +++++----- drivers/acpi/sbs.c | 2 +- drivers/acpi/scan.c | 2 +- drivers/acpi/sleep/proc.c | 19 ++++++++++--------- drivers/acpi/thermal.c | 6 +++--- include/acpi/acpi_bus.h | 4 ++-- 7 files changed, 37 insertions(+), 35 deletions(-) Index: linux-2.6.23-rc1/drivers/acpi/thermal.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/thermal.c +++ linux-2.6.23-rc1/drivers/acpi/thermal.c @@ -834,7 +834,7 @@ static int acpi_thermal_trip_seq_show(st for (j = 0; j < tz->trips.passive.devices.count; j++) { status = acpi_bus_get_device(tz->trips.passive.devices. handles[j], &device); - seq_printf(seq, "%4.4s ", status ? "" : + seq_printf(seq, "%s ", status ? "" : acpi_device_bid(device)); } seq_puts(seq, "\n"); @@ -850,7 +850,7 @@ static int acpi_thermal_trip_seq_show(st status = acpi_bus_get_device(tz->trips.active[i]. devices.handles[j], &device); - seq_printf(seq, "%4.4s ", status ? "" : + seq_printf(seq, "%s", status ? "" : acpi_device_bid(device)); } seq_puts(seq, "\n"); @@ -1163,7 +1163,7 @@ static int acpi_thermal_add(struct acpi_ return -ENOMEM; tz->device = device; - strcpy(tz->name, device->pnp.bus_id); + strcpy(tz->name, acpi_device_bid(device)); strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); acpi_driver_data(device) = tz; Index: linux-2.6.23-rc1/include/acpi/acpi_bus.h =================================================================== --- linux-2.6.23-rc1.orig/include/acpi/acpi_bus.h +++ linux-2.6.23-rc1/include/acpi/acpi_bus.h @@ -182,7 +182,7 @@ struct acpi_device_dir { /* Plug and Play */ -typedef char acpi_bus_id[5]; +typedef char acpi_bus_id[BUS_ID_SIZE]; typedef unsigned long acpi_bus_address; typedef char acpi_hardware_id[15]; typedef char acpi_unique_id[9]; @@ -199,7 +199,7 @@ struct acpi_device_pnp { acpi_device_class device_class; /* " */ }; -#define acpi_device_bid(d) ((d)->pnp.bus_id) +#define acpi_device_bid(d) ((d)->dev.bus_id) #define acpi_device_adr(d) ((d)->pnp.bus_address) #define acpi_device_hid(d) ((d)->pnp.hardware_id) #define acpi_device_uid(d) ((d)->pnp.unique_id) Index: linux-2.6.23-rc1/drivers/acpi/sbs.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/sbs.c +++ linux-2.6.23-rc1/drivers/acpi/sbs.c @@ -424,7 +424,7 @@ static int acpi_check_update_proc(struct static int acpi_sbs_generate_event(struct acpi_device *device, int event, int state, char *bid, char *class) { - char bid_saved[5]; + char bid_saved[BUS_ID_SIZE]; char class_saved[20]; int result = 0; Index: linux-2.6.23-rc1/drivers/acpi/bus.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/bus.c +++ linux-2.6.23-rc1/drivers/acpi/bus.c @@ -110,12 +110,13 @@ int acpi_bus_get_status(struct acpi_devi if (device->status.functional && !device->status.present) { printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " "functional but not present; setting present\n", - device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); + acpi_device_bid(device), + (u32) STRUCT_TO_INT(device->status)); device->status.present = 1; } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", - device->pnp.bus_id, + acpi_device_bid(device), (u32) STRUCT_TO_INT(device->status))); return 0; @@ -168,7 +169,7 @@ int acpi_bus_get_power(acpi_handle handl } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] power state is D%d\n", - device->pnp.bus_id, device->power.state)); + acpi_device_bid(device), device->power.state)); return 0; } @@ -261,11 +262,11 @@ int acpi_bus_set_power(acpi_handle handl if (result) printk(KERN_WARNING PREFIX "Transitioning device [%s] to D%d\n", - device->pnp.bus_id, state); + acpi_device_bid(device), state); else ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] transitioned to D%d\n", - device->pnp.bus_id, state)); + acpi_device_bid(device), state)); return result; } @@ -306,7 +307,7 @@ int acpi_bus_generate_event(struct acpi_ return -ENOMEM; strcpy(event->device_class, device->pnp.device_class); - strcpy(event->bus_id, device->pnp.bus_id); + strcpy(event->bus_id, acpi_device_bid(device)); event->type = type; event->data = data; @@ -466,7 +467,7 @@ static void acpi_bus_notify(acpi_handle case ACPI_NOTIFY_BUS_CHECK: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received BUS CHECK notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); result = acpi_bus_check_scope(device); /* * TBD: We'll need to outsource certain events to non-ACPI @@ -477,7 +478,7 @@ static void acpi_bus_notify(acpi_handle case ACPI_NOTIFY_DEVICE_CHECK: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE CHECK notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); result = acpi_bus_check_device(device, NULL); /* * TBD: We'll need to outsource certain events to non-ACPI @@ -488,42 +489,42 @@ static void acpi_bus_notify(acpi_handle case ACPI_NOTIFY_DEVICE_WAKE: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE WAKE notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD */ break; case ACPI_NOTIFY_EJECT_REQUEST: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received EJECT REQUEST notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD */ break; case ACPI_NOTIFY_DEVICE_CHECK_LIGHT: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE CHECK LIGHT notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD: Exactly what does 'light' mean? */ break; case ACPI_NOTIFY_FREQUENCY_MISMATCH: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received FREQUENCY MISMATCH notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD */ break; case ACPI_NOTIFY_BUS_MODE_MISMATCH: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received BUS MODE MISMATCH notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD */ break; case ACPI_NOTIFY_POWER_FAULT: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received POWER FAULT notification for device [%s]\n", - device->pnp.bus_id)); + acpi_device_bid(device))); /* TBD */ break; Index: linux-2.6.23-rc1/drivers/acpi/scan.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/scan.c +++ linux-2.6.23-rc1/drivers/acpi/scan.c @@ -267,7 +267,7 @@ static int acpi_device_probe(struct devi acpi_start_single_object(acpi_dev); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n", - acpi_drv->name, acpi_dev->pnp.bus_id)); + acpi_drv->name, acpi_device_bid(acpi_dev))); get_device(dev); } return ret; Index: linux-2.6.23-rc1/drivers/acpi/power.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/power.c +++ linux-2.6.23-rc1/drivers/acpi/power.c @@ -197,7 +197,7 @@ static int acpi_power_on(acpi_handle han ref = container_of(node, struct acpi_power_reference, node); if (dev->handle == ref->device->handle) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] already referenced by resource [%s]\n", - dev->pnp.bus_id, resource->name)); + acpi_device_bid(dev), resource->name)); found = 1; break; } @@ -214,7 +214,7 @@ static int acpi_power_on(acpi_handle han list_add_tail(&ref->node, &resource->reference); ref->device = dev; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] added to resource [%s] references\n", - dev->pnp.bus_id, resource->name)); + acpi_device_bid(dev), resource->name)); } mutex_unlock(&resource->resource_lock); @@ -262,7 +262,7 @@ static int acpi_power_off_device(acpi_ha list_del(&ref->node); kfree(ref); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] removed from resource [%s] references\n", - dev->pnp.bus_id, resource->name)); + acpi_device_bid(dev), resource->name)); break; } } @@ -470,7 +470,7 @@ int acpi_power_transition(struct acpi_de if (result) { device->power.state = ACPI_STATE_UNKNOWN; printk(KERN_WARNING PREFIX "Transitioning device [%s] to D%d\n", - device->pnp.bus_id, state); + acpi_device_bid(device), state); } else { /* We shouldn't change the state till all above operations succeed */ device->power.state = state; @@ -602,7 +602,7 @@ static int acpi_power_add(struct acpi_de resource->device = device; mutex_init(&resource->resource_lock); INIT_LIST_HEAD(&resource->reference); - strcpy(resource->name, device->pnp.bus_id); + strcpy(resource->name, acpi_device_bid(device)); strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_POWER_CLASS); acpi_driver_data(device) = resource; Index: linux-2.6.23-rc1/drivers/acpi/sleep/proc.c =================================================================== --- linux-2.6.23-rc1.orig/drivers/acpi/sleep/proc.c +++ linux-2.6.23-rc1/drivers/acpi/sleep/proc.c @@ -359,7 +359,7 @@ acpi_system_wakeup_device_seq_show(struc { struct list_head *node, *next; - seq_printf(seq, "Device\tS-state\t Status Sysfs node\n"); + seq_printf(seq, "Device \tName\tS-state\t Status Sysfs node\n"); spin_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { @@ -372,8 +372,8 @@ acpi_system_wakeup_device_seq_show(struc spin_unlock(&acpi_device_lock); ldev = acpi_get_physical_device(dev->handle); - seq_printf(seq, "%s\t S%d\t%c%-8s ", - dev->pnp.bus_id, + seq_printf(seq, "%.15s\t%4s\t S%d\t%c%-8s ", + acpi_device_bid(dev), dev->pnp.bus_id, (u32) dev->wakeup.sleep_state, dev->wakeup.flags.run_wake ? '*' : ' ', dev->wakeup.state.enabled ? "enabled" : "disabled"); @@ -396,13 +396,13 @@ acpi_system_write_wakeup_device(struct f size_t count, loff_t * ppos) { struct list_head *node, *next; - char strbuf[5]; - char str[5] = ""; + char strbuf[BUS_ID_SIZE]; + char str[BUS_ID_SIZE] = ""; int len = count; struct acpi_device *found_dev = NULL; - if (len > 4) - len = 4; + if (len > BUS_ID_SIZE) + len = BUS_ID_SIZE; if (copy_from_user(strbuf, buffer, len)) return -EFAULT; @@ -416,7 +416,7 @@ acpi_system_write_wakeup_device(struct f if (!dev->wakeup.flags.valid) continue; - if (!strncmp(dev->pnp.bus_id, str, 4)) { + if (!strncmp(acpi_device_bid(dev), str, BUS_ID_SIZE)) { dev->wakeup.state.enabled = dev->wakeup.state.enabled ? 0 : 1; found_dev = dev; @@ -438,7 +438,8 @@ acpi_system_write_wakeup_device(struct f printk(KERN_WARNING "ACPI: '%s' and '%s' have the same GPE, " "can't disable/enable one seperately\n", - dev->pnp.bus_id, found_dev->pnp.bus_id); + acpi_device_bid(dev), + acpi_device_bid(found_dev)); dev->wakeup.state.enabled = found_dev->wakeup.state.enabled; } - To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html