diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/acpi/container.c | 5 | ||||
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 15 |
2 files changed, 16 insertions, 4 deletions
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c index 0b6ae6eb5c4a..368f9ddb8480 100644 --- a/drivers/acpi/container.c +++ b/drivers/acpi/container.c | |||
| @@ -79,9 +79,10 @@ static int container_device_attach(struct acpi_device *adev, | |||
| 79 | ACPI_COMPANION_SET(dev, adev); | 79 | ACPI_COMPANION_SET(dev, adev); |
| 80 | dev->release = acpi_container_release; | 80 | dev->release = acpi_container_release; |
| 81 | ret = device_register(dev); | 81 | ret = device_register(dev); |
| 82 | if (ret) | 82 | if (ret) { |
| 83 | put_device(dev); | ||
| 83 | return ret; | 84 | return ret; |
| 84 | 85 | } | |
| 85 | adev->driver_data = dev; | 86 | adev->driver_data = dev; |
| 86 | return 1; | 87 | return 1; |
| 87 | } | 88 | } |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index e2a783fdb98f..7c7a388c85ab 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -730,6 +730,17 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot) | |||
| 730 | return (unsigned int)sta; | 730 | return (unsigned int)sta; |
| 731 | } | 731 | } |
| 732 | 732 | ||
| 733 | static inline bool device_status_valid(unsigned int sta) | ||
| 734 | { | ||
| 735 | /* | ||
| 736 | * ACPI spec says that _STA may return bit 0 clear with bit 3 set | ||
| 737 | * if the device is valid but does not require a device driver to be | ||
| 738 | * loaded (Section 6.3.7 of ACPI 5.0A). | ||
| 739 | */ | ||
| 740 | unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING; | ||
| 741 | return (sta & mask) == mask; | ||
| 742 | } | ||
| 743 | |||
| 733 | /** | 744 | /** |
| 734 | * trim_stale_devices - remove PCI devices that are not responding. | 745 | * trim_stale_devices - remove PCI devices that are not responding. |
| 735 | * @dev: PCI device to start walking the hierarchy from. | 746 | * @dev: PCI device to start walking the hierarchy from. |
| @@ -745,7 +756,7 @@ static void trim_stale_devices(struct pci_dev *dev) | |||
| 745 | unsigned long long sta; | 756 | unsigned long long sta; |
| 746 | 757 | ||
| 747 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | 758 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); |
| 748 | alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL) | 759 | alive = (ACPI_SUCCESS(status) && device_status_valid(sta)) |
| 749 | || acpiphp_no_hotplug(handle); | 760 | || acpiphp_no_hotplug(handle); |
| 750 | } | 761 | } |
| 751 | if (!alive) { | 762 | if (!alive) { |
| @@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge) | |||
| 792 | mutex_lock(&slot->crit_sect); | 803 | mutex_lock(&slot->crit_sect); |
| 793 | if (slot_no_hotplug(slot)) { | 804 | if (slot_no_hotplug(slot)) { |
| 794 | ; /* do nothing */ | 805 | ; /* do nothing */ |
| 795 | } else if (get_slot_status(slot) == ACPI_STA_ALL) { | 806 | } else if (device_status_valid(get_slot_status(slot))) { |
| 796 | /* remove stale devices if any */ | 807 | /* remove stale devices if any */ |
| 797 | list_for_each_entry_safe_reverse(dev, tmp, | 808 | list_for_each_entry_safe_reverse(dev, tmp, |
| 798 | &bus->devices, bus_list) | 809 | &bus->devices, bus_list) |
