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; + } } }