summaryrefslogtreecommitdiffstats
path: root/sys/dev/ixgbe
diff options
context:
space:
mode:
authorjfv <jfv@FreeBSD.org>2013-08-12 22:54:38 +0000
committerjfv <jfv@FreeBSD.org>2013-08-12 22:54:38 +0000
commitc8a53736fe9139a202d17ed7f95389d33326cb61 (patch)
tree767a17c64e7c7b7bb4acab0845d0093a096485e7 /sys/dev/ixgbe
parenta2aef273685605f46048119618c225d88ecbab86 (diff)
downloadFreeBSD-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.c8
-rw-r--r--sys/dev/ixgbe/ixv.c4
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,
OpenPOWER on IntegriCloud