> > Date: Thu, 15 Oct 2015 17:23:21 +0000 > > From: Miod Vallat <m...@online.fr> > > > > The following diff attempts to fix two small bge(4) bugs: > > > > - the first chunk fixes what seems to be a logic error on BCM 5720, > > where the code attemps to preserve the state of four bits, but these > > have actually already been set in the local variable by the call to > > bge_dma_swap_options() immediately above. For some reason the > > bge_dma_swap_options() logic does not affect BCM 5762, and I'm not > > sure whether this is a bug or not. > > > > - the second chunk repairs BCM5704 A3 support, as found on some G5 Xserve > > (RackMac3,1), by using the proper function pointer to write a magic > > register. Apparently, using the wrong function only works once, which > > allows the driver to attach, but as soon as you attempt to give it an > > IP address, the machine freezes without that change. > > This chunk doesn't make sense to me. The code is supposed to write a > magic value into SRAM, not into a register. > > I suspect that the real issue is that we disable the MAC memory > arbiter in bge_stop(). The MAC memory arbiter has to be enabled for > bge_writemem_ind() to work, but bge_reset() only enables it later > after it resets the chip. Does the diff below help?
No; with this diff the system freezes at attach time. > Index: if_bge.c > =================================================================== > RCS file: /home/cvs/src/sys/dev/pci/if_bge.c,v > retrieving revision 1.369 > diff -u -p -r1.369 if_bge.c > --- if_bge.c 19 Jul 2015 06:28:12 -0000 1.369 > +++ if_bge.c 16 Oct 2015 19:48:45 -0000 > @@ -3216,6 +3216,13 @@ bge_reset(struct bge_softc *sc) > cachesize = pci_conf_read(pa->pa_pc, pa->pa_tag, BGE_PCI_CACHESZ); > command = pci_conf_read(pa->pa_pc, pa->pa_tag, BGE_PCI_CMD); > > + /* Enable memory arbiter. */ > + if (BGE_IS_5714_FAMILY(sc)) { > + val = CSR_READ_4(sc, BGE_MARB_MODE); > + CSR_WRITE_4(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE | val); > + } else > + CSR_WRITE_4(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE); > + > pci_conf_write(pa->pa_pc, pa->pa_tag, BGE_PCI_MISC_CTL, > BGE_PCIMISCCTL_INDIRECT_ACCESS | BGE_PCIMISCCTL_MASK_PCI_INTR | > BGE_PCIMISCCTL_ENDIAN_WORDSWAP | BGE_PCIMISCCTL_PCISTATE_RW);