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: Kai-Heng Feng <kai.heng.feng@canonical.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d6089c7418
commit
b33b7cd6fd
|
@ -46,6 +46,7 @@
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/of_net.h>
|
#include <linux/of_net.h>
|
||||||
|
#include <linux/dmi.h>
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
|
||||||
|
@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128;
|
||||||
module_param(copybreak, int, 0);
|
module_param(copybreak, int, 0);
|
||||||
MODULE_PARM_DESC(copybreak, "Receive copy threshold");
|
MODULE_PARM_DESC(copybreak, "Receive copy threshold");
|
||||||
|
|
||||||
static int disable_msi = 0;
|
static int disable_msi = -1;
|
||||||
module_param(disable_msi, int, 0);
|
module_param(disable_msi, int, 0);
|
||||||
MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
|
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;
|
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)
|
static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
{
|
{
|
||||||
struct net_device *dev, *dev1;
|
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;
|
goto err_out_free_pci;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (disable_msi == -1)
|
||||||
|
disable_msi = !!dmi_check_system(msi_blacklist);
|
||||||
|
|
||||||
if (!disable_msi && pci_enable_msi(pdev) == 0) {
|
if (!disable_msi && pci_enable_msi(pdev) == 0) {
|
||||||
err = sky2_test_msi(hw);
|
err = sky2_test_msi(hw);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
Loading…
Reference in New Issue