i7core_edac: Avoid doing multiple probes for the same card
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 30 Jun 2010 04:42:21 +0000 (01:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 2 Jul 2010 21:04:29 +0000 (18:04 -0300)
As Nehalem/Nehalem-EP/Westmere devices uses several devices for the same
functionality (memory controller), the default way of proping devices doesn't
work. So, instead of a per-device probe, all devices should be probed at once.

This means that we should block any new attempt of probe, otherwise, it will
try to register the same device several times.

Acked-by: Doug Thompson <dougthompson@xmission.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/edac/i7core_edac.c

index d7c76800988ee453b68650809c38c489863f4050..cc9357da0e3442ad9666a415f80b3dd29321b6a0 100644 (file)
@@ -1947,21 +1947,26 @@ fail:
  *             0 for FOUND a device
  *             < 0 for error code
  */
+
+static int probed = 0;
+
 static int __devinit i7core_probe(struct pci_dev *pdev,
                                  const struct pci_device_id *id)
 {
-       int dev_idx = id->driver_data;
        int rc;
        struct i7core_dev *i7core_dev;
 
+       /* get the pci devices we want to reserve for our use */
+       mutex_lock(&i7core_edac_lock);
+
        /*
         * All memory controllers are allocated at the first pass.
         */
-       if (unlikely(dev_idx >= 1))
+       if (unlikely(probed >= 1)) {
+               mutex_unlock(&i7core_edac_lock);
                return -EINVAL;
-
-       /* get the pci devices we want to reserve for our use */
-       mutex_lock(&i7core_edac_lock);
+       }
+       probed++;
 
        rc = i7core_get_devices(pci_dev_table);
        if (unlikely(rc < 0))
@@ -2033,6 +2038,8 @@ static void __devexit i7core_remove(struct pci_dev *pdev)
                                      i7core_dev->socket);
                }
        }
+       probed--;
+
        mutex_unlock(&i7core_edac_lock);
 }