On Mon, Apr 09, 2018 at 08:27:49PM +0200, Mark Kettenis wrote:
> > Date: Mon, 9 Apr 2018 18:31:49 +0200
> > From: Patrick Wildt <patr...@blueri.se>
> > 
> > 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?
> 
> We should allways use mmio instead of io if possible.  The cascading
> if statements are a bit ugly, but I can't come up with a better solution.
> 
> Would be great if somebody could test this on an older (classic PCI)
> card.
> 

Works fine here on:

re0 at pci3 dev 0 function 0 "Realtek 8168" rev 0x02: RTL8168C/8111C (0x3c00), 
msi, address 00:0a:cd:18:3c:76
rgephy0 at re0 phy 7: RTL8169S/8110S/8211 PHY, rev. 2

This card is probably 5+ years old. It has the following BAR configuration:

 4:0:0: Realtek 8168
        0x0000: Vendor ID: 10ec Product ID: 8168
        0x0004: Command: 0006 Status: 0010
        0x0008: Class: 02 Subclass: 00 Interface: 00 Revision: 02
        0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
        0x0010: BAR io addr: 0x00000000/0x0100
        0x0014: BAR empty (00000000)
        0x0018: BAR mem 64bit addr: 0x00000000f1400000/0x00001000
        0x0020: BAR mem prefetchable 64bit addr: 0x0000000000000000/0x00010000

-ml

> ok kettenis@
> 
> > 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