svn commit: r323330 - in head/sys/dev: mpr mps
Scott Long
scottl at FreeBSD.org
Fri Sep 8 20:20:37 UTC 2017
Author: scottl
Date: Fri Sep 8 20:20:35 2017
New Revision: 323330
URL: https://svnweb.freebsd.org/changeset/base/323330
Log:
Refactor interrupt allocation and deallocation. Add some extra
diagnostics. No other functional changes.
Sponsored by: Netflix
Modified:
head/sys/dev/mpr/mpr_pci.c
head/sys/dev/mps/mps_pci.c
Modified: head/sys/dev/mpr/mpr_pci.c
==============================================================================
--- head/sys/dev/mpr/mpr_pci.c Fri Sep 8 20:09:14 2017 (r323329)
+++ head/sys/dev/mpr/mpr_pci.c Fri Sep 8 20:20:35 2017 (r323330)
@@ -268,10 +268,21 @@ mpr_pci_alloc_interrupts(struct mpr_softc *sc)
if ((error != 0) && (sc->disable_msi == 0) &&
((msgs = pci_msi_count(dev)) >= MPR_MSI_COUNT))
error = mpr_alloc_msi(sc, MPR_MSI_COUNT);
- if (error != 0)
- msgs = 0;
+ if (error != 0) {
+ /*
+ * If neither MSI or MSI-X are available, assume legacy INTx.
+ * This also implies that there will be only 1 queue.
+ */
+ sc->mpr_flags |= MPR_FLAGS_INTX;
+ msgs = 1;
+ } else {
+ sc->mpr_flags |= MPR_FLAGS_MSI;
+ msgs = MPR_MSI_COUNT; /* XXX */
+ }
sc->msi_msgs = msgs;
+ mpr_dprint(sc, MPR_INIT, "Allocated %d interrupts\n", msgs);
+
return (error);
}
@@ -279,47 +290,45 @@ int
mpr_pci_setup_interrupts(struct mpr_softc *sc)
{
device_t dev;
- int i, error;
+ void *ihandler;
+ int i, error, rid, initial_rid;
dev = sc->mpr_dev;
error = ENXIO;
- if (sc->msi_msgs == 0) {
- sc->mpr_flags |= MPR_FLAGS_INTX;
- sc->mpr_irq_rid[0] = 0;
- sc->mpr_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ,
- &sc->mpr_irq_rid[0], RF_SHAREABLE | RF_ACTIVE);
- if (sc->mpr_irq[0] == NULL) {
- mpr_printf(sc, "Cannot allocate INTx interrupt\n");
- return (ENXIO);
- }
- error = bus_setup_intr(dev, sc->mpr_irq[0],
- INTR_TYPE_BIO | INTR_MPSAFE, NULL, mpr_intr, sc,
- &sc->mpr_intrhand[0]);
- if (error)
- mpr_printf(sc, "Cannot setup INTx interrupt\n");
+ if (sc->mpr_flags & MPR_FLAGS_INTX) {
+ initial_rid = 0;
+ ihandler = mpr_intr;
+ } else if (sc->mpr_flags & MPR_FLAGS_MSI) {
+ initial_rid = 1;
+ ihandler = mpr_intr_msi;
} else {
- sc->mpr_flags |= MPR_FLAGS_MSI;
- for (i = 0; i < MPR_MSI_COUNT; i++) {
- sc->mpr_irq_rid[i] = i + 1;
- sc->mpr_irq[i] = bus_alloc_resource_any(dev,
- SYS_RES_IRQ, &sc->mpr_irq_rid[i], RF_ACTIVE);
- if (sc->mpr_irq[i] == NULL) {
- mpr_printf(sc,
- "Cannot allocate MSI interrupt\n");
- return (ENXIO);
- }
- error = bus_setup_intr(dev, sc->mpr_irq[i],
- INTR_TYPE_BIO | INTR_MPSAFE, NULL, mpr_intr_msi,
- sc, &sc->mpr_intrhand[i]);
- if (error) {
- mpr_printf(sc,
- "Cannot setup MSI interrupt %d\n", i);
- break;
- }
+ mpr_dprint(sc, MPR_ERROR|MPR_INIT,
+ "Unable to set up interrupts\n");
+ return (EINVAL);
+ }
+
+ for (i = 0; i < sc->msi_msgs; i++) {
+ rid = i + initial_rid;
+ sc->mpr_irq_rid[i] = rid;
+ sc->mpr_irq[i] = bus_alloc_resource_any(dev, SYS_RES_IRQ,
+ &sc->mpr_irq_rid[i], RF_ACTIVE);
+ if (sc->mpr_irq[i] == NULL) {
+ mpr_dprint(sc, MPR_ERROR|MPR_INIT,
+ "Cannot allocate interrupt RID %d\n", rid);
+ break;
}
+ error = bus_setup_intr(dev, sc->mpr_irq[i],
+ INTR_TYPE_BIO | INTR_MPSAFE, NULL, mpr_intr_msi,
+ sc, &sc->mpr_intrhand[i]);
+ if (error) {
+ mpr_dprint(sc, MPR_ERROR|MPR_INIT,
+ "Cannot setup interrupt RID %d\n", rid);
+ break;
+ }
}
+ mpr_dprint(sc, MPR_INIT, "Set up %d interrupts\n", sc->msi_msgs);
return (error);
}
@@ -347,24 +356,17 @@ mpr_pci_free(struct mpr_softc *sc)
bus_dma_tag_destroy(sc->mpr_parent_dmat);
}
- if (sc->mpr_flags & MPR_FLAGS_MSI) {
- for (i = 0; i < MPR_MSI_COUNT; i++) {
- if (sc->mpr_irq[i] != NULL) {
- bus_teardown_intr(sc->mpr_dev, sc->mpr_irq[i],
- sc->mpr_intrhand[i]);
- bus_release_resource(sc->mpr_dev, SYS_RES_IRQ,
- sc->mpr_irq_rid[i], sc->mpr_irq[i]);
- }
+ for (i = 0; i < sc->msi_msgs; i++) {
+ if (sc->mpr_irq[i] != NULL) {
+ bus_teardown_intr(sc->mpr_dev, sc->mpr_irq[i],
+ sc->mpr_intrhand[i]);
+ bus_release_resource(sc->mpr_dev, SYS_RES_IRQ,
+ sc->mpr_irq_rid[i], sc->mpr_irq[i]);
}
- pci_release_msi(sc->mpr_dev);
}
- if (sc->mpr_flags & MPR_FLAGS_INTX) {
- bus_teardown_intr(sc->mpr_dev, sc->mpr_irq[0],
- sc->mpr_intrhand[0]);
- bus_release_resource(sc->mpr_dev, SYS_RES_IRQ,
- sc->mpr_irq_rid[0], sc->mpr_irq[0]);
- }
+ if (sc->mpr_flags & MPR_FLAGS_MSI)
+ pci_release_msi(sc->mpr_dev);
if (sc->mpr_regs_resource != NULL) {
bus_release_resource(sc->mpr_dev, SYS_RES_MEMORY,
Modified: head/sys/dev/mps/mps_pci.c
==============================================================================
--- head/sys/dev/mps/mps_pci.c Fri Sep 8 20:09:14 2017 (r323329)
+++ head/sys/dev/mps/mps_pci.c Fri Sep 8 20:20:35 2017 (r323330)
@@ -253,10 +253,21 @@ mps_pci_alloc_interrupts(struct mps_softc *sc)
if ((error != 0) && (sc->disable_msi == 0) &&
((msgs = pci_msi_count(dev)) >= MPS_MSI_COUNT))
error = mps_alloc_msi(sc, MPS_MSI_COUNT);
- if (error != 0)
- msgs = 0;
+ if (error != 0) {
+ /*
+ * If neither MSI or MSI-X are avaiable, assume legacy INTx.
+ * This also implies that there will be only 1 queue.
+ */
+ sc->mps_flags |= MPS_FLAGS_INTX;
+ msgs = 1;
+ } else {
+ sc->mps_flags |= MPS_FLAGS_MSI;
+ msgs = 1; /* XXX */
+ }
sc->msi_msgs = msgs;
+ mps_dprint(sc, MPS_INIT, "Allocated %d interrupts\n", msgs);
+
return (error);
}
@@ -264,47 +275,46 @@ int
mps_pci_setup_interrupts(struct mps_softc *sc)
{
device_t dev;
- int i, error;
+ void *ihandler;
+ int i, error, rid, initial_rid;
dev = sc->mps_dev;
error = ENXIO;
- if (sc->msi_msgs == 0) {
- sc->mps_flags |= MPS_FLAGS_INTX;
- sc->mps_irq_rid[0] = 0;
- sc->mps_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ,
- &sc->mps_irq_rid[0], RF_SHAREABLE | RF_ACTIVE);
- if (sc->mps_irq[0] == NULL) {
- mps_printf(sc, "Cannot allocate INTx interrupt\n");
- return (ENXIO);
- }
- error = bus_setup_intr(dev, sc->mps_irq[0],
- INTR_TYPE_BIO | INTR_MPSAFE, NULL, mps_intr, sc,
- &sc->mps_intrhand[0]);
- if (error)
- mps_printf(sc, "Cannot setup INTx interrupt\n");
+ if (sc->mps_flags & MPS_FLAGS_INTX) {
+ initial_rid = 0;
+ ihandler = mps_intr;
+ } else if (sc->mps_flags & MPS_FLAGS_MSI) {
+ initial_rid = 1;
+ ihandler = mps_intr_msi;
} else {
- sc->mps_flags |= MPS_FLAGS_MSI;
- for (i = 0; i < MPS_MSI_COUNT; i++) {
- sc->mps_irq_rid[i] = i + 1;
- sc->mps_irq[i] = bus_alloc_resource_any(dev,
- SYS_RES_IRQ, &sc->mps_irq_rid[i], RF_ACTIVE);
- if (sc->mps_irq[i] == NULL) {
- mps_printf(sc,
- "Cannot allocate MSI interrupt\n");
- return (ENXIO);
- }
- error = bus_setup_intr(dev, sc->mps_irq[i],
- INTR_TYPE_BIO | INTR_MPSAFE, NULL, mps_intr_msi,
- sc, &sc->mps_intrhand[i]);
- if (error) {
- mps_printf(sc,
- "Cannot setup MSI interrupt %d\n", i);
- break;
- }
+ mps_dprint(sc, MPS_ERROR|MPS_INIT,
+ "Unable to set up interrupts\n");
+ return (EINVAL);
+ }
+
+ for (i = 0; i < sc->msi_msgs; i++) {
+ rid = i + initial_rid;
+ sc->mps_irq_rid[i] = rid;
+ sc->mps_irq[i] = bus_alloc_resource_any(dev, SYS_RES_IRQ,
+ &sc->mps_irq_rid[i], RF_ACTIVE);
+ if (sc->mps_irq[i] == NULL) {
+ mps_dprint(sc, MPS_ERROR|MPS_INIT,
+ "Cannot allocate interrupt RID%d\n", rid);
+ break;
}
+ error = bus_setup_intr(dev, sc->mps_irq[i],
+ INTR_TYPE_BIO | INTR_MPSAFE, NULL, ihandler,
+ sc, &sc->mps_intrhand[i]);
+ if (error) {
+ mps_dprint(sc, MPS_ERROR|MPS_INIT,
+ "Cannot setup interrupt RID %d\n", rid);
+ break;
+ }
}
+ mps_dprint(sc, MPS_INIT, "Set up %d interrupts\n", sc->msi_msgs);
+
return (error);
}
@@ -332,24 +342,17 @@ mps_pci_free(struct mps_softc *sc)
bus_dma_tag_destroy(sc->mps_parent_dmat);
}
- if (sc->mps_flags & MPS_FLAGS_MSI) {
- for (i = 0; i < MPS_MSI_COUNT; i++) {
- if (sc->mps_irq[i] != NULL) {
- bus_teardown_intr(sc->mps_dev, sc->mps_irq[i],
- sc->mps_intrhand[i]);
- bus_release_resource(sc->mps_dev, SYS_RES_IRQ,
- sc->mps_irq_rid[i], sc->mps_irq[i]);
- }
+ for (i = 0; i < sc->msi_msgs; i++) {
+ if (sc->mps_irq[i] != NULL) {
+ bus_teardown_intr(sc->mps_dev, sc->mps_irq[i],
+ sc->mps_intrhand[i]);
+ bus_release_resource(sc->mps_dev, SYS_RES_IRQ,
+ sc->mps_irq_rid[i], sc->mps_irq[i]);
}
- pci_release_msi(sc->mps_dev);
}
- if (sc->mps_flags & MPS_FLAGS_INTX) {
- bus_teardown_intr(sc->mps_dev, sc->mps_irq[0],
- sc->mps_intrhand[0]);
- bus_release_resource(sc->mps_dev, SYS_RES_IRQ,
- sc->mps_irq_rid[0], sc->mps_irq[0]);
- }
+ if (sc->mps_flags & MPS_FLAGS_MSI)
+ pci_release_msi(sc->mps_dev);
if (sc->mps_regs_resource != NULL) {
bus_release_resource(sc->mps_dev, SYS_RES_MEMORY,
More information about the svn-src-all
mailing list