Browse Source

ipmi:pci: Blacklist a Realtek "IPMI" device

Realtek has some sort of "Virtual" IPMI device on the PCI bus as a
KCS controller, but whatever it is, it's not one.  Ignore it if seen.

Reported-by: Chris Chiu <chiu@endlessm.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Tested-by: Daniel Drake <drake@endlessm.com>
Corey Minyard 7 years ago
parent
commit
bc48fa1b9d
1 changed files with 12 additions and 0 deletions
  1. 12 0
      drivers/char/ipmi/ipmi_si_pci.c

+ 12 - 0
drivers/char/ipmi/ipmi_si_pci.c

@@ -62,12 +62,24 @@ static int ipmi_pci_probe_regspacing(struct si_sm_io *io)
 	return DEFAULT_REGSPACING;
 	return DEFAULT_REGSPACING;
 }
 }
 
 
+static struct pci_device_id ipmi_pci_blacklist[] = {
+	/*
+	 * This is a "Virtual IPMI device", whatever that is.  It appears
+	 * as a KCS device by the class, but it is not one.
+	 */
+	{ PCI_VDEVICE(REALTEK, 0x816c) },
+	{ 0, }
+};
+
 static int ipmi_pci_probe(struct pci_dev *pdev,
 static int ipmi_pci_probe(struct pci_dev *pdev,
 				    const struct pci_device_id *ent)
 				    const struct pci_device_id *ent)
 {
 {
 	int rv;
 	int rv;
 	struct si_sm_io io;
 	struct si_sm_io io;
 
 
+	if (pci_match_id(ipmi_pci_blacklist, pdev))
+		return -ENODEV;
+
 	memset(&io, 0, sizeof(io));
 	memset(&io, 0, sizeof(io));
 	io.addr_source = SI_PCI;
 	io.addr_source = SI_PCI;
 	dev_info(&pdev->dev, "probing via PCI");
 	dev_info(&pdev->dev, "probing via PCI");