Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Feb 2010 21:20:55 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org
Subject:   svn commit: r204014 - in stable/6/sys: amd64/amd64 i386/i386
Message-ID:  <201002172120.o1HLKtbe060328@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Wed Feb 17 21:20:54 2010
New Revision: 204014
URL: http://svn.freebsd.org/changeset/base/204014

Log:
  Fix a bug where MSI interrupts on x86 were always routed to APIC ID 0 rather
  than the APIC ID of the boot CPU prior to SI_SUB_SMP.  This resulted in
  some storage controllers not being able to enumerate attached devices when
  using MSI/MSI-X interrupts.  This only affects <= 7.x, so it is a direct
  commit to 7 rather than an MFC.

Modified:
  stable/6/sys/amd64/amd64/msi.c
  stable/6/sys/i386/i386/msi.c

Modified: stable/6/sys/amd64/amd64/msi.c
==============================================================================
--- stable/6/sys/amd64/amd64/msi.c	Wed Feb 17 21:19:10 2010	(r204013)
+++ stable/6/sys/amd64/amd64/msi.c	Wed Feb 17 21:20:54 2010	(r204014)
@@ -301,6 +301,7 @@ again:
 	for (i = 0; i < count; i++) {
 		msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]);
 		msi->msi_dev = dev;
+		msi->msi_cpu = PCPU_GET(apic_id);
 		msi->msi_vector = vector + i;
 		if (bootverbose)
 			printf("msi: routing MSI IRQ %d to vector %u\n",
@@ -458,6 +459,7 @@ again:
 	/* Setup source. */
 	msi->msi_dev = dev;
 	msi->msi_vector = vector;
+	msi->msi_cpu = PCPU_GET(apic_id);
 	msi->msi_msix = 1;
 
 	/* XXX: Somewhat gross. */

Modified: stable/6/sys/i386/i386/msi.c
==============================================================================
--- stable/6/sys/i386/i386/msi.c	Wed Feb 17 21:19:10 2010	(r204013)
+++ stable/6/sys/i386/i386/msi.c	Wed Feb 17 21:20:54 2010	(r204014)
@@ -301,6 +301,7 @@ again:
 	for (i = 0; i < count; i++) {
 		msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]);
 		msi->msi_dev = dev;
+		msi->msi_cpu = PCPU_GET(apic_id);
 		msi->msi_vector = vector + i;
 		if (bootverbose)
 			printf("msi: routing MSI IRQ %d to vector %u\n",
@@ -458,6 +459,7 @@ again:
 	/* Setup source. */
 	msi->msi_dev = dev;
 	msi->msi_vector = vector;
+	msi->msi_cpu = PCPU_GET(apic_id);
 	msi->msi_msix = 1;
 
 	/* XXX: Somewhat gross. */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002172120.o1HLKtbe060328>