Lines Matching full:sc
363 #define BGE_IS_JUMBO_CAPABLE(sc) ((sc)->bge_flags & BGE_FLAG_JUMBO) argument
364 #define BGE_IS_5700_FAMILY(sc) ((sc)->bge_flags & BGE_FLAG_5700_FAMILY) argument
365 #define BGE_IS_5705_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_5705_PLUS) argument
366 #define BGE_IS_5714_FAMILY(sc) ((sc)->bge_flags & BGE_FLAG_5714_FAMILY) argument
367 #define BGE_IS_575X_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_575X_PLUS) argument
368 #define BGE_IS_5755_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_5755_PLUS) argument
369 #define BGE_IS_5717_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_5717_PLUS) argument
370 #define BGE_IS_57765_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_57765_PLUS) argument
393 static int bge_get_eaddr_fw(struct bge_softc *sc, uint8_t ether_addr[]);
546 bge_has_eaddr(struct bge_softc *sc) in bge_has_eaddr() argument
552 bge_readmem_ind(struct bge_softc *sc, int off) in bge_readmem_ind() argument
557 if (sc->bge_asicrev == BGE_ASICREV_BCM5906 && in bge_readmem_ind()
561 dev = sc->bge_dev; in bge_readmem_ind()
570 bge_writemem_ind(struct bge_softc *sc, int off, int val) in bge_writemem_ind() argument
574 if (sc->bge_asicrev == BGE_ASICREV_BCM5906 && in bge_writemem_ind()
578 dev = sc->bge_dev; in bge_writemem_ind()
587 bge_readreg_ind(struct bge_softc *sc, int off) in bge_readreg_ind() argument
591 dev = sc->bge_dev; in bge_readreg_ind()
599 bge_writereg_ind(struct bge_softc *sc, int off, int val) in bge_writereg_ind() argument
603 dev = sc->bge_dev; in bge_writereg_ind()
610 bge_writemem_direct(struct bge_softc *sc, int off, int val) in bge_writemem_direct() argument
612 CSR_WRITE_4(sc, off, val); in bge_writemem_direct()
616 bge_writembx(struct bge_softc *sc, int off, int val) in bge_writembx() argument
618 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) in bge_writembx()
621 CSR_WRITE_4(sc, off, val); in bge_writembx()
622 if ((sc->bge_flags & BGE_FLAG_MBOX_REORDER) != 0) in bge_writembx()
623 CSR_READ_4(sc, off); in bge_writembx()
630 bge_ape_lock_init(struct bge_softc *sc) in bge_ape_lock_init() argument
635 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) in bge_ape_lock_init()
650 if (sc->bge_func_addr == 0) in bge_ape_lock_init()
653 bit = (1 << sc->bge_func_addr); in bge_ape_lock_init()
655 APE_WRITE_4(sc, regbase + 4 * i, bit); in bge_ape_lock_init()
659 switch (sc->bge_func_addr) { in bge_ape_lock_init()
661 sc->bge_phy_ape_lock = BGE_APE_LOCK_PHY0; in bge_ape_lock_init()
664 sc->bge_phy_ape_lock = BGE_APE_LOCK_PHY1; in bge_ape_lock_init()
667 sc->bge_phy_ape_lock = BGE_APE_LOCK_PHY2; in bge_ape_lock_init()
670 sc->bge_phy_ape_lock = BGE_APE_LOCK_PHY3; in bge_ape_lock_init()
673 device_printf(sc->bge_dev, in bge_ape_lock_init()
682 bge_ape_read_fw_ver(struct bge_softc *sc) in bge_ape_read_fw_ver() argument
688 apedata = APE_READ_4(sc, BGE_APE_SEG_SIG); in bge_ape_read_fw_ver()
690 sc->bge_mfw_flags &= ~ BGE_MFW_ON_APE; in bge_ape_read_fw_ver()
695 apedata = APE_READ_4(sc, BGE_APE_FW_STATUS); in bge_ape_read_fw_ver()
697 device_printf(sc->bge_dev, "APE signature found " in bge_ape_read_fw_ver()
702 sc->bge_mfw_flags |= BGE_MFW_ON_APE; in bge_ape_read_fw_ver()
705 apedata = APE_READ_4(sc, BGE_APE_FW_VERSION); in bge_ape_read_fw_ver()
706 features = APE_READ_4(sc, BGE_APE_FW_FEATURES); in bge_ape_read_fw_ver()
708 sc->bge_mfw_flags |= BGE_MFW_TYPE_NCSI; in bge_ape_read_fw_ver()
711 sc->bge_mfw_flags |= BGE_MFW_TYPE_DASH; in bge_ape_read_fw_ver()
717 device_printf(sc->bge_dev, "APE FW version: %s v%d.%d.%d.%d\n", in bge_ape_read_fw_ver()
726 bge_ape_lock(struct bge_softc *sc, int locknum) in bge_ape_lock() argument
731 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) == 0) in bge_ape_lock()
735 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) { in bge_ape_lock()
748 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) in bge_ape_lock()
750 if (sc->bge_func_addr == 0) in bge_ape_lock()
753 bit = (1 << sc->bge_func_addr); in bge_ape_lock()
757 if (sc->bge_func_addr == 0) in bge_ape_lock()
760 bit = (1 << sc->bge_func_addr); in bge_ape_lock()
764 if (sc->bge_func_addr == 0) in bge_ape_lock()
767 bit = (1 << sc->bge_func_addr); in bge_ape_lock()
781 APE_WRITE_4(sc, req + off, bit); in bge_ape_lock()
785 status = APE_READ_4(sc, gnt + off); in bge_ape_lock()
793 device_printf(sc->bge_dev, "APE lock %d request failed! " in bge_ape_lock()
798 APE_WRITE_4(sc, gnt + off, bit); in bge_ape_lock()
806 bge_ape_unlock(struct bge_softc *sc, int locknum) in bge_ape_unlock() argument
811 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) == 0) in bge_ape_unlock()
814 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) in bge_ape_unlock()
823 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) in bge_ape_unlock()
825 if (sc->bge_func_addr == 0) in bge_ape_unlock()
828 bit = (1 << sc->bge_func_addr); in bge_ape_unlock()
831 if (sc->bge_func_addr == 0) in bge_ape_unlock()
834 bit = (1 << sc->bge_func_addr); in bge_ape_unlock()
837 if (sc->bge_func_addr == 0) in bge_ape_unlock()
840 bit = (1 << sc->bge_func_addr); in bge_ape_unlock()
852 APE_WRITE_4(sc, gnt + off, bit); in bge_ape_unlock()
859 bge_ape_send_event(struct bge_softc *sc, uint32_t event) in bge_ape_send_event() argument
865 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) == 0) in bge_ape_send_event()
870 if (bge_ape_lock(sc, BGE_APE_LOCK_MEM) != 0) in bge_ape_send_event()
872 apedata = APE_READ_4(sc, BGE_APE_EVENT_STATUS); in bge_ape_send_event()
874 APE_WRITE_4(sc, BGE_APE_EVENT_STATUS, event | in bge_ape_send_event()
876 bge_ape_unlock(sc, BGE_APE_LOCK_MEM); in bge_ape_send_event()
877 APE_WRITE_4(sc, BGE_APE_EVENT, BGE_APE_EVENT_1); in bge_ape_send_event()
880 bge_ape_unlock(sc, BGE_APE_LOCK_MEM); in bge_ape_send_event()
884 device_printf(sc->bge_dev, "APE event 0x%08x send timed out\n", in bge_ape_send_event()
889 bge_ape_driver_state_change(struct bge_softc *sc, int kind) in bge_ape_driver_state_change() argument
893 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) == 0) in bge_ape_driver_state_change()
899 apedata = APE_READ_4(sc, BGE_APE_HOST_SEG_SIG); in bge_ape_driver_state_change()
901 APE_WRITE_4(sc, BGE_APE_HOST_INIT_COUNT, 0); in bge_ape_driver_state_change()
903 apedata = APE_READ_4(sc, BGE_APE_HOST_INIT_COUNT); in bge_ape_driver_state_change()
904 APE_WRITE_4(sc, BGE_APE_HOST_INIT_COUNT, ++apedata); in bge_ape_driver_state_change()
906 APE_WRITE_4(sc, BGE_APE_HOST_SEG_SIG, in bge_ape_driver_state_change()
908 APE_WRITE_4(sc, BGE_APE_HOST_SEG_LEN, in bge_ape_driver_state_change()
912 APE_WRITE_4(sc, BGE_APE_HOST_DRIVER_ID, in bge_ape_driver_state_change()
914 APE_WRITE_4(sc, BGE_APE_HOST_BEHAVIOR, in bge_ape_driver_state_change()
916 APE_WRITE_4(sc, BGE_APE_HOST_HEARTBEAT_INT_MS, in bge_ape_driver_state_change()
918 APE_WRITE_4(sc, BGE_APE_HOST_DRVR_STATE, in bge_ape_driver_state_change()
923 APE_WRITE_4(sc, BGE_APE_HOST_DRVR_STATE, in bge_ape_driver_state_change()
934 bge_ape_send_event(sc, event | BGE_APE_EVENT_STATUS_DRIVER_EVNT | in bge_ape_driver_state_change()
957 bge_nvram_getbyte(struct bge_softc *sc, int addr, uint8_t *dest) in bge_nvram_getbyte() argument
963 CSR_WRITE_4(sc, BGE_NVRAM_SWARB, BGE_NVRAMSWARB_SET1); in bge_nvram_getbyte()
965 if (CSR_READ_4(sc, BGE_NVRAM_SWARB) & BGE_NVRAMSWARB_GNT1) in bge_nvram_getbyte()
973 access = CSR_READ_4(sc, BGE_NVRAM_ACCESS); in bge_nvram_getbyte()
974 CSR_WRITE_4(sc, BGE_NVRAM_ACCESS, access | BGE_NVRAMACC_ENABLE); in bge_nvram_getbyte()
976 CSR_WRITE_4(sc, BGE_NVRAM_ADDR, addr & 0xfffffffc); in bge_nvram_getbyte()
977 CSR_WRITE_4(sc, BGE_NVRAM_CMD, BGE_NVRAM_READCMD); in bge_nvram_getbyte()
980 if (CSR_READ_4(sc, BGE_NVRAM_CMD) & BGE_NVRAMCMD_DONE) { in bge_nvram_getbyte()
987 if_printf(sc->bge_ifp, "nvram read timed out\n"); in bge_nvram_getbyte()
992 byte = CSR_READ_4(sc, BGE_NVRAM_RDDATA); in bge_nvram_getbyte()
997 CSR_WRITE_4(sc, BGE_NVRAM_ACCESS, access); in bge_nvram_getbyte()
1000 CSR_WRITE_4(sc, BGE_NVRAM_SWARB, BGE_NVRAMSWARB_CLR1); in bge_nvram_getbyte()
1001 CSR_READ_4(sc, BGE_NVRAM_SWARB); in bge_nvram_getbyte()
1010 bge_read_nvram(struct bge_softc *sc, caddr_t dest, int off, int cnt) in bge_read_nvram() argument
1015 if (sc->bge_asicrev != BGE_ASICREV_BCM5906) in bge_read_nvram()
1019 err = bge_nvram_getbyte(sc, off + i, &byte); in bge_read_nvram()
1035 bge_eeprom_getbyte(struct bge_softc *sc, int addr, uint8_t *dest) in bge_eeprom_getbyte() argument
1044 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_AUTO_EEPROM); in bge_eeprom_getbyte()
1047 CSR_WRITE_4(sc, BGE_EE_ADDR, in bge_eeprom_getbyte()
1052 CSR_WRITE_4(sc, BGE_EE_ADDR, BGE_EE_READCMD | addr); in bge_eeprom_getbyte()
1057 if (CSR_READ_4(sc, BGE_EE_ADDR) & BGE_EEADDR_DONE) in bge_eeprom_getbyte()
1062 device_printf(sc->bge_dev, "EEPROM read timed out\n"); in bge_eeprom_getbyte()
1067 byte = CSR_READ_4(sc, BGE_EE_DATA); in bge_eeprom_getbyte()
1078 bge_read_eeprom(struct bge_softc *sc, caddr_t dest, int off, int cnt) in bge_read_eeprom() argument
1084 error = bge_eeprom_getbyte(sc, off + i, &byte); in bge_read_eeprom()
1096 struct bge_softc *sc; in bge_miibus_readreg() local
1100 sc = device_get_softc(dev); in bge_miibus_readreg()
1102 if (bge_ape_lock(sc, sc->bge_phy_ape_lock) != 0) in bge_miibus_readreg()
1106 if ((sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) != 0) { in bge_miibus_readreg()
1107 CSR_WRITE_4(sc, BGE_MI_MODE, in bge_miibus_readreg()
1108 sc->bge_mi_mode & ~BGE_MIMODE_AUTOPOLL); in bge_miibus_readreg()
1112 CSR_WRITE_4(sc, BGE_MI_COMM, BGE_MICMD_READ | BGE_MICOMM_BUSY | in bge_miibus_readreg()
1118 val = CSR_READ_4(sc, BGE_MI_COMM); in bge_miibus_readreg()
1121 val = CSR_READ_4(sc, BGE_MI_COMM); in bge_miibus_readreg()
1127 device_printf(sc->bge_dev, in bge_miibus_readreg()
1134 if ((sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) != 0) { in bge_miibus_readreg()
1135 CSR_WRITE_4(sc, BGE_MI_MODE, sc->bge_mi_mode); in bge_miibus_readreg()
1139 bge_ape_unlock(sc, sc->bge_phy_ape_lock); in bge_miibus_readreg()
1150 struct bge_softc *sc; in bge_miibus_writereg() local
1153 sc = device_get_softc(dev); in bge_miibus_writereg()
1155 if (sc->bge_asicrev == BGE_ASICREV_BCM5906 && in bge_miibus_writereg()
1159 if (bge_ape_lock(sc, sc->bge_phy_ape_lock) != 0) in bge_miibus_writereg()
1163 if ((sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) != 0) { in bge_miibus_writereg()
1164 CSR_WRITE_4(sc, BGE_MI_MODE, in bge_miibus_writereg()
1165 sc->bge_mi_mode & ~BGE_MIMODE_AUTOPOLL); in bge_miibus_writereg()
1169 CSR_WRITE_4(sc, BGE_MI_COMM, BGE_MICMD_WRITE | BGE_MICOMM_BUSY | in bge_miibus_writereg()
1174 if (!(CSR_READ_4(sc, BGE_MI_COMM) & BGE_MICOMM_BUSY)) { in bge_miibus_writereg()
1176 CSR_READ_4(sc, BGE_MI_COMM); /* dummy read */ in bge_miibus_writereg()
1182 if ((sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) != 0) { in bge_miibus_writereg()
1183 CSR_WRITE_4(sc, BGE_MI_MODE, sc->bge_mi_mode); in bge_miibus_writereg()
1187 bge_ape_unlock(sc, sc->bge_phy_ape_lock); in bge_miibus_writereg()
1190 device_printf(sc->bge_dev, in bge_miibus_writereg()
1200 struct bge_softc *sc; in bge_miibus_statchg() local
1204 sc = device_get_softc(dev); in bge_miibus_statchg()
1205 if ((if_getdrvflags(sc->bge_ifp) & IFF_DRV_RUNNING) == 0) in bge_miibus_statchg()
1207 mii = device_get_softc(sc->bge_miibus); in bge_miibus_statchg()
1214 sc->bge_link = 1; in bge_miibus_statchg()
1219 if (sc->bge_asicrev != BGE_ASICREV_BCM5906) in bge_miibus_statchg()
1220 sc->bge_link = 1; in bge_miibus_statchg()
1222 sc->bge_link = 0; in bge_miibus_statchg()
1225 sc->bge_link = 0; in bge_miibus_statchg()
1229 sc->bge_link = 0; in bge_miibus_statchg()
1230 if (sc->bge_link == 0) in bge_miibus_statchg()
1240 mac_mode = CSR_READ_4(sc, BGE_MAC_MODE) & in bge_miibus_statchg()
1242 tx_mode = CSR_READ_4(sc, BGE_TX_MODE); in bge_miibus_statchg()
1243 rx_mode = CSR_READ_4(sc, BGE_RX_MODE); in bge_miibus_statchg()
1262 CSR_WRITE_4(sc, BGE_MAC_MODE, mac_mode); in bge_miibus_statchg()
1264 CSR_WRITE_4(sc, BGE_TX_MODE, tx_mode); in bge_miibus_statchg()
1265 CSR_WRITE_4(sc, BGE_RX_MODE, rx_mode); in bge_miibus_statchg()
1272 bge_newbuf_std(struct bge_softc *sc, int i) in bge_newbuf_std() argument
1280 if (sc->bge_flags & BGE_FLAG_JUMBO_STD && in bge_newbuf_std()
1281 (if_getmtu(sc->bge_ifp) + ETHER_HDR_LEN + ETHER_CRC_LEN + in bge_newbuf_std()
1293 if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0) in bge_newbuf_std()
1296 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_rx_mtag, in bge_newbuf_std()
1297 sc->bge_cdata.bge_rx_std_sparemap, m, segs, &nsegs, 0); in bge_newbuf_std()
1302 if (sc->bge_cdata.bge_rx_std_chain[i] != NULL) { in bge_newbuf_std()
1303 bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, in bge_newbuf_std()
1304 sc->bge_cdata.bge_rx_std_dmamap[i], BUS_DMASYNC_POSTREAD); in bge_newbuf_std()
1305 bus_dmamap_unload(sc->bge_cdata.bge_rx_mtag, in bge_newbuf_std()
1306 sc->bge_cdata.bge_rx_std_dmamap[i]); in bge_newbuf_std()
1308 map = sc->bge_cdata.bge_rx_std_dmamap[i]; in bge_newbuf_std()
1309 sc->bge_cdata.bge_rx_std_dmamap[i] = sc->bge_cdata.bge_rx_std_sparemap; in bge_newbuf_std()
1310 sc->bge_cdata.bge_rx_std_sparemap = map; in bge_newbuf_std()
1311 sc->bge_cdata.bge_rx_std_chain[i] = m; in bge_newbuf_std()
1312 sc->bge_cdata.bge_rx_std_seglen[i] = segs[0].ds_len; in bge_newbuf_std()
1313 r = &sc->bge_ldata.bge_rx_std_ring[sc->bge_std]; in bge_newbuf_std()
1320 bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, in bge_newbuf_std()
1321 sc->bge_cdata.bge_rx_std_dmamap[i], BUS_DMASYNC_PREREAD); in bge_newbuf_std()
1331 bge_newbuf_jumbo(struct bge_softc *sc, int i) in bge_newbuf_jumbo() argument
1348 if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0) in bge_newbuf_jumbo()
1351 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_mtag_jumbo, in bge_newbuf_jumbo()
1352 sc->bge_cdata.bge_rx_jumbo_sparemap, m, segs, &nsegs, 0); in bge_newbuf_jumbo()
1358 if (sc->bge_cdata.bge_rx_jumbo_chain[i] != NULL) { in bge_newbuf_jumbo()
1359 bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, in bge_newbuf_jumbo()
1360 sc->bge_cdata.bge_rx_jumbo_dmamap[i], BUS_DMASYNC_POSTREAD); in bge_newbuf_jumbo()
1361 bus_dmamap_unload(sc->bge_cdata.bge_mtag_jumbo, in bge_newbuf_jumbo()
1362 sc->bge_cdata.bge_rx_jumbo_dmamap[i]); in bge_newbuf_jumbo()
1364 map = sc->bge_cdata.bge_rx_jumbo_dmamap[i]; in bge_newbuf_jumbo()
1365 sc->bge_cdata.bge_rx_jumbo_dmamap[i] = in bge_newbuf_jumbo()
1366 sc->bge_cdata.bge_rx_jumbo_sparemap; in bge_newbuf_jumbo()
1367 sc->bge_cdata.bge_rx_jumbo_sparemap = map; in bge_newbuf_jumbo()
1368 sc->bge_cdata.bge_rx_jumbo_chain[i] = m; in bge_newbuf_jumbo()
1369 sc->bge_cdata.bge_rx_jumbo_seglen[i][0] = 0; in bge_newbuf_jumbo()
1370 sc->bge_cdata.bge_rx_jumbo_seglen[i][1] = 0; in bge_newbuf_jumbo()
1371 sc->bge_cdata.bge_rx_jumbo_seglen[i][2] = 0; in bge_newbuf_jumbo()
1372 sc->bge_cdata.bge_rx_jumbo_seglen[i][3] = 0; in bge_newbuf_jumbo()
1377 r = &sc->bge_ldata.bge_rx_jumbo_ring[sc->bge_jumbo]; in bge_newbuf_jumbo()
1386 sc->bge_cdata.bge_rx_jumbo_seglen[i][3] = segs[3].ds_len; in bge_newbuf_jumbo()
1391 sc->bge_cdata.bge_rx_jumbo_seglen[i][2] = segs[2].ds_len; in bge_newbuf_jumbo()
1396 sc->bge_cdata.bge_rx_jumbo_seglen[i][1] = segs[1].ds_len; in bge_newbuf_jumbo()
1401 sc->bge_cdata.bge_rx_jumbo_seglen[i][0] = segs[0].ds_len; in bge_newbuf_jumbo()
1407 bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, in bge_newbuf_jumbo()
1408 sc->bge_cdata.bge_rx_jumbo_dmamap[i], BUS_DMASYNC_PREREAD); in bge_newbuf_jumbo()
1414 bge_init_rx_ring_std(struct bge_softc *sc) in bge_init_rx_ring_std() argument
1418 bzero(sc->bge_ldata.bge_rx_std_ring, BGE_STD_RX_RING_SZ); in bge_init_rx_ring_std()
1419 sc->bge_std = 0; in bge_init_rx_ring_std()
1421 if ((error = bge_newbuf_std(sc, i)) != 0) in bge_init_rx_ring_std()
1423 BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); in bge_init_rx_ring_std()
1426 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, in bge_init_rx_ring_std()
1427 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_PREWRITE); in bge_init_rx_ring_std()
1429 sc->bge_std = 0; in bge_init_rx_ring_std()
1430 bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, BGE_STD_RX_RING_CNT - 1); in bge_init_rx_ring_std()
1436 bge_free_rx_ring_std(struct bge_softc *sc) in bge_free_rx_ring_std() argument
1441 if (sc->bge_cdata.bge_rx_std_chain[i] != NULL) { in bge_free_rx_ring_std()
1442 bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, in bge_free_rx_ring_std()
1443 sc->bge_cdata.bge_rx_std_dmamap[i], in bge_free_rx_ring_std()
1445 bus_dmamap_unload(sc->bge_cdata.bge_rx_mtag, in bge_free_rx_ring_std()
1446 sc->bge_cdata.bge_rx_std_dmamap[i]); in bge_free_rx_ring_std()
1447 m_freem(sc->bge_cdata.bge_rx_std_chain[i]); in bge_free_rx_ring_std()
1448 sc->bge_cdata.bge_rx_std_chain[i] = NULL; in bge_free_rx_ring_std()
1450 bzero((char *)&sc->bge_ldata.bge_rx_std_ring[i], in bge_free_rx_ring_std()
1456 bge_init_rx_ring_jumbo(struct bge_softc *sc) in bge_init_rx_ring_jumbo() argument
1461 bzero(sc->bge_ldata.bge_rx_jumbo_ring, BGE_JUMBO_RX_RING_SZ); in bge_init_rx_ring_jumbo()
1462 sc->bge_jumbo = 0; in bge_init_rx_ring_jumbo()
1464 if ((error = bge_newbuf_jumbo(sc, i)) != 0) in bge_init_rx_ring_jumbo()
1466 BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); in bge_init_rx_ring_jumbo()
1469 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_init_rx_ring_jumbo()
1470 sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_PREWRITE); in bge_init_rx_ring_jumbo()
1472 sc->bge_jumbo = 0; in bge_init_rx_ring_jumbo()
1475 rcb = &sc->bge_ldata.bge_info.bge_jumbo_rx_rcb; in bge_init_rx_ring_jumbo()
1478 CSR_WRITE_4(sc, BGE_RX_JUMBO_RCB_MAXLEN_FLAGS, rcb->bge_maxlen_flags); in bge_init_rx_ring_jumbo()
1480 bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, BGE_JUMBO_RX_RING_CNT - 1); in bge_init_rx_ring_jumbo()
1486 bge_free_rx_ring_jumbo(struct bge_softc *sc) in bge_free_rx_ring_jumbo() argument
1491 if (sc->bge_cdata.bge_rx_jumbo_chain[i] != NULL) { in bge_free_rx_ring_jumbo()
1492 bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, in bge_free_rx_ring_jumbo()
1493 sc->bge_cdata.bge_rx_jumbo_dmamap[i], in bge_free_rx_ring_jumbo()
1495 bus_dmamap_unload(sc->bge_cdata.bge_mtag_jumbo, in bge_free_rx_ring_jumbo()
1496 sc->bge_cdata.bge_rx_jumbo_dmamap[i]); in bge_free_rx_ring_jumbo()
1497 m_freem(sc->bge_cdata.bge_rx_jumbo_chain[i]); in bge_free_rx_ring_jumbo()
1498 sc->bge_cdata.bge_rx_jumbo_chain[i] = NULL; in bge_free_rx_ring_jumbo()
1500 bzero((char *)&sc->bge_ldata.bge_rx_jumbo_ring[i], in bge_free_rx_ring_jumbo()
1506 bge_free_tx_ring(struct bge_softc *sc) in bge_free_tx_ring() argument
1510 if (sc->bge_ldata.bge_tx_ring == NULL) in bge_free_tx_ring()
1514 if (sc->bge_cdata.bge_tx_chain[i] != NULL) { in bge_free_tx_ring()
1515 bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, in bge_free_tx_ring()
1516 sc->bge_cdata.bge_tx_dmamap[i], in bge_free_tx_ring()
1518 bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, in bge_free_tx_ring()
1519 sc->bge_cdata.bge_tx_dmamap[i]); in bge_free_tx_ring()
1520 m_freem(sc->bge_cdata.bge_tx_chain[i]); in bge_free_tx_ring()
1521 sc->bge_cdata.bge_tx_chain[i] = NULL; in bge_free_tx_ring()
1523 bzero((char *)&sc->bge_ldata.bge_tx_ring[i], in bge_free_tx_ring()
1529 bge_init_tx_ring(struct bge_softc *sc) in bge_init_tx_ring() argument
1531 sc->bge_txcnt = 0; in bge_init_tx_ring()
1532 sc->bge_tx_saved_considx = 0; in bge_init_tx_ring()
1534 bzero(sc->bge_ldata.bge_tx_ring, BGE_TX_RING_SZ); in bge_init_tx_ring()
1535 bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, in bge_init_tx_ring()
1536 sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_PREWRITE); in bge_init_tx_ring()
1539 sc->bge_tx_prodidx = 0; in bge_init_tx_ring()
1540 bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, sc->bge_tx_prodidx); in bge_init_tx_ring()
1543 if (sc->bge_chiprev == BGE_CHIPREV_5700_BX) in bge_init_tx_ring()
1544 bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, sc->bge_tx_prodidx); in bge_init_tx_ring()
1547 bge_writembx(sc, BGE_MBX_TX_NIC_PROD0_LO, 0); in bge_init_tx_ring()
1549 if (sc->bge_chiprev == BGE_CHIPREV_5700_BX) in bge_init_tx_ring()
1550 bge_writembx(sc, BGE_MBX_TX_NIC_PROD0_LO, 0); in bge_init_tx_ring()
1556 bge_setpromisc(struct bge_softc *sc) in bge_setpromisc() argument
1560 BGE_LOCK_ASSERT(sc); in bge_setpromisc()
1562 ifp = sc->bge_ifp; in bge_setpromisc()
1566 BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC); in bge_setpromisc()
1568 BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC); in bge_setpromisc()
1584 bge_setmulti(struct bge_softc *sc) in bge_setmulti() argument
1590 BGE_LOCK_ASSERT(sc); in bge_setmulti()
1592 ifp = sc->bge_ifp; in bge_setmulti()
1596 CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0xFFFFFFFF); in bge_setmulti()
1602 CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0); in bge_setmulti()
1607 CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), hashes[i]); in bge_setmulti()
1611 bge_setvlan(struct bge_softc *sc) in bge_setvlan() argument
1615 BGE_LOCK_ASSERT(sc); in bge_setvlan()
1617 ifp = sc->bge_ifp; in bge_setvlan()
1621 BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_KEEP_VLAN_DIAG); in bge_setvlan()
1623 BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_KEEP_VLAN_DIAG); in bge_setvlan()
1627 bge_sig_pre_reset(struct bge_softc *sc, int type) in bge_sig_pre_reset() argument
1633 if (sc->bge_asf_mode) in bge_sig_pre_reset()
1634 bge_writemem_ind(sc, BGE_SRAM_FW_MB, BGE_SRAM_FW_MB_MAGIC); in bge_sig_pre_reset()
1636 if (sc->bge_asf_mode & ASF_NEW_HANDSHAKE) { in bge_sig_pre_reset()
1639 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_pre_reset()
1643 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_pre_reset()
1647 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_pre_reset()
1654 bge_ape_driver_state_change(sc, type); in bge_sig_pre_reset()
1658 bge_sig_post_reset(struct bge_softc *sc, int type) in bge_sig_post_reset() argument
1661 if (sc->bge_asf_mode & ASF_NEW_HANDSHAKE) { in bge_sig_post_reset()
1664 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_post_reset()
1669 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_post_reset()
1675 bge_ape_driver_state_change(sc, type); in bge_sig_post_reset()
1679 bge_sig_legacy(struct bge_softc *sc, int type) in bge_sig_legacy() argument
1682 if (sc->bge_asf_mode) { in bge_sig_legacy()
1685 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_legacy()
1689 bge_writemem_ind(sc, BGE_SRAM_FW_DRV_STATE_MB, in bge_sig_legacy()
1697 bge_stop_fw(struct bge_softc *sc) in bge_stop_fw() argument
1701 if (sc->bge_asf_mode) { in bge_stop_fw()
1702 bge_writemem_ind(sc, BGE_SRAM_FW_CMD_MB, BGE_FW_CMD_PAUSE); in bge_stop_fw()
1703 CSR_WRITE_4(sc, BGE_RX_CPU_EVENT, in bge_stop_fw()
1704 CSR_READ_4(sc, BGE_RX_CPU_EVENT) | BGE_RX_CPU_DRV_EVENT); in bge_stop_fw()
1707 if (!(CSR_READ_4(sc, BGE_RX_CPU_EVENT) & in bge_stop_fw()
1716 bge_dma_swap_options(struct bge_softc *sc) in bge_dma_swap_options() argument
1732 bge_chipinit(struct bge_softc *sc) in bge_chipinit() argument
1740 if (sc->bge_flags & BGE_FLAG_TAGGED_STATUS) in bge_chipinit()
1742 pci_write_config(sc->bge_dev, BGE_PCI_MISC_CTL, misc_ctl, 4); in bge_chipinit()
1750 BGE_MEMWIN_WRITE(sc, i, 0); in bge_chipinit()
1754 BGE_MEMWIN_WRITE(sc, i, 0); in bge_chipinit()
1756 if (sc->bge_chiprev == BGE_CHIPREV_5704_BX) { in bge_chipinit()
1762 val = pci_read_config(sc->bge_dev, BGE_PCI_MSI_DATA + 2, 2); in bge_chipinit()
1764 pci_write_config(sc->bge_dev, BGE_PCI_MSI_DATA + 2, val, 2); in bge_chipinit()
1767 if (sc->bge_asicrev == BGE_ASICREV_BCM57765 || in bge_chipinit()
1768 sc->bge_asicrev == BGE_ASICREV_BCM57766) { in bge_chipinit()
1774 if (sc->bge_chiprev != BGE_CHIPREV_57765_AX) { in bge_chipinit()
1775 CSR_WRITE_4(sc, BGE_CPMU_PADRNG_CTL, in bge_chipinit()
1776 CSR_READ_4(sc, BGE_CPMU_PADRNG_CTL) | in bge_chipinit()
1786 if (sc->bge_flags & BGE_FLAG_PCIE) { in bge_chipinit()
1787 if (sc->bge_mps >= 256) in bge_chipinit()
1791 } else if (sc->bge_flags & BGE_FLAG_PCIX) { in bge_chipinit()
1792 if (BGE_IS_5714_FAMILY(sc)) { in bge_chipinit()
1796 dma_rw_ctl |= (sc->bge_asicrev == BGE_ASICREV_BCM5780) ? in bge_chipinit()
1799 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5703) { in bge_chipinit()
1808 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704) { in bge_chipinit()
1818 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || in bge_chipinit()
1819 sc->bge_asicrev == BGE_ASICREV_BCM5704) { in bge_chipinit()
1823 tmp = CSR_READ_4(sc, BGE_PCI_CLKCTL) & 0x1F; in bge_chipinit()
1836 if (sc->bge_asicrev != BGE_ASICREV_BCM5705 && in bge_chipinit()
1837 sc->bge_asicrev != BGE_ASICREV_BCM5750) in bge_chipinit()
1840 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 || in bge_chipinit()
1841 sc->bge_asicrev == BGE_ASICREV_BCM5701) in bge_chipinit()
1844 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || in bge_chipinit()
1845 sc->bge_asicrev == BGE_ASICREV_BCM5704) in bge_chipinit()
1847 if (BGE_IS_5717_PLUS(sc)) { in bge_chipinit()
1849 if (sc->bge_chipid == BGE_CHIPID_BCM57765_A0) in bge_chipinit()
1856 if (!BGE_IS_57765_PLUS(sc) && in bge_chipinit()
1857 sc->bge_asicrev != BGE_ASICREV_BCM5717 && in bge_chipinit()
1858 sc->bge_asicrev != BGE_ASICREV_BCM5762) in bge_chipinit()
1861 pci_write_config(sc->bge_dev, BGE_PCI_DMA_RW_CTL, dma_rw_ctl, 4); in bge_chipinit()
1866 mode_ctl = bge_dma_swap_options(sc); in bge_chipinit()
1867 if (sc->bge_asicrev == BGE_ASICREV_BCM5720 || in bge_chipinit()
1868 sc->bge_asicrev == BGE_ASICREV_BCM5762) { in bge_chipinit()
1870 mode_ctl |= CSR_READ_4(sc, BGE_MODE_CTL) & in bge_chipinit()
1884 if (sc->bge_asicrev == BGE_ASICREV_BCM5701 && in bge_chipinit()
1885 sc->bge_chipid == BGE_CHIPID_BCM5701_B5) in bge_chipinit()
1891 if (sc->bge_asf_mode & ASF_STACKUP) in bge_chipinit()
1894 CSR_WRITE_4(sc, BGE_MODE_CTL, mode_ctl); in bge_chipinit()
1900 PCI_CLRBIT(sc->bge_dev, BGE_PCI_CMD, PCIM_CMD_MWIEN, 4); in bge_chipinit()
1903 CSR_WRITE_4(sc, BGE_MISC_CFG, BGE_32BITTIME_66MHZ); in bge_chipinit()
1906 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_chipinit()
1910 BGE_CLRBIT(sc, BGE_MISC_CFG, BGE_MISCCFG_EPHY_IDDQ); in bge_chipinit()
1911 CSR_READ_4(sc, BGE_MISC_CFG); /* Flush */ in bge_chipinit()
1919 bge_blockinit(struct bge_softc *sc) in bge_blockinit() argument
1934 CSR_WRITE_4(sc, BGE_PCI_MEMWIN_BASEADDR, 0); in bge_blockinit()
1938 if (!(BGE_IS_5705_PLUS(sc))) { in bge_blockinit()
1940 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_BASEADDR, BGE_BUFFPOOL_1); in bge_blockinit()
1941 if (sc->bge_asicrev == BGE_ASICREV_BCM5704) in bge_blockinit()
1942 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_LEN, 0x10000); in bge_blockinit()
1944 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_LEN, 0x18000); in bge_blockinit()
1947 CSR_WRITE_4(sc, BGE_BMAN_DMA_DESCPOOL_BASEADDR, in bge_blockinit()
1949 CSR_WRITE_4(sc, BGE_BMAN_DMA_DESCPOOL_LEN, 0x2000); in bge_blockinit()
1953 if (BGE_IS_5717_PLUS(sc)) { in bge_blockinit()
1954 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_READDMA_LOWAT, 0x0); in bge_blockinit()
1955 if (if_getmtu(sc->bge_ifp) > ETHERMTU) { in bge_blockinit()
1956 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_MACRX_LOWAT, 0x7e); in bge_blockinit()
1957 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_HIWAT, 0xea); in bge_blockinit()
1959 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_MACRX_LOWAT, 0x2a); in bge_blockinit()
1960 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_HIWAT, 0xa0); in bge_blockinit()
1962 } else if (!BGE_IS_5705_PLUS(sc)) { in bge_blockinit()
1963 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_READDMA_LOWAT, 0x50); in bge_blockinit()
1964 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_MACRX_LOWAT, 0x20); in bge_blockinit()
1965 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_HIWAT, 0x60); in bge_blockinit()
1966 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_blockinit()
1967 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_READDMA_LOWAT, 0x0); in bge_blockinit()
1968 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_MACRX_LOWAT, 0x04); in bge_blockinit()
1969 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_HIWAT, 0x10); in bge_blockinit()
1971 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_READDMA_LOWAT, 0x0); in bge_blockinit()
1972 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_MACRX_LOWAT, 0x10); in bge_blockinit()
1973 CSR_WRITE_4(sc, BGE_BMAN_MBUFPOOL_HIWAT, 0x60); in bge_blockinit()
1977 CSR_WRITE_4(sc, BGE_BMAN_DMA_DESCPOOL_LOWAT, 5); in bge_blockinit()
1978 CSR_WRITE_4(sc, BGE_BMAN_DMA_DESCPOOL_HIWAT, 10); in bge_blockinit()
1988 if (sc->bge_asicrev == BGE_ASICREV_BCM5719) in bge_blockinit()
1990 CSR_WRITE_4(sc, BGE_BMAN_MODE, val); in bge_blockinit()
1995 if (CSR_READ_4(sc, BGE_BMAN_MODE) & BGE_BMANMODE_ENABLE) in bge_blockinit()
2000 device_printf(sc->bge_dev, "buffer manager failed to start\n"); in bge_blockinit()
2005 CSR_WRITE_4(sc, BGE_FTQ_RESET, 0xFFFFFFFF); in bge_blockinit()
2006 CSR_WRITE_4(sc, BGE_FTQ_RESET, 0); in bge_blockinit()
2011 if (CSR_READ_4(sc, BGE_FTQ_RESET) == 0) in bge_blockinit()
2016 device_printf(sc->bge_dev, "flow-through queue init failed\n"); in bge_blockinit()
2052 rcb = &sc->bge_ldata.bge_info.bge_std_rx_rcb; in bge_blockinit()
2054 BGE_ADDR_LO(sc->bge_ldata.bge_rx_std_ring_paddr); in bge_blockinit()
2056 BGE_ADDR_HI(sc->bge_ldata.bge_rx_std_ring_paddr); in bge_blockinit()
2057 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, in bge_blockinit()
2058 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_PREREAD); in bge_blockinit()
2059 if (BGE_IS_5717_PLUS(sc)) { in bge_blockinit()
2068 } else if (BGE_IS_5705_PLUS(sc)) { in bge_blockinit()
2087 if (sc->bge_asicrev == BGE_ASICREV_BCM5717 || in bge_blockinit()
2088 sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_blockinit()
2089 sc->bge_asicrev == BGE_ASICREV_BCM5720) in bge_blockinit()
2094 CSR_WRITE_4(sc, BGE_RX_STD_RCB_HADDR_HI, rcb->bge_hostaddr.bge_addr_hi); in bge_blockinit()
2095 CSR_WRITE_4(sc, BGE_RX_STD_RCB_HADDR_LO, rcb->bge_hostaddr.bge_addr_lo); in bge_blockinit()
2096 CSR_WRITE_4(sc, BGE_RX_STD_RCB_MAXLEN_FLAGS, rcb->bge_maxlen_flags); in bge_blockinit()
2097 CSR_WRITE_4(sc, BGE_RX_STD_RCB_NICADDR, rcb->bge_nicaddr); in bge_blockinit()
2100 bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, 0); in bge_blockinit()
2109 if (BGE_IS_JUMBO_CAPABLE(sc)) { in bge_blockinit()
2110 rcb = &sc->bge_ldata.bge_info.bge_jumbo_rx_rcb; in bge_blockinit()
2113 BGE_ADDR_LO(sc->bge_ldata.bge_rx_jumbo_ring_paddr); in bge_blockinit()
2115 BGE_ADDR_HI(sc->bge_ldata.bge_rx_jumbo_ring_paddr); in bge_blockinit()
2116 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_blockinit()
2117 sc->bge_cdata.bge_rx_jumbo_ring_map, in bge_blockinit()
2121 if (sc->bge_asicrev == BGE_ASICREV_BCM5717 || in bge_blockinit()
2122 sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_blockinit()
2123 sc->bge_asicrev == BGE_ASICREV_BCM5720) in bge_blockinit()
2127 CSR_WRITE_4(sc, BGE_RX_JUMBO_RCB_HADDR_HI, in bge_blockinit()
2129 CSR_WRITE_4(sc, BGE_RX_JUMBO_RCB_HADDR_LO, in bge_blockinit()
2132 CSR_WRITE_4(sc, BGE_RX_JUMBO_RCB_MAXLEN_FLAGS, in bge_blockinit()
2134 CSR_WRITE_4(sc, BGE_RX_JUMBO_RCB_NICADDR, rcb->bge_nicaddr); in bge_blockinit()
2136 bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, 0); in bge_blockinit()
2140 if (BGE_IS_5700_FAMILY(sc)) { in bge_blockinit()
2141 rcb = &sc->bge_ldata.bge_info.bge_mini_rx_rcb; in bge_blockinit()
2144 CSR_WRITE_4(sc, BGE_RX_MINI_RCB_MAXLEN_FLAGS, in bge_blockinit()
2147 bge_writembx(sc, BGE_MBX_RX_MINI_PROD_LO, 0); in bge_blockinit()
2151 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_blockinit()
2152 if (sc->bge_chipid == BGE_CHIPID_BCM5906_A0 || in bge_blockinit()
2153 sc->bge_chipid == BGE_CHIPID_BCM5906_A1 || in bge_blockinit()
2154 sc->bge_chipid == BGE_CHIPID_BCM5906_A2) in bge_blockinit()
2155 CSR_WRITE_4(sc, BGE_ISO_PKT_TX, in bge_blockinit()
2156 (CSR_READ_4(sc, BGE_ISO_PKT_TX) & ~3) | 2); in bge_blockinit()
2175 if (BGE_IS_5705_PLUS(sc)) in bge_blockinit()
2179 CSR_WRITE_4(sc, BGE_RBDI_STD_REPL_THRESH, val); in bge_blockinit()
2180 if (BGE_IS_JUMBO_CAPABLE(sc)) in bge_blockinit()
2181 CSR_WRITE_4(sc, BGE_RBDI_JUMBO_REPL_THRESH, in bge_blockinit()
2183 if (BGE_IS_5717_PLUS(sc)) { in bge_blockinit()
2184 CSR_WRITE_4(sc, BGE_STD_REPLENISH_LWM, 32); in bge_blockinit()
2185 CSR_WRITE_4(sc, BGE_JMB_REPLENISH_LWM, 16); in bge_blockinit()
2193 if (!BGE_IS_5705_PLUS(sc)) in bge_blockinit()
2196 else if (BGE_IS_57765_PLUS(sc) || in bge_blockinit()
2197 sc->bge_asicrev == BGE_ASICREV_BCM5762) in bge_blockinit()
2199 else if (BGE_IS_5717_PLUS(sc)) in bge_blockinit()
2205 RCB_WRITE_4(sc, vrcb, bge_maxlen_flags, in bge_blockinit()
2207 RCB_WRITE_4(sc, vrcb, bge_nicaddr, 0); in bge_blockinit()
2213 BGE_HOSTADDR(taddr, sc->bge_ldata.bge_tx_ring_paddr); in bge_blockinit()
2214 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_hi, taddr.bge_addr_hi); in bge_blockinit()
2215 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_lo, taddr.bge_addr_lo); in bge_blockinit()
2216 if (sc->bge_asicrev == BGE_ASICREV_BCM5717 || in bge_blockinit()
2217 sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_blockinit()
2218 sc->bge_asicrev == BGE_ASICREV_BCM5720) in bge_blockinit()
2219 RCB_WRITE_4(sc, vrcb, bge_nicaddr, BGE_SEND_RING_5717); in bge_blockinit()
2221 RCB_WRITE_4(sc, vrcb, bge_nicaddr, in bge_blockinit()
2223 RCB_WRITE_4(sc, vrcb, bge_maxlen_flags, in bge_blockinit()
2231 if (sc->bge_asicrev == BGE_ASICREV_BCM5717 || in bge_blockinit()
2232 sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_blockinit()
2233 sc->bge_asicrev == BGE_ASICREV_BCM5720) { in bge_blockinit()
2236 } else if (!BGE_IS_5705_PLUS(sc)) in bge_blockinit()
2238 else if (sc->bge_asicrev == BGE_ASICREV_BCM5755 || in bge_blockinit()
2239 sc->bge_asicrev == BGE_ASICREV_BCM5762 || in bge_blockinit()
2240 BGE_IS_57765_PLUS(sc)) in bge_blockinit()
2247 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_hi, 0); in bge_blockinit()
2248 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_lo, 0); in bge_blockinit()
2249 RCB_WRITE_4(sc, vrcb, bge_maxlen_flags, in bge_blockinit()
2251 RCB_WRITE_4(sc, vrcb, bge_nicaddr, 0); in bge_blockinit()
2252 bge_writembx(sc, BGE_MBX_RX_CONS0_LO + in bge_blockinit()
2263 BGE_HOSTADDR(taddr, sc->bge_ldata.bge_rx_return_ring_paddr); in bge_blockinit()
2264 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_hi, taddr.bge_addr_hi); in bge_blockinit()
2265 RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_lo, taddr.bge_addr_lo); in bge_blockinit()
2266 RCB_WRITE_4(sc, vrcb, bge_nicaddr, 0); in bge_blockinit()
2267 RCB_WRITE_4(sc, vrcb, bge_maxlen_flags, in bge_blockinit()
2268 BGE_RCB_MAXLEN_FLAGS(sc->bge_return_ring_cnt, 0)); in bge_blockinit()
2270 lladdr = if_getlladdr(sc->bge_ifp); in bge_blockinit()
2272 CSR_WRITE_4(sc, BGE_TX_RANDOM_BACKOFF, in bge_blockinit()
2280 if (sc->bge_asicrev == BGE_ASICREV_BCM5720 || in bge_blockinit()
2281 sc->bge_asicrev == BGE_ASICREV_BCM5762) in bge_blockinit()
2282 val |= CSR_READ_4(sc, BGE_TX_LENGTHS) & in bge_blockinit()
2284 CSR_WRITE_4(sc, BGE_TX_LENGTHS, val); in bge_blockinit()
2290 CSR_WRITE_4(sc, BGE_RX_RULES_CFG, 0x08); in bge_blockinit()
2296 CSR_WRITE_4(sc, BGE_RXLP_CFG, 0x181); in bge_blockinit()
2299 CSR_WRITE_4(sc, BGE_RXLP_STATS_ENABLE_MASK, 0x007FFFFF); in bge_blockinit()
2300 CSR_WRITE_4(sc, BGE_RXLP_STATS_CTL, 0x1); in bge_blockinit()
2303 CSR_WRITE_4(sc, BGE_HCC_MODE, 0x00000000); in bge_blockinit()
2308 if (!(CSR_READ_4(sc, BGE_HCC_MODE) & BGE_HCCMODE_ENABLE)) in bge_blockinit()
2313 device_printf(sc->bge_dev, in bge_blockinit()
2319 CSR_WRITE_4(sc, BGE_HCC_RX_COAL_TICKS, sc->bge_rx_coal_ticks); in bge_blockinit()
2320 CSR_WRITE_4(sc, BGE_HCC_TX_COAL_TICKS, sc->bge_tx_coal_ticks); in bge_blockinit()
2321 CSR_WRITE_4(sc, BGE_HCC_RX_MAX_COAL_BDS, sc->bge_rx_max_coal_bds); in bge_blockinit()
2322 CSR_WRITE_4(sc, BGE_HCC_TX_MAX_COAL_BDS, sc->bge_tx_max_coal_bds); in bge_blockinit()
2323 if (!(BGE_IS_5705_PLUS(sc))) { in bge_blockinit()
2324 CSR_WRITE_4(sc, BGE_HCC_RX_COAL_TICKS_INT, 0); in bge_blockinit()
2325 CSR_WRITE_4(sc, BGE_HCC_TX_COAL_TICKS_INT, 0); in bge_blockinit()
2327 CSR_WRITE_4(sc, BGE_HCC_RX_MAX_COAL_BDS_INT, 1); in bge_blockinit()
2328 CSR_WRITE_4(sc, BGE_HCC_TX_MAX_COAL_BDS_INT, 1); in bge_blockinit()
2331 if (!(BGE_IS_5705_PLUS(sc))) { in bge_blockinit()
2332 CSR_WRITE_4(sc, BGE_HCC_STATS_ADDR_HI, in bge_blockinit()
2333 BGE_ADDR_HI(sc->bge_ldata.bge_stats_paddr)); in bge_blockinit()
2334 CSR_WRITE_4(sc, BGE_HCC_STATS_ADDR_LO, in bge_blockinit()
2335 BGE_ADDR_LO(sc->bge_ldata.bge_stats_paddr)); in bge_blockinit()
2336 CSR_WRITE_4(sc, BGE_HCC_STATS_BASEADDR, BGE_STATS_BLOCK); in bge_blockinit()
2337 CSR_WRITE_4(sc, BGE_HCC_STATUSBLK_BASEADDR, BGE_STATUS_BLOCK); in bge_blockinit()
2338 CSR_WRITE_4(sc, BGE_HCC_STATS_TICKS, sc->bge_stat_ticks); in bge_blockinit()
2342 CSR_WRITE_4(sc, BGE_HCC_STATUSBLK_ADDR_HI, in bge_blockinit()
2343 BGE_ADDR_HI(sc->bge_ldata.bge_status_block_paddr)); in bge_blockinit()
2344 CSR_WRITE_4(sc, BGE_HCC_STATUSBLK_ADDR_LO, in bge_blockinit()
2345 BGE_ADDR_LO(sc->bge_ldata.bge_status_block_paddr)); in bge_blockinit()
2348 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_blockinit()
2349 sc->bge_chipid != BGE_CHIPID_BCM5700_C0) { in bge_blockinit()
2351 bzero(sc->bge_ldata.bge_status_block, BGE_STATUS_BLK_SZ); in bge_blockinit()
2354 bzero(sc->bge_ldata.bge_status_block, 32); in bge_blockinit()
2356 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_blockinit()
2357 sc->bge_cdata.bge_status_map, in bge_blockinit()
2361 CSR_WRITE_4(sc, BGE_HCC_MODE, val | BGE_HCCMODE_ENABLE); in bge_blockinit()
2364 CSR_WRITE_4(sc, BGE_RBDC_MODE, in bge_blockinit()
2368 CSR_WRITE_4(sc, BGE_RXLP_MODE, BGE_RXLPMODE_ENABLE); in bge_blockinit()
2371 if (!(BGE_IS_5705_PLUS(sc))) in bge_blockinit()
2372 CSR_WRITE_4(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE); in bge_blockinit()
2380 if (sc->bge_flags & BGE_FLAG_TBI) in bge_blockinit()
2382 else if (sc->bge_flags & BGE_FLAG_MII_SERDES) in bge_blockinit()
2388 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) != 0) in bge_blockinit()
2391 CSR_WRITE_4(sc, BGE_MAC_MODE, val); in bge_blockinit()
2395 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_INTR_ONATTN); in bge_blockinit()
2399 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUT0 | in bge_blockinit()
2401 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUTEN0 | in bge_blockinit()
2406 if (!(BGE_IS_5705_PLUS(sc))) in bge_blockinit()
2407 CSR_WRITE_4(sc, BGE_DMAC_MODE, BGE_DMACMODE_ENABLE); in bge_blockinit()
2412 if (BGE_IS_5755_PLUS(sc)) in bge_blockinit()
2416 if (sc->bge_asicrev == BGE_ASICREV_BCM5785) in bge_blockinit()
2420 CSR_WRITE_4(sc, BGE_WDMA_MODE, val); in bge_blockinit()
2426 if (sc->bge_asicrev == BGE_ASICREV_BCM5717) in bge_blockinit()
2429 if (sc->bge_asicrev == BGE_ASICREV_BCM5784 || in bge_blockinit()
2430 sc->bge_asicrev == BGE_ASICREV_BCM5785 || in bge_blockinit()
2431 sc->bge_asicrev == BGE_ASICREV_BCM57780) in bge_blockinit()
2435 if (sc->bge_flags & BGE_FLAG_PCIE) in bge_blockinit()
2437 if (sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) { in bge_blockinit()
2439 if (sc->bge_flags & BGE_FLAG_TSO3 || in bge_blockinit()
2440 sc->bge_asicrev == BGE_ASICREV_BCM5785 || in bge_blockinit()
2441 sc->bge_asicrev == BGE_ASICREV_BCM57780) in bge_blockinit()
2445 if (sc->bge_asicrev == BGE_ASICREV_BCM5720 || in bge_blockinit()
2446 sc->bge_asicrev == BGE_ASICREV_BCM5762) { in bge_blockinit()
2447 val |= CSR_READ_4(sc, BGE_RDMA_MODE) & in bge_blockinit()
2456 if (sc->bge_asicrev == BGE_ASICREV_BCM5761 || in bge_blockinit()
2457 sc->bge_asicrev == BGE_ASICREV_BCM5784 || in bge_blockinit()
2458 sc->bge_asicrev == BGE_ASICREV_BCM5785 || in bge_blockinit()
2459 sc->bge_asicrev == BGE_ASICREV_BCM57780 || in bge_blockinit()
2460 BGE_IS_5717_PLUS(sc) || BGE_IS_57765_PLUS(sc)) { in bge_blockinit()
2461 if (sc->bge_asicrev == BGE_ASICREV_BCM5762) in bge_blockinit()
2465 dmactl = CSR_READ_4(sc, rdmareg); in bge_blockinit()
2470 if (sc->bge_chipid == BGE_CHIPID_BCM5719_A0 || in bge_blockinit()
2471 sc->bge_asicrev == BGE_ASICREV_BCM5762) { in bge_blockinit()
2484 CSR_WRITE_4(sc, rdmareg, dmactl | in bge_blockinit()
2488 if (sc->bge_asicrev == BGE_ASICREV_BCM5719) { in bge_blockinit()
2489 CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, in bge_blockinit()
2490 CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL) | in bge_blockinit()
2493 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5720) { in bge_blockinit()
2498 CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, in bge_blockinit()
2499 CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL) | in bge_blockinit()
2502 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5762) { in bge_blockinit()
2503 CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL_REG2, in bge_blockinit()
2504 CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL_REG2) | in bge_blockinit()
2509 CSR_WRITE_4(sc, BGE_RDMA_MODE, val); in bge_blockinit()
2512 if (sc->bge_flags & BGE_FLAG_RDMA_BUG) { in bge_blockinit()
2514 val = CSR_READ_4(sc, BGE_RDMA_LENGTH + i * 4); in bge_blockinit()
2521 val = CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL); in bge_blockinit()
2522 if (sc->bge_asicrev == BGE_ASICREV_BCM5719) in bge_blockinit()
2526 CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, val); in bge_blockinit()
2531 CSR_WRITE_4(sc, BGE_RDC_MODE, BGE_RDCMODE_ENABLE); in bge_blockinit()
2534 CSR_WRITE_4(sc, BGE_RBDI_MODE, BGE_RBDIMODE_ENABLE); in bge_blockinit()
2537 CSR_WRITE_4(sc, BGE_RDBDI_MODE, BGE_RDBDIMODE_ENABLE); in bge_blockinit()
2540 if (!(BGE_IS_5705_PLUS(sc))) in bge_blockinit()
2541 CSR_WRITE_4(sc, BGE_MBCF_MODE, BGE_MBCFMODE_ENABLE); in bge_blockinit()
2544 CSR_WRITE_4(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); in bge_blockinit()
2548 if (sc->bge_asicrev == BGE_ASICREV_BCM5761) in bge_blockinit()
2550 CSR_WRITE_4(sc, BGE_SDC_MODE, val); in bge_blockinit()
2553 if (sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) in bge_blockinit()
2554 CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE | in bge_blockinit()
2557 CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); in bge_blockinit()
2560 CSR_WRITE_4(sc, BGE_SBDI_MODE, BGE_SBDIMODE_ENABLE); in bge_blockinit()
2563 CSR_WRITE_4(sc, BGE_SRS_MODE, BGE_SRSMODE_ENABLE); in bge_blockinit()
2565 CSR_WRITE_4(sc, BGE_SDI_STATS_ENABLE_MASK, 0x007FFFFF); in bge_blockinit()
2566 CSR_WRITE_4(sc, BGE_SDI_STATS_CTL, in bge_blockinit()
2570 CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED | in bge_blockinit()
2573 CSR_WRITE_4(sc, BGE_MI_STS, 0); in bge_blockinit()
2579 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_blockinit()
2580 CSR_WRITE_4(sc, BGE_MI_STS, BGE_MISTS_LINK); in bge_blockinit()
2582 if (sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) { in bge_blockinit()
2583 CSR_WRITE_4(sc, BGE_MI_MODE, sc->bge_mi_mode); in bge_blockinit()
2586 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_blockinit()
2587 sc->bge_chipid != BGE_CHIPID_BCM5700_B2) in bge_blockinit()
2588 CSR_WRITE_4(sc, BGE_MAC_EVT_ENB, in bge_blockinit()
2599 CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED | in bge_blockinit()
2604 BGE_SETBIT(sc, BGE_MAC_EVT_ENB, BGE_EVTENB_LINK_CHANGED); in bge_blockinit()
2705 struct bge_softc *sc; in bge_probe() local
2711 sc = device_get_softc(dev); in bge_probe()
2712 sc->bge_dev = dev; in bge_probe()
2719 if (bge_has_eaddr(sc) && in bge_probe()
2740 bge_dma_free(struct bge_softc *sc) in bge_dma_free() argument
2746 if (sc->bge_cdata.bge_rx_std_dmamap[i]) in bge_dma_free()
2747 bus_dmamap_destroy(sc->bge_cdata.bge_rx_mtag, in bge_dma_free()
2748 sc->bge_cdata.bge_rx_std_dmamap[i]); in bge_dma_free()
2750 if (sc->bge_cdata.bge_rx_std_sparemap) in bge_dma_free()
2751 bus_dmamap_destroy(sc->bge_cdata.bge_rx_mtag, in bge_dma_free()
2752 sc->bge_cdata.bge_rx_std_sparemap); in bge_dma_free()
2756 if (sc->bge_cdata.bge_rx_jumbo_dmamap[i]) in bge_dma_free()
2757 bus_dmamap_destroy(sc->bge_cdata.bge_mtag_jumbo, in bge_dma_free()
2758 sc->bge_cdata.bge_rx_jumbo_dmamap[i]); in bge_dma_free()
2760 if (sc->bge_cdata.bge_rx_jumbo_sparemap) in bge_dma_free()
2761 bus_dmamap_destroy(sc->bge_cdata.bge_mtag_jumbo, in bge_dma_free()
2762 sc->bge_cdata.bge_rx_jumbo_sparemap); in bge_dma_free()
2766 if (sc->bge_cdata.bge_tx_dmamap[i]) in bge_dma_free()
2767 bus_dmamap_destroy(sc->bge_cdata.bge_tx_mtag, in bge_dma_free()
2768 sc->bge_cdata.bge_tx_dmamap[i]); in bge_dma_free()
2771 if (sc->bge_cdata.bge_rx_mtag) in bge_dma_free()
2772 bus_dma_tag_destroy(sc->bge_cdata.bge_rx_mtag); in bge_dma_free()
2773 if (sc->bge_cdata.bge_mtag_jumbo) in bge_dma_free()
2774 bus_dma_tag_destroy(sc->bge_cdata.bge_mtag_jumbo); in bge_dma_free()
2775 if (sc->bge_cdata.bge_tx_mtag) in bge_dma_free()
2776 bus_dma_tag_destroy(sc->bge_cdata.bge_tx_mtag); in bge_dma_free()
2779 if (sc->bge_ldata.bge_rx_std_ring_paddr) in bge_dma_free()
2780 bus_dmamap_unload(sc->bge_cdata.bge_rx_std_ring_tag, in bge_dma_free()
2781 sc->bge_cdata.bge_rx_std_ring_map); in bge_dma_free()
2782 if (sc->bge_ldata.bge_rx_std_ring) in bge_dma_free()
2783 bus_dmamem_free(sc->bge_cdata.bge_rx_std_ring_tag, in bge_dma_free()
2784 sc->bge_ldata.bge_rx_std_ring, in bge_dma_free()
2785 sc->bge_cdata.bge_rx_std_ring_map); in bge_dma_free()
2787 if (sc->bge_cdata.bge_rx_std_ring_tag) in bge_dma_free()
2788 bus_dma_tag_destroy(sc->bge_cdata.bge_rx_std_ring_tag); in bge_dma_free()
2791 if (sc->bge_ldata.bge_rx_jumbo_ring_paddr) in bge_dma_free()
2792 bus_dmamap_unload(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_dma_free()
2793 sc->bge_cdata.bge_rx_jumbo_ring_map); in bge_dma_free()
2795 if (sc->bge_ldata.bge_rx_jumbo_ring) in bge_dma_free()
2796 bus_dmamem_free(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_dma_free()
2797 sc->bge_ldata.bge_rx_jumbo_ring, in bge_dma_free()
2798 sc->bge_cdata.bge_rx_jumbo_ring_map); in bge_dma_free()
2800 if (sc->bge_cdata.bge_rx_jumbo_ring_tag) in bge_dma_free()
2801 bus_dma_tag_destroy(sc->bge_cdata.bge_rx_jumbo_ring_tag); in bge_dma_free()
2804 if (sc->bge_ldata.bge_rx_return_ring_paddr) in bge_dma_free()
2805 bus_dmamap_unload(sc->bge_cdata.bge_rx_return_ring_tag, in bge_dma_free()
2806 sc->bge_cdata.bge_rx_return_ring_map); in bge_dma_free()
2808 if (sc->bge_ldata.bge_rx_return_ring) in bge_dma_free()
2809 bus_dmamem_free(sc->bge_cdata.bge_rx_return_ring_tag, in bge_dma_free()
2810 sc->bge_ldata.bge_rx_return_ring, in bge_dma_free()
2811 sc->bge_cdata.bge_rx_return_ring_map); in bge_dma_free()
2813 if (sc->bge_cdata.bge_rx_return_ring_tag) in bge_dma_free()
2814 bus_dma_tag_destroy(sc->bge_cdata.bge_rx_return_ring_tag); in bge_dma_free()
2817 if (sc->bge_ldata.bge_tx_ring_paddr) in bge_dma_free()
2818 bus_dmamap_unload(sc->bge_cdata.bge_tx_ring_tag, in bge_dma_free()
2819 sc->bge_cdata.bge_tx_ring_map); in bge_dma_free()
2821 if (sc->bge_ldata.bge_tx_ring) in bge_dma_free()
2822 bus_dmamem_free(sc->bge_cdata.bge_tx_ring_tag, in bge_dma_free()
2823 sc->bge_ldata.bge_tx_ring, in bge_dma_free()
2824 sc->bge_cdata.bge_tx_ring_map); in bge_dma_free()
2826 if (sc->bge_cdata.bge_tx_ring_tag) in bge_dma_free()
2827 bus_dma_tag_destroy(sc->bge_cdata.bge_tx_ring_tag); in bge_dma_free()
2830 if (sc->bge_ldata.bge_status_block_paddr) in bge_dma_free()
2831 bus_dmamap_unload(sc->bge_cdata.bge_status_tag, in bge_dma_free()
2832 sc->bge_cdata.bge_status_map); in bge_dma_free()
2834 if (sc->bge_ldata.bge_status_block) in bge_dma_free()
2835 bus_dmamem_free(sc->bge_cdata.bge_status_tag, in bge_dma_free()
2836 sc->bge_ldata.bge_status_block, in bge_dma_free()
2837 sc->bge_cdata.bge_status_map); in bge_dma_free()
2839 if (sc->bge_cdata.bge_status_tag) in bge_dma_free()
2840 bus_dma_tag_destroy(sc->bge_cdata.bge_status_tag); in bge_dma_free()
2843 if (sc->bge_ldata.bge_stats_paddr) in bge_dma_free()
2844 bus_dmamap_unload(sc->bge_cdata.bge_stats_tag, in bge_dma_free()
2845 sc->bge_cdata.bge_stats_map); in bge_dma_free()
2847 if (sc->bge_ldata.bge_stats) in bge_dma_free()
2848 bus_dmamem_free(sc->bge_cdata.bge_stats_tag, in bge_dma_free()
2849 sc->bge_ldata.bge_stats, in bge_dma_free()
2850 sc->bge_cdata.bge_stats_map); in bge_dma_free()
2852 if (sc->bge_cdata.bge_stats_tag) in bge_dma_free()
2853 bus_dma_tag_destroy(sc->bge_cdata.bge_stats_tag); in bge_dma_free()
2855 if (sc->bge_cdata.bge_buffer_tag) in bge_dma_free()
2856 bus_dma_tag_destroy(sc->bge_cdata.bge_buffer_tag); in bge_dma_free()
2859 if (sc->bge_cdata.bge_parent_tag) in bge_dma_free()
2860 bus_dma_tag_destroy(sc->bge_cdata.bge_parent_tag); in bge_dma_free()
2864 bge_dma_ring_alloc(struct bge_softc *sc, bus_size_t alignment, in bge_dma_ring_alloc() argument
2875 error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, in bge_dma_ring_alloc()
2879 device_printf(sc->bge_dev, in bge_dma_ring_alloc()
2887 device_printf(sc->bge_dev, in bge_dma_ring_alloc()
2896 device_printf(sc->bge_dev, in bge_dma_ring_alloc()
2902 if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0 && in bge_dma_ring_alloc()
2912 device_printf(sc->bge_dev, "4GB boundary crossed, " in bge_dma_ring_alloc()
2924 bge_dma_alloc(struct bge_softc *sc) in bge_dma_alloc() argument
2931 if ((sc->bge_flags & BGE_FLAG_40BIT_BUG) != 0) in bge_dma_alloc()
2936 error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev), in bge_dma_alloc()
2939 0, NULL, NULL, &sc->bge_cdata.bge_parent_tag); in bge_dma_alloc()
2941 device_printf(sc->bge_dev, in bge_dma_alloc()
2947 error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_STD_RX_RING_SZ, in bge_dma_alloc()
2948 &sc->bge_cdata.bge_rx_std_ring_tag, in bge_dma_alloc()
2949 (uint8_t **)&sc->bge_ldata.bge_rx_std_ring, in bge_dma_alloc()
2950 &sc->bge_cdata.bge_rx_std_ring_map, in bge_dma_alloc()
2951 &sc->bge_ldata.bge_rx_std_ring_paddr, "RX ring"); in bge_dma_alloc()
2956 error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_RX_RTN_RING_SZ(sc), in bge_dma_alloc()
2957 &sc->bge_cdata.bge_rx_return_ring_tag, in bge_dma_alloc()
2958 (uint8_t **)&sc->bge_ldata.bge_rx_return_ring, in bge_dma_alloc()
2959 &sc->bge_cdata.bge_rx_return_ring_map, in bge_dma_alloc()
2960 &sc->bge_ldata.bge_rx_return_ring_paddr, "RX return ring"); in bge_dma_alloc()
2965 error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_TX_RING_SZ, in bge_dma_alloc()
2966 &sc->bge_cdata.bge_tx_ring_tag, in bge_dma_alloc()
2967 (uint8_t **)&sc->bge_ldata.bge_tx_ring, in bge_dma_alloc()
2968 &sc->bge_cdata.bge_tx_ring_map, in bge_dma_alloc()
2969 &sc->bge_ldata.bge_tx_ring_paddr, "TX ring"); in bge_dma_alloc()
2980 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_dma_alloc()
2981 sc->bge_chipid != BGE_CHIPID_BCM5700_C0) in bge_dma_alloc()
2985 error = bge_dma_ring_alloc(sc, PAGE_SIZE, sbsz, in bge_dma_alloc()
2986 &sc->bge_cdata.bge_status_tag, in bge_dma_alloc()
2987 (uint8_t **)&sc->bge_ldata.bge_status_block, in bge_dma_alloc()
2988 &sc->bge_cdata.bge_status_map, in bge_dma_alloc()
2989 &sc->bge_ldata.bge_status_block_paddr, "status block"); in bge_dma_alloc()
2994 error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_STATS_SZ, in bge_dma_alloc()
2995 &sc->bge_cdata.bge_stats_tag, in bge_dma_alloc()
2996 (uint8_t **)&sc->bge_ldata.bge_stats, in bge_dma_alloc()
2997 &sc->bge_cdata.bge_stats_map, in bge_dma_alloc()
2998 &sc->bge_ldata.bge_stats_paddr, "statistics block"); in bge_dma_alloc()
3003 if (BGE_IS_JUMBO_CAPABLE(sc)) { in bge_dma_alloc()
3004 error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_JUMBO_RX_RING_SZ, in bge_dma_alloc()
3005 &sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_dma_alloc()
3006 (uint8_t **)&sc->bge_ldata.bge_rx_jumbo_ring, in bge_dma_alloc()
3007 &sc->bge_cdata.bge_rx_jumbo_ring_map, in bge_dma_alloc()
3008 &sc->bge_ldata.bge_rx_jumbo_ring_paddr, "jumbo RX ring"); in bge_dma_alloc()
3015 if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0) { in bge_dma_alloc()
3024 if (sc->bge_pcixcap != 0) in bge_dma_alloc()
3027 error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev), in bge_dma_alloc()
3030 0, NULL, NULL, &sc->bge_cdata.bge_buffer_tag); in bge_dma_alloc()
3032 device_printf(sc->bge_dev, in bge_dma_alloc()
3037 if (sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) { in bge_dma_alloc()
3044 error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, 1, in bge_dma_alloc()
3047 &sc->bge_cdata.bge_tx_mtag); in bge_dma_alloc()
3050 device_printf(sc->bge_dev, "could not allocate TX dma tag\n"); in bge_dma_alloc()
3055 if (sc->bge_flags & BGE_FLAG_JUMBO_STD) in bge_dma_alloc()
3059 error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, 1, 0, in bge_dma_alloc()
3061 rxmaxsegsz, 0, NULL, NULL, &sc->bge_cdata.bge_rx_mtag); in bge_dma_alloc()
3064 device_printf(sc->bge_dev, "could not allocate RX dma tag\n"); in bge_dma_alloc()
3069 error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0, in bge_dma_alloc()
3070 &sc->bge_cdata.bge_rx_std_sparemap); in bge_dma_alloc()
3072 device_printf(sc->bge_dev, in bge_dma_alloc()
3077 error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0, in bge_dma_alloc()
3078 &sc->bge_cdata.bge_rx_std_dmamap[i]); in bge_dma_alloc()
3080 device_printf(sc->bge_dev, in bge_dma_alloc()
3088 error = bus_dmamap_create(sc->bge_cdata.bge_tx_mtag, 0, in bge_dma_alloc()
3089 &sc->bge_cdata.bge_tx_dmamap[i]); in bge_dma_alloc()
3091 device_printf(sc->bge_dev, in bge_dma_alloc()
3098 if (BGE_IS_JUMBO_CAPABLE(sc)) { in bge_dma_alloc()
3099 error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, in bge_dma_alloc()
3102 0, NULL, NULL, &sc->bge_cdata.bge_mtag_jumbo); in bge_dma_alloc()
3104 device_printf(sc->bge_dev, in bge_dma_alloc()
3109 error = bus_dmamap_create(sc->bge_cdata.bge_mtag_jumbo, in bge_dma_alloc()
3110 0, &sc->bge_cdata.bge_rx_jumbo_sparemap); in bge_dma_alloc()
3112 device_printf(sc->bge_dev, in bge_dma_alloc()
3117 error = bus_dmamap_create(sc->bge_cdata.bge_mtag_jumbo, in bge_dma_alloc()
3118 0, &sc->bge_cdata.bge_rx_jumbo_dmamap[i]); in bge_dma_alloc()
3120 device_printf(sc->bge_dev, in bge_dma_alloc()
3134 bge_has_multiple_ports(struct bge_softc *sc) in bge_has_multiple_ports() argument
3136 device_t dev = sc->bge_dev; in bge_has_multiple_ports()
3153 bge_can_use_msi(struct bge_softc *sc) in bge_can_use_msi() argument
3157 if (sc->bge_msi == 0) in bge_can_use_msi()
3164 switch (sc->bge_asicrev) { in bge_can_use_msi()
3171 if (bge_has_multiple_ports(sc)) in bge_can_use_msi()
3175 if (sc->bge_chiprev != BGE_CHIPREV_5750_AX && in bge_can_use_msi()
3176 sc->bge_chiprev != BGE_CHIPREV_5750_BX) in bge_can_use_msi()
3184 if (sc->bge_chiprev == BGE_CHIPREV_5784_AX) in bge_can_use_msi()
3188 if (BGE_IS_575X_PLUS(sc)) in bge_can_use_msi()
3195 bge_mbox_reorder(struct bge_softc *sc) in bge_mbox_reorder() argument
3211 dev = sc->bge_dev; in bge_mbox_reorder()
3225 device_printf(sc->bge_dev, in bge_mbox_reorder()
3236 bge_devinfo(struct bge_softc *sc) in bge_devinfo() argument
3240 device_printf(sc->bge_dev, in bge_devinfo()
3242 sc->bge_chipid, sc->bge_asicrev, sc->bge_chiprev); in bge_devinfo()
3243 if (sc->bge_flags & BGE_FLAG_PCIE) in bge_devinfo()
3245 else if (sc->bge_flags & BGE_FLAG_PCIX) { in bge_devinfo()
3247 cfg = CSR_READ_4(sc, BGE_MISC_CFG) & BGE_MISCCFG_BOARD_ID_MASK; in bge_devinfo()
3251 clk = CSR_READ_4(sc, BGE_PCI_CLKCTL) & 0x1F; in bge_devinfo()
3272 if (sc->bge_pcixcap != 0) in bge_devinfo()
3276 cfg = pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE, 4); in bge_devinfo()
3292 struct bge_softc *sc; in bge_attach() local
3297 sc = device_get_softc(dev); in bge_attach()
3298 sc->bge_dev = dev; in bge_attach()
3300 BGE_LOCK_INIT(sc, device_get_nameunit(dev)); in bge_attach()
3301 NET_TASK_INIT(&sc->bge_intr_task, 0, bge_intr_task, sc); in bge_attach()
3302 callout_init_mtx(&sc->bge_stat_ch, &sc->bge_mtx, 0); in bge_attach()
3310 sc->bge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in bge_attach()
3313 if (sc->bge_res == NULL) { in bge_attach()
3314 device_printf (sc->bge_dev, "couldn't map BAR0 memory\n"); in bge_attach()
3320 sc->bge_func_addr = pci_get_function(dev); in bge_attach()
3321 sc->bge_chipid = bge_chipid(dev); in bge_attach()
3322 sc->bge_asicrev = BGE_ASICREV(sc->bge_chipid); in bge_attach()
3323 sc->bge_chiprev = BGE_CHIPREV(sc->bge_chipid); in bge_attach()
3326 sc->bge_phy_addr = 1; in bge_attach()
3349 if (sc->bge_asicrev == BGE_ASICREV_BCM5717 || in bge_attach()
3350 sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_attach()
3351 sc->bge_asicrev == BGE_ASICREV_BCM5720) { in bge_attach()
3352 if (sc->bge_chipid != BGE_CHIPID_BCM5717_A0) { in bge_attach()
3353 if (CSR_READ_4(sc, BGE_SGDIG_STS) & in bge_attach()
3355 sc->bge_phy_addr = sc->bge_func_addr + 8; in bge_attach()
3357 sc->bge_phy_addr = sc->bge_func_addr + 1; in bge_attach()
3359 if (CSR_READ_4(sc, BGE_CPMU_PHY_STRAP) & in bge_attach()
3361 sc->bge_phy_addr = sc->bge_func_addr + 8; in bge_attach()
3363 sc->bge_phy_addr = sc->bge_func_addr + 1; in bge_attach()
3367 if (bge_has_eaddr(sc)) in bge_attach()
3368 sc->bge_flags |= BGE_FLAG_EADDR; in bge_attach()
3371 switch (sc->bge_asicrev) { in bge_attach()
3375 sc->bge_flags |= BGE_FLAG_57765_PLUS; in bge_attach()
3380 sc->bge_flags |= BGE_FLAG_5717_PLUS | BGE_FLAG_5755_PLUS | in bge_attach()
3383 if (sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_attach()
3384 sc->bge_asicrev == BGE_ASICREV_BCM5720) { in bge_attach()
3389 sc->bge_flags |= BGE_FLAG_RDMA_BUG; in bge_attach()
3390 if (sc->bge_asicrev == BGE_ASICREV_BCM5719 && in bge_attach()
3391 sc->bge_chipid == BGE_CHIPID_BCM5719_A0) { in bge_attach()
3393 sc->bge_flags &= ~BGE_FLAG_JUMBO; in bge_attach()
3403 sc->bge_flags |= BGE_FLAG_5755_PLUS | BGE_FLAG_575X_PLUS | in bge_attach()
3410 sc->bge_flags |= BGE_FLAG_5700_FAMILY | BGE_FLAG_JUMBO; in bge_attach()
3415 sc->bge_flags |= BGE_FLAG_5714_FAMILY | BGE_FLAG_JUMBO_STD; in bge_attach()
3420 sc->bge_flags |= BGE_FLAG_575X_PLUS; in bge_attach()
3423 sc->bge_flags |= BGE_FLAG_5705_PLUS; in bge_attach()
3428 switch (sc->bge_asicrev) { in bge_attach()
3434 sc->bge_flags |= BGE_FLAG_APE; in bge_attach()
3439 if ((sc->bge_flags & BGE_FLAG_APE) != 0) { in bge_attach()
3441 sc->bge_res2 = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in bge_attach()
3443 if (sc->bge_res2 == NULL) { in bge_attach()
3444 device_printf (sc->bge_dev, in bge_attach()
3457 bge_ape_lock_init(sc); in bge_attach()
3458 bge_ape_read_fw_ver(sc); in bge_attach()
3462 bge_add_sysctls(sc); in bge_attach()
3465 if (BGE_IS_5717_PLUS(sc) || in bge_attach()
3466 sc->bge_asicrev == BGE_ASICREV_BCM5784 || in bge_attach()
3467 sc->bge_asicrev == BGE_ASICREV_BCM5761 || in bge_attach()
3468 sc->bge_asicrev == BGE_ASICREV_BCM5785 || in bge_attach()
3469 sc->bge_asicrev == BGE_ASICREV_BCM57780) in bge_attach()
3470 sc->bge_flags |= BGE_FLAG_CPMU_PRESENT; in bge_attach()
3471 if ((sc->bge_flags & BGE_FLAG_CPMU_PRESENT) != 0) in bge_attach()
3472 sc->bge_mi_mode = BGE_MIMODE_500KHZ_CONST; in bge_attach()
3474 sc->bge_mi_mode = BGE_MIMODE_BASE; in bge_attach()
3476 if (BGE_IS_5700_FAMILY(sc) || sc->bge_asicrev == BGE_ASICREV_BCM5705) in bge_attach()
3477 sc->bge_mi_mode |= BGE_MIMODE_AUTOPOLL; in bge_attach()
3486 sc->bge_flags |= BGE_FLAG_4G_BNDRY_BUG; in bge_attach()
3489 if (BGE_IS_5755_PLUS(sc) || sc->bge_asicrev == BGE_ASICREV_BCM5906) in bge_attach()
3490 sc->bge_flags |= BGE_FLAG_SHORT_DMA_BUG; in bge_attach()
3498 if (sc->bge_asicrev == BGE_ASICREV_BCM5719) in bge_attach()
3499 sc->bge_flags |= BGE_FLAG_4K_RDMA_BUG; in bge_attach()
3501 misccfg = CSR_READ_4(sc, BGE_MISC_CFG) & BGE_MISCCFG_BOARD_ID_MASK; in bge_attach()
3502 if (sc->bge_asicrev == BGE_ASICREV_BCM5705) { in bge_attach()
3505 sc->bge_flags |= BGE_FLAG_5788; in bge_attach()
3509 if ((sc->bge_asicrev == BGE_ASICREV_BCM5703 && in bge_attach()
3511 (sc->bge_asicrev == BGE_ASICREV_BCM5705 && in bge_attach()
3523 sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_attach()
3526 sc->bge_phy_flags |= BGE_PHY_NO_WIRESPEED; in bge_attach()
3541 if (BGE_IS_5717_PLUS(sc)) { in bge_attach()
3543 sc->bge_flags |= BGE_FLAG_TSO3; in bge_attach()
3544 if (sc->bge_asicrev == BGE_ASICREV_BCM5719 && in bge_attach()
3545 sc->bge_chipid == BGE_CHIPID_BCM5719_A0) { in bge_attach()
3547 sc->bge_flags &= ~BGE_FLAG_TSO3; in bge_attach()
3549 } else if (BGE_IS_5755_PLUS(sc)) { in bge_attach()
3558 sc->bge_flags |= BGE_FLAG_TSO; in bge_attach()
3569 sc->bge_flags |= BGE_FLAG_PCIE; in bge_attach()
3570 sc->bge_expcap = reg; in bge_attach()
3572 sc->bge_mps = pci_read_config(dev, sc->bge_expcap + in bge_attach()
3574 sc->bge_mps = 128 << (sc->bge_mps & PCIEM_CAP_MAX_PAYLOAD); in bge_attach()
3575 if (sc->bge_asicrev == BGE_ASICREV_BCM5719 || in bge_attach()
3576 sc->bge_asicrev == BGE_ASICREV_BCM5720) in bge_attach()
3577 sc->bge_expmrq = 2048; in bge_attach()
3579 sc->bge_expmrq = 4096; in bge_attach()
3580 pci_set_max_read_req(dev, sc->bge_expmrq); in bge_attach()
3587 sc->bge_pcixcap = reg; in bge_attach()
3590 sc->bge_flags |= BGE_FLAG_PCIX; in bge_attach()
3598 if (BGE_IS_5714_FAMILY(sc) && (sc->bge_flags & BGE_FLAG_PCIX)) in bge_attach()
3599 sc->bge_flags |= BGE_FLAG_40BIT_BUG; in bge_attach()
3608 if (sc->bge_pcixcap != 0 && bge_mbox_reorder(sc) != 0) in bge_attach()
3609 sc->bge_flags |= BGE_FLAG_MBOX_REORDER; in bge_attach()
3616 if (pci_find_cap(sc->bge_dev, PCIY_MSI, ®) == 0) { in bge_attach()
3617 sc->bge_msicap = reg; in bge_attach()
3619 if (bge_can_use_msi(sc) && pci_alloc_msi(dev, ®) == 0) { in bge_attach()
3621 sc->bge_flags |= BGE_FLAG_MSI; in bge_attach()
3631 if (sc->bge_flags & BGE_FLAG_MSI && BGE_IS_5717_PLUS(sc)) in bge_attach()
3632 sc->bge_flags |= BGE_FLAG_TAGGED_STATUS; in bge_attach()
3635 sc->bge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in bge_attach()
3638 if (sc->bge_irq == NULL) { in bge_attach()
3639 device_printf(sc->bge_dev, "couldn't map interrupt\n"); in bge_attach()
3644 bge_devinfo(sc); in bge_attach()
3646 sc->bge_asf_mode = 0; in bge_attach()
3648 if ((sc->bge_flags & BGE_FLAG_APE) == 0) { in bge_attach()
3649 if (bge_allow_asf && (bge_readmem_ind(sc, BGE_SRAM_DATA_SIG) == in bge_attach()
3651 if (bge_readmem_ind(sc, BGE_SRAM_DATA_CFG) & in bge_attach()
3653 sc->bge_asf_mode |= ASF_ENABLE; in bge_attach()
3654 sc->bge_asf_mode |= ASF_STACKUP; in bge_attach()
3655 if (BGE_IS_575X_PLUS(sc)) in bge_attach()
3656 sc->bge_asf_mode |= ASF_NEW_HANDSHAKE; in bge_attach()
3661 bge_stop_fw(sc); in bge_attach()
3662 bge_sig_pre_reset(sc, BGE_RESET_SHUTDOWN); in bge_attach()
3663 if (bge_reset(sc)) { in bge_attach()
3664 device_printf(sc->bge_dev, "chip reset failed\n"); in bge_attach()
3669 bge_sig_legacy(sc, BGE_RESET_SHUTDOWN); in bge_attach()
3670 bge_sig_post_reset(sc, BGE_RESET_SHUTDOWN); in bge_attach()
3672 if (bge_chipinit(sc)) { in bge_attach()
3673 device_printf(sc->bge_dev, "chip initialization failed\n"); in bge_attach()
3678 error = bge_get_eaddr(sc, eaddr); in bge_attach()
3680 device_printf(sc->bge_dev, in bge_attach()
3687 if (BGE_IS_5717_PLUS(sc)) in bge_attach()
3688 sc->bge_return_ring_cnt = BGE_RETURN_RING_CNT; in bge_attach()
3689 else if (BGE_IS_5705_PLUS(sc)) in bge_attach()
3690 sc->bge_return_ring_cnt = BGE_RETURN_RING_CNT_5705; in bge_attach()
3692 sc->bge_return_ring_cnt = BGE_RETURN_RING_CNT; in bge_attach()
3694 if (bge_dma_alloc(sc)) { in bge_attach()
3695 device_printf(sc->bge_dev, in bge_attach()
3702 sc->bge_stat_ticks = BGE_TICKS_PER_SEC; in bge_attach()
3703 sc->bge_rx_coal_ticks = 150; in bge_attach()
3704 sc->bge_tx_coal_ticks = 150; in bge_attach()
3705 sc->bge_rx_max_coal_bds = 10; in bge_attach()
3706 sc->bge_tx_max_coal_bds = 10; in bge_attach()
3709 sc->bge_csum_features = BGE_CSUM_FEATURES; in bge_attach()
3710 if (sc->bge_forced_udpcsum != 0) in bge_attach()
3711 sc->bge_csum_features |= CSUM_UDP; in bge_attach()
3714 ifp = sc->bge_ifp = if_alloc(IFT_ETHER); in bge_attach()
3715 if_setsoftc(ifp, sc); in bge_attach()
3724 if_sethwassist(ifp, sc->bge_csum_features); in bge_attach()
3727 if ((sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) != 0) { in bge_attach()
3743 if (sc->bge_chipid == BGE_CHIPID_BCM5700_B0) { in bge_attach()
3758 if (bge_readmem_ind(sc, BGE_SRAM_DATA_SIG) == BGE_SRAM_DATA_SIG_MAGIC) in bge_attach()
3759 hwcfg = bge_readmem_ind(sc, BGE_SRAM_DATA_CFG); in bge_attach()
3760 else if ((sc->bge_flags & BGE_FLAG_EADDR) && in bge_attach()
3761 (sc->bge_asicrev != BGE_ASICREV_BCM5906)) { in bge_attach()
3762 if (bge_read_eeprom(sc, (caddr_t)&hwcfg, BGE_EE_HWCFG_OFFSET, in bge_attach()
3764 device_printf(sc->bge_dev, "failed to read EEPROM\n"); in bge_attach()
3774 if (BGE_IS_5705_PLUS(sc)) { in bge_attach()
3775 sc->bge_flags |= BGE_FLAG_MII_SERDES; in bge_attach()
3776 sc->bge_phy_flags |= BGE_PHY_NO_WIRESPEED; in bge_attach()
3778 sc->bge_flags |= BGE_FLAG_TBI; in bge_attach()
3782 if (sc->bge_chipid == BGE_CHIPID_BCM5701_A0 || in bge_attach()
3783 sc->bge_chipid == BGE_CHIPID_BCM5701_B0) in bge_attach()
3784 sc->bge_phy_flags |= BGE_PHY_CRC_BUG; in bge_attach()
3785 if (sc->bge_chiprev == BGE_CHIPREV_5703_AX || in bge_attach()
3786 sc->bge_chiprev == BGE_CHIPREV_5704_AX) in bge_attach()
3787 sc->bge_phy_flags |= BGE_PHY_ADC_BUG; in bge_attach()
3788 if (sc->bge_chipid == BGE_CHIPID_BCM5704_A0) in bge_attach()
3789 sc->bge_phy_flags |= BGE_PHY_5704_A0_BUG; in bge_attach()
3791 sc->bge_phy_flags |= BGE_PHY_NO_3LED; in bge_attach()
3792 if ((BGE_IS_5705_PLUS(sc)) && in bge_attach()
3793 sc->bge_asicrev != BGE_ASICREV_BCM5906 && in bge_attach()
3794 sc->bge_asicrev != BGE_ASICREV_BCM5785 && in bge_attach()
3795 sc->bge_asicrev != BGE_ASICREV_BCM57780 && in bge_attach()
3796 !BGE_IS_5717_PLUS(sc)) { in bge_attach()
3797 if (sc->bge_asicrev == BGE_ASICREV_BCM5755 || in bge_attach()
3798 sc->bge_asicrev == BGE_ASICREV_BCM5761 || in bge_attach()
3799 sc->bge_asicrev == BGE_ASICREV_BCM5784 || in bge_attach()
3800 sc->bge_asicrev == BGE_ASICREV_BCM5787) { in bge_attach()
3803 sc->bge_phy_flags |= BGE_PHY_JITTER_BUG; in bge_attach()
3805 sc->bge_phy_flags |= BGE_PHY_ADJUST_TRIM; in bge_attach()
3807 sc->bge_phy_flags |= BGE_PHY_BER_BUG; in bge_attach()
3814 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 || in bge_attach()
3815 (sc->bge_asicrev == BGE_ASICREV_BCM5705 && in bge_attach()
3816 (sc->bge_chipid != BGE_CHIPID_BCM5705_A0 && in bge_attach()
3817 sc->bge_chipid != BGE_CHIPID_BCM5705_A1))) in bge_attach()
3818 sc->bge_phy_flags |= BGE_PHY_NO_WIRESPEED; in bge_attach()
3820 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_attach()
3821 ifmedia_init(&sc->bge_ifmedia, IFM_IMASK, bge_ifmedia_upd, in bge_attach()
3823 ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_1000_SX, 0, NULL); in bge_attach()
3824 ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_1000_SX | IFM_FDX, in bge_attach()
3826 ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL); in bge_attach()
3827 ifmedia_set(&sc->bge_ifmedia, IFM_ETHER | IFM_AUTO); in bge_attach()
3828 sc->bge_ifmedia.ifm_media = sc->bge_ifmedia.ifm_cur->ifm_media; in bge_attach()
3838 BGE_CLRBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP); in bge_attach()
3840 bge_asf_driver_up(sc); in bge_attach()
3842 error = mii_attach(dev, &sc->bge_miibus, ifp, in bge_attach()
3844 (ifm_stat_cb_t)bge_ifmedia_sts, capmask, sc->bge_phy_addr, in bge_attach()
3848 device_printf(sc->bge_dev, "Try again\n"); in bge_attach()
3849 bge_miibus_writereg(sc->bge_dev, in bge_attach()
3850 sc->bge_phy_addr, MII_BMCR, BMCR_RESET); in bge_attach()
3853 device_printf(sc->bge_dev, "attaching PHYs failed\n"); in bge_attach()
3860 if (sc->bge_asf_mode & ASF_STACKUP) in bge_attach()
3861 BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP); in bge_attach()
3872 if (sc->bge_asicrev == BGE_ASICREV_BCM5701 && in bge_attach()
3873 sc->bge_flags & BGE_FLAG_PCIX) in bge_attach()
3874 sc->bge_flags |= BGE_FLAG_RX_ALIGNBUG; in bge_attach()
3887 if (BGE_IS_5755_PLUS(sc) && sc->bge_flags & BGE_FLAG_MSI) { in bge_attach()
3889 CSR_WRITE_4(sc, BGE_MSI_MODE, CSR_READ_4(sc, BGE_MSI_MODE) & in bge_attach()
3891 sc->bge_tq = taskqueue_create_fast("bge_taskq", M_WAITOK, in bge_attach()
3892 taskqueue_thread_enqueue, &sc->bge_tq); in bge_attach()
3893 error = taskqueue_start_threads(&sc->bge_tq, 1, PI_NET, in bge_attach()
3894 "%s taskq", device_get_nameunit(sc->bge_dev)); in bge_attach()
3900 error = bus_setup_intr(dev, sc->bge_irq, in bge_attach()
3901 INTR_TYPE_NET | INTR_MPSAFE, bge_msi_intr, NULL, sc, in bge_attach()
3902 &sc->bge_intrhand); in bge_attach()
3904 error = bus_setup_intr(dev, sc->bge_irq, in bge_attach()
3905 INTR_TYPE_NET | INTR_MPSAFE, NULL, bge_intr, sc, in bge_attach()
3906 &sc->bge_intrhand); in bge_attach()
3910 device_printf(sc->bge_dev, "couldn't set up irq\n"); in bge_attach()
3926 struct bge_softc *sc; in bge_detach() local
3929 sc = device_get_softc(dev); in bge_detach()
3930 ifp = sc->bge_ifp; in bge_detach()
3939 BGE_LOCK(sc); in bge_detach()
3940 bge_stop(sc); in bge_detach()
3941 BGE_UNLOCK(sc); in bge_detach()
3942 callout_drain(&sc->bge_stat_ch); in bge_detach()
3945 if (sc->bge_tq) in bge_detach()
3946 taskqueue_drain(sc->bge_tq, &sc->bge_intr_task); in bge_detach()
3948 if (sc->bge_flags & BGE_FLAG_TBI) in bge_detach()
3949 ifmedia_removeall(&sc->bge_ifmedia); in bge_detach()
3950 else if (sc->bge_miibus != NULL) { in bge_detach()
3954 bge_release_resources(sc); in bge_detach()
3960 bge_release_resources(struct bge_softc *sc) in bge_release_resources() argument
3964 dev = sc->bge_dev; in bge_release_resources()
3966 if (sc->bge_tq != NULL) in bge_release_resources()
3967 taskqueue_free(sc->bge_tq); in bge_release_resources()
3969 if (sc->bge_intrhand != NULL) in bge_release_resources()
3970 bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand); in bge_release_resources()
3972 if (sc->bge_irq != NULL) { in bge_release_resources()
3974 rman_get_rid(sc->bge_irq), sc->bge_irq); in bge_release_resources()
3978 if (sc->bge_res != NULL) in bge_release_resources()
3980 rman_get_rid(sc->bge_res), sc->bge_res); in bge_release_resources()
3982 if (sc->bge_res2 != NULL) in bge_release_resources()
3984 rman_get_rid(sc->bge_res2), sc->bge_res2); in bge_release_resources()
3986 if (sc->bge_ifp != NULL) in bge_release_resources()
3987 if_free(sc->bge_ifp); in bge_release_resources()
3989 bge_dma_free(sc); in bge_release_resources()
3991 if (mtx_initialized(&sc->bge_mtx)) /* XXX */ in bge_release_resources()
3992 BGE_LOCK_DESTROY(sc); in bge_release_resources()
3996 bge_reset(struct bge_softc *sc) in bge_reset() argument
4004 dev = sc->bge_dev; in bge_reset()
4007 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) != 0) in bge_reset()
4009 mac_mode = CSR_READ_4(sc, BGE_MAC_MODE) & mac_mode_mask; in bge_reset()
4011 if (BGE_IS_575X_PLUS(sc) && !BGE_IS_5714_FAMILY(sc) && in bge_reset()
4012 (sc->bge_asicrev != BGE_ASICREV_BCM5906)) { in bge_reset()
4013 if (sc->bge_flags & BGE_FLAG_PCIE) in bge_reset()
4020 if (sc->bge_asicrev != BGE_ASICREV_BCM5700 && in bge_reset()
4021 sc->bge_asicrev != BGE_ASICREV_BCM5701) { in bge_reset()
4022 CSR_WRITE_4(sc, BGE_NVRAM_SWARB, BGE_NVRAMSWARB_SET1); in bge_reset()
4024 if (CSR_READ_4(sc, BGE_NVRAM_SWARB) & in bge_reset()
4035 bge_ape_lock(sc, BGE_APE_LOCK_GRC); in bge_reset()
4046 if (sc->bge_asicrev == BGE_ASICREV_BCM5752 || in bge_reset()
4047 BGE_IS_5755_PLUS(sc)) { in bge_reset()
4050 CSR_WRITE_4(sc, BGE_FASTBOOT_PC, 0x0); in bge_reset()
4058 bge_writemem_ind(sc, BGE_SRAM_FW_MB, BGE_SRAM_FW_MB_MAGIC); in bge_reset()
4063 if (sc->bge_flags & BGE_FLAG_PCIE) { in bge_reset()
4064 if (sc->bge_asicrev != BGE_ASICREV_BCM5785 && in bge_reset()
4065 (sc->bge_flags & BGE_FLAG_5717_PLUS) == 0) { in bge_reset()
4066 if (CSR_READ_4(sc, 0x7E2C) == 0x60) /* PCIE 1.0 */ in bge_reset()
4067 CSR_WRITE_4(sc, 0x7E2C, 0x20); in bge_reset()
4069 if (sc->bge_chipid != BGE_CHIPID_BCM5750_A0) { in bge_reset()
4071 CSR_WRITE_4(sc, BGE_MISC_CFG, 1 << 29); in bge_reset()
4076 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_reset()
4077 val = CSR_READ_4(sc, BGE_VCPU_STATUS); in bge_reset()
4078 CSR_WRITE_4(sc, BGE_VCPU_STATUS, in bge_reset()
4080 val = CSR_READ_4(sc, BGE_VCPU_EXT_CTRL); in bge_reset()
4081 CSR_WRITE_4(sc, BGE_VCPU_EXT_CTRL, in bge_reset()
4089 if (BGE_IS_5705_PLUS(sc) && in bge_reset()
4090 (sc->bge_flags & BGE_FLAG_CPMU_PRESENT) == 0) in bge_reset()
4094 write_op(sc, BGE_MISC_CFG, reset); in bge_reset()
4096 if (sc->bge_flags & BGE_FLAG_PCIE) in bge_reset()
4102 if (sc->bge_flags & BGE_FLAG_PCIE) { in bge_reset()
4103 if (sc->bge_chipid == BGE_CHIPID_BCM5750_A0) { in bge_reset()
4109 sc->bge_expcap + PCIER_DEVICE_CTL, 2); in bge_reset()
4113 pci_write_config(dev, sc->bge_expcap + PCIER_DEVICE_CTL, in bge_reset()
4115 pci_set_max_read_req(dev, sc->bge_expmrq); in bge_reset()
4117 pci_write_config(dev, sc->bge_expcap + PCIER_DEVICE_STA, in bge_reset()
4128 if (sc->bge_chipid == BGE_CHIPID_BCM5704_A0 && in bge_reset()
4129 (sc->bge_flags & BGE_FLAG_PCIX) != 0) in bge_reset()
4131 if ((sc->bge_mfw_flags & BGE_MFW_ON_APE) != 0) in bge_reset()
4143 if (sc->bge_flags & BGE_FLAG_PCIX) { in bge_reset()
4145 sc->bge_pcixcap + PCIXR_COMMAND, 2); in bge_reset()
4147 if (sc->bge_asicrev == BGE_ASICREV_BCM5703) { in bge_reset()
4150 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704) { in bge_reset()
4155 pci_write_config(dev, sc->bge_pcixcap + PCIXR_COMMAND, in bge_reset()
4159 if (BGE_IS_5714_FAMILY(sc)) { in bge_reset()
4161 if (sc->bge_flags & BGE_FLAG_MSI) { in bge_reset()
4163 sc->bge_msicap + PCIR_MSI_CTRL, 2); in bge_reset()
4165 sc->bge_msicap + PCIR_MSI_CTRL, in bge_reset()
4167 val = CSR_READ_4(sc, BGE_MSI_MODE); in bge_reset()
4168 CSR_WRITE_4(sc, BGE_MSI_MODE, in bge_reset()
4171 val = CSR_READ_4(sc, BGE_MARB_MODE); in bge_reset()
4172 CSR_WRITE_4(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE | val); in bge_reset()
4174 CSR_WRITE_4(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE); in bge_reset()
4177 CSR_WRITE_4(sc, BGE_MODE_CTL, bge_dma_swap_options(sc)); in bge_reset()
4179 val = CSR_READ_4(sc, BGE_MAC_MODE); in bge_reset()
4181 CSR_WRITE_4(sc, BGE_MAC_MODE, val); in bge_reset()
4184 bge_ape_unlock(sc, BGE_APE_LOCK_GRC); in bge_reset()
4186 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { in bge_reset()
4188 val = CSR_READ_4(sc, BGE_VCPU_STATUS); in bge_reset()
4206 val = bge_readmem_ind(sc, BGE_SRAM_FW_MB); in bge_reset()
4211 if ((sc->bge_flags & BGE_FLAG_EADDR) && i == BGE_TIMEOUT) in bge_reset()
4216 if (sc->bge_chipid == BGE_CHIPID_BCM57765_A0) in bge_reset()
4225 if (sc->bge_asicrev == BGE_ASICREV_BCM5704 && in bge_reset()
4226 sc->bge_flags & BGE_FLAG_TBI) { in bge_reset()
4227 val = CSR_READ_4(sc, BGE_SERDES_CFG); in bge_reset()
4229 CSR_WRITE_4(sc, BGE_SERDES_CFG, val); in bge_reset()
4233 if (sc->bge_flags & BGE_FLAG_PCIE && in bge_reset()
4234 !BGE_IS_5717_PLUS(sc) && in bge_reset()
4235 sc->bge_chipid != BGE_CHIPID_BCM5750_A0 && in bge_reset()
4236 sc->bge_asicrev != BGE_ASICREV_BCM5785) { in bge_reset()
4238 val = CSR_READ_4(sc, 0x7C00); in bge_reset()
4239 CSR_WRITE_4(sc, 0x7C00, val | (1 << 25)); in bge_reset()
4242 if (sc->bge_asicrev == BGE_ASICREV_BCM5720) in bge_reset()
4243 BGE_CLRBIT(sc, BGE_CPMU_CLCK_ORIDE, in bge_reset()
4250 bge_rxreuse_std(struct bge_softc *sc, int i) in bge_rxreuse_std() argument
4254 r = &sc->bge_ldata.bge_rx_std_ring[sc->bge_std]; in bge_rxreuse_std()
4256 r->bge_len = sc->bge_cdata.bge_rx_std_seglen[i]; in bge_rxreuse_std()
4258 BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); in bge_rxreuse_std()
4262 bge_rxreuse_jumbo(struct bge_softc *sc, int i) in bge_rxreuse_jumbo() argument
4266 r = &sc->bge_ldata.bge_rx_jumbo_ring[sc->bge_jumbo]; in bge_rxreuse_jumbo()
4268 r->bge_len0 = sc->bge_cdata.bge_rx_jumbo_seglen[i][0]; in bge_rxreuse_jumbo()
4269 r->bge_len1 = sc->bge_cdata.bge_rx_jumbo_seglen[i][1]; in bge_rxreuse_jumbo()
4270 r->bge_len2 = sc->bge_cdata.bge_rx_jumbo_seglen[i][2]; in bge_rxreuse_jumbo()
4271 r->bge_len3 = sc->bge_cdata.bge_rx_jumbo_seglen[i][3]; in bge_rxreuse_jumbo()
4273 BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); in bge_rxreuse_jumbo()
4286 bge_rxeof(struct bge_softc *sc, uint16_t rx_prod, int holdlck) in bge_rxeof() argument
4292 rx_cons = sc->bge_rx_saved_considx; in bge_rxeof()
4298 ifp = sc->bge_ifp; in bge_rxeof()
4300 bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag, in bge_rxeof()
4301 sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_POSTREAD); in bge_rxeof()
4302 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, in bge_rxeof()
4303 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_POSTWRITE); in bge_rxeof()
4304 if (BGE_IS_JUMBO_CAPABLE(sc) && in bge_rxeof()
4307 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_rxeof()
4308 sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTWRITE); in bge_rxeof()
4319 if (sc->rxcycles <= 0) in bge_rxeof()
4321 sc->rxcycles--; in bge_rxeof()
4325 cur_rx = &sc->bge_ldata.bge_rx_return_ring[rx_cons]; in bge_rxeof()
4328 BGE_INC(rx_cons, sc->bge_return_ring_cnt); in bge_rxeof()
4338 m = sc->bge_cdata.bge_rx_jumbo_chain[rxidx]; in bge_rxeof()
4340 bge_rxreuse_jumbo(sc, rxidx); in bge_rxeof()
4343 if (bge_newbuf_jumbo(sc, rxidx) != 0) { in bge_rxeof()
4344 bge_rxreuse_jumbo(sc, rxidx); in bge_rxeof()
4348 BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); in bge_rxeof()
4351 m = sc->bge_cdata.bge_rx_std_chain[rxidx]; in bge_rxeof()
4353 bge_rxreuse_std(sc, rxidx); in bge_rxeof()
4356 if (bge_newbuf_std(sc, rxidx) != 0) { in bge_rxeof()
4357 bge_rxreuse_std(sc, rxidx); in bge_rxeof()
4361 BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); in bge_rxeof()
4370 if (sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) { in bge_rxeof()
4380 bge_rxcsum(sc, cur_rx, m); in bge_rxeof()
4392 BGE_UNLOCK(sc); in bge_rxeof()
4394 BGE_LOCK(sc); in bge_rxeof()
4403 bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag, in bge_rxeof()
4404 sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_PREREAD); in bge_rxeof()
4406 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, in bge_rxeof()
4407 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_PREWRITE); in bge_rxeof()
4410 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, in bge_rxeof()
4411 sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_PREWRITE); in bge_rxeof()
4413 sc->bge_rx_saved_considx = rx_cons; in bge_rxeof()
4414 bge_writembx(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx); in bge_rxeof()
4416 bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, (sc->bge_std + in bge_rxeof()
4419 bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, (sc->bge_jumbo + in bge_rxeof()
4426 if (BGE_IS_5705_PLUS(sc)) in bge_rxeof()
4427 if_incierrors(ifp, CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_DROPS)); in bge_rxeof()
4433 bge_rxcsum(struct bge_softc *sc, struct bge_rx_bd *cur_rx, struct mbuf *m) in bge_rxcsum() argument
4436 if (BGE_IS_5717_PLUS(sc)) { in bge_rxcsum()
4468 bge_txeof(struct bge_softc *sc, uint16_t tx_cons) in bge_txeof() argument
4473 BGE_LOCK_ASSERT(sc); in bge_txeof()
4476 if (sc->bge_tx_saved_considx == tx_cons) in bge_txeof()
4479 ifp = sc->bge_ifp; in bge_txeof()
4481 bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, in bge_txeof()
4482 sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_POSTWRITE); in bge_txeof()
4487 while (sc->bge_tx_saved_considx != tx_cons) { in bge_txeof()
4490 idx = sc->bge_tx_saved_considx; in bge_txeof()
4491 cur_tx = &sc->bge_ldata.bge_tx_ring[idx]; in bge_txeof()
4494 if (sc->bge_cdata.bge_tx_chain[idx] != NULL) { in bge_txeof()
4495 bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, in bge_txeof()
4496 sc->bge_cdata.bge_tx_dmamap[idx], in bge_txeof()
4498 bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, in bge_txeof()
4499 sc->bge_cdata.bge_tx_dmamap[idx]); in bge_txeof()
4500 m_freem(sc->bge_cdata.bge_tx_chain[idx]); in bge_txeof()
4501 sc->bge_cdata.bge_tx_chain[idx] = NULL; in bge_txeof()
4503 sc->bge_txcnt--; in bge_txeof()
4504 BGE_INC(sc->bge_tx_saved_considx, BGE_TX_RING_CNT); in bge_txeof()
4508 if (sc->bge_txcnt == 0) in bge_txeof()
4509 sc->bge_timer = 0; in bge_txeof()
4516 struct bge_softc *sc = if_getsoftc(ifp); in bge_poll() local
4521 BGE_LOCK(sc); in bge_poll()
4523 BGE_UNLOCK(sc); in bge_poll()
4527 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_poll()
4528 sc->bge_cdata.bge_status_map, in bge_poll()
4531 rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; in bge_poll()
4532 tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; in bge_poll()
4534 statusword = sc->bge_ldata.bge_status_block->bge_status; in bge_poll()
4536 sc->bge_ldata.bge_status_block->bge_status = 0; in bge_poll()
4538 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_poll()
4539 sc->bge_cdata.bge_status_map, in bge_poll()
4544 sc->bge_link_evt++; in bge_poll()
4547 if ((sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_poll()
4548 sc->bge_chipid != BGE_CHIPID_BCM5700_B2) || in bge_poll()
4549 sc->bge_link_evt || (sc->bge_flags & BGE_FLAG_TBI)) in bge_poll()
4550 bge_link_upd(sc); in bge_poll()
4552 sc->rxcycles = count; in bge_poll()
4553 rx_npkts = bge_rxeof(sc, rx_prod, 1); in bge_poll()
4555 BGE_UNLOCK(sc); in bge_poll()
4558 bge_txeof(sc, tx_cons); in bge_poll()
4562 BGE_UNLOCK(sc); in bge_poll()
4570 struct bge_softc *sc; in bge_msi_intr() local
4572 sc = (struct bge_softc *)arg; in bge_msi_intr()
4577 taskqueue_enqueue(sc->bge_tq, &sc->bge_intr_task); in bge_msi_intr()
4584 struct bge_softc *sc; in bge_intr_task() local
4589 sc = (struct bge_softc *)arg; in bge_intr_task()
4590 ifp = sc->bge_ifp; in bge_intr_task()
4592 BGE_LOCK(sc); in bge_intr_task()
4594 BGE_UNLOCK(sc); in bge_intr_task()
4599 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_intr_task()
4600 sc->bge_cdata.bge_status_map, in bge_intr_task()
4604 rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; in bge_intr_task()
4605 tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; in bge_intr_task()
4606 status = sc->bge_ldata.bge_status_block->bge_status; in bge_intr_task()
4607 status_tag = sc->bge_ldata.bge_status_block->bge_status_tag << 24; in bge_intr_task()
4609 sc->bge_ldata.bge_status_block->bge_status = 0; in bge_intr_task()
4610 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_intr_task()
4611 sc->bge_cdata.bge_status_map, in bge_intr_task()
4613 if ((sc->bge_flags & BGE_FLAG_TAGGED_STATUS) == 0) in bge_intr_task()
4617 bge_link_upd(sc); in bge_intr_task()
4620 bge_writembx(sc, BGE_MBX_IRQ0_LO, status_tag); in bge_intr_task()
4623 sc->bge_rx_saved_considx != rx_prod) { in bge_intr_task()
4625 BGE_UNLOCK(sc); in bge_intr_task()
4626 bge_rxeof(sc, rx_prod, 0); in bge_intr_task()
4627 BGE_LOCK(sc); in bge_intr_task()
4631 bge_txeof(sc, tx_cons); in bge_intr_task()
4635 BGE_UNLOCK(sc); in bge_intr_task()
4641 struct bge_softc *sc; in bge_intr() local
4646 sc = xsc; in bge_intr()
4648 BGE_LOCK(sc); in bge_intr()
4650 ifp = sc->bge_ifp; in bge_intr()
4654 BGE_UNLOCK(sc); in bge_intr()
4679 bge_writembx(sc, BGE_MBX_IRQ0_LO, 0); in bge_intr()
4684 statusword = CSR_READ_4(sc, BGE_MAC_STS) & BGE_MACSTAT_LINK_CHANGED; in bge_intr()
4687 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_intr()
4688 sc->bge_cdata.bge_status_map, in bge_intr()
4690 rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; in bge_intr()
4691 tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; in bge_intr()
4692 sc->bge_ldata.bge_status_block->bge_status = 0; in bge_intr()
4693 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_intr()
4694 sc->bge_cdata.bge_status_map, in bge_intr()
4697 if ((sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_intr()
4698 sc->bge_chipid != BGE_CHIPID_BCM5700_B2) || in bge_intr()
4699 statusword || sc->bge_link_evt) in bge_intr()
4700 bge_link_upd(sc); in bge_intr()
4704 bge_rxeof(sc, rx_prod, 1); in bge_intr()
4709 bge_txeof(sc, tx_cons); in bge_intr()
4716 BGE_UNLOCK(sc); in bge_intr()
4720 bge_asf_driver_up(struct bge_softc *sc) in bge_asf_driver_up() argument
4722 if (sc->bge_asf_mode & ASF_STACKUP) { in bge_asf_driver_up()
4724 if (sc->bge_asf_count) in bge_asf_driver_up()
4725 sc->bge_asf_count --; in bge_asf_driver_up()
4727 sc->bge_asf_count = 2; in bge_asf_driver_up()
4728 bge_writemem_ind(sc, BGE_SRAM_FW_CMD_MB, in bge_asf_driver_up()
4730 bge_writemem_ind(sc, BGE_SRAM_FW_CMD_LEN_MB, 4); in bge_asf_driver_up()
4731 bge_writemem_ind(sc, BGE_SRAM_FW_CMD_DATA_MB, in bge_asf_driver_up()
4733 CSR_WRITE_4(sc, BGE_RX_CPU_EVENT, in bge_asf_driver_up()
4734 CSR_READ_4(sc, BGE_RX_CPU_EVENT) | in bge_asf_driver_up()
4743 struct bge_softc *sc = xsc; in bge_tick() local
4746 BGE_LOCK_ASSERT(sc); in bge_tick()
4749 if (callout_pending(&sc->bge_stat_ch) || in bge_tick()
4750 !callout_active(&sc->bge_stat_ch)) in bge_tick()
4753 if (BGE_IS_5705_PLUS(sc)) in bge_tick()
4754 bge_stats_update_regs(sc); in bge_tick()
4756 bge_stats_update(sc); in bge_tick()
4760 if ((sc->bge_flags & BGE_FLAG_TBI) == 0) { in bge_tick()
4761 mii = device_get_softc(sc->bge_miibus); in bge_tick()
4767 if (!sc->bge_link) in bge_tick()
4777 if (!(if_getcapenable(sc->bge_ifp) & IFCAP_POLLING)) in bge_tick()
4780 sc->bge_link_evt++; in bge_tick()
4781 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 || in bge_tick()
4782 sc->bge_flags & BGE_FLAG_5788) in bge_tick()
4783 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_INTR_SET); in bge_tick()
4785 BGE_SETBIT(sc, BGE_HCC_MODE, BGE_HCCMODE_COAL_NOW); in bge_tick()
4789 bge_asf_driver_up(sc); in bge_tick()
4790 bge_watchdog(sc); in bge_tick()
4792 callout_reset(&sc->bge_stat_ch, hz, bge_tick, sc); in bge_tick()
4796 bge_stats_update_regs(struct bge_softc *sc) in bge_stats_update_regs() argument
4801 stats = &sc->bge_mac_stats; in bge_stats_update_regs()
4804 CSR_READ_4(sc, BGE_TX_MAC_STATS_OCTETS); in bge_stats_update_regs()
4806 CSR_READ_4(sc, BGE_TX_MAC_STATS_COLLS); in bge_stats_update_regs()
4808 CSR_READ_4(sc, BGE_TX_MAC_STATS_XON_SENT); in bge_stats_update_regs()
4810 CSR_READ_4(sc, BGE_TX_MAC_STATS_XOFF_SENT); in bge_stats_update_regs()
4812 CSR_READ_4(sc, BGE_TX_MAC_STATS_ERRORS); in bge_stats_update_regs()
4814 CSR_READ_4(sc, BGE_TX_MAC_STATS_SINGLE_COLL); in bge_stats_update_regs()
4816 CSR_READ_4(sc, BGE_TX_MAC_STATS_MULTI_COLL); in bge_stats_update_regs()
4818 CSR_READ_4(sc, BGE_TX_MAC_STATS_DEFERRED); in bge_stats_update_regs()
4820 CSR_READ_4(sc, BGE_TX_MAC_STATS_EXCESS_COLL); in bge_stats_update_regs()
4822 CSR_READ_4(sc, BGE_TX_MAC_STATS_LATE_COLL); in bge_stats_update_regs()
4824 CSR_READ_4(sc, BGE_TX_MAC_STATS_UCAST); in bge_stats_update_regs()
4826 CSR_READ_4(sc, BGE_TX_MAC_STATS_MCAST); in bge_stats_update_regs()
4828 CSR_READ_4(sc, BGE_TX_MAC_STATS_BCAST); in bge_stats_update_regs()
4831 CSR_READ_4(sc, BGE_RX_MAC_STATS_OCTESTS); in bge_stats_update_regs()
4833 CSR_READ_4(sc, BGE_RX_MAC_STATS_FRAGMENTS); in bge_stats_update_regs()
4835 CSR_READ_4(sc, BGE_RX_MAC_STATS_UCAST); in bge_stats_update_regs()
4837 CSR_READ_4(sc, BGE_RX_MAC_STATS_MCAST); in bge_stats_update_regs()
4839 CSR_READ_4(sc, BGE_RX_MAC_STATS_BCAST); in bge_stats_update_regs()
4841 CSR_READ_4(sc, BGE_RX_MAC_STATS_FCS_ERRORS); in bge_stats_update_regs()
4843 CSR_READ_4(sc, BGE_RX_MAC_STATS_ALGIN_ERRORS); in bge_stats_update_regs()
4845 CSR_READ_4(sc, BGE_RX_MAC_STATS_XON_RCVD); in bge_stats_update_regs()
4847 CSR_READ_4(sc, BGE_RX_MAC_STATS_XOFF_RCVD); in bge_stats_update_regs()
4849 CSR_READ_4(sc, BGE_RX_MAC_STATS_CTRL_RCVD); in bge_stats_update_regs()
4851 CSR_READ_4(sc, BGE_RX_MAC_STATS_XOFF_ENTERED); in bge_stats_update_regs()
4853 CSR_READ_4(sc, BGE_RX_MAC_STATS_FRAME_TOO_LONG); in bge_stats_update_regs()
4855 CSR_READ_4(sc, BGE_RX_MAC_STATS_JABBERS); in bge_stats_update_regs()
4857 CSR_READ_4(sc, BGE_RX_MAC_STATS_UNDERSIZE); in bge_stats_update_regs()
4860 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_FILTDROP); in bge_stats_update_regs()
4862 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_DMA_WRQ_FULL); in bge_stats_update_regs()
4864 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_DMA_HPWRQ_FULL); in bge_stats_update_regs()
4866 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_OUT_OF_BDS); in bge_stats_update_regs()
4886 if (sc->bge_asicrev != BGE_ASICREV_BCM5717 && in bge_stats_update_regs()
4887 sc->bge_chipid != BGE_CHIPID_BCM5719_A0 && in bge_stats_update_regs()
4888 sc->bge_chipid != BGE_CHIPID_BCM5720_A0) in bge_stats_update_regs()
4890 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_DROPS); in bge_stats_update_regs()
4892 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_ERRORS); in bge_stats_update_regs()
4894 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_RXTHRESH_HIT); in bge_stats_update_regs()
4896 if (sc->bge_flags & BGE_FLAG_RDMA_BUG) { in bge_stats_update_regs()
4904 val = CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL); in bge_stats_update_regs()
4905 if (sc->bge_asicrev == BGE_ASICREV_BCM5719) in bge_stats_update_regs()
4909 CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, val); in bge_stats_update_regs()
4910 sc->bge_flags &= ~BGE_FLAG_RDMA_BUG; in bge_stats_update_regs()
4916 bge_stats_clear_regs(struct bge_softc *sc) in bge_stats_clear_regs() argument
4919 CSR_READ_4(sc, BGE_TX_MAC_STATS_OCTETS); in bge_stats_clear_regs()
4920 CSR_READ_4(sc, BGE_TX_MAC_STATS_COLLS); in bge_stats_clear_regs()
4921 CSR_READ_4(sc, BGE_TX_MAC_STATS_XON_SENT); in bge_stats_clear_regs()
4922 CSR_READ_4(sc, BGE_TX_MAC_STATS_XOFF_SENT); in bge_stats_clear_regs()
4923 CSR_READ_4(sc, BGE_TX_MAC_STATS_ERRORS); in bge_stats_clear_regs()
4924 CSR_READ_4(sc, BGE_TX_MAC_STATS_SINGLE_COLL); in bge_stats_clear_regs()
4925 CSR_READ_4(sc, BGE_TX_MAC_STATS_MULTI_COLL); in bge_stats_clear_regs()
4926 CSR_READ_4(sc, BGE_TX_MAC_STATS_DEFERRED); in bge_stats_clear_regs()
4927 CSR_READ_4(sc, BGE_TX_MAC_STATS_EXCESS_COLL); in bge_stats_clear_regs()
4928 CSR_READ_4(sc, BGE_TX_MAC_STATS_LATE_COLL); in bge_stats_clear_regs()
4929 CSR_READ_4(sc, BGE_TX_MAC_STATS_UCAST); in bge_stats_clear_regs()
4930 CSR_READ_4(sc, BGE_TX_MAC_STATS_MCAST); in bge_stats_clear_regs()
4931 CSR_READ_4(sc, BGE_TX_MAC_STATS_BCAST); in bge_stats_clear_regs()
4933 CSR_READ_4(sc, BGE_RX_MAC_STATS_OCTESTS); in bge_stats_clear_regs()
4934 CSR_READ_4(sc, BGE_RX_MAC_STATS_FRAGMENTS); in bge_stats_clear_regs()
4935 CSR_READ_4(sc, BGE_RX_MAC_STATS_UCAST); in bge_stats_clear_regs()
4936 CSR_READ_4(sc, BGE_RX_MAC_STATS_MCAST); in bge_stats_clear_regs()
4937 CSR_READ_4(sc, BGE_RX_MAC_STATS_BCAST); in bge_stats_clear_regs()
4938 CSR_READ_4(sc, BGE_RX_MAC_STATS_FCS_ERRORS); in bge_stats_clear_regs()
4939 CSR_READ_4(sc, BGE_RX_MAC_STATS_ALGIN_ERRORS); in bge_stats_clear_regs()
4940 CSR_READ_4(sc, BGE_RX_MAC_STATS_XON_RCVD); in bge_stats_clear_regs()
4941 CSR_READ_4(sc, BGE_RX_MAC_STATS_XOFF_RCVD); in bge_stats_clear_regs()
4942 CSR_READ_4(sc, BGE_RX_MAC_STATS_CTRL_RCVD); in bge_stats_clear_regs()
4943 CSR_READ_4(sc, BGE_RX_MAC_STATS_XOFF_ENTERED); in bge_stats_clear_regs()
4944 CSR_READ_4(sc, BGE_RX_MAC_STATS_FRAME_TOO_LONG); in bge_stats_clear_regs()
4945 CSR_READ_4(sc, BGE_RX_MAC_STATS_JABBERS); in bge_stats_clear_regs()
4946 CSR_READ_4(sc, BGE_RX_MAC_STATS_UNDERSIZE); in bge_stats_clear_regs()
4948 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_FILTDROP); in bge_stats_clear_regs()
4949 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_DMA_WRQ_FULL); in bge_stats_clear_regs()
4950 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_DMA_HPWRQ_FULL); in bge_stats_clear_regs()
4951 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_OUT_OF_BDS); in bge_stats_clear_regs()
4952 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_DROPS); in bge_stats_clear_regs()
4953 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_ERRORS); in bge_stats_clear_regs()
4954 CSR_READ_4(sc, BGE_RXLP_LOCSTAT_RXTHRESH_HIT); in bge_stats_clear_regs()
4958 bge_stats_update(struct bge_softc *sc) in bge_stats_update() argument
4964 ifp = sc->bge_ifp; in bge_stats_update()
4968 #define READ_STAT(sc, stats, stat) \ in bge_stats_update() argument
4969 CSR_READ_4(sc, stats + offsetof(struct bge_stats, stat)) in bge_stats_update()
4971 cnt = READ_STAT(sc, stats, txstats.etherStatsCollisions.bge_addr_lo); in bge_stats_update()
4972 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, cnt - sc->bge_tx_collisions); in bge_stats_update()
4973 sc->bge_tx_collisions = cnt; in bge_stats_update()
4975 cnt = READ_STAT(sc, stats, nicNoMoreRxBDs.bge_addr_lo); in bge_stats_update()
4976 if_inc_counter(ifp, IFCOUNTER_IERRORS, cnt - sc->bge_rx_nobds); in bge_stats_update()
4977 sc->bge_rx_nobds = cnt; in bge_stats_update()
4978 cnt = READ_STAT(sc, stats, ifInErrors.bge_addr_lo); in bge_stats_update()
4979 if_inc_counter(ifp, IFCOUNTER_IERRORS, cnt - sc->bge_rx_inerrs); in bge_stats_update()
4980 sc->bge_rx_inerrs = cnt; in bge_stats_update()
4981 cnt = READ_STAT(sc, stats, ifInDiscards.bge_addr_lo); in bge_stats_update()
4982 if_inc_counter(ifp, IFCOUNTER_IERRORS, cnt - sc->bge_rx_discards); in bge_stats_update()
4983 sc->bge_rx_discards = cnt; in bge_stats_update()
4985 cnt = READ_STAT(sc, stats, txstats.ifOutDiscards.bge_addr_lo); in bge_stats_update()
4986 if_inc_counter(ifp, IFCOUNTER_OERRORS, cnt - sc->bge_tx_discards); in bge_stats_update()
4987 sc->bge_tx_discards = cnt; in bge_stats_update()
5071 bge_setup_tso(struct bge_softc *sc, struct mbuf *m, uint16_t *mss, in bge_setup_tso() argument
5119 if (sc->bge_flags & BGE_FLAG_TSO3) { in bge_setup_tso()
5147 bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) in bge_encap() argument
5160 if ((sc->bge_flags & BGE_FLAG_SHORT_DMA_BUG) != 0 && in bge_encap()
5168 *m_head = m = bge_setup_tso(sc, m, &mss, &csum_flags); in bge_encap()
5173 } else if ((m->m_pkthdr.csum_flags & sc->bge_csum_features) != 0) { in bge_encap()
5188 if (sc->bge_flags & BGE_FLAG_JUMBO_FRAME && in bge_encap()
5191 if (sc->bge_forced_collapse > 0 && in bge_encap()
5192 (sc->bge_flags & BGE_FLAG_PCIE) != 0 && m->m_next != NULL) { in bge_encap()
5198 if (sc->bge_forced_collapse == 1) in bge_encap()
5202 sc->bge_forced_collapse); in bge_encap()
5209 map = sc->bge_cdata.bge_tx_dmamap[idx]; in bge_encap()
5210 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_tx_mtag, map, m, segs, in bge_encap()
5220 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_tx_mtag, map, in bge_encap()
5231 if (sc->bge_txcnt + nsegs >= BGE_TX_RING_CNT) { in bge_encap()
5232 bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, map); in bge_encap()
5236 bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, map, BUS_DMASYNC_PREWRITE); in bge_encap()
5243 if (sc->bge_asicrev == BGE_ASICREV_BCM5762 && in bge_encap()
5252 d = &sc->bge_ldata.bge_tx_ring[idx]; in bge_encap()
5267 bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, map, in bge_encap()
5269 bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, map); in bge_encap()
5276 d = &sc->bge_ldata.bge_tx_ring[idx]; in bge_encap()
5297 sc->bge_cdata.bge_tx_dmamap[*txidx] = sc->bge_cdata.bge_tx_dmamap[idx]; in bge_encap()
5298 sc->bge_cdata.bge_tx_dmamap[idx] = map; in bge_encap()
5299 sc->bge_cdata.bge_tx_chain[idx] = m; in bge_encap()
5300 sc->bge_txcnt += nsegs; in bge_encap()
5315 struct bge_softc *sc; in bge_start_locked() local
5320 sc = if_getsoftc(ifp); in bge_start_locked()
5321 BGE_LOCK_ASSERT(sc); in bge_start_locked()
5323 if (!sc->bge_link || in bge_start_locked()
5328 prodidx = sc->bge_tx_prodidx; in bge_start_locked()
5331 if (sc->bge_txcnt > BGE_TX_RING_CNT - 16) { in bge_start_locked()
5344 if (bge_encap(sc, &m_head, &prodidx)) { in bge_start_locked()
5361 bge_start_tx(sc, prodidx); in bge_start_locked()
5365 bge_start_tx(struct bge_softc *sc, uint32_t prodidx) in bge_start_tx() argument
5368 bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, in bge_start_tx()
5369 sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_PREWRITE); in bge_start_tx()
5371 bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); in bge_start_tx()
5373 if (sc->bge_chiprev == BGE_CHIPREV_5700_BX) in bge_start_tx()
5374 bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); in bge_start_tx()
5376 sc->bge_tx_prodidx = prodidx; in bge_start_tx()
5379 sc->bge_timer = BGE_TX_TIMEOUT; in bge_start_tx()
5389 struct bge_softc *sc; in bge_start() local
5391 sc = if_getsoftc(ifp); in bge_start()
5392 BGE_LOCK(sc); in bge_start()
5394 BGE_UNLOCK(sc); in bge_start()
5398 bge_init_locked(struct bge_softc *sc) in bge_init_locked() argument
5404 BGE_LOCK_ASSERT(sc); in bge_init_locked()
5406 ifp = sc->bge_ifp; in bge_init_locked()
5412 bge_stop(sc); in bge_init_locked()
5414 bge_stop_fw(sc); in bge_init_locked()
5415 bge_sig_pre_reset(sc, BGE_RESET_START); in bge_init_locked()
5416 bge_reset(sc); in bge_init_locked()
5417 bge_sig_legacy(sc, BGE_RESET_START); in bge_init_locked()
5418 bge_sig_post_reset(sc, BGE_RESET_START); in bge_init_locked()
5420 bge_chipinit(sc); in bge_init_locked()
5426 if (bge_blockinit(sc)) { in bge_init_locked()
5427 device_printf(sc->bge_dev, "initialization failure\n"); in bge_init_locked()
5431 ifp = sc->bge_ifp; in bge_init_locked()
5434 CSR_WRITE_4(sc, BGE_RX_MTU, if_getmtu(ifp) + in bge_init_locked()
5439 m = (uint16_t *)if_getlladdr(sc->bge_ifp); in bge_init_locked()
5440 CSR_WRITE_4(sc, BGE_MAC_ADDR1_LO, htons(m[0])); in bge_init_locked()
5441 CSR_WRITE_4(sc, BGE_MAC_ADDR1_HI, (htons(m[1]) << 16) | htons(m[2])); in bge_init_locked()
5444 bge_setpromisc(sc); in bge_init_locked()
5447 bge_setmulti(sc); in bge_init_locked()
5450 bge_setvlan(sc); in bge_init_locked()
5453 if (sc->bge_forced_udpcsum == 0) in bge_init_locked()
5454 sc->bge_csum_features &= ~CSUM_UDP; in bge_init_locked()
5456 sc->bge_csum_features |= CSUM_UDP; in bge_init_locked()
5460 if_sethwassistbits(ifp, sc->bge_csum_features, 0); in bge_init_locked()
5464 if (bge_init_rx_ring_std(sc) != 0) { in bge_init_locked()
5465 device_printf(sc->bge_dev, "no memory for std Rx buffers.\n"); in bge_init_locked()
5466 bge_stop(sc); in bge_init_locked()
5475 if (sc->bge_chipid == BGE_CHIPID_BCM5705_A0) { in bge_init_locked()
5479 v = bge_readmem_ind(sc, BGE_STD_RX_RINGS + 8); in bge_init_locked()
5484 device_printf (sc->bge_dev, in bge_init_locked()
5489 if (BGE_IS_JUMBO_CAPABLE(sc) && in bge_init_locked()
5492 if (bge_init_rx_ring_jumbo(sc) != 0) { in bge_init_locked()
5493 device_printf(sc->bge_dev, in bge_init_locked()
5495 bge_stop(sc); in bge_init_locked()
5501 sc->bge_rx_saved_considx = 0; in bge_init_locked()
5504 sc->bge_rx_discards = sc->bge_tx_discards = sc->bge_tx_collisions = 0; in bge_init_locked()
5507 bge_init_tx_ring(sc); in bge_init_locked()
5510 mode = CSR_READ_4(sc, BGE_TX_MODE); in bge_init_locked()
5511 if (BGE_IS_5755_PLUS(sc) || sc->bge_asicrev == BGE_ASICREV_BCM5906) in bge_init_locked()
5513 if (sc->bge_asicrev == BGE_ASICREV_BCM5720 || in bge_init_locked()
5514 sc->bge_asicrev == BGE_ASICREV_BCM5762) { in bge_init_locked()
5516 mode |= CSR_READ_4(sc, BGE_TX_MODE) & in bge_init_locked()
5520 CSR_WRITE_4(sc, BGE_TX_MODE, mode | BGE_TXMODE_ENABLE); in bge_init_locked()
5524 mode = CSR_READ_4(sc, BGE_RX_MODE); in bge_init_locked()
5525 if (BGE_IS_5755_PLUS(sc)) in bge_init_locked()
5527 if (sc->bge_asicrev == BGE_ASICREV_BCM5762) in bge_init_locked()
5529 CSR_WRITE_4(sc,BGE_RX_MODE, mode | BGE_RXMODE_ENABLE); in bge_init_locked()
5538 if (BGE_IS_57765_PLUS(sc)) in bge_init_locked()
5539 CSR_WRITE_4(sc, BGE_MAX_RX_FRAME_LOWAT, 1); in bge_init_locked()
5541 CSR_WRITE_4(sc, BGE_MAX_RX_FRAME_LOWAT, 2); in bge_init_locked()
5544 if (BGE_IS_5705_PLUS(sc)) in bge_init_locked()
5545 bge_stats_clear_regs(sc); in bge_init_locked()
5548 BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP); in bge_init_locked()
5553 BGE_SETBIT(sc, BGE_PCI_MISC_CTL, in bge_init_locked()
5555 bge_writembx(sc, BGE_MBX_IRQ0_LO, 1); in bge_init_locked()
5561 BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_CLEAR_INTA); in bge_init_locked()
5562 BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR); in bge_init_locked()
5563 bge_writembx(sc, BGE_MBX_IRQ0_LO, 0); in bge_init_locked()
5571 callout_reset(&sc->bge_stat_ch, hz, bge_tick, sc); in bge_init_locked()
5577 struct bge_softc *sc = xsc; in bge_init() local
5579 BGE_LOCK(sc); in bge_init()
5580 bge_init_locked(sc); in bge_init()
5581 BGE_UNLOCK(sc); in bge_init()
5590 struct bge_softc *sc = if_getsoftc(ifp); in bge_ifmedia_upd() local
5593 BGE_LOCK(sc); in bge_ifmedia_upd()
5595 BGE_UNLOCK(sc); in bge_ifmedia_upd()
5603 struct bge_softc *sc = if_getsoftc(ifp); in bge_ifmedia_upd_locked() local
5608 BGE_LOCK_ASSERT(sc); in bge_ifmedia_upd_locked()
5610 ifm = &sc->bge_ifmedia; in bge_ifmedia_upd_locked()
5613 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_ifmedia_upd_locked()
5623 if (sc->bge_asicrev == BGE_ASICREV_BCM5704) { in bge_ifmedia_upd_locked()
5625 sgdig = CSR_READ_4(sc, BGE_SGDIG_STS); in bge_ifmedia_upd_locked()
5627 CSR_WRITE_4(sc, BGE_TX_TBI_AUTONEG, 0); in bge_ifmedia_upd_locked()
5628 sgdig = CSR_READ_4(sc, BGE_SGDIG_CFG); in bge_ifmedia_upd_locked()
5632 CSR_WRITE_4(sc, BGE_SGDIG_CFG, in bge_ifmedia_upd_locked()
5635 CSR_WRITE_4(sc, BGE_SGDIG_CFG, sgdig); in bge_ifmedia_upd_locked()
5641 BGE_CLRBIT(sc, BGE_MAC_MODE, in bge_ifmedia_upd_locked()
5644 BGE_SETBIT(sc, BGE_MAC_MODE, in bge_ifmedia_upd_locked()
5655 sc->bge_link_evt++; in bge_ifmedia_upd_locked()
5656 mii = device_get_softc(sc->bge_miibus); in bge_ifmedia_upd_locked()
5673 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 || in bge_ifmedia_upd_locked()
5674 sc->bge_flags & BGE_FLAG_5788) in bge_ifmedia_upd_locked()
5675 BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_INTR_SET); in bge_ifmedia_upd_locked()
5677 BGE_SETBIT(sc, BGE_HCC_MODE, BGE_HCCMODE_COAL_NOW); in bge_ifmedia_upd_locked()
5688 struct bge_softc *sc = if_getsoftc(ifp); in bge_ifmedia_sts() local
5691 BGE_LOCK(sc); in bge_ifmedia_sts()
5694 BGE_UNLOCK(sc); in bge_ifmedia_sts()
5697 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_ifmedia_sts()
5700 if (CSR_READ_4(sc, BGE_MAC_STS) & in bge_ifmedia_sts()
5705 BGE_UNLOCK(sc); in bge_ifmedia_sts()
5709 if (CSR_READ_4(sc, BGE_MAC_MODE) & BGE_MACMODE_HALF_DUPLEX) in bge_ifmedia_sts()
5713 BGE_UNLOCK(sc); in bge_ifmedia_sts()
5717 mii = device_get_softc(sc->bge_miibus); in bge_ifmedia_sts()
5722 BGE_UNLOCK(sc); in bge_ifmedia_sts()
5728 struct bge_softc *sc = if_getsoftc(ifp); in bge_ioctl() local
5735 if (BGE_IS_JUMBO_CAPABLE(sc) || in bge_ioctl()
5736 (sc->bge_flags & BGE_FLAG_JUMBO_STD)) { in bge_ioctl()
5746 BGE_LOCK(sc); in bge_ioctl()
5751 bge_init_locked(sc); in bge_ioctl()
5754 BGE_UNLOCK(sc); in bge_ioctl()
5757 BGE_LOCK(sc); in bge_ioctl()
5768 flags = if_getflags(ifp) ^ sc->bge_if_flags; in bge_ioctl()
5770 bge_setpromisc(sc); in bge_ioctl()
5772 bge_setmulti(sc); in bge_ioctl()
5774 bge_init_locked(sc); in bge_ioctl()
5777 bge_stop(sc); in bge_ioctl()
5780 sc->bge_if_flags = if_getflags(ifp); in bge_ioctl()
5781 BGE_UNLOCK(sc); in bge_ioctl()
5787 BGE_LOCK(sc); in bge_ioctl()
5788 bge_setmulti(sc); in bge_ioctl()
5789 BGE_UNLOCK(sc); in bge_ioctl()
5795 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_ioctl()
5797 &sc->bge_ifmedia, command); in bge_ioctl()
5799 mii = device_get_softc(sc->bge_miibus); in bge_ioctl()
5812 BGE_LOCK(sc); in bge_ioctl()
5813 BGE_SETBIT(sc, BGE_PCI_MISC_CTL, in bge_ioctl()
5815 bge_writembx(sc, BGE_MBX_IRQ0_LO, 1); in bge_ioctl()
5817 BGE_UNLOCK(sc); in bge_ioctl()
5821 BGE_LOCK(sc); in bge_ioctl()
5822 BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, in bge_ioctl()
5824 bge_writembx(sc, BGE_MBX_IRQ0_LO, 0); in bge_ioctl()
5826 BGE_UNLOCK(sc); in bge_ioctl()
5835 sc->bge_csum_features, 0); in bge_ioctl()
5838 sc->bge_csum_features); in bge_ioctl()
5857 bge_init(sc); in bge_ioctl()
5868 BGE_LOCK(sc); in bge_ioctl()
5869 bge_setvlan(sc); in bge_ioctl()
5870 BGE_UNLOCK(sc); in bge_ioctl()
5885 bge_watchdog(struct bge_softc *sc) in bge_watchdog() argument
5890 BGE_LOCK_ASSERT(sc); in bge_watchdog()
5892 if (sc->bge_timer == 0 || --sc->bge_timer) in bge_watchdog()
5896 if ((CSR_READ_4(sc, BGE_RX_MODE) & BGE_RXMODE_FLOWCTL_ENABLE) != 0) { in bge_watchdog()
5897 status = CSR_READ_4(sc, BGE_RX_STS); in bge_watchdog()
5903 CSR_WRITE_4(sc, BGE_RX_STS, status); in bge_watchdog()
5904 sc->bge_timer = BGE_TX_TIMEOUT; in bge_watchdog()
5912 CSR_WRITE_4(sc, BGE_RX_STS, status); in bge_watchdog()
5913 sc->bge_timer = BGE_TX_TIMEOUT; in bge_watchdog()
5922 ifp = sc->bge_ifp; in bge_watchdog()
5927 bge_init_locked(sc); in bge_watchdog()
5933 bge_stop_block(struct bge_softc *sc, bus_size_t reg, uint32_t bit) in bge_stop_block() argument
5937 BGE_CLRBIT(sc, reg, bit); in bge_stop_block()
5940 if ((CSR_READ_4(sc, reg) & bit) == 0) in bge_stop_block()
5951 bge_stop(struct bge_softc *sc) in bge_stop() argument
5955 BGE_LOCK_ASSERT(sc); in bge_stop()
5957 ifp = sc->bge_ifp; in bge_stop()
5959 callout_stop(&sc->bge_stat_ch); in bge_stop()
5962 BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR); in bge_stop()
5963 bge_writembx(sc, BGE_MBX_IRQ0_LO, 1); in bge_stop()
5968 bge_stop_fw(sc); in bge_stop()
5969 bge_sig_pre_reset(sc, BGE_RESET_SHUTDOWN); in bge_stop()
5974 bge_stop_block(sc, BGE_RX_MODE, BGE_RXMODE_ENABLE); in bge_stop()
5975 bge_stop_block(sc, BGE_RBDI_MODE, BGE_RBDIMODE_ENABLE); in bge_stop()
5976 bge_stop_block(sc, BGE_RXLP_MODE, BGE_RXLPMODE_ENABLE); in bge_stop()
5977 if (BGE_IS_5700_FAMILY(sc)) in bge_stop()
5978 bge_stop_block(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE); in bge_stop()
5979 bge_stop_block(sc, BGE_RDBDI_MODE, BGE_RBDIMODE_ENABLE); in bge_stop()
5980 bge_stop_block(sc, BGE_RDC_MODE, BGE_RDCMODE_ENABLE); in bge_stop()
5981 bge_stop_block(sc, BGE_RBDC_MODE, BGE_RBDCMODE_ENABLE); in bge_stop()
5986 bge_stop_block(sc, BGE_SRS_MODE, BGE_SRSMODE_ENABLE); in bge_stop()
5987 bge_stop_block(sc, BGE_SBDI_MODE, BGE_SBDIMODE_ENABLE); in bge_stop()
5988 bge_stop_block(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); in bge_stop()
5989 bge_stop_block(sc, BGE_RDMA_MODE, BGE_RDMAMODE_ENABLE); in bge_stop()
5990 bge_stop_block(sc, BGE_SDC_MODE, BGE_SDCMODE_ENABLE); in bge_stop()
5991 if (BGE_IS_5700_FAMILY(sc)) in bge_stop()
5992 bge_stop_block(sc, BGE_DMAC_MODE, BGE_DMACMODE_ENABLE); in bge_stop()
5993 bge_stop_block(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); in bge_stop()
5999 bge_stop_block(sc, BGE_HCC_MODE, BGE_HCCMODE_ENABLE); in bge_stop()
6000 bge_stop_block(sc, BGE_WDMA_MODE, BGE_WDMAMODE_ENABLE); in bge_stop()
6001 if (BGE_IS_5700_FAMILY(sc)) in bge_stop()
6002 bge_stop_block(sc, BGE_MBCF_MODE, BGE_MBCFMODE_ENABLE); in bge_stop()
6004 CSR_WRITE_4(sc, BGE_FTQ_RESET, 0xFFFFFFFF); in bge_stop()
6005 CSR_WRITE_4(sc, BGE_FTQ_RESET, 0); in bge_stop()
6006 if (!(BGE_IS_5705_PLUS(sc))) { in bge_stop()
6007 BGE_CLRBIT(sc, BGE_BMAN_MODE, BGE_BMANMODE_ENABLE); in bge_stop()
6008 BGE_CLRBIT(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE); in bge_stop()
6011 if (BGE_IS_5705_PLUS(sc)) in bge_stop()
6012 bge_stats_update_regs(sc); in bge_stop()
6014 bge_reset(sc); in bge_stop()
6015 bge_sig_legacy(sc, BGE_RESET_SHUTDOWN); in bge_stop()
6016 bge_sig_post_reset(sc, BGE_RESET_SHUTDOWN); in bge_stop()
6021 if (sc->bge_asf_mode & ASF_STACKUP) in bge_stop()
6022 BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP); in bge_stop()
6024 BGE_CLRBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP); in bge_stop()
6027 bge_free_rx_ring_std(sc); in bge_stop()
6030 if (BGE_IS_JUMBO_CAPABLE(sc)) in bge_stop()
6031 bge_free_rx_ring_jumbo(sc); in bge_stop()
6034 bge_free_tx_ring(sc); in bge_stop()
6036 sc->bge_tx_saved_considx = BGE_TXCONS_UNSET; in bge_stop()
6039 if (bootverbose && sc->bge_link) in bge_stop()
6040 if_printf(sc->bge_ifp, "link DOWN\n"); in bge_stop()
6041 sc->bge_link = 0; in bge_stop()
6053 struct bge_softc *sc; in bge_shutdown() local
6055 sc = device_get_softc(dev); in bge_shutdown()
6056 BGE_LOCK(sc); in bge_shutdown()
6057 bge_stop(sc); in bge_shutdown()
6058 BGE_UNLOCK(sc); in bge_shutdown()
6066 struct bge_softc *sc; in bge_suspend() local
6068 sc = device_get_softc(dev); in bge_suspend()
6069 BGE_LOCK(sc); in bge_suspend()
6070 bge_stop(sc); in bge_suspend()
6071 BGE_UNLOCK(sc); in bge_suspend()
6079 struct bge_softc *sc; in bge_resume() local
6082 sc = device_get_softc(dev); in bge_resume()
6083 BGE_LOCK(sc); in bge_resume()
6084 ifp = sc->bge_ifp; in bge_resume()
6086 bge_init_locked(sc); in bge_resume()
6090 BGE_UNLOCK(sc); in bge_resume()
6096 bge_link_upd(struct bge_softc *sc) in bge_link_upd() argument
6101 BGE_LOCK_ASSERT(sc); in bge_link_upd()
6104 sc->bge_link_evt = 0; in bge_link_upd()
6121 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_link_upd()
6122 sc->bge_chipid != BGE_CHIPID_BCM5700_B2) { in bge_link_upd()
6123 status = CSR_READ_4(sc, BGE_MAC_STS); in bge_link_upd()
6125 mii = device_get_softc(sc->bge_miibus); in bge_link_upd()
6127 if (!sc->bge_link && in bge_link_upd()
6130 sc->bge_link++; in bge_link_upd()
6132 if_printf(sc->bge_ifp, "link UP\n"); in bge_link_upd()
6133 } else if (sc->bge_link && in bge_link_upd()
6136 sc->bge_link = 0; in bge_link_upd()
6138 if_printf(sc->bge_ifp, "link DOWN\n"); in bge_link_upd()
6142 CSR_WRITE_4(sc, BGE_MAC_EVT_ENB, in bge_link_upd()
6144 bge_miibus_readreg(sc->bge_dev, sc->bge_phy_addr, in bge_link_upd()
6146 bge_miibus_writereg(sc->bge_dev, sc->bge_phy_addr, in bge_link_upd()
6152 if (sc->bge_flags & BGE_FLAG_TBI) { in bge_link_upd()
6153 status = CSR_READ_4(sc, BGE_MAC_STS); in bge_link_upd()
6155 if (!sc->bge_link) { in bge_link_upd()
6156 sc->bge_link++; in bge_link_upd()
6157 if (sc->bge_asicrev == BGE_ASICREV_BCM5704) { in bge_link_upd()
6158 BGE_CLRBIT(sc, BGE_MAC_MODE, in bge_link_upd()
6162 CSR_WRITE_4(sc, BGE_MAC_STS, 0xFFFFFFFF); in bge_link_upd()
6164 if_printf(sc->bge_ifp, "link UP\n"); in bge_link_upd()
6165 if_link_state_change(sc->bge_ifp, in bge_link_upd()
6168 } else if (sc->bge_link) { in bge_link_upd()
6169 sc->bge_link = 0; in bge_link_upd()
6171 if_printf(sc->bge_ifp, "link DOWN\n"); in bge_link_upd()
6172 if_link_state_change(sc->bge_ifp, LINK_STATE_DOWN); in bge_link_upd()
6174 } else if ((sc->bge_mi_mode & BGE_MIMODE_AUTOPOLL) != 0) { in bge_link_upd()
6180 link = (CSR_READ_4(sc, BGE_MI_STS) & BGE_MISTS_LINK) ? 1 : 0; in bge_link_upd()
6182 if (link != sc->bge_link || in bge_link_upd()
6183 sc->bge_asicrev == BGE_ASICREV_BCM5700) { in bge_link_upd()
6184 mii = device_get_softc(sc->bge_miibus); in bge_link_upd()
6186 if (!sc->bge_link && in bge_link_upd()
6189 sc->bge_link++; in bge_link_upd()
6191 if_printf(sc->bge_ifp, "link UP\n"); in bge_link_upd()
6192 } else if (sc->bge_link && in bge_link_upd()
6195 sc->bge_link = 0; in bge_link_upd()
6197 if_printf(sc->bge_ifp, "link DOWN\n"); in bge_link_upd()
6205 mii = device_get_softc(sc->bge_miibus); in bge_link_upd()
6207 bge_miibus_statchg(sc->bge_dev); in bge_link_upd()
6211 CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED | in bge_link_upd()
6217 bge_add_sysctls(struct bge_softc *sc) in bge_add_sysctls() argument
6222 ctx = device_get_sysctl_ctx(sc->bge_dev); in bge_add_sysctls()
6223 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->bge_dev)); in bge_add_sysctls()
6227 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, in bge_add_sysctls()
6231 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, in bge_add_sysctls()
6235 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, in bge_add_sysctls()
6239 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, in bge_add_sysctls()
6256 sc->bge_forced_collapse = 0; in bge_add_sysctls()
6258 CTLFLAG_RWTUN, &sc->bge_forced_collapse, 0, in bge_add_sysctls()
6262 sc->bge_msi = 1; in bge_add_sysctls()
6264 CTLFLAG_RDTUN, &sc->bge_msi, 0, "Enable MSI"); in bge_add_sysctls()
6276 sc->bge_forced_udpcsum = 0; in bge_add_sysctls()
6278 CTLFLAG_RWTUN, &sc->bge_forced_udpcsum, 0, in bge_add_sysctls()
6282 if (BGE_IS_5705_PLUS(sc)) in bge_add_sysctls()
6283 bge_add_sysctl_stats_regs(sc, ctx, children); in bge_add_sysctls()
6285 bge_add_sysctl_stats(sc, ctx, children); in bge_add_sysctls()
6288 #define BGE_SYSCTL_STAT(sc, ctx, desc, parent, node, oid) \ argument
6290 CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, \
6294 bge_add_sysctl_stats(struct bge_softc *sc, struct sysctl_ctx_list *ctx, in bge_add_sysctl_stats() argument
6303 BGE_SYSCTL_STAT(sc, ctx, "Frames Dropped Due To Filters", in bge_add_sysctl_stats()
6306 BGE_SYSCTL_STAT(sc, ctx, "NIC DMA Write Queue Full", in bge_add_sysctl_stats()
6308 BGE_SYSCTL_STAT(sc, ctx, "NIC DMA Write High Priority Queue Full", in bge_add_sysctl_stats()
6310 BGE_SYSCTL_STAT(sc, ctx, "NIC No More RX Buffer Descriptors", in bge_add_sysctl_stats()
6312 BGE_SYSCTL_STAT(sc, ctx, "Discarded Input Frames", in bge_add_sysctl_stats()
6314 BGE_SYSCTL_STAT(sc, ctx, "Input Errors", in bge_add_sysctl_stats()
6316 BGE_SYSCTL_STAT(sc, ctx, "NIC Recv Threshold Hit", in bge_add_sysctl_stats()
6318 BGE_SYSCTL_STAT(sc, ctx, "NIC DMA Read Queue Full", in bge_add_sysctl_stats()
6320 BGE_SYSCTL_STAT(sc, ctx, "NIC DMA Read High Priority Queue Full", in bge_add_sysctl_stats()
6322 BGE_SYSCTL_STAT(sc, ctx, "NIC Send Data Complete Queue Full", in bge_add_sysctl_stats()
6324 BGE_SYSCTL_STAT(sc, ctx, "NIC Ring Set Send Producer Index", in bge_add_sysctl_stats()
6326 BGE_SYSCTL_STAT(sc, ctx, "NIC Ring Status Update", in bge_add_sysctl_stats()
6328 BGE_SYSCTL_STAT(sc, ctx, "NIC Interrupts", in bge_add_sysctl_stats()
6330 BGE_SYSCTL_STAT(sc, ctx, "NIC Avoided Interrupts", in bge_add_sysctl_stats()
6332 BGE_SYSCTL_STAT(sc, ctx, "NIC Send Threshold Hit", in bge_add_sysctl_stats()
6338 BGE_SYSCTL_STAT(sc, ctx, "Inbound Octets", in bge_add_sysctl_stats()
6340 BGE_SYSCTL_STAT(sc, ctx, "Fragments", in bge_add_sysctl_stats()
6342 BGE_SYSCTL_STAT(sc, ctx, "Inbound Unicast Packets", in bge_add_sysctl_stats()
6344 BGE_SYSCTL_STAT(sc, ctx, "Inbound Multicast Packets", in bge_add_sysctl_stats()
6346 BGE_SYSCTL_STAT(sc, ctx, "FCS Errors", in bge_add_sysctl_stats()
6348 BGE_SYSCTL_STAT(sc, ctx, "Alignment Errors", in bge_add_sysctl_stats()
6350 BGE_SYSCTL_STAT(sc, ctx, "XON Pause Frames Received", in bge_add_sysctl_stats()
6352 BGE_SYSCTL_STAT(sc, ctx, "XOFF Pause Frames Received", in bge_add_sysctl_stats()
6355 BGE_SYSCTL_STAT(sc, ctx, "MAC Control Frames Received", in bge_add_sysctl_stats()
6358 BGE_SYSCTL_STAT(sc, ctx, "XOFF State Entered", in bge_add_sysctl_stats()
6360 BGE_SYSCTL_STAT(sc, ctx, "Frames Too Long", in bge_add_sysctl_stats()
6362 BGE_SYSCTL_STAT(sc, ctx, "Jabbers", in bge_add_sysctl_stats()
6364 BGE_SYSCTL_STAT(sc, ctx, "Undersized Packets", in bge_add_sysctl_stats()
6366 BGE_SYSCTL_STAT(sc, ctx, "Inbound Range Length Errors", in bge_add_sysctl_stats()
6368 BGE_SYSCTL_STAT(sc, ctx, "Outbound Range Length Errors", in bge_add_sysctl_stats()
6374 BGE_SYSCTL_STAT(sc, ctx, "Outbound Octets", in bge_add_sysctl_stats()
6376 BGE_SYSCTL_STAT(sc, ctx, "TX Collisions", in bge_add_sysctl_stats()
6378 BGE_SYSCTL_STAT(sc, ctx, "XON Sent", in bge_add_sysctl_stats()
6380 BGE_SYSCTL_STAT(sc, ctx, "XOFF Sent", in bge_add_sysctl_stats()
6382 BGE_SYSCTL_STAT(sc, ctx, "Flow Control Done", in bge_add_sysctl_stats()
6384 BGE_SYSCTL_STAT(sc, ctx, "Internal MAC TX errors", in bge_add_sysctl_stats()
6387 BGE_SYSCTL_STAT(sc, ctx, "Single Collision Frames", in bge_add_sysctl_stats()
6390 BGE_SYSCTL_STAT(sc, ctx, "Multiple Collision Frames", in bge_add_sysctl_stats()
6393 BGE_SYSCTL_STAT(sc, ctx, "Deferred Transmissions", in bge_add_sysctl_stats()
6396 BGE_SYSCTL_STAT(sc, ctx, "Excessive Collisions", in bge_add_sysctl_stats()
6399 BGE_SYSCTL_STAT(sc, ctx, "Late Collisions", in bge_add_sysctl_stats()
6402 BGE_SYSCTL_STAT(sc, ctx, "Outbound Unicast Packets", in bge_add_sysctl_stats()
6404 BGE_SYSCTL_STAT(sc, ctx, "Outbound Multicast Packets", in bge_add_sysctl_stats()
6406 BGE_SYSCTL_STAT(sc, ctx, "Outbound Broadcast Packets", in bge_add_sysctl_stats()
6408 BGE_SYSCTL_STAT(sc, ctx, "Carrier Sense Errors", in bge_add_sysctl_stats()
6411 BGE_SYSCTL_STAT(sc, ctx, "Outbound Discards", in bge_add_sysctl_stats()
6413 BGE_SYSCTL_STAT(sc, ctx, "Outbound Errors", in bge_add_sysctl_stats()
6423 bge_add_sysctl_stats_regs(struct bge_softc *sc, struct sysctl_ctx_list *ctx, in bge_add_sysctl_stats_regs() argument
6430 stats = &sc->bge_mac_stats; in bge_add_sysctl_stats_regs()
6520 struct bge_softc *sc; in bge_sysctl_stats() local
6524 sc = (struct bge_softc *)arg1; in bge_sysctl_stats()
6526 result = CSR_READ_4(sc, BGE_MEMWIN_START + BGE_STATS_BLOCK + offset + in bge_sysctl_stats()
6535 struct bge_softc *sc; in bge_sysctl_debug_info() local
6546 sc = (struct bge_softc *)arg1; in bge_sysctl_debug_info()
6548 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && in bge_sysctl_debug_info()
6549 sc->bge_chipid != BGE_CHIPID_BCM5700_C0) in bge_sysctl_debug_info()
6553 sbdata = (uint16_t *)sc->bge_ldata.bge_status_block; in bge_sysctl_debug_info()
6555 BGE_LOCK(sc); in bge_sysctl_debug_info()
6556 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_sysctl_debug_info()
6557 sc->bge_cdata.bge_status_map, in bge_sysctl_debug_info()
6570 printf(" %08x", CSR_READ_4(sc, i)); in bge_sysctl_debug_info()
6575 BGE_UNLOCK(sc); in bge_sysctl_debug_info()
6578 if (BGE_IS_5717_PLUS(sc)) in bge_sysctl_debug_info()
6580 if (BGE_IS_5755_PLUS(sc)) in bge_sysctl_debug_info()
6582 if (BGE_IS_575X_PLUS(sc)) in bge_sysctl_debug_info()
6584 if (BGE_IS_5705_PLUS(sc)) in bge_sysctl_debug_info()
6586 if (BGE_IS_5714_FAMILY(sc)) in bge_sysctl_debug_info()
6588 if (BGE_IS_5700_FAMILY(sc)) in bge_sysctl_debug_info()
6590 if (sc->bge_flags & BGE_FLAG_JUMBO) in bge_sysctl_debug_info()
6592 if (sc->bge_flags & BGE_FLAG_PCIX) in bge_sysctl_debug_info()
6594 if (sc->bge_flags & BGE_FLAG_PCIE) in bge_sysctl_debug_info()
6596 if (sc->bge_phy_flags & BGE_PHY_NO_3LED) in bge_sysctl_debug_info()
6598 if (sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) in bge_sysctl_debug_info()
6608 struct bge_softc *sc; in bge_sysctl_reg_read() local
6619 sc = (struct bge_softc *)arg1; in bge_sysctl_reg_read()
6620 val = CSR_READ_4(sc, result); in bge_sysctl_reg_read()
6630 struct bge_softc *sc; in bge_sysctl_ape_read() local
6641 sc = (struct bge_softc *)arg1; in bge_sysctl_ape_read()
6642 val = APE_READ_4(sc, result); in bge_sysctl_ape_read()
6652 struct bge_softc *sc; in bge_sysctl_mem_read() local
6663 sc = (struct bge_softc *)arg1; in bge_sysctl_mem_read()
6664 val = bge_readmem_ind(sc, result); in bge_sysctl_mem_read()
6673 bge_get_eaddr_fw(struct bge_softc *sc, uint8_t ether_addr[]) in bge_get_eaddr_fw() argument
6679 bge_get_eaddr_mem(struct bge_softc *sc, uint8_t ether_addr[]) in bge_get_eaddr_mem() argument
6683 mac_addr = bge_readmem_ind(sc, BGE_SRAM_MAC_ADDR_HIGH_MB); in bge_get_eaddr_mem()
6687 mac_addr = bge_readmem_ind(sc, BGE_SRAM_MAC_ADDR_LOW_MB); in bge_get_eaddr_mem()
6698 bge_get_eaddr_nvram(struct bge_softc *sc, uint8_t ether_addr[]) in bge_get_eaddr_nvram() argument
6702 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) in bge_get_eaddr_nvram()
6705 return (bge_read_nvram(sc, ether_addr, mac_offset + 2, in bge_get_eaddr_nvram()
6710 bge_get_eaddr_eeprom(struct bge_softc *sc, uint8_t ether_addr[]) in bge_get_eaddr_eeprom() argument
6713 if (sc->bge_asicrev == BGE_ASICREV_BCM5906) in bge_get_eaddr_eeprom()
6716 return (bge_read_eeprom(sc, ether_addr, BGE_EE_MAC_OFFSET + 2, in bge_get_eaddr_eeprom()
6721 bge_get_eaddr(struct bge_softc *sc, uint8_t eaddr[]) in bge_get_eaddr() argument
6734 if ((*func)(sc, eaddr) == 0) in bge_get_eaddr()
6743 struct bge_softc *sc; in bge_get_counter() local
6746 sc = if_getsoftc(ifp); in bge_get_counter()
6747 if (!BGE_IS_5705_PLUS(sc)) in bge_get_counter()
6749 stats = &sc->bge_mac_stats; in bge_get_counter()
6766 struct bge_softc *sc; in bge_debugnet_init() local
6768 sc = if_getsoftc(ifp); in bge_debugnet_init()
6769 BGE_LOCK(sc); in bge_debugnet_init()
6779 if ((sc->bge_flags & BGE_FLAG_JUMBO_STD) != 0 && in bge_debugnet_init()
6780 (if_getmtu(sc->bge_ifp) + ETHER_HDR_LEN + ETHER_CRC_LEN + in bge_debugnet_init()
6785 BGE_UNLOCK(sc); in bge_debugnet_init()
6796 struct bge_softc *sc; in bge_debugnet_transmit() local
6800 sc = if_getsoftc(ifp); in bge_debugnet_transmit()
6805 prodidx = sc->bge_tx_prodidx; in bge_debugnet_transmit()
6806 error = bge_encap(sc, &m, &prodidx); in bge_debugnet_transmit()
6808 bge_start_tx(sc, prodidx); in bge_debugnet_transmit()
6815 struct bge_softc *sc; in bge_debugnet_poll() local
6818 sc = if_getsoftc(ifp); in bge_debugnet_poll()
6823 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_debugnet_poll()
6824 sc->bge_cdata.bge_status_map, in bge_debugnet_poll()
6827 rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; in bge_debugnet_poll()
6828 tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; in bge_debugnet_poll()
6830 bus_dmamap_sync(sc->bge_cdata.bge_status_tag, in bge_debugnet_poll()
6831 sc->bge_cdata.bge_status_map, in bge_debugnet_poll()
6834 (void)bge_rxeof(sc, rx_prod, 0); in bge_debugnet_poll()
6835 bge_txeof(sc, tx_cons); in bge_debugnet_poll()