|
@@ -2226,7 +2226,7 @@ fail0:
|
|
|
static int __devinit i7core_probe(struct pci_dev *pdev,
|
|
|
const struct pci_device_id *id)
|
|
|
{
|
|
|
- int rc;
|
|
|
+ int rc, count = 0;
|
|
|
struct i7core_dev *i7core_dev;
|
|
|
|
|
|
/* get the pci devices we want to reserve for our use */
|
|
@@ -2246,12 +2246,28 @@ static int __devinit i7core_probe(struct pci_dev *pdev,
|
|
|
goto fail0;
|
|
|
|
|
|
list_for_each_entry(i7core_dev, &i7core_edac_list, list) {
|
|
|
+ count++;
|
|
|
rc = i7core_register_mci(i7core_dev);
|
|
|
if (unlikely(rc < 0))
|
|
|
goto fail1;
|
|
|
}
|
|
|
|
|
|
- i7core_printk(KERN_INFO, "Driver loaded.\n");
|
|
|
+ /*
|
|
|
+ * Nehalem-EX uses a different memory controller. However, as the
|
|
|
+ * memory controller is not visible on some Nehalem/Nehalem-EP, we
|
|
|
+ * need to indirectly probe via a X58 PCI device. The same devices
|
|
|
+ * are found on (some) Nehalem-EX. So, on those machines, the
|
|
|
+ * probe routine needs to return -ENODEV, as the actual Memory
|
|
|
+ * Controller registers won't be detected.
|
|
|
+ */
|
|
|
+ if (!count) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto fail1;
|
|
|
+ }
|
|
|
+
|
|
|
+ i7core_printk(KERN_INFO,
|
|
|
+ "Driver loaded, %d memory controller(s) found.\n",
|
|
|
+ count);
|
|
|
|
|
|
mutex_unlock(&i7core_edac_lock);
|
|
|
return 0;
|