mei: add mei_quirk_probe function
One customer reported a bug that Ubuntu 12.04 will hang on the C600/X79 servers with SPS firmware. *This patch works around this issue.
*
The patch is included in upstream 3.6-rc3. Please consider to backport it to Ubuntu 12.04 and 12.10.
*
commit a2f6985332d2564e443d9d889ce70f39b3293d09
Author: Tomas Winkler <tomas.winkler@intel.com>
Date:** Mon Aug 6 15:23:55 2012 +0300
*
*** mei: add mei_quirk_probe function
*
*** The main purpose of this function is to exclude ME devices
*** without support for MEI/HECI interface from binding
*
*** Currently affected systems are C600/X79 based servers
*** that expose PCI device even though it doesn't supported ME Interface.
*** MEI driver accessing such nonfunctional device can corrupt
*** the system.
*
*** Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
*** Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
*
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 0923302..7422c76 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -925,6 +925,27 @@ static struct miscdevice* mei_misc_device = {
};
*
/**
+ * mei_quirk_probe - probe for devices that doesn't valid ME interface
+ * @pdev: PCI device structure
+ * @ent: entry into pci_device_table
+ *
+ * returns true if ME Interface is valid, false otherwise
+ */
+static bool __devinit mei_quirk_probe(struct pci_dev *pdev,
+****************************** const struct pci_device_id *ent)
+{
+****** u32 reg;
+****** if (ent->device == MEI_DEV_ID_PBG_1) {
+************** pci_read_config_dword(pdev, 0x48, ®);
+************** /* make sure that bit 9 is up and bit 10 is down */
+************** if ((reg & 0x600) == 0x200) {
+********************** dev_info(&pdev->dev, "Device doesn't have valid ME Interface
");
+********************** return false;
+************** }
+****** }
+****** return true;
+}
+/**
* * mei_probe - Device Initialization Routine
* *
* * @pdev: PCI device structure
@@ -939,6 +960,12 @@ static int __devinit mei_probe(struct pci_dev *pdev,
******* int err;
*
******* mutex_lock(&mei_mutex);
+
+****** if (!mei_quirk_probe(pdev, ent)) {
+************** err = -ENODEV;
+************** goto end;
+****** }
+
******* if (mei_device) {
*************** err = -EEXIST;
*************** goto end;
*
--
kernel-team mailing list
kernel-team@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/kernel-team
|