Merge branches 'acpi-dock', 'acpi-scan' and 'acpi-pci-hotplug'

* acpi-dock:
  ACPI / dock: Use acpi_device_enumerated() to check if dock is present

* acpi-scan:
  ACPI / container: Fix error code path in container_device_attach()

* acpi-pci-hotplug:
  ACPI / hotplug / PCI: Relax the checking of _STA return values
This commit is contained in:
Rafael J. Wysocki 2014-02-12 14:56:58 +01:00
commit d990ce0d5b
2 changed files with 16 additions and 4 deletions

View file

@ -79,9 +79,10 @@ static int container_device_attach(struct acpi_device *adev,
ACPI_COMPANION_SET(dev, adev); ACPI_COMPANION_SET(dev, adev);
dev->release = acpi_container_release; dev->release = acpi_container_release;
ret = device_register(dev); ret = device_register(dev);
if (ret) if (ret) {
put_device(dev);
return ret; return ret;
}
adev->driver_data = dev; adev->driver_data = dev;
return 1; return 1;
} }

View file

@ -730,6 +730,17 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
return (unsigned int)sta; return (unsigned int)sta;
} }
static inline bool device_status_valid(unsigned int sta)
{
/*
* ACPI spec says that _STA may return bit 0 clear with bit 3 set
* if the device is valid but does not require a device driver to be
* loaded (Section 6.3.7 of ACPI 5.0A).
*/
unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
return (sta & mask) == mask;
}
/** /**
* trim_stale_devices - remove PCI devices that are not responding. * trim_stale_devices - remove PCI devices that are not responding.
* @dev: PCI device to start walking the hierarchy from. * @dev: PCI device to start walking the hierarchy from.
@ -745,7 +756,7 @@ static void trim_stale_devices(struct pci_dev *dev)
unsigned long long sta; unsigned long long sta;
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL) alive = (ACPI_SUCCESS(status) && device_status_valid(sta))
|| acpiphp_no_hotplug(handle); || acpiphp_no_hotplug(handle);
} }
if (!alive) { if (!alive) {
@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
mutex_lock(&slot->crit_sect); mutex_lock(&slot->crit_sect);
if (slot_no_hotplug(slot)) { if (slot_no_hotplug(slot)) {
; /* do nothing */ ; /* do nothing */
} else if (get_slot_status(slot) == ACPI_STA_ALL) { } else if (device_status_valid(get_slot_status(slot))) {
/* remove stale devices if any */ /* remove stale devices if any */
list_for_each_entry_safe_reverse(dev, tmp, list_for_each_entry_safe_reverse(dev, tmp,
&bus->devices, bus_list) &bus->devices, bus_list)