Hi,

some (probably newer) re(4) cards don't have the 32-bit memory BAR that
we try to map first.  Instead there's a 64-bit memory BAR in the follow-
ing BAR.   On the MacchiatoBIN, where we currently do not support the IO
space, this means we need to attempt to map the 64-bit memory BAR.  This
diff tries to map the 64-bit BAR first, and falls back to 32-bit BAR and
IO after that.  This makes re(4) on that machine.  It looks a but ugly,
but I don't think there's a nicer way.  Thanks to kettenis@ for finding
the cause of my issues!

ok?

Patrick

diff --git a/sys/dev/ic/rtl81x9reg.h b/sys/dev/ic/rtl81x9reg.h
index 8fc4a9a851d..6f7019ebdbd 100644
--- a/sys/dev/ic/rtl81x9reg.h
+++ b/sys/dev/ic/rtl81x9reg.h
@@ -1061,6 +1061,7 @@ struct rl_softc {
 #define RL_PCI_HEADER_TYPE     0x0E
 #define RL_PCI_LOIO            0x10
 #define RL_PCI_LOMEM           0x14
+#define RL_PCI_LOMEM64         0x18
 #define RL_PCI_BIOSROM         0x30
 #define RL_PCI_INTLINE         0x3C
 #define RL_PCI_INTPIN          0x3D
diff --git a/sys/dev/pci/if_re_pci.c b/sys/dev/pci/if_re_pci.c
index 84d1f3f2b04..c553aa17349 100644
--- a/sys/dev/pci/if_re_pci.c
+++ b/sys/dev/pci/if_re_pci.c
@@ -141,12 +141,18 @@ re_pci_attach(struct device *parent, struct device *self, 
void *aux)
        /*
         * Map control/status registers.
         */
-       if (pci_mapreg_map(pa, RL_PCI_LOMEM, PCI_MAPREG_TYPE_MEM, 0,
-           &sc->rl_btag, &sc->rl_bhandle, NULL, &psc->sc_iosize, 0)) {
-               if (pci_mapreg_map(pa, RL_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
-                   &sc->rl_btag, &sc->rl_bhandle, NULL, &psc->sc_iosize, 0)) {
-                       printf(": can't map mem or i/o space\n");
-                       return;
+       if (pci_mapreg_map(pa, RL_PCI_LOMEM64, PCI_MAPREG_TYPE_MEM |
+           PCI_MAPREG_MEM_TYPE_64BIT, 0, &sc->rl_btag, &sc->rl_bhandle,
+           NULL, &psc->sc_iosize, 0)) {
+               if (pci_mapreg_map(pa, RL_PCI_LOMEM, PCI_MAPREG_TYPE_MEM |
+                   PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->rl_btag, &sc->rl_bhandle,
+                   NULL, &psc->sc_iosize, 0)) {
+                       if (pci_mapreg_map(pa, RL_PCI_LOIO, PCI_MAPREG_TYPE_IO,
+                           0, &sc->rl_btag, &sc->rl_bhandle, NULL,
+                           &psc->sc_iosize, 0)) {
+                               printf(": can't map mem or i/o space\n");
+                               return;
+                       }
                }
        }
 

Reply via email to