Blame SOURCES/0002-sky2-Disable-MSI-on-Dell-Inspiron-1545-and-Gateway-P.patch

Kmods SIG 9c492e
From b33b7cd6fd86478dd2890a9abeb6f036aa01fdf7 Mon Sep 17 00:00:00 2001
Kmods SIG 9c492e
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
Kmods SIG 9c492e
Date: Mon, 4 Mar 2019 15:00:03 +0800
Kmods SIG 9c492e
Subject: [Backport b33b7cd6fd86] sky2: Disable MSI on Dell Inspiron 1545 and
Kmods SIG 9c492e
 Gateway P-79
Kmods SIG 9c492e
Kmods SIG 9c492e
Some sky2 chips fire IRQ after S3, before the driver is fully resumed:
Kmods SIG 9c492e
[ 686.804877] do_IRQ: 1.37 No irq handler for vector
Kmods SIG 9c492e
Kmods SIG 9c492e
This is likely a platform bug that device isn't fully quiesced during
Kmods SIG 9c492e
S3. Use MSI-X, maskable MSI or INTx can prevent this issue from
Kmods SIG 9c492e
happening.
Kmods SIG 9c492e
Kmods SIG 9c492e
Since MSI-X and maskable MSI are not supported by this device, fallback
Kmods SIG 9c492e
to use INTx on affected platforms.
Kmods SIG 9c492e
Kmods SIG 9c492e
BugLink: https://bugs.launchpad.net/bugs/1807259
Kmods SIG 9c492e
BugLink: https://bugs.launchpad.net/bugs/1809843
Kmods SIG 9c492e
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Kmods SIG 9c492e
Signed-off-by: David S. Miller <davem@davemloft.net>
Kmods SIG 9c492e
---
Kmods SIG 9c492e
 src/sky2.c | 24 +++++++++++++++++++++++-
Kmods SIG 9c492e
 1 file changed, 23 insertions(+), 1 deletion(-)
Kmods SIG 9c492e
Kmods SIG 9c492e
diff --git a/src/sky2.c b/src/sky2.c
Kmods SIG 9c492e
index 57727fe1501ee851ec5ca3e4dfe45d54ee5934e9..8b3495ee2b6eb7aeeabdb4449e21e05f61562435 100644
Kmods SIG 9c492e
--- a/src/sky2.c
Kmods SIG 9c492e
+++ b/src/sky2.c
Kmods SIG 9c492e
@@ -46,6 +46,7 @@
Kmods SIG 9c492e
 #include <linux/mii.h>
Kmods SIG 9c492e
 #include <linux/of_device.h>
Kmods SIG 9c492e
 #include <linux/of_net.h>
Kmods SIG 9c492e
+#include <linux/dmi.h>
Kmods SIG 9c492e
 
Kmods SIG 9c492e
 #include <asm/irq.h>
Kmods SIG 9c492e
 
Kmods SIG 9c492e
@@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128;
Kmods SIG 9c492e
 module_param(copybreak, int, 0);
Kmods SIG 9c492e
 MODULE_PARM_DESC(copybreak, "Receive copy threshold");
Kmods SIG 9c492e
 
Kmods SIG 9c492e
-static int disable_msi = 0;
Kmods SIG 9c492e
+static int disable_msi = -1;
Kmods SIG 9c492e
 module_param(disable_msi, int, 0);
Kmods SIG 9c492e
 MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
Kmods SIG 9c492e
 
Kmods SIG 9c492e
@@ -4917,6 +4918,24 @@ static const char *sky2_name(u8 chipid, char *buf, int sz)
Kmods SIG 9c492e
 	return buf;
Kmods SIG 9c492e
 }
Kmods SIG 9c492e
 
Kmods SIG 9c492e
+static const struct dmi_system_id msi_blacklist[] = {
Kmods SIG 9c492e
+	{
Kmods SIG 9c492e
+		.ident = "Dell Inspiron 1545",
Kmods SIG 9c492e
+		.matches = {
Kmods SIG 9c492e
+			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
Kmods SIG 9c492e
+			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1545"),
Kmods SIG 9c492e
+		},
Kmods SIG 9c492e
+	},
Kmods SIG 9c492e
+	{
Kmods SIG 9c492e
+		.ident = "Gateway P-79",
Kmods SIG 9c492e
+		.matches = {
Kmods SIG 9c492e
+			DMI_MATCH(DMI_SYS_VENDOR, "Gateway"),
Kmods SIG 9c492e
+			DMI_MATCH(DMI_PRODUCT_NAME, "P-79"),
Kmods SIG 9c492e
+		},
Kmods SIG 9c492e
+	},
Kmods SIG 9c492e
+	{}
Kmods SIG 9c492e
+};
Kmods SIG 9c492e
+
Kmods SIG 9c492e
 static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Kmods SIG 9c492e
 {
Kmods SIG 9c492e
 	struct net_device *dev, *dev1;
Kmods SIG 9c492e
@@ -5028,6 +5047,9 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
Kmods SIG 9c492e
 		goto err_out_free_pci;
Kmods SIG 9c492e
 	}
Kmods SIG 9c492e
 
Kmods SIG 9c492e
+	if (disable_msi == -1)
Kmods SIG 9c492e
+		disable_msi = !!dmi_check_system(msi_blacklist);
Kmods SIG 9c492e
+
Kmods SIG 9c492e
 	if (!disable_msi && pci_enable_msi(pdev) == 0) {
Kmods SIG 9c492e
 		err = sky2_test_msi(hw);
Kmods SIG 9c492e
 		if (err) {
Kmods SIG 9c492e
-- 
Kmods SIG 9c492e
2.31.1
Kmods SIG 9c492e