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

Commit 62fd9857 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/i7core:
  MAINTAINERS: Add an entry for i7core_edac
  i7core_edac: Avoid doing multiple probes for the same card
  i7core_edac: Properly discover the first QPI device
parents 40450447 67c89316
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2111,11 +2111,18 @@ F: drivers/edac/i5000_edac.c

EDAC-I5400
M:	Mauro Carvalho Chehab <mchehab@redhat.com>
L:	bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
L:	linux-edac@vger.kernel.org
W:	bluesmoke.sourceforge.net
S:	Maintained
F:	drivers/edac/i5400_edac.c

EDAC-I7CORE
M:	Mauro Carvalho Chehab <mchehab@redhat.com>
L:	linux-edac@vger.kernel.org
W:	bluesmoke.sourceforge.net
S:	Maintained
F:	drivers/edac/i7core_edac.c linux/edac_mce.h drivers/edac/edac_mce.c

EDAC-I82975X
M:	Ranganathan Desikan <ravi@jetztechnologies.com>
M:	"Arvind R." <arvind@jetztechnologies.com>
+40 −13
Original line number Diff line number Diff line
@@ -1233,10 +1233,28 @@ static void __init i7core_xeon_pci_fixup(struct pci_id_table *table)
			for (i = 0; i < MAX_SOCKET_BUSES; i++)
				pcibios_scan_specific_bus(255-i);
		}
		pci_dev_put(pdev);
		table++;
	}
}

static unsigned i7core_pci_lastbus(void)
{
	int last_bus = 0, bus;
	struct pci_bus *b = NULL;

	while ((b = pci_find_next_bus(b)) != NULL) {
		bus = b->number;
		debugf0("Found bus %d\n", bus);
		if (bus > last_bus)
			last_bus = bus;
	}

	debugf0("Last bus %d\n", last_bus);

	return last_bus;
}

/*
 *	i7core_get_devices	Find and perform 'get' operation on the MCH's
 *			device/functions we want to reference for this driver
@@ -1244,7 +1262,8 @@ static void __init i7core_xeon_pci_fixup(struct pci_id_table *table)
 *			Need to 'get' device 16 func 1 and func 2
 */
int i7core_get_onedevice(struct pci_dev **prev, int devno,
			 struct pci_id_descr *dev_descr, unsigned n_devs)
			 struct pci_id_descr *dev_descr, unsigned n_devs,
			 unsigned last_bus)
{
	struct i7core_dev *i7core_dev;

@@ -1291,10 +1310,7 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno,
	}
	bus = pdev->bus->number;

	if (bus == 0x3f)
		socket = 0;
	else
		socket = 255 - bus;
	socket = last_bus - bus;

	i7core_dev = get_i7core_dev(socket);
	if (!i7core_dev) {
@@ -1358,17 +1374,21 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno,

static int i7core_get_devices(struct pci_id_table *table)
{
	int i, rc;
	int i, rc, last_bus;
	struct pci_dev *pdev = NULL;
	struct pci_id_descr *dev_descr;

	last_bus = i7core_pci_lastbus();

	while (table && table->descr) {
		dev_descr = table->descr;
		for (i = 0; i < table->n_devs; i++) {
			pdev = NULL;
			do {
				rc = i7core_get_onedevice(&pdev, i, &dev_descr[i],
							  table->n_devs);
				rc = i7core_get_onedevice(&pdev, i,
							  &dev_descr[i],
							  table->n_devs,
							  last_bus);
				if (rc < 0) {
					if (i == 0) {
						i = table->n_devs;
@@ -1927,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))
@@ -2013,6 +2038,8 @@ static void __devexit i7core_remove(struct pci_dev *pdev)
				      i7core_dev->socket);
		}
	}
	probed--;

	mutex_unlock(&i7core_edac_lock);
}