diff options
| author | Pyun YongHyeon <yongari@FreeBSD.org> | 2008-02-03 08:12:58 +0000 |
|---|---|---|
| committer | Pyun YongHyeon <yongari@FreeBSD.org> | 2008-02-03 08:12:58 +0000 |
| commit | a06654f8d55a0d72fa37857d386e5133bd7cf295 (patch) | |
| tree | c9ae3a86106c3a2ec02c2235498865e016713feb | |
| parent | 0d9449b4b3cde3d00b3a158b0e4a0d1ba7bb96f9 (diff) | |
Notes
| -rw-r--r-- | sys/dev/msk/if_msk.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c index 9519dee681bf..ca91a92f9fb0 100644 --- a/sys/dev/msk/if_msk.c +++ b/sys/dev/msk/if_msk.c @@ -362,6 +362,11 @@ static struct resource_spec msk_irq_spec_legacy[] = { static struct resource_spec msk_irq_spec_msi[] = { { SYS_RES_IRQ, 1, RF_ACTIVE }, + { -1, 0, 0 } +}; + +static struct resource_spec msk_irq_spec_msi2[] = { + { SYS_RES_IRQ, 1, RF_ACTIVE }, { SYS_RES_IRQ, 2, RF_ACTIVE }, { -1, 0, 0 } }; @@ -1529,7 +1534,7 @@ static int mskc_attach(device_t dev) { struct msk_softc *sc; - int error, msic, *port, reg; + int error, msic, msir, *port, reg; sc = device_get_softc(dev); sc->msk_dev = dev; @@ -1649,13 +1654,27 @@ mskc_attach(device_t dev) */ if (legacy_intr != 0) msi_disable = 1; - if (msic == 2 && msi_disable == 0 && sc->msk_num_port == 1 && - pci_alloc_msi(dev, &msic) == 0) { - if (msic == 2) { - sc->msk_msi = 1; - sc->msk_irq_spec = msk_irq_spec_msi; - } else - pci_release_msi(dev); + if (msi_disable == 0) { + switch (msic) { + case 2: + case 1: /* 88E8058 reports 1 MSI message */ + msir = msic; + if (sc->msk_num_port == 1 && + pci_alloc_msi(dev, &msir) == 0) { + if (msic == msir) { + sc->msk_msi = 1; + sc->msk_irq_spec = msic == 2 ? + msk_irq_spec_msi2 : + msk_irq_spec_msi; + } else + pci_release_msi(dev); + } + break; + default: + device_printf(dev, + "Unexpected number of MSI messages : %d\n", msic); + break; + } } error = bus_alloc_resources(dev, sc->msk_irq_spec, sc->msk_irq); |
