diff options
author | jfv <jfv@FreeBSD.org> | 2013-08-12 22:54:38 +0000 |
---|---|---|
committer | jfv <jfv@FreeBSD.org> | 2013-08-12 22:54:38 +0000 |
commit | c8a53736fe9139a202d17ed7f95389d33326cb61 (patch) | |
tree | 767a17c64e7c7b7bb4acab0845d0093a096485e7 /sys/dev/ixgbe | |
parent | a2aef273685605f46048119618c225d88ecbab86 (diff) | |
download | FreeBSD-src-c8a53736fe9139a202d17ed7f95389d33326cb61.zip FreeBSD-src-c8a53736fe9139a202d17ed7f95389d33326cb61.tar.gz |
Improve the MSIX setup code in the drivers, thanks to Marius for
the changes. Make sure that pci_alloc_msix() does give us the vectors
we need and fall back to MSI when it doesn't, also release any that
were allocated when insufficient.
MFC after: 3 days
Diffstat (limited to 'sys/dev/ixgbe')
-rw-r--r-- | sys/dev/ixgbe/ixgbe.c | 8 | ||||
-rw-r--r-- | sys/dev/ixgbe/ixv.c | 4 |
2 files changed, 10 insertions, 2 deletions
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index ca4aa66..e6dc239 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -2456,12 +2456,18 @@ ixgbe_setup_msix(struct adapter *adapter) msgs, want); goto msi; } - if (pci_alloc_msix(dev, &msgs) == 0) { + if ((pci_alloc_msix(dev, &msgs) == 0) && (msgs == want)) { device_printf(adapter->dev, "Using MSIX interrupts with %d vectors\n", msgs); adapter->num_queues = queues; return (msgs); } + /* + ** If MSIX alloc failed or provided us with + ** less than needed, free and fall through to MSI + */ + pci_release_msi(dev); + msi: if (adapter->msix_mem != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, diff --git a/sys/dev/ixgbe/ixv.c b/sys/dev/ixgbe/ixv.c index 20131aa..c0cd7ae 100644 --- a/sys/dev/ixgbe/ixv.c +++ b/sys/dev/ixgbe/ixv.c @@ -1704,11 +1704,13 @@ ixv_setup_msix(struct adapter *adapter) ** plus an additional for mailbox. */ want = 2; - if (pci_alloc_msix(dev, &want) == 0) { + if ((pci_alloc_msix(dev, &want) == 0) && (want == 2)) { device_printf(adapter->dev, "Using MSIX interrupts with %d vectors\n", want); return (want); } + /* Release in case alloc was insufficient */ + pci_release_msi(dev); out: if (adapter->msix_mem != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, |