From: Chang Liu <cl91tp@gmail.com>
To: linux-pci@vger.kernel.org
Cc: Chang Liu <cl91tp@gmail.com>
Subject: [PATCH] PCI: add a quirk for keeping Bus Master bit on shutdown
Date: Tue, 12 Nov 2013 19:40:03 +0000 [thread overview]
Message-ID: <1384285203-642-1-git-send-email-cl91tp@gmail.com> (raw)
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=63861
Commit b566a22c2 and 7897e60227 made pci_device_shutdown()
unconditionally clear Bus Master bit for every pci devices.
While this works for most hardware, certain devices are not
compatible with this. Intel Lynx Point-LP SATA Controller,
for example, will hang the system if its Bus Master bit is
cleared during device shutdown. This patch adds a pci quirk
so that device drivers can instruct pci_device_shutdown()
to keep Bus Master from being cleared, and then implements
this mechanism for the Intel Lynx Point-LP AHCI driver.
Signed-off-by: Chang Liu <cl91tp@gmail.com>
---
As per Takao's suggestion, add a new member into struct pci_dev
and add a quirk in the ahci driver. I tested this on my
machine (Acer V5-573G) and it works fine.
drivers/ata/ahci.c | 8 ++++++++
drivers/pci/pci-driver.c | 11 ++++++++---
include/linux/pci.h | 1 +
3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 8e28f92..de6efcb 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1385,6 +1385,14 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master(pdev);
+ /* We normally clear Bus Master on pci device shutdown. However,
+ * doing so for Intel Lynx Point-LP SATA Controller [AHCI mode]
+ * hangs the system. Therefore keep it.
+ * See bug report: https://bugzilla.kernel.org/show_bug.cgi?id=63861
+ */
+ if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x9c03)
+ pdev->keep_busmaster_on_shutdown = 1;
+
if (hpriv->flags & AHCI_HFLAG_MULTI_MSI)
return ahci_host_activate(host, pdev->irq, n_msis);
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 38f3c01..ff15b0c 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -392,10 +392,15 @@ static void pci_device_shutdown(struct device *dev)
pci_msix_shutdown(pci_dev);
/*
- * Turn off Bus Master bit on the device to tell it to not
- * continue to do DMA. Don't touch devices in D3cold or unknown states.
+ * If the hardware is okay with it, turn off Bus Master bit
+ * on the device to tell it not to continue doing DMA.
+ * Don't touch devices in D3cold or unknown states.
+ * On certain hardware clearing Bus Master bit on shutdown
+ * may hang the entire system. In these cases the driver of
+ * these devices should set keep_busmaster_on_shutdown to 1.
*/
- if (pci_dev->current_state <= PCI_D3hot)
+ if (!pci_dev->keep_busmaster_on_shutdown
+ && pci_dev->current_state <= PCI_D3hot)
pci_clear_master(pci_dev);
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index da172f9..63db735 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -322,6 +322,7 @@ struct pci_dev {
/* keep track of device state */
unsigned int is_added:1;
unsigned int is_busmaster:1; /* device is busmaster */
+ unsigned int keep_busmaster_on_shutdown:1; /* do not clear busmaster on shutdown */
unsigned int no_msi:1; /* device may not use msi */
unsigned int block_cfg_access:1; /* config space access is blocked */
unsigned int broken_parity_status:1; /* Device generates false positive parity */
--
1.8.4.2
next reply other threads:[~2013-11-12 11:40 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-12 19:40 Chang Liu [this message]
2013-11-26 3:33 ` [PATCH] PCI: add a quirk for keeping Bus Master bit on shutdown Bjorn Helgaas
2013-11-26 4:11 ` Chang Liu
2013-11-26 4:20 ` Bjorn Helgaas
2013-11-26 5:39 ` Lan Tianyu
2013-11-26 16:40 ` Khalid Aziz
2013-11-26 17:35 ` Bjorn Helgaas
2013-11-26 17:48 ` Matthew Garrett
2013-11-26 18:37 ` Khalid Aziz
2013-11-26 19:38 ` Konstantin Khlebnikov
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=1384285203-642-1-git-send-email-cl91tp@gmail.com \
--to=cl91tp@gmail.com \
--cc=linux-pci@vger.kernel.org \
/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.