Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751256Ab0BHV3w (ORCPT ); Mon, 8 Feb 2010 16:29:52 -0500 Received: from ogre.sisk.pl ([217.79.144.158]:60171 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750701Ab0BHV3v (ORCPT ); Mon, 8 Feb 2010 16:29:51 -0500 From: "Rafael J. Wysocki" To: linux-pm@lists.linux-foundation.org Subject: Re: [linux-pm] [PATCH 8/9] PCI / ACPI / PM: Platform support for PCI PME wake-up (rev. 7) Date: Mon, 8 Feb 2010 22:30:30 +0100 User-Agent: KMail/1.12.4 (Linux/2.6.33-rc7-rjw; KDE/4.3.5; x86_64; ; ) Cc: Gary Hade , Linux PCI , LKML , Jesse Barnes , "Moore, Robert" , Matthew Garrett References: <201001101431.38630.rjw@sisk.pl> <20100208175333.GA9334@us.ibm.com> <201002082017.14631.rjw@sisk.pl> In-Reply-To: <201002082017.14631.rjw@sisk.pl> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201002082230.30497.rjw@sisk.pl> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4116 Lines: 112 On Monday 08 February 2010, Rafael J. Wysocki wrote: > On Monday 08 February 2010, Gary Hade wrote: > > On Sat, Feb 06, 2010 at 09:11:56PM +0100, Rafael J. Wysocki wrote: > > > On Saturday 06 February 2010, Bjorn Helgaas wrote: > > > > On Sunday 10 January 2010 07:01:03 am Rafael J. Wysocki wrote: > > > > > From: Rafael J. Wysocki > > > > > > > > > > Although the majority of PCI devices can generate PMEs that in > > > > > principle may be used to wake up devices suspended at run time, > > > > > platform support is generally necessary to convert PMEs into wake-up > > > > > events that can be delivered to the kernel. If ACPI is used for this > > > > > purpose, a PME generated by a PCI device will trigger the ACPI GPE > > > > > associated with the device to generate an ACPI wake-up event that we > > > > > can set up a handler for, provided that everything is configured > > > > > correctly. > > > > > > > > I think acpiphp needs a little attention after this patch. Gary > > > > Hade noticed while testing Jesse's linux-next branch that acpiphp > > > > complains like this: > > > > > > > > acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 > > > > acpiphp: Slot [9] registered > > > > acpiphp: Slot [10] registered > > > > acpiphp_glue: failed to register interrupt notify handler > > > > acpiphp: Slot [6] registered > > > > acpiphp_glue: failed to register interrupt notify handler > > > > > > > > I reproduced this on an HP rx3600 (ia64), and found that acpiphp > > > > doesn't complain on commit 82533a617f453, but it *does* complain > > > > on commit fb3383bb4ac6e, which seems to be this patch. > > > > > > I can't see the possible reason looking at the code alone. > > > > > > Could you add a debug printk() printing the error code returned by > > > pci_acpi_add_hp_notifier() in acpiphp_glue.c:register_slot(), please? > > > > Rafael, On the system where I ran into the problem it returns > > AE_NOT_FOUND. See below. > > Thanks! > > Well, that means there's no struct acpi_device object associated with handle. > > I must admit I didn't take that into consideration, but it should be easily > fixable. I'll send a patch for that later today. Patch appended. If the theory is correct, it should fix the issue. Please test. Rafael --- drivers/pci/pci-acpi.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) Index: linux-2.6/drivers/pci/pci-acpi.c =================================================================== --- linux-2.6.orig/drivers/pci/pci-acpi.c +++ linux-2.6/drivers/pci/pci-acpi.c @@ -116,10 +116,19 @@ acpi_status pci_acpi_add_hp_notifier(acp { struct pci_acpi_notify_data *nd; struct acpi_device *dev; - acpi_status status = AE_OK; + acpi_status status; + + if (!handle) + return AE_BAD_PARAMETER; - if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &dev))) - return AE_NOT_FOUND; + status = acpi_bus_get_device(handle, &dev); + /* + * If there's no struct acpi_device for given handle, try to install the + * handler directly. + */ + if (ACPI_FAILURE(status)) + return acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, + handler, context); mutex_lock(&pci_acpi_notifier_mtx); @@ -170,10 +179,19 @@ acpi_status pci_acpi_remove_hp_notifier( { struct pci_acpi_notify_data *nd; struct acpi_device *dev; - acpi_status status = AE_NOT_FOUND; + acpi_status status; + + if (!handle) + return AE_BAD_PARAMETER; - if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &dev))) - return AE_NOT_FOUND; + status = acpi_bus_get_device(handle, &dev); + /* + * If there's no struct acpi_device for given handle, try to remove the + * handler directly. + */ + if (ACPI_FAILURE(status)) + return acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, + handler); mutex_lock(&pci_acpi_notifier_mtx); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/