xb wrote: > Hi all, > > We have platforms that do not boot in 2.6.16, but boot OK with 2.6.15 > (loop in ACPI code). > After some investigations, I found this is due to pci buses that are > described in the configuration, but not available in limited > configurations. > These buses have a _STA method, but no _INI method. > With 2.6.15, the _STA method is run, and as the bus is not present, > the bus and all devices behind it are ignored. > With 2.6.16, as no _INI method is provided for the bus, _STA method is > not run, and then we loop when executing methods for devices behind > the not present bus. > > Having a look to ACPI specification, I could find nowhere the > restriction that _STA method is called only when an _INI method is > provided for the device: > > "6.5.1 _INI (Init) > ... > If the _STA method indicates that the device is present, OSPM will > evaluate the _INI for the device (if the _INI method exists) and will > examine each of the children of the device for _INI methods. If the > _STA method indicates that the device is not present, OSPM will not > run the _INI and will not examine the children of the device for _INI > methods. " > > > traces ----------------------------------------------- > > > Device PC11 > 000060e4: 02 . . Name _HID > 000060e9: 03 . . . PNP0A03 PCI Bus 0x030ad041 > 000060ee: 02 . . Name _UID > 000060f3: 03 . . . 0x0b > 000060f5: 02 . . Name _ADR > 000060fa: 03 . . . 0x00 > 000060fc: 02 ---- 'PCI bus number setup by the BIOS' Method _BBN > 00006102: 03 . . . 0x00 > 00006103: 03 . . . Return > 00006104: 04 . . . . path: \_SB_.CSFF.IO15.B1__ > 00006117: 02 ---- 'Dynamic_Statu' Method _STA > 0000611d: 03 . . . 0x00 > 0000611e: 03 . . . If > 00006120: 04 . . . . LEqual > 00006121: 05 . . . . . path: \_SB_.CSFF.IO11.HUBD > 00006134: 05 . . . . . 0x00 > 00006136: 04 . . . . Return > 00006137: 05 . . . . . 0x0f > 00006139: 03 . . . Return > 0000613a: 04 . . . . 0x00 > 0000613c: 02 ---- 'Current Resource Setting' Method _CRS > 00006142: 03 . . . 0x00 > 00006143: 03 . . . Return > 00006144: 04 . . . . path: \_SB_.HLRS > 0000614e: 03 . . . 0x01 > 00006150: 03 . . . 0x01 > 00006152: 02 > I checked that the following patch fixes the problem: --- linux-2.6.16-old/drivers/acpi/namespace/nsinit.c 2006-03-31 18:26:23.000000000 +0200 +++ linux-2.6.16-new/drivers/acpi/namespace/nsinit.c 2006-04-03 14:57:28.000000000 +0200 @@ -362,19 +362,6 @@ acpi_ns_init_one_device(acpi_handle obj_ info->device_count++; /* - * Check if the _INI method exists for this device - - * if _INI does not exist, there is no need to run _STA - * No _INI means device requires no initialization - */ - status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI), - device_node, ACPI_TYPE_METHOD, &ini_node); - if (ACPI_FAILURE(status)) { - /* No _INI method found - move on to next device */ - - return_ACPI_STATUS(AE_OK); - } - - /* * Run _STA to determine if we can run _INI on the device - * the device must be present before _INI can be run. * However, _STA is not required - assume device present if no _STA @@ -405,6 +392,17 @@ acpi_ns_init_one_device(acpi_handle obj_ } /* + * Check if the _INI method exists for this device - + * No _INI means device requires no initialization + */ + status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI), + device_node, ACPI_TYPE_METHOD, &ini_node); + if (ACPI_FAILURE(status)) { + /* No _INI method found - move on to next device */ + return_ACPI_STATUS(AE_OK); + } + + /* * The device is present and _INI exists. Run the _INI method. * (We already have the _INI node from above) */