Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b33b7cd6 authored by Kai-Heng Feng's avatar Kai-Heng Feng Committed by David S. Miller
Browse files

sky2: Disable MSI on Dell Inspiron 1545 and Gateway P-79

Some sky2 chips fire IRQ after S3, before the driver is fully resumed:
[ 686.804877] do_IRQ: 1.37 No irq handler for vector

This is likely a platform bug that device isn't fully quiesced during
S3. Use MSI-X, maskable MSI or INTx can prevent this issue from
happening.

Since MSI-X and maskable MSI are not supported by this device, fallback
to use INTx on affected platforms.

BugLink: https://bugs.launchpad.net/bugs/1807259
BugLink: https://bugs.launchpad.net/bugs/1809843


Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d6089c74
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
#include <linux/mii.h>
#include <linux/of_device.h>
#include <linux/of_net.h>
#include <linux/dmi.h>

#include <asm/irq.h>

@@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128;
module_param(copybreak, int, 0);
MODULE_PARM_DESC(copybreak, "Receive copy threshold");

static int disable_msi = 0;
static int disable_msi = -1;
module_param(disable_msi, int, 0);
MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");

@@ -4917,6 +4918,24 @@ static const char *sky2_name(u8 chipid, char *buf, int sz)
	return buf;
}

static const struct dmi_system_id msi_blacklist[] = {
	{
		.ident = "Dell Inspiron 1545",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1545"),
		},
	},
	{
		.ident = "Gateway P-79",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Gateway"),
			DMI_MATCH(DMI_PRODUCT_NAME, "P-79"),
		},
	},
	{}
};

static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
	struct net_device *dev, *dev1;
@@ -5028,6 +5047,9 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
		goto err_out_free_pci;
	}

	if (disable_msi == -1)
		disable_msi = !!dmi_check_system(msi_blacklist);

	if (!disable_msi && pci_enable_msi(pdev) == 0) {
		err = sky2_test_msi(hw);
		if (err) {