> This chunk doesn't make sense to me. The code is supposed to write a > magic value into SRAM, not into a register.
If I understand if_bgereg.h correctly, access to the SRAM can be performed either through a simple indirect access (write address to the index register, read from or write to the data register), or through a fixed 32KB window in the pci address space, and the latter is not available on older models. Thus it makes sense to use write_op as determined from the board type earlier, rather than always use writemem_ind. Also, the following diff to if_bgereg.h makes sure that the window is used as a 32KB window, not a 64KB one. Index: if_bgereg.h =================================================================== RCS file: /OpenBSD/src/sys/dev/pci/if_bgereg.h,v retrieving revision 1.128 diff -u -p -r1.128 if_bgereg.h --- if_bgereg.h 19 Oct 2015 05:31:25 -0000 1.128 +++ if_bgereg.h 1 Nov 2015 10:01:54 -0000 @@ -47,7 +47,7 @@ * * The NIC's memory can be accessed by the host in one of 3 ways: * - * 1) Indirect register access. The MEMWIN_BASEADDR and MEMWIN_DATA + * 1) Indirect register access. The REG_BASEADDR and REG_DATA * registers in PCI config space can be used to read any 32-bit * address within the NIC's memory. * @@ -2272,15 +2272,15 @@ #define BGE_MEMWIN_READ(pc, tag, x, val) \ do { \ pci_conf_write(pc, tag, BGE_PCI_MEMWIN_BASEADDR, \ - (0xFFFF0000 & x)); \ - val = CSR_READ_4(sc, BGE_MEMWIN_START + (x & 0xFFFF)); \ + (0xFFFF8000 & x)); \ + val = CSR_READ_4(sc, BGE_MEMWIN_START + (x & 0x7FFF)); \ } while(0) #define BGE_MEMWIN_WRITE(pc, tag, x, val) \ do { \ pci_conf_write(pc, tag, BGE_PCI_MEMWIN_BASEADDR, \ - (0xFFFF0000 & x)); \ - CSR_WRITE_4(sc, BGE_MEMWIN_START + (x & 0xFFFF), val); \ + (0xFFFF8000 & x)); \ + CSR_WRITE_4(sc, BGE_MEMWIN_START + (x & 0x7FFF), val); \ } while(0) /*