All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@hp.com>
To: xen-devel <xen-devel@lists.xensource.com>
Subject: [PATCH] pciback: restore PCI BARs on D3->D0 transition
Date: Mon, 26 Mar 2007 13:29:03 -0600	[thread overview]
Message-ID: <1174937343.20923.38.camel@bling> (raw)


   Ever since xen-unstable cset 14308 ("pci back: Fix registration of of
filters on subsections of config space") I've been getting an MCA on the
*2nd* boot of a driver domain using an e1000 NIC.  Cset 14308 allowed
the proper setup of the PM control registers, so the NIC is put in the
D3 power state when the driver domain shuts down.  Unfortunately,
pci_set_power_state() won't restore the BARs on a D3hot/cold to D0
transition.  There are some comments in this upstream cset about why
that is:

http://www.kernel.org/hg/linux-2.6/rev/8f33e29c89a7

However, we obviously can't expect PCI devices to work without their
BARs properly programmed.  The patch below adds a call to
pci_restore_bars() as a workaround until we can figure out why the PCI
code doesn't do this for us.  Thanks,

	Alex

Signed-off-by: Alex Williamson <alex.williamson@hp.com>
---

diff -r 56caf0e37e6a linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c	Mon Mar 26 10:10:31 2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_capability_pm.c	Mon Mar 26 13:13:23 2007 -0600
@@ -33,7 +33,7 @@ static int pm_ctrl_write(struct pci_dev 
 {
 	int err;
 	u16 cur_value;
-	pci_power_t new_state;
+	pci_power_t new_state, old_state;
 
 	/* Handle setting power state separately */
 	new_state = (pci_power_t)(new_value & PCI_PM_CTRL_STATE_MASK);
@@ -52,9 +52,20 @@ static int pm_ctrl_write(struct pci_dev 
 
 	/* Let pci core handle the power management change */
 	dev_dbg(&dev->dev, "set power state to %x\n", new_state);
+	old_state = dev->current_state;
 	err = pci_set_power_state(dev, new_state);
 	if (err)
 		err = PCIBIOS_SET_FAILED;
+
+	/*
+	 * Linux does not currently restore the BARs on a transition from
+	 * D3hot/cold to D0.  Fixup here.
+	 */
+	if (new_state == PCI_D0 &&
+	    (old_state == PCI_D3hot || old_state == PCI_D3cold)) {
+		if (!(cur_value & PCI_PM_CTRL_NO_SOFT_RESET))
+			pci_restore_bars(dev);
+	}
 
       out:
 	return err;

             reply	other threads:[~2007-03-26 19:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-26 19:29 Alex Williamson [this message]
2007-03-26 20:23 ` [PATCH] pciback: restore PCI BARs on D3->D0 transition Alex Williamson
2007-03-27  0:32   ` Keir Fraser
2007-04-03 15:52     ` Chris

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=1174937343.20923.38.camel@bling \
    --to=alex.williamson@hp.com \
    --cc=xen-devel@lists.xensource.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.