pci_intr_msix_count() is the function that drivers using multiple MSI-X
authorjmatthew <jmatthew@openbsd.org>
Fri, 23 Jul 2021 00:29:14 +0000 (00:29 +0000)
committerjmatthew <jmatthew@openbsd.org>
Fri, 23 Jul 2021 00:29:14 +0000 (00:29 +0000)
vectors use to decide whether to use MSI-X, so make it return 0 if MSI
is not enabled for the device.

fixes problems with ix(4) on older amd64 hardware and current riscv64
ok kettenis@ dlg@

sys/dev/pci/if_bnxt.c
sys/dev/pci/if_ix.c
sys/dev/pci/if_ixl.c
sys/dev/pci/if_mcx.c
sys/dev/pci/if_vmx.c
sys/dev/pci/pci.c
sys/dev/pci/pcivar.h

index 390fb8e..f4bd7ec 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_bnxt.c,v 1.32 2021/04/24 09:37:46 jmatthew Exp $   */
+/*     $OpenBSD: if_bnxt.c,v 1.33 2021/07/23 00:29:14 jmatthew Exp $   */
 /*-
  * Broadcom NetXtreme-C/E network driver.
  *
@@ -537,7 +537,7 @@ bnxt_attach(struct device *parent, struct device *self, void *aux)
                sc->sc_flags |= BNXT_FLAG_MSIX;
                intrstr = pci_intr_string(sc->sc_pc, ih);
 
-               nmsix = pci_intr_msix_count(pa->pa_pc, pa->pa_tag);
+               nmsix = pci_intr_msix_count(pa);
                if (nmsix > 1) {
                        sc->sc_ih = pci_intr_establish(sc->sc_pc, ih,
                            IPL_NET | IPL_MPSAFE, bnxt_admin_intr, sc, DEVNAME(sc));
index 546ee3a..45a8025 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ix.c,v 1.178 2020/12/22 23:25:37 dlg Exp $ */
+/*     $OpenBSD: if_ix.c,v 1.179 2021/07/23 00:29:14 jmatthew Exp $    */
 
 /******************************************************************************
 
@@ -1783,7 +1783,7 @@ ixgbe_setup_msix(struct ix_softc *sc)
        if (!ixgbe_enable_msix)
                return;
 
-       nmsix = pci_intr_msix_count(pa->pa_pc, pa->pa_tag);
+       nmsix = pci_intr_msix_count(pa);
        if (nmsix <= 1)
                return;
 
index 95cde6b..b4a38bd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ixl.c,v 1.74 2021/03/26 08:02:34 jan Exp $ */
+/*     $OpenBSD: if_ixl.c,v 1.75 2021/07/23 00:29:14 jmatthew Exp $ */
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -1795,7 +1795,7 @@ ixl_attach(struct device *parent, struct device *self, void *aux)
        }
 
        if (pci_intr_map_msix(pa, 0, &sc->sc_ih) == 0) {
-               int nmsix = pci_intr_msix_count(pa->pa_pc, pa->pa_tag);
+               int nmsix = pci_intr_msix_count(pa);
                if (nmsix > 1) { /* we used 1 (the 0th) for the adminq */
                        nmsix--;
 
index 99b7c5f..d9fbe3e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_mcx.c,v 1.101 2021/06/02 19:16:11 patrick Exp $ */
+/*     $OpenBSD: if_mcx.c,v 1.102 2021/07/23 00:29:14 jmatthew Exp $ */
 
 /*
  * Copyright (c) 2017 David Gwynne <dlg@openbsd.org>
@@ -2831,7 +2831,7 @@ mcx_attach(struct device *parent, struct device *self, void *aux)
                goto teardown;
        }
 
-       msix = pci_intr_msix_count(pa->pa_pc, pa->pa_tag);
+       msix = pci_intr_msix_count(pa);
        if (msix < 2) {
                printf(": not enough msi-x vectors\n");
                goto teardown;
index 8d69006..12717c8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_vmx.c,v 1.65 2020/12/12 11:48:53 jan Exp $ */
+/*     $OpenBSD: if_vmx.c,v 1.66 2021/07/23 00:29:14 jmatthew Exp $    */
 
 /*
  * Copyright (c) 2013 Tsubai Masanari
@@ -271,7 +271,7 @@ vmxnet3_attach(struct device *parent, struct device *self, void *aux)
        switch (intrcfg & VMXNET3_INTRCFG_TYPE_MASK) {
        case VMXNET3_INTRCFG_TYPE_AUTO:
        case VMXNET3_INTRCFG_TYPE_MSIX:
-               msix = pci_intr_msix_count(pa->pa_pc, pa->pa_tag);
+               msix = pci_intr_msix_count(pa);
                if (msix > 0) {
                        if (pci_intr_map_msix(pa, 0, &ih) == 0) {
                                msix--; /* are there spares for tx/rx qs? */
index bc20739..14f91e5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pci.c,v 1.119 2020/09/08 20:13:52 kettenis Exp $      */
+/*     $OpenBSD: pci.c,v 1.120 2021/07/23 00:29:14 jmatthew Exp $      */
 /*     $NetBSD: pci.c,v 1.31 1997/06/06 23:48:04 thorpej Exp $ */
 
 /*
@@ -1694,11 +1694,15 @@ pci_resume_msix(pci_chipset_tag_t pc, pcitag_t tag,
 }
 
 int
-pci_intr_msix_count(pci_chipset_tag_t pc, pcitag_t tag)
+pci_intr_msix_count(struct pci_attach_args *pa)
 {
        pcireg_t reg;
 
-       if (pci_get_capability(pc, tag, PCI_CAP_MSIX, NULL, &reg) == 0)
+       if ((pa->pa_flags & PCI_FLAGS_MSI_ENABLED) == 0)
+               return (0);
+
+       if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_MSIX, NULL,
+           &reg) == 0)
                return (0);
 
        return (PCI_MSIX_MC_TBLSZ(reg) + 1);
@@ -1731,7 +1735,7 @@ pci_resume_msix(pci_chipset_tag_t pc, pcitag_t tag,
 }
 
 int
-pci_intr_msix_count(pci_chipset_tag_t pc, pcitag_t tag)
+pci_intr_msix_count(struct pci_attach_args *pa)
 {
        return (0);
 }
index a8a1be3..1113c2a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pcivar.h,v 1.75 2021/05/01 16:11:16 visa Exp $        */
+/*     $OpenBSD: pcivar.h,v 1.76 2021/07/23 00:29:14 jmatthew Exp $    */
 /*     $NetBSD: pcivar.h,v 1.23 1997/06/06 23:48:05 thorpej Exp $      */
 
 /*
@@ -247,7 +247,7 @@ void        pci_suspend_msix(pci_chipset_tag_t, pcitag_t, bus_space_tag_t,
 void   pci_resume_msix(pci_chipset_tag_t, pcitag_t, bus_space_tag_t,
            pcireg_t, struct msix_vector *);
 
-int    pci_intr_msix_count(pci_chipset_tag_t, pcitag_t);
+int    pci_intr_msix_count(struct pci_attach_args *);
 
 uint16_t pci_requester_id(pci_chipset_tag_t, pcitag_t);