All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Peter Wu <lekensteyn@gmail.com>,
	Bastien Traverse <bastien.traverse@gmail.com>,
	linux-kernel@vger.kernel.org, francis.moro@gmail.com,
	linux-pm@vger.kernel.org
Subject: Re: 3.12: ethernet controller missing after resuming from suspend to RAM
Date: Tue, 11 Feb 2014 12:42:37 +0200	[thread overview]
Message-ID: <20140211104237.GE18029@intel.com> (raw)
In-Reply-To: <4302366.hs31VgE4VT@vostro.rjw.lan>

On Mon, Feb 10, 2014 at 11:39:29PM +0100, Rafael J. Wysocki wrote:
> > _STA() returns 0x0A instead of 0x0F. Could there be something missing in
> > the ACPI hotplug code that overlooks this and removes the device on resume?
> 
> That is possible.  Actually even quite likely, but let's wait for the response
> from Peter.

Here's a hack that should take the 0xa return value into consideration. It
turned out that this case is even mentioned in the ACPI spec.

diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index e2a783fdb98f..014381b42d86 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)
 	return (unsigned int)sta;
 }
 
+static inline bool device_sta_valid(unsigned long long sta)
+{
+	/*
+	 * ACPI spec says that _STA may return bit 0 clear with bit 8 set
+	 * if the device is valid but does not require device driver to be
+	 * loaded (chapter 6.3.7).
+	 */
+	unsigned mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
+	return (sta & mask) == mask;
+}
+
 /**
  * trim_stale_devices - remove PCI devices that are not responding.
  * @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;
 
 		status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
-		alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL)
+		alive = (ACPI_SUCCESS(status) && device_sta_valid(sta))
 			|| acpiphp_no_hotplug(handle);
 	}
 	if (!alive) {
@@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
 		mutex_lock(&slot->crit_sect);
 		if (slot_no_hotplug(slot)) {
 			; /* do nothing */
-		} else if (get_slot_status(slot) == ACPI_STA_ALL) {
+		} else if (device_sta_valid(get_slot_status(slot))) {
 			/* remove stale devices if any */
 			list_for_each_entry_safe_reverse(dev, tmp,
 							 &bus->devices, bus_list)



  reply	other threads:[~2014-02-11 10:35 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 23:42 3.12: ethernet controller missing after resuming from suspend to RAM Bastien Traverse
2014-02-06  7:38 ` Francis Moreau
2014-02-06 12:40   ` Rafael J. Wysocki
2014-02-06 13:33     ` Francis Moreau
2014-02-06 23:15     ` Bastien Traverse
2014-02-07  7:29       ` Francis Moreau
2014-02-06 21:08 ` Peter Wu
2014-02-06 23:28   ` Rafael J. Wysocki
2014-02-06 23:27     ` Peter Wu
2014-02-06 23:48       ` Rafael J. Wysocki
2014-02-07 13:43         ` Peter Wu
2014-02-08 15:01           ` Rafael J. Wysocki
2014-02-08 21:34             ` Peter Wu
2014-02-09 21:46               ` Rafael J. Wysocki
2014-02-09 23:18                 ` Peter Wu
2014-02-10  0:52                   ` Rafael J. Wysocki
2014-02-10  1:15                     ` Peter Wu
2014-02-10 12:10                       ` Rafael J. Wysocki
2014-02-10 12:20                         ` Mika Westerberg
2014-02-10 22:39                           ` Rafael J. Wysocki
2014-02-11 10:42                             ` Mika Westerberg [this message]
2014-02-11 12:57                               ` Rafael J. Wysocki
2014-02-11 18:17                               ` Peter Wu
2014-02-11 23:58                                 ` Rafael J. Wysocki
2014-02-12  7:44                                   ` Francis Moreau
2014-02-12 14:04                                     ` Rafael J. Wysocki
2014-02-18 12:18                                       ` Bastien Traverse
2014-02-12  9:21                                   ` Mika Westerberg
2014-02-06 23:41     ` Bastien Traverse
2014-02-07  1:19       ` Rafael J. Wysocki
2014-02-09 18:44         ` Bastien Traverse
2014-02-09 22:07           ` Peter Wu
2014-02-11 18:14             ` Bastien Traverse
2014-02-10  8:17           ` Francis Moreau
  -- strict thread matches above, loose matches on Subject: below --
2013-12-12  8:00 Francis Moreau
2013-12-12  9:28 ` Francis Moreau
2013-12-12 14:57 ` Rafael J. Wysocki
2013-12-12 17:43   ` Francis Moreau
2013-12-12 17:58     ` Rafael J. Wysocki
2013-12-12 19:17       ` Francis Moreau
2013-12-17  8:05         ` Francis Moreau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140211104237.GE18029@intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=bastien.traverse@gmail.com \
    --cc=francis.moro@gmail.com \
    --cc=lekensteyn@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.