From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: shaohua.li@intel.com
Cc: linux-pm@lists.linux-foundation.org, linux-acpi@vger.kernel.org,
stern@rowland.harvard.edu, dbrownell@users.sourceforge.net,
Jesse Barnes <jbarnes@virtuousgeek.org>
Subject: Re: [RFC 3/5] pci wakeup handler
Date: Mon, 8 Sep 2008 15:09:50 +0200 [thread overview]
Message-ID: <200809081509.52070.rjw@sisk.pl> (raw)
In-Reply-To: <20080908092305.438330804@sli10-desk.sh.intel.com>
On Monday, 8 of September 2008, shaohua.li@intel.com wrote:
> pci subsystem wakeup handler.
> ---
> drivers/pci/pci-driver.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> Index: linux/drivers/pci/pci-driver.c
> ===================================================================
> --- linux.orig/drivers/pci/pci-driver.c 2008-09-08 13:55:56.000000000 +0800
> +++ linux/drivers/pci/pci-driver.c 2008-09-08 14:24:42.000000000 +0800
> @@ -472,12 +472,57 @@ static int pci_pm_resume_noirq(struct de
> return error;
> }
>
> +/*
> + * Called when dev is suspected to invoke a wakeup event, return 0 if yes
> + * */
> +static int pci_pm_wakeup_event(struct device *dev)
> +{
> + struct pci_dev *pdev = to_pci_dev(dev);
> + int pme_pos = pci_find_capability(pdev, PCI_CAP_ID_PM);
Pleae use dev->pm_cap instead.
> + struct pci_driver *drv = pdev->driver;
> + u16 reg16;
> + int spurious = 0;
Please use 'bool' for boolean variables.
> + int ret = -ENODEV;
> +
> + if (pme_pos == 0) {
> + /*
> + * Some USB devices haven't PME, but have specific registers to
> + * control wakeup
> + */
> + goto out;
> + }
> +
> + /* clear PME status and disable PME to avoid interrupt flood */
> + pci_read_config_word(pdev, pme_pos + PCI_PM_CTRL, ®16);
The variable used for that is called 'pmcsr' in the other functions. Perhaps
call it 'pmcsr' instead of 'reg16' here too?
> + if (!(reg16 & PCI_PM_CTRL_PME_STATUS))
> + return -ENODEV;
> + /* I see spurious GPE here, just ignore it for now */
> + if (!(reg16 & PCI_PM_CTRL_PME_ENABLE))
> + spurious = 1;
> + reg16 &= ~PCI_PM_CTRL_PME_ENABLE;
> + reg16 |= PCI_PM_CTRL_PME_STATUS;
> + pci_write_config_word(pdev, pme_pos + PCI_PM_CTRL, reg16);
I think you can use pci_pm_active() for clearing PME# and status. That'll
read the register once more, but that shouldn't be a problem. Actually, you
can do:
pci_read_config_word(pdev, pme_pos + PCI_PM_CTRL, &pmcsr);
if (!(pmcsr & PCI_PM_CTRL_PME_STATUS))
/* No event (why have we been called, actually? */
return -EINVAL;
pci_pm_active(dev, false);
if (!(pmcsr & PCI_PM_CTRL_PME_ENABLE))
/* Spurious event */
return -ENODEV;
> +
> + if (spurious)
> + return -ENODEV;
> + ret = 0;
> + /* This device invokes PME, gives driver a chance to do something */
> +out:
> + if (drv && drv->pm && drv->pm->base.wakeup_event) {
> + if (!ret) /* ignore return value in this case */
> + drv->pm->base.wakeup_event(&pdev->dev);
> + else
> + return drv->pm->base.wakeup_event(&pdev->dev);
Hm, I'd do:
if (drv && drv->pm && drv->pm->base.wakeup_event) {
int dev_ret = drv->pm->base.wakeup_event(&pdev->dev);
if (ret)
ret = dev_ret;
}
Also, why do you think we should ignore the returned value if ret is zero?
> + }
> + return ret;
> +}
> #else /* !CONFIG_SUSPEND */
>
> #define pci_pm_suspend NULL
> #define pci_pm_suspend_noirq NULL
> #define pci_pm_resume NULL
> #define pci_pm_resume_noirq NULL
> +#define pci_pm_wakeup_event NULL
>
> #endif /* !CONFIG_SUSPEND */
>
> @@ -651,6 +696,7 @@ struct pm_ext_ops pci_pm_ops = {
> .thaw = pci_pm_thaw,
> .poweroff = pci_pm_poweroff,
> .restore = pci_pm_restore,
> + .wakeup_event = pci_pm_wakeup_event,
> },
> .suspend_noirq = pci_pm_suspend_noirq,
> .resume_noirq = pci_pm_resume_noirq,
>
Thanks,
Rafael
next prev parent reply other threads:[~2008-09-08 13:05 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-08 9:19 [RFC 0/5] device wakeup event support shaohua.li
2008-09-08 9:19 ` [RFC 1/5] devcore introduce wakeup_event callback shaohua.li
2008-09-09 2:56 ` David Brownell
2008-09-09 3:49 ` Li, Shaohua
2008-09-09 3:49 ` Li, Shaohua
2008-09-09 5:26 ` David Brownell
2008-09-09 5:26 ` David Brownell
2008-09-09 8:36 ` Li, Shaohua
2008-09-09 11:45 ` Rafael J. Wysocki
2008-09-09 14:22 ` Alan Stern
2008-09-09 14:22 ` Alan Stern
2008-09-09 11:45 ` Rafael J. Wysocki
2008-09-09 8:36 ` Li, Shaohua
2008-09-09 14:18 ` Alan Stern
2008-09-09 15:52 ` David Brownell
2008-09-09 15:52 ` David Brownell
2008-09-09 18:39 ` Alan Stern
2008-09-09 18:39 ` Alan Stern
2008-09-09 14:18 ` Alan Stern
2008-09-09 2:56 ` David Brownell
2008-09-08 9:19 ` shaohua.li
2008-09-08 9:19 ` [RFC 2/5] devcore adds generic wakeup event handler shaohua.li
2008-09-08 9:19 ` shaohua.li
2008-09-08 9:19 ` [RFC 3/5] pci wakeup handler shaohua.li
2008-09-08 9:19 ` shaohua.li
2008-09-08 13:09 ` Rafael J. Wysocki [this message]
2008-09-09 1:44 ` Li, Shaohua
2008-09-09 2:56 ` David Brownell
2008-09-09 3:38 ` Li, Shaohua
2008-09-09 3:38 ` Li, Shaohua
2008-09-09 2:56 ` David Brownell
2008-09-09 1:44 ` Li, Shaohua
2008-09-08 13:09 ` Rafael J. Wysocki
2008-09-09 2:56 ` David Brownell
2008-09-09 3:33 ` Li, Shaohua
2008-09-09 3:33 ` Li, Shaohua
2008-09-09 4:04 ` David Brownell
2008-09-09 4:04 ` David Brownell
2008-09-09 11:09 ` Rafael J. Wysocki
2008-09-09 16:18 ` David Brownell
2008-09-09 16:18 ` David Brownell
2008-09-09 11:09 ` Rafael J. Wysocki
2008-09-09 2:56 ` David Brownell
2008-09-08 9:19 ` [RFC 4/5] PCIe native PME detection shaohua.li
2008-09-08 9:19 ` shaohua.li
2008-09-08 21:36 ` Rafael J. Wysocki
2008-09-08 21:36 ` Rafael J. Wysocki
2008-09-09 1:21 ` Li, Shaohua
2008-09-09 1:21 ` Li, Shaohua
2008-09-08 9:19 ` [RFC 5/5] ACPI GPE based wakeup event detection shaohua.li
2008-09-08 20:57 ` Rafael J. Wysocki
2008-09-09 1:13 ` Zhao Yakui
2008-09-09 1:13 ` Zhao Yakui
2008-09-09 1:08 ` Li, Shaohua
2008-09-09 1:08 ` Li, Shaohua
2008-09-09 11:17 ` Rafael J. Wysocki
2008-09-09 11:17 ` Rafael J. Wysocki
2008-09-09 14:08 ` Alan Stern
2008-09-09 14:08 ` Alan Stern
2008-09-08 20:57 ` Rafael J. Wysocki
2008-09-08 9:19 ` shaohua.li
2008-09-09 2:41 ` [RFC 0/5] device wakeup event support David Brownell
2008-09-09 3:54 ` Li, Shaohua
2008-09-09 3:54 ` Li, Shaohua
2008-09-09 2:41 ` David Brownell
-- strict thread matches above, loose matches on Subject: below --
2008-09-11 6:30 [RFC 0/5] device wakeup event support v2 Shaohua Li
2008-09-11 6:30 ` [RFC 3/5] pci wakeup handler Shaohua Li
2008-09-11 6:30 ` Shaohua Li
2008-10-19 19:50 ` Rafael J. Wysocki
2008-10-22 5:34 ` Shaohua Li
2008-10-22 12:01 ` Rafael J. Wysocki
2008-10-22 12:01 ` Rafael J. Wysocki
2008-10-22 5:34 ` Shaohua Li
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=200809081509.52070.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=dbrownell@users.sourceforge.net \
--cc=jbarnes@virtuousgeek.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=shaohua.li@intel.com \
--cc=stern@rowland.harvard.edu \
/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.