From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: "Yinghai Lu" <yhlu.kernel@gmail.com>
Cc: "Jeff Garzik" <jgarzik@redhat.com>, "Ingo Molnar" <mingo@elte.hu>,
"Eric W. Biederman" <ebiederm@xmission.com>,
"Andrew Morton" <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, netdev <netdev@vger.kernel.org>,
Jesse Barnes <jbarnes@virtuousgeek.org>
Subject: Re: [PATCH] net: forcedeth use pci_choose_state instead of PCI_D3hot - v2
Date: Sun, 17 Aug 2008 23:47:35 +0200 [thread overview]
Message-ID: <200808172347.36582.rjw@sisk.pl> (raw)
In-Reply-To: <86802c440808171358y55361a52pa6d0aacf44a1875f@mail.gmail.com>
On Sunday, 17 of August 2008, Yinghai Lu wrote:
> On Sun, Aug 17, 2008 at 12:34 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > On Sunday, 17 of August 2008, Rafael J. Wysocki wrote:
> >> On Sunday, 17 of August 2008, Yinghai Lu wrote:
> >> > On Sun, Aug 17, 2008 at 9:55 AM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> >> > > On Sunday, 17 of August 2008, Rafael J. Wysocki wrote:
> >> > >> On Sunday, 17 of August 2008, Yinghai Lu wrote:
> >> > >> > after
> >> > >> >
> >> > >> > | commit f735a2a1a4f2a0f5cd823ce323e82675990469e2
> >> > >> > | Author: Tobias Diedrich <ranma+kernel@tdiedrich.de>
> >> > >> > | Date: Sun May 18 15:02:37 2008 +0200
> >> > >> > |
> >> > >> > | [netdrvr] forcedeth: setup wake-on-lan before shutting down
> >> > >> > |
> >> > >> > | When hibernating in 'shutdown' mode, after saving the image the suspend hook
> >> > >> > | is not called again.
> >> > >> > | However, if the device is in promiscous mode, wake-on-lan will not work.
> >> > >> > | This adds a shutdown hook to setup wake-on-lan before the final shutdown.
> >> > >> > |
> >> > >> > | Signed-off-by: Tobias Diedrich <ranma+kernel@tdiedrich.de>
> >> > >> > | Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
> >> > >> >
> >> > >> > my servers with nvidia mcp55 nic doesn't work with msi in second kernel by kexec
> >> > >> >
> >> > >> > after remove pci_set_power_state(, PCI_D3hot) that nic/msi will work again.
> >> > >> >
> >> > >> > check with e1000 is using pci_choose_state in _shutdown.
> >> > >
> >> > > This is wrong.
> >> > >
> >> > >> > So change that pci_choose_state(pdev, ...), and it works.
> >> > >>
> >> > >> Well, this doesn't look like a good solution to me, because you're putting
> >> > >> PMSG_SUSPEND in there, which is not correct for shutdown. The right thing to
> >> > >> do would be to avoid changing the device power state if nv_shutdown() is
> >> > >> used for kexec or to rework the initialization of the adapter to handle the
> >> > >> case when it's initially in D3.
> >> > >>
> >> > >> Does it help if you just remove the pci_set_power_state(pdev, PCI_D3hot)
> >> > >> altogether?
> >> > >
> >> > > Ah, sorry. I see it does.
> >> > >
> >> > > Actually, I think you can use pci_prepare_to_sleep() instead of
> >> > > pci_enable_wake() / pci_set_power_state() combo. It wasn't designed for this
> >> > > purpose, but should work nevertheless.
> >> > >
> >> > > Can you please check if the appended patch works instead of your one?
> >> > >
> >> > > Rafael
> >> > >
> >> > > ---
> >> > > Fix the problem that boxes with NVidia MCP55 don't work with MSI
> >> > > in a kexeced kernel.
> >> > >
> >> > > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> >> > > ---
> >> > > drivers/net/forcedeth.c | 4 +---
> >> > > 1 file changed, 1 insertion(+), 3 deletions(-)
> >> > >
> >> > > Index: linux-2.6/drivers/net/forcedeth.c
> >> > > ===================================================================
> >> > > --- linux-2.6.orig/drivers/net/forcedeth.c
> >> > > +++ linux-2.6/drivers/net/forcedeth.c
> >> > > @@ -5975,10 +5975,8 @@ static void nv_shutdown(struct pci_dev *
> >> > > if (netif_running(dev))
> >> > > nv_close(dev);
> >> > >
> >> > > - pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
> >> > > - pci_enable_wake(pdev, PCI_D3cold, np->wolenabled);
> >> > > pci_disable_device(pdev);
> >> > > - pci_set_power_state(pdev, PCI_D3hot);
> >> > > + pci_prepare_to_sleep(pdev);
> >> > > }
> >> > > #else
> >> > > #define nv_suspend NULL
> >> > >
> >> > >
> >> >
> >> > your patch doesn't work... it seems that silicon has problem with D3Hot
> >>
> >> Okay, so perhaps it's better to do something like this:
> >>
> >> ---
> >> drivers/net/forcedeth.c | 8 +++++---
> >> 1 file changed, 5 insertions(+), 3 deletions(-)
> >>
> >> Index: linux-2.6/drivers/net/forcedeth.c
> >> ===================================================================
> >> --- linux-2.6.orig/drivers/net/forcedeth.c
> >> +++ linux-2.6/drivers/net/forcedeth.c
> >> @@ -5975,10 +5975,12 @@ static void nv_shutdown(struct pci_dev *
> >> if (netif_running(dev))
> >> nv_close(dev);
> >>
> >> - pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
> >> - pci_enable_wake(pdev, PCI_D3cold, np->wolenabled);
> >> pci_disable_device(pdev);
> >> - pci_set_power_state(pdev, PCI_D3hot);
> >> + if (system_state == SYS_POWER_OFF) {
> >
> > Sorry, it should be SYSTEM_POWER_OFF here. Corrected patch is appended.
> >
> >> + if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled))
> >> + pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
> >> + pci_set_power_state(pdev, PCI_D3hot);
> >> + }
> >> }
> >> #else
> >> #define nv_suspend NULL
> >> --
> >
> > ---
> > drivers/net/forcedeth.c | 8 +++++---
> > 1 file changed, 5 insertions(+), 3 deletions(-)
> >
> > Index: linux-2.6/drivers/net/forcedeth.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/net/forcedeth.c
> > +++ linux-2.6/drivers/net/forcedeth.c
> > @@ -5975,10 +5975,12 @@ static void nv_shutdown(struct pci_dev *
> > if (netif_running(dev))
> > nv_close(dev);
> >
> > - pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
> > - pci_enable_wake(pdev, PCI_D3cold, np->wolenabled);
> > pci_disable_device(pdev);
> > - pci_set_power_state(pdev, PCI_D3hot);
> > + if (system_state == SYSTEM_POWER_OFF) {
> > + if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled))
> > + pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
> > + pci_set_power_state(pdev, PCI_D3hot);
> > + }
> > }
> > #else
> > #define nv_suspend NULL
> >
>
> why not like e1000 to
> pci_set_power_state(pdev, pci_choose_state(pdev, PMSG_SUSPEND));
>
> pci_choose_state would check if platform support those state...
... but ->shutdown() only involves the platform in the
'system_state == SYSTEM_POWER_OFF' case!
In fact, using pci_choose_state() in ->shutdown() is a very convoluted way of
checking the 'system_state' value, and not a 100% reliable one. :-)
Namely, the fact that pci_choose_state() returns you D0 instead of D3hot for
'system_state != SYSTEM_POWER_OFF' is a pure coincidence (accidentally, there
is an ACPI handle for the device, but there need not be one) and you should
not rely on that in general. Generally speaking, pci_choose_state() is not to
be used outside of the drivers' ->suspend() routines.
[Yes, this means e1000 will have to be fixed, as I said before.]
Apart from this, pci_choose_state() is broken and will shortly be deprecated.
Moreover, in future all direct references to PMSG_SUSPEND from the drivers
will be removed.
Thanks,
Rafael
next prev parent reply other threads:[~2008-08-17 21:44 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-17 6:25 [PATCH] net: forcedeth use pci_choose_state instead of PCI_D3hot - v2 Yinghai Lu
2008-08-17 13:02 ` Rafael J. Wysocki
2008-08-17 16:55 ` Rafael J. Wysocki
2008-08-17 19:16 ` Yinghai Lu
2008-08-17 19:29 ` Rafael J. Wysocki
2008-08-17 19:34 ` Rafael J. Wysocki
2008-08-17 20:58 ` Yinghai Lu
2008-08-17 21:47 ` Rafael J. Wysocki [this message]
2008-08-18 10:22 ` Rafael J. Wysocki
2008-08-18 21:50 ` Yinghai Lu
2008-08-18 22:08 ` Rafael J. Wysocki
2008-08-18 22:36 ` Yinghai Lu
2008-08-19 18:45 ` [PATCH] forcedeth: Fix kexec regression Rafael J. Wysocki
2008-08-19 20:37 ` Andrew Morton
2008-08-19 20:49 ` Rafael J. Wysocki
2008-08-20 7:01 ` Eric W. Biederman
2008-08-20 13:12 ` Rafael J. Wysocki
2008-08-18 22:37 ` [PATCH] net: forcedeth use pci_choose_state instead of PCI_D3hot - v2 Yinghai Lu
2008-08-18 22:42 ` Simon Arlott
2008-08-19 17:58 ` Rafael J. Wysocki
2008-08-19 18:33 ` Simon Arlott
2008-08-19 21:09 ` Rafael J. Wysocki
2008-08-30 19:39 ` Simon Arlott
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=200808172347.36582.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=jbarnes@virtuousgeek.org \
--cc=jgarzik@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=netdev@vger.kernel.org \
--cc=yhlu.kernel@gmail.com \
/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.