Module Name: src Committed By: msaitoh Date: Sun Mar 22 18:14:59 UTC 2009
Modified Files: src/sys/dev/pci: if_bge.c Log Message: Make bge(4) close to FreBSD and OpenBSD. NO FUNCTIONAL CHANGE BY THIS COMMIT. To generate a diff of this commit: cvs rdiff -u -r1.157 -r1.158 src/sys/dev/pci/if_bge.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.157 src/sys/dev/pci/if_bge.c:1.158 --- src/sys/dev/pci/if_bge.c:1.157 Sun Mar 22 16:20:06 2009 +++ src/sys/dev/pci/if_bge.c Sun Mar 22 18:14:59 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.157 2009/03/22 16:20:06 msaitoh Exp $ */ +/* $NetBSD: if_bge.c,v 1.158 2009/03/22 18:14:59 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.157 2009/03/22 16:20:06 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.158 2009/03/22 18:14:59 msaitoh Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -260,6 +260,217 @@ #define BGE_EVCNT_UPD(ev, val) /* nothing */ #endif +static const struct bge_product { + pci_vendor_id_t bp_vendor; + pci_product_id_t bp_product; + const char *bp_name; +} bge_products[] = { + /* + * The BCM5700 documentation seems to indicate that the hardware + * still has the Alteon vendor ID burned into it, though it + * should always be overridden by the value in the EEPROM. We'll + * check for it anyway. + */ + { PCI_VENDOR_ALTEON, + PCI_PRODUCT_ALTEON_BCM5700, + "Broadcom BCM5700 Gigabit Ethernet", + }, + { PCI_VENDOR_ALTEON, + PCI_PRODUCT_ALTEON_BCM5701, + "Broadcom BCM5701 Gigabit Ethernet", + }, + { PCI_VENDOR_ALTIMA, + PCI_PRODUCT_ALTIMA_AC1000, + "Altima AC1000 Gigabit Ethernet", + }, + { PCI_VENDOR_ALTIMA, + PCI_PRODUCT_ALTIMA_AC1001, + "Altima AC1001 Gigabit Ethernet", + }, + { PCI_VENDOR_ALTIMA, + PCI_PRODUCT_ALTIMA_AC9100, + "Altima AC9100 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5700, + "Broadcom BCM5700 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5701, + "Broadcom BCM5701 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5702, + "Broadcom BCM5702 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5702X, + "Broadcom BCM5702X Gigabit Ethernet" }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5703, + "Broadcom BCM5703 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5703X, + "Broadcom BCM5703X Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5703_ALT, + "Broadcom BCM5703 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5704C, + "Broadcom BCM5704C Dual Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5704S, + "Broadcom BCM5704S Dual Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5705, + "Broadcom BCM5705 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5705K, + "Broadcom BCM5705K Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5705M, + "Broadcom BCM5705M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5705M_ALT, + "Broadcom BCM5705M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5714, + "Broadcom BCM5714/5715 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5715, + "Broadcom BCM5714/5715 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5789, + "Broadcom BCM5789 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5721, + "Broadcom BCM5721 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5722, + "Broadcom BCM5722 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5750, + "Broadcom BCM5750 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5750M, + "Broadcom BCM5750M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5751, + "Broadcom BCM5751 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5751M, + "Broadcom BCM5751M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5752, + "Broadcom BCM5752 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5752M, + "Broadcom BCM5752M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5753, + "Broadcom BCM5753 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5753M, + "Broadcom BCM5753M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5754, + "Broadcom BCM5754 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5754M, + "Broadcom BCM5754M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5755, + "Broadcom BCM5755 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5755M, + "Broadcom BCM5755M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5780, + "Broadcom BCM5780 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5780S, + "Broadcom BCM5780S Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5782, + "Broadcom BCM5782 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5786, + "Broadcom BCM5786 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5787, + "Broadcom BCM5787 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5787M, + "Broadcom BCM5787M Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5788, + "Broadcom BCM5788 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5789, + "Broadcom BCM5789 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5901, + "Broadcom BCM5901 Fast Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5901A2, + "Broadcom BCM5901A2 Fast Ethernet", + }, + { PCI_VENDOR_SCHNEIDERKOCH, + PCI_PRODUCT_SCHNEIDERKOCH_SK_9DX1, + "SysKonnect SK-9Dx1 Gigabit Ethernet", + }, + { PCI_VENDOR_3COM, + PCI_PRODUCT_3COM_3C996, + "3Com 3c996 Gigabit Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5906, + "Broadcom BCM5906 Fast Ethernet", + }, + { PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM5906M, + "Broadcom BCM5906M Fast Ethernet", + }, + { 0, + 0, + NULL }, +}; + /* * XXX: how to handle variants based on 5750 and derivatives: * 5750 5751, 5721, possibly 5714, 5752, and 5708?, which @@ -285,6 +496,72 @@ (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5705 || \ (BGE_IS_5750_OR_BEYOND(sc))) +static const struct bge_revision { + uint32_t br_chipid; + const char *br_name; +} bge_revisions[] = { + { BGE_CHIPID_BCM5700_A0, "BCM5700 A0" }, + { BGE_CHIPID_BCM5700_A1, "BCM5700 A1" }, + { BGE_CHIPID_BCM5700_B0, "BCM5700 B0" }, + { BGE_CHIPID_BCM5700_B1, "BCM5700 B1" }, + { BGE_CHIPID_BCM5700_B2, "BCM5700 B2" }, + { BGE_CHIPID_BCM5700_B3, "BCM5700 B3" }, + /* This is treated like a BCM5700 Bx */ + { BGE_CHIPID_BCM5700_ALTIMA, "BCM5700 Altima" }, + { BGE_CHIPID_BCM5700_C0, "BCM5700 C0" }, + { BGE_CHIPID_BCM5701_A0, "BCM5701 A0" }, + { BGE_CHIPID_BCM5701_B0, "BCM5701 B0" }, + { BGE_CHIPID_BCM5701_B2, "BCM5701 B2" }, + { BGE_CHIPID_BCM5701_B5, "BCM5701 B5" }, + { BGE_CHIPID_BCM5703_A0, "BCM5703 A0" }, + { BGE_CHIPID_BCM5703_A1, "BCM5703 A1" }, + { BGE_CHIPID_BCM5703_A2, "BCM5703 A2" }, + { BGE_CHIPID_BCM5703_A3, "BCM5703 A3" }, + { BGE_CHIPID_BCM5703_B0, "BCM5703 B0" }, + { BGE_CHIPID_BCM5704_A0, "BCM5704 A0" }, + { BGE_CHIPID_BCM5704_A1, "BCM5704 A1" }, + { BGE_CHIPID_BCM5704_A2, "BCM5704 A2" }, + { BGE_CHIPID_BCM5704_A3, "BCM5704 A3" }, + { BGE_CHIPID_BCM5705_A0, "BCM5705 A0" }, + { BGE_CHIPID_BCM5705_A1, "BCM5705 A1" }, + { BGE_CHIPID_BCM5705_A2, "BCM5705 A2" }, + { BGE_CHIPID_BCM5705_A3, "BCM5705 A3" }, + { BGE_CHIPID_BCM5750_A0, "BCM5750 A0" }, + { BGE_CHIPID_BCM5750_A1, "BCM5750 A1" }, + { BGE_CHIPID_BCM5751_A1, "BCM5751 A1" }, + { BGE_CHIPID_BCM5752_A0, "BCM5752 A0" }, + { BGE_CHIPID_BCM5752_A1, "BCM5752 A1" }, + { BGE_CHIPID_BCM5752_A2, "BCM5752 A2" }, + { BGE_CHIPID_BCM5755_A0, "BCM5755 A0" }, + { BGE_CHIPID_BCM5755_A1, "BCM5755 A1" }, + { BGE_CHIPID_BCM5755_A2, "BCM5755 A2" }, + { BGE_CHIPID_BCM5755_C0, "BCM5755 C0" }, + { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" }, + { BGE_CHIPID_BCM5787_A1, "BCM5754/5787 A1" }, + { BGE_CHIPID_BCM5787_A2, "BCM5754/5787 A2" }, + { 0, NULL } +}; + +/* + * Some defaults for major revisions, so that newer steppings + * that we don't know about have a shot at working. + */ +static const struct bge_revision bge_majorrevs[] = { + { BGE_ASICREV_BCM5700, "unknown BCM5700" }, + { BGE_ASICREV_BCM5701, "unknown BCM5701" }, + { BGE_ASICREV_BCM5703, "unknown BCM5703" }, + { BGE_ASICREV_BCM5704, "unknown BCM5704" }, + { BGE_ASICREV_BCM5705, "unknown BCM5705" }, + { BGE_ASICREV_BCM5750, "unknown BCM575x family" }, + { BGE_ASICREV_BCM5714_A0, "unknown BCM5714" }, + { BGE_ASICREV_BCM5714, "unknown BCM5714" }, + { BGE_ASICREV_BCM5752, "unknown BCM5752 family" }, + { BGE_ASICREV_BCM5755, "unknown BCM5755" }, + { BGE_ASICREV_BCM5780, "unknown BCM5780" }, + { BGE_ASICREV_BCM5787, "unknown BCM5787" }, + { BGE_ASICREV_BCM5906, "unknown BCM5906" }, + { 0, NULL } +}; CFATTACH_DECL_NEW(bge, sizeof(struct bge_softc), bge_probe, bge_attach, NULL, NULL); @@ -311,7 +588,7 @@ bge_readreg_ind(struct bge_softc *sc, int off) { pci_conf_write(sc->sc_pc, sc->sc_pcitag, BGE_PCI_REG_BASEADDR, off); - return(pci_conf_read(sc->sc_pc, sc->sc_pcitag, BGE_PCI_REG_DATA)); + return (pci_conf_read(sc->sc_pc, sc->sc_pcitag, BGE_PCI_REG_DATA)); } #endif @@ -337,90 +614,6 @@ CSR_WRITE_4(sc, off, val); } -#ifdef notdef -static u_int8_t -bge_vpd_readbyte(struct bge_softc *sc, int addr) -{ - int i; - u_int32_t val; - - pci_conf_write(sc->sc_pc, sc->sc_pcitag, BGE_PCI_VPD_ADDR, addr); - for (i = 0; i < BGE_TIMEOUT * 10; i++) { - DELAY(10); - if (pci_conf_read(sc->sc_pc, sc->sc_pcitag, BGE_PCI_VPD_ADDR) & - BGE_VPD_FLAG) - break; - } - - if (i == BGE_TIMEOUT) { - aprint_error_dev(sc->bge_dev, "VPD read timed out\n"); - return(0); - } - - val = pci_conf_read(sc->sc_pc, sc->sca_pcitag, BGE_PCI_VPD_DATA); - - return((val >> ((addr % 4) * 8)) & 0xFF); -} - -static void -bge_vpd_read_res(struct bge_softc *sc, struct vpd_res *res, int addr) -{ - int i; - u_int8_t *ptr; - - ptr = (u_int8_t *)res; - for (i = 0; i < sizeof(struct vpd_res); i++) - ptr[i] = bge_vpd_readbyte(sc, i + addr); -} - -static void -bge_vpd_read(struct bge_softc *sc) -{ - int pos = 0, i; - struct vpd_res res; - - if (sc->bge_vpd_prodname != NULL) - free(sc->bge_vpd_prodname, M_DEVBUF); - if (sc->bge_vpd_readonly != NULL) - free(sc->bge_vpd_readonly, M_DEVBUF); - sc->bge_vpd_prodname = NULL; - sc->bge_vpd_readonly = NULL; - - bge_vpd_read_res(sc, &res, pos); - - if (res.vr_id != VPD_RES_ID) { - aprint_error_dev("bad VPD resource id: expected %x got %x\n", - VPD_RES_ID, res.vr_id); - return; - } - - pos += sizeof(res); - sc->bge_vpd_prodname = malloc(res.vr_len + 1, M_DEVBUF, M_NOWAIT); - if (sc->bge_vpd_prodname == NULL) - panic("bge_vpd_read"); - for (i = 0; i < res.vr_len; i++) - sc->bge_vpd_prodname[i] = bge_vpd_readbyte(sc, i + pos); - sc->bge_vpd_prodname[i] = '\0'; - pos += i; - - bge_vpd_read_res(sc, &res, pos); - - if (res.vr_id != VPD_RES_READ) { - aprint_error_dev(sc->bge_dev, - "bad VPD resource id: expected %x got %x\n", - VPD_RES_READ, res.vr_id); - return; - } - - pos += sizeof(res); - sc->bge_vpd_readonly = malloc(res.vr_len, M_DEVBUF, M_NOWAIT); - if (sc->bge_vpd_readonly == NULL) - panic("bge_vpd_read"); - for (i = 0; i < res.vr_len + 1; i++) - sc->bge_vpd_readonly[i] = bge_vpd_readbyte(sc, i + pos); -} -#endif - static u_int8_t bge_nvram_getbyte(struct bge_softc *sc, int addr, u_int8_t *dest) { @@ -528,7 +721,7 @@ if (i == BGE_TIMEOUT) { aprint_error_dev(sc->bge_dev, "eeprom read timed out\n"); - return(0); + return (0); } /* Get result. */ @@ -536,7 +729,7 @@ *dest = (byte >> ((addr % 4) * 8)) & 0xFF; - return(0); + return (0); } /* @@ -556,7 +749,7 @@ *(dest + i) = byte; } - return(err ? 1 : 0); + return (err ? 1 : 0); } static int @@ -577,7 +770,7 @@ * special-cased. */ if (phy != 1) - return(0); + return (0); /* Reading with autopolling on may trigger PCI errors */ saved_autopoll = CSR_READ_4(sc, BGE_MI_MODE); @@ -612,9 +805,9 @@ } if (val & BGE_MICOMM_READFAIL) - return(0); + return (0); - return(val & 0xFFFF); + return (val & 0xFFFF); } static void @@ -681,29 +874,26 @@ BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_PORTMODE); if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) { BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_GMII); - } else { + } else BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_MII); - } - if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) { + if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_HALF_DUPLEX); - } else { + else BGE_SETBIT(sc, BGE_MAC_MODE, BGE_MACMODE_HALF_DUPLEX); - } /* * 802.3x flow control */ - if (sc->bge_flowflags & IFM_ETH_RXPAUSE) { + if (sc->bge_flowflags & IFM_ETH_RXPAUSE) BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_FLOWCTL_ENABLE); - } else { + else BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_FLOWCTL_ENABLE); - } - if (sc->bge_flowflags & IFM_ETH_TXPAUSE) { + + if (sc->bge_flowflags & IFM_ETH_TXPAUSE) BGE_SETBIT(sc, BGE_TX_MODE, BGE_TXMODE_FLOWCTL_ENABLE); - } else { + else BGE_CLRBIT(sc, BGE_TX_MODE, BGE_TXMODE_FLOWCTL_ENABLE); - } } /* @@ -877,12 +1067,12 @@ if (entry == NULL) { aprint_error_dev(sc->bge_dev, "no free jumbo buffers\n"); - return(NULL); + return (NULL); } SLIST_REMOVE_HEAD(&sc->bge_jfree_listhead, jpool_entries); SLIST_INSERT_HEAD(&sc->bge_jinuse_listhead, entry, jpool_entries); - return(sc->bge_cdata.bge_jslots[entry->slot]); + return (sc->bge_cdata.bge_jslots[entry->slot]); } /* @@ -944,14 +1134,13 @@ if (m == NULL) { MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) { - return(ENOBUFS); - } + if (m_new == NULL) + return (ENOBUFS); MCLGET(m_new, M_DONTWAIT); if (!(m_new->m_flags & M_EXT)) { m_freem(m_new); - return(ENOBUFS); + return (ENOBUFS); } m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; @@ -964,7 +1153,7 @@ m_adj(m_new, ETHER_ALIGN); if (bus_dmamap_load_mbuf(sc->bge_dmatag, dmamap, m_new, BUS_DMA_READ|BUS_DMA_NOWAIT)) - return(ENOBUFS); + return (ENOBUFS); bus_dmamap_sync(sc->bge_dmatag, dmamap, 0, dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); @@ -982,7 +1171,7 @@ sizeof (struct bge_rx_bd), BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - return(0); + return (0); } /* @@ -1000,9 +1189,8 @@ /* Allocate the mbuf. */ MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) { - return(ENOBUFS); - } + if (m_new == NULL) + return (ENOBUFS); /* Allocate the jumbo buffer */ buf = bge_jalloc(sc); @@ -1010,7 +1198,7 @@ m_freem(m_new); aprint_error_dev(sc->bge_dev, "jumbo allocation failed -- packet dropped!\n"); - return(ENOBUFS); + return (ENOBUFS); } /* Attach the buffer to the mbuf. */ @@ -1042,7 +1230,7 @@ sizeof (struct bge_rx_bd), BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - return(0); + return (0); } /* @@ -1061,7 +1249,7 @@ for (i = 0; i < BGE_SSLOTS; i++) { if (bge_newbuf_std(sc, i, NULL, 0) == ENOBUFS) - return(ENOBUFS); + return (ENOBUFS); } sc->bge_std = i - 1; @@ -1069,7 +1257,7 @@ sc->bge_flags |= BGE_RXRING_VALID; - return(0); + return (0); } static void @@ -1105,7 +1293,7 @@ for (i = 0; i < BGE_JUMBO_RX_RING_CNT; i++) { if (bge_newbuf_jumbo(sc, i, NULL) == ENOBUFS) - return(ENOBUFS); + return (ENOBUFS); }; sc->bge_jumbo = i - 1; @@ -1117,7 +1305,7 @@ bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, sc->bge_jumbo); - return(0); + return (0); } static void @@ -1189,12 +1377,14 @@ /* Initialize transmit producer index for host-memory send ring. */ sc->bge_tx_prodidx = 0; bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, sc->bge_tx_prodidx); - if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) /* 5700 b2 errata */ + /* 5700 b2 errata */ + if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, sc->bge_tx_prodidx); - /* NIC-memory send ring not used; initialize to zero. */ + /* NIC-memory send ring not used; initialize to zero. */ bge_writembx(sc, BGE_MBX_TX_NIC_PROD0_LO, 0); - if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) /* 5700 b2 errata */ + /* 5700 b2 errata */ + if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) bge_writembx(sc, BGE_MBX_TX_NIC_PROD0_LO, 0); SLIST_INIT(&sc->txdma_list); @@ -1202,7 +1392,7 @@ if (bus_dmamap_create(sc->bge_dmatag, BGE_TXDMA_MAX, BGE_NTXSEG, ETHER_MAX_LEN_JUMBO, 0, BUS_DMA_NOWAIT, &dmamap)) - return(ENOBUFS); + return (ENOBUFS); if (dmamap == NULL) panic("dmamap NULL in bge_init_tx_ring"); dma = malloc(sizeof(*dma), M_DEVBUF, M_NOWAIT); @@ -1218,7 +1408,7 @@ sc->bge_flags |= BGE_TXRING_VALID; - return(0); + return (0); } static void @@ -1328,7 +1518,7 @@ if (CSR_READ_4(sc, BGE_RXCPU_MODE) & BGE_RXCPUMODE_ROMFAIL) { aprint_error_dev(sc->bge_dev, "RX CPU self-diagnostics failed!\n"); - return(ENODEV); + return (ENODEV); } /* Clear the MAC control register */ @@ -1504,7 +1694,7 @@ /* Set the timer prescaler (always 66MHz) */ CSR_WRITE_4(sc, BGE_MISC_CFG, 65 << 1/*BGE_32BITTIME_66MHZ*/); - return(0); + return (0); } static int @@ -1597,7 +1787,7 @@ if (i == BGE_TIMEOUT) { aprint_error_dev(sc->bge_dev, "buffer manager failed to start\n"); - return(ENXIO); + return (ENXIO); } } @@ -1615,7 +1805,7 @@ if (i == BGE_TIMEOUT) { aprint_error_dev(sc->bge_dev, "flow-through queue init failed\n"); - return(ENXIO); + return (ENXIO); } /* Initialize the standard RX ring control block */ @@ -1689,7 +1879,7 @@ i = BGE_STD_RX_RING_CNT / 8; /* - * Use a value of 8 for the following chips to workaround HW errata. + * Use a value of 8 for the following chips to workaround HW errata. * Some of these chips have been added based on empirical * evidence (they don't work unless this is done). */ @@ -1711,7 +1901,7 @@ rcb_addr = BGE_MEMWIN_START + BGE_SEND_RING_RCB; for (i = 0; i < BGE_TX_RINGS_EXTSSRAM_MAX; i++) { RCB_WRITE_4(sc, rcb_addr, bge_maxlen_flags, - BGE_RCB_MAXLEN_FLAGS(0,BGE_RCB_FLAG_RING_DISABLED)); + BGE_RCB_MAXLEN_FLAGS(0, BGE_RCB_FLAG_RING_DISABLED)); RCB_WRITE_4(sc, rcb_addr, bge_nicaddr, 0); rcb_addr += sizeof(struct bge_rcb); } @@ -1799,7 +1989,7 @@ if (i == BGE_TIMEOUT) { aprint_error_dev(sc->bge_dev, "host coalescing engine failed to idle\n"); - return(ENXIO); + return (ENXIO); } /* Set up host coalescing defaults */ @@ -1840,521 +2030,158 @@ BGE_RBDCMODE_ENABLE|BGE_RBDCMODE_ATTN); /* Turn on RX list placement state machine */ - CSR_WRITE_4(sc, BGE_RXLP_MODE, BGE_RXLPMODE_ENABLE); - - /* Turn on RX list selector state machine. */ - if (!(BGE_IS_5705_OR_BEYOND(sc))) - CSR_WRITE_4(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE); - - /* Turn on DMA, clear stats */ - CSR_WRITE_4(sc, BGE_MAC_MODE, BGE_MACMODE_TXDMA_ENB| - BGE_MACMODE_RXDMA_ENB|BGE_MACMODE_RX_STATS_CLEAR| - BGE_MACMODE_TX_STATS_CLEAR|BGE_MACMODE_RX_STATS_ENB| - BGE_MACMODE_TX_STATS_ENB|BGE_MACMODE_FRMHDR_DMA_ENB| - ((sc->bge_flags & BGE_PHY_FIBER_TBI) ? BGE_PORTMODE_TBI - : BGE_PORTMODE_MII)); - - /* Set misc. local control, enable interrupts on attentions */ - sc->bge_local_ctrl_reg = BGE_MLC_INTR_ONATTN | BGE_MLC_AUTO_EEPROM; - -#ifdef notdef - /* Assert GPIO pins for PHY reset */ - BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUT0| - BGE_MLC_MISCIO_OUT1|BGE_MLC_MISCIO_OUT2); - BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUTEN0| - BGE_MLC_MISCIO_OUTEN1|BGE_MLC_MISCIO_OUTEN2); -#endif - -#if defined(not_quite_yet) - /* Linux driver enables enable gpio pin #1 on 5700s */ - if (sc->bge_chipid == BGE_CHIPID_BCM5700) { - sc->bge_local_ctrl_reg |= - (BGE_MLC_MISCIO_OUT1|BGE_MLC_MISCIO_OUTEN1); - } -#endif - CSR_WRITE_4(sc, BGE_MISC_LOCAL_CTL, sc->bge_local_ctrl_reg); - - /* Turn on DMA completion state machine */ - if (!(BGE_IS_5705_OR_BEYOND(sc))) - CSR_WRITE_4(sc, BGE_DMAC_MODE, BGE_DMACMODE_ENABLE); - - /* Turn on write DMA state machine */ - { - uint32_t bge_wdma_mode = - BGE_WDMAMODE_ENABLE|BGE_WDMAMODE_ALL_ATTNS; - - /* Enable host coalescing bug fix; see Linux tg3.c */ - if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5755 || - BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5787) - bge_wdma_mode |= (1 << 29); - - CSR_WRITE_4(sc, BGE_WDMA_MODE, bge_wdma_mode); - } - - /* Turn on read DMA state machine */ - { - uint32_t dma_read_modebits; - - dma_read_modebits = - BGE_RDMAMODE_ENABLE | BGE_RDMAMODE_ALL_ATTNS; - - if ((sc->bge_flags & BGE_PCIE) && 0) { - dma_read_modebits |= BGE_RDMA_MODE_FIFO_LONG_BURST; - } else if (BGE_IS_5705_OR_BEYOND(sc)) { - dma_read_modebits |= BGE_RDMA_MODE_FIFO_SIZE_128; - } - - /* XXX broadcom-supplied linux driver; undocumented */ - if (BGE_IS_5750_OR_BEYOND(sc)) { - /* - * XXX: magic values. - * From Broadcom-supplied Linux driver; apparently - * required to workaround a DMA bug affecting TSO - * on bcm575x/bcm5721? - */ - dma_read_modebits |= (1 << 27); - } - CSR_WRITE_4(sc, BGE_RDMA_MODE, dma_read_modebits); - } - - /* Turn on RX data completion state machine */ - CSR_WRITE_4(sc, BGE_RDC_MODE, BGE_RDCMODE_ENABLE); - - /* Turn on RX BD initiator state machine */ - CSR_WRITE_4(sc, BGE_RBDI_MODE, BGE_RBDIMODE_ENABLE); - - /* Turn on RX data and RX BD initiator state machine */ - CSR_WRITE_4(sc, BGE_RDBDI_MODE, BGE_RDBDIMODE_ENABLE); - - /* Turn on Mbuf cluster free state machine */ - if (!(BGE_IS_5705_OR_BEYOND(sc))) - CSR_WRITE_4(sc, BGE_MBCF_MODE, BGE_MBCFMODE_ENABLE); - - /* Turn on send BD completion state machine */ - CSR_WRITE_4(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); - - /* Turn on send data completion state machine */ - CSR_WRITE_4(sc, BGE_SDC_MODE, BGE_SDCMODE_ENABLE); - - /* Turn on send data initiator state machine */ - if (BGE_IS_5750_OR_BEYOND(sc)) { - /* XXX: magic value from Linux driver */ - CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE | 0x08); - } else { - CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); - } - - /* Turn on send BD initiator state machine */ - CSR_WRITE_4(sc, BGE_SBDI_MODE, BGE_SBDIMODE_ENABLE); - - /* Turn on send BD selector state machine */ - CSR_WRITE_4(sc, BGE_SRS_MODE, BGE_SRSMODE_ENABLE); - - CSR_WRITE_4(sc, BGE_SDI_STATS_ENABLE_MASK, 0x007FFFFF); - CSR_WRITE_4(sc, BGE_SDI_STATS_CTL, - BGE_SDISTATSCTL_ENABLE|BGE_SDISTATSCTL_FASTER); - - /* ack/clear link change events */ - CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED| - BGE_MACSTAT_CFG_CHANGED); - CSR_WRITE_4(sc, BGE_MI_STS, 0); - - /* Enable PHY auto polling (for MII/GMII only) */ - if (sc->bge_flags & BGE_PHY_FIBER_TBI) { - CSR_WRITE_4(sc, BGE_MI_STS, BGE_MISTS_LINK); - } else { - BGE_SETBIT(sc, BGE_MI_MODE, BGE_MIMODE_AUTOPOLL|10<<16); - if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5700) - CSR_WRITE_4(sc, BGE_MAC_EVT_ENB, - BGE_EVTENB_MI_INTERRUPT); - } - - /* Enable link state change attentions. */ - BGE_SETBIT(sc, BGE_MAC_EVT_ENB, BGE_EVTENB_LINK_CHANGED); - - return(0); -} - -static const struct bge_revision { - uint32_t br_chipid; - const char *br_name; -} bge_revisions[] = { - { BGE_CHIPID_BCM5700_A0, "BCM5700 A0" }, - - { BGE_CHIPID_BCM5700_A1, "BCM5700 A1" }, - - { BGE_CHIPID_BCM5700_B0, "BCM5700 B0" }, - - { BGE_CHIPID_BCM5700_B1, "BCM5700 B1" }, - - { BGE_CHIPID_BCM5700_B2, "BCM5700 B2" }, - - { BGE_CHIPID_BCM5700_B3, "BCM5700 B3" }, - - /* This is treated like a BCM5700 Bx */ - { BGE_CHIPID_BCM5700_ALTIMA, "BCM5700 Altima" }, - - { BGE_CHIPID_BCM5700_C0, "BCM5700 C0" }, - - { BGE_CHIPID_BCM5701_A0, "BCM5701 A0" }, - - { BGE_CHIPID_BCM5701_B0, "BCM5701 B0" }, - - { BGE_CHIPID_BCM5701_B2, "BCM5701 B2" }, - - { BGE_CHIPID_BCM5701_B5, "BCM5701 B5" }, - - { BGE_CHIPID_BCM5703_A0, "BCM5703 A0" }, - - { BGE_CHIPID_BCM5703_A1, "BCM5703 A1" }, - - { BGE_CHIPID_BCM5703_A2, "BCM5703 A2" }, - - { BGE_CHIPID_BCM5703_A3, "BCM5703 A3" }, - - { BGE_CHIPID_BCM5703_B0, "BCM5703 B0" }, - - { BGE_CHIPID_BCM5704_A0, "BCM5704 A0" }, - - { BGE_CHIPID_BCM5704_A1, "BCM5704 A1" }, - - { BGE_CHIPID_BCM5704_A2, "BCM5704 A2" }, - - { BGE_CHIPID_BCM5704_A3, "BCM5704 A3" }, - - { BGE_CHIPID_BCM5705_A0, "BCM5705 A0" }, - - { BGE_CHIPID_BCM5705_A1, "BCM5705 A1" }, - - { BGE_CHIPID_BCM5705_A2, "BCM5705 A2" }, - - { BGE_CHIPID_BCM5705_A3, "BCM5705 A3" }, - - { BGE_CHIPID_BCM5750_A0, "BCM5750 A0" }, - - { BGE_CHIPID_BCM5750_A1, "BCM5750 A1" }, - - { BGE_CHIPID_BCM5751_A1, "BCM5751 A1" }, - - { BGE_CHIPID_BCM5752_A0, "BCM5752 A0" }, - - { BGE_CHIPID_BCM5752_A1, "BCM5752 A1" }, - - { BGE_CHIPID_BCM5752_A2, "BCM5752 A2" }, - - { BGE_CHIPID_BCM5755_A0, "BCM5755 A0" }, - - { BGE_CHIPID_BCM5755_A1, "BCM5755 A1" }, - - { BGE_CHIPID_BCM5755_A2, "BCM5755 A2" }, - - { BGE_CHIPID_BCM5755_C0, "BCM5755 C0" }, - - { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" }, - - { BGE_CHIPID_BCM5787_A1, "BCM5754/5787 A1" }, - - { BGE_CHIPID_BCM5787_A2, "BCM5754/5787 A2" }, - - { 0, NULL } -}; - -/* - * Some defaults for major revisions, so that newer steppings - * that we don't know about have a shot at working. - */ -static const struct bge_revision bge_majorrevs[] = { - { BGE_ASICREV_BCM5700, "unknown BCM5700" }, - - { BGE_ASICREV_BCM5701, "unknown BCM5701" }, - - { BGE_ASICREV_BCM5703, "unknown BCM5703" }, - - { BGE_ASICREV_BCM5704, "unknown BCM5704" }, - - { BGE_ASICREV_BCM5705, "unknown BCM5705" }, - - { BGE_ASICREV_BCM5750, "unknown BCM575x family" }, - - { BGE_ASICREV_BCM5714_A0, "unknown BCM5714" }, - - { BGE_ASICREV_BCM5714, "unknown BCM5714" }, - - { BGE_ASICREV_BCM5752, "unknown BCM5752 family" }, - - { BGE_ASICREV_BCM5755, "unknown BCM5755" }, - - { BGE_ASICREV_BCM5780, "unknown BCM5780" }, - - { BGE_ASICREV_BCM5787, "unknown BCM5787" }, - - { BGE_ASICREV_BCM5906, "unknown BCM5906" }, - - { 0, NULL } -}; - - -static const struct bge_revision * -bge_lookup_rev(uint32_t chipid) -{ - const struct bge_revision *br; - - for (br = bge_revisions; br->br_name != NULL; br++) { - if (br->br_chipid == chipid) - return (br); - } - - for (br = bge_majorrevs; br->br_name != NULL; br++) { - if (br->br_chipid == BGE_ASICREV(chipid)) - return (br); - } - - return (NULL); -} - -static const struct bge_product { - pci_vendor_id_t bp_vendor; - pci_product_id_t bp_product; - const char *bp_name; -} bge_products[] = { - /* - * The BCM5700 documentation seems to indicate that the hardware - * still has the Alteon vendor ID burned into it, though it - * should always be overridden by the value in the EEPROM. We'll - * check for it anyway. - */ - { PCI_VENDOR_ALTEON, - PCI_PRODUCT_ALTEON_BCM5700, - "Broadcom BCM5700 Gigabit Ethernet", - }, - { PCI_VENDOR_ALTEON, - PCI_PRODUCT_ALTEON_BCM5701, - "Broadcom BCM5701 Gigabit Ethernet", - }, - - { PCI_VENDOR_ALTIMA, - PCI_PRODUCT_ALTIMA_AC1000, - "Altima AC1000 Gigabit Ethernet", - }, - { PCI_VENDOR_ALTIMA, - PCI_PRODUCT_ALTIMA_AC1001, - "Altima AC1001 Gigabit Ethernet", - }, - { PCI_VENDOR_ALTIMA, - PCI_PRODUCT_ALTIMA_AC9100, - "Altima AC9100 Gigabit Ethernet", - }, - - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5700, - "Broadcom BCM5700 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5701, - "Broadcom BCM5701 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5702, - "Broadcom BCM5702 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5702X, - "Broadcom BCM5702X Gigabit Ethernet" }, - - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5703, - "Broadcom BCM5703 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5703X, - "Broadcom BCM5703X Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5703_ALT, - "Broadcom BCM5703 Gigabit Ethernet", - }, - - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5704C, - "Broadcom BCM5704C Dual Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5704S, - "Broadcom BCM5704S Dual Gigabit Ethernet", - }, - - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5705, - "Broadcom BCM5705 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5705K, - "Broadcom BCM5705K Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5705M, - "Broadcom BCM5705M Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5705M_ALT, - "Broadcom BCM5705M Gigabit Ethernet", - }, + CSR_WRITE_4(sc, BGE_RXLP_MODE, BGE_RXLPMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5714, - "Broadcom BCM5714/5715 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5715, - "Broadcom BCM5714/5715 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5789, - "Broadcom BCM5789 Gigabit Ethernet", - }, + /* Turn on RX list selector state machine. */ + if (!(BGE_IS_5705_OR_BEYOND(sc))) + CSR_WRITE_4(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5721, - "Broadcom BCM5721 Gigabit Ethernet", - }, + /* Turn on DMA, clear stats */ + CSR_WRITE_4(sc, BGE_MAC_MODE, BGE_MACMODE_TXDMA_ENB| + BGE_MACMODE_RXDMA_ENB|BGE_MACMODE_RX_STATS_CLEAR| + BGE_MACMODE_TX_STATS_CLEAR|BGE_MACMODE_RX_STATS_ENB| + BGE_MACMODE_TX_STATS_ENB|BGE_MACMODE_FRMHDR_DMA_ENB| + ((sc->bge_flags & BGE_PHY_FIBER_TBI) ? BGE_PORTMODE_TBI + : BGE_PORTMODE_MII)); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5722, - "Broadcom BCM5722 Gigabit Ethernet", - }, + /* Set misc. local control, enable interrupts on attentions */ + sc->bge_local_ctrl_reg = BGE_MLC_INTR_ONATTN | BGE_MLC_AUTO_EEPROM; - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5750, - "Broadcom BCM5750 Gigabit Ethernet", - }, +#ifdef notdef + /* Assert GPIO pins for PHY reset */ + BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUT0| + BGE_MLC_MISCIO_OUT1|BGE_MLC_MISCIO_OUT2); + BGE_SETBIT(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_MISCIO_OUTEN0| + BGE_MLC_MISCIO_OUTEN1|BGE_MLC_MISCIO_OUTEN2); +#endif - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5750M, - "Broadcom BCM5750M Gigabit Ethernet", - }, +#if defined(not_quite_yet) + /* Linux driver enables enable gpio pin #1 on 5700s */ + if (sc->bge_chipid == BGE_CHIPID_BCM5700) { + sc->bge_local_ctrl_reg |= + (BGE_MLC_MISCIO_OUT1|BGE_MLC_MISCIO_OUTEN1); + } +#endif + CSR_WRITE_4(sc, BGE_MISC_LOCAL_CTL, sc->bge_local_ctrl_reg); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5751, - "Broadcom BCM5751 Gigabit Ethernet", - }, + /* Turn on DMA completion state machine */ + if (!(BGE_IS_5705_OR_BEYOND(sc))) + CSR_WRITE_4(sc, BGE_DMAC_MODE, BGE_DMACMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5751M, - "Broadcom BCM5751M Gigabit Ethernet", - }, + /* Turn on write DMA state machine */ + { + uint32_t bge_wdma_mode = + BGE_WDMAMODE_ENABLE|BGE_WDMAMODE_ALL_ATTNS; - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5752, - "Broadcom BCM5752 Gigabit Ethernet", - }, + /* Enable host coalescing bug fix; see Linux tg3.c */ + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5755 || + BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5787) + bge_wdma_mode |= (1 << 29); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5752M, - "Broadcom BCM5752M Gigabit Ethernet", - }, + CSR_WRITE_4(sc, BGE_WDMA_MODE, bge_wdma_mode); + } - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5753, - "Broadcom BCM5753 Gigabit Ethernet", - }, + /* Turn on read DMA state machine */ + { + uint32_t dma_read_modebits; - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5753M, - "Broadcom BCM5753M Gigabit Ethernet", - }, + dma_read_modebits = + BGE_RDMAMODE_ENABLE | BGE_RDMAMODE_ALL_ATTNS; - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5754, - "Broadcom BCM5754 Gigabit Ethernet", - }, + if ((sc->bge_flags & BGE_PCIE) && 0) { + dma_read_modebits |= BGE_RDMA_MODE_FIFO_LONG_BURST; + } else if (BGE_IS_5705_OR_BEYOND(sc)) { + dma_read_modebits |= BGE_RDMA_MODE_FIFO_SIZE_128; + } - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5754M, - "Broadcom BCM5754M Gigabit Ethernet", - }, + /* XXX broadcom-supplied linux driver; undocumented */ + if (BGE_IS_5750_OR_BEYOND(sc)) { + /* + * XXX: magic values. + * From Broadcom-supplied Linux driver; apparently + * required to workaround a DMA bug affecting TSO + * on bcm575x/bcm5721? + */ + dma_read_modebits |= (1 << 27); + } + CSR_WRITE_4(sc, BGE_RDMA_MODE, dma_read_modebits); + } - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5755, - "Broadcom BCM5755 Gigabit Ethernet", - }, + /* Turn on RX data completion state machine */ + CSR_WRITE_4(sc, BGE_RDC_MODE, BGE_RDCMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5755M, - "Broadcom BCM5755M Gigabit Ethernet", - }, + /* Turn on RX BD initiator state machine */ + CSR_WRITE_4(sc, BGE_RBDI_MODE, BGE_RBDIMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5780, - "Broadcom BCM5780 Gigabit Ethernet", - }, + /* Turn on RX data and RX BD initiator state machine */ + CSR_WRITE_4(sc, BGE_RDBDI_MODE, BGE_RDBDIMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5780S, - "Broadcom BCM5780S Gigabit Ethernet", - }, + /* Turn on Mbuf cluster free state machine */ + if (!(BGE_IS_5705_OR_BEYOND(sc))) + CSR_WRITE_4(sc, BGE_MBCF_MODE, BGE_MBCFMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5782, - "Broadcom BCM5782 Gigabit Ethernet", - }, + /* Turn on send BD completion state machine */ + CSR_WRITE_4(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5786, - "Broadcom BCM5786 Gigabit Ethernet", - }, + /* Turn on send data completion state machine */ + CSR_WRITE_4(sc, BGE_SDC_MODE, BGE_SDCMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5787, - "Broadcom BCM5787 Gigabit Ethernet", - }, + /* Turn on send data initiator state machine */ + if (BGE_IS_5750_OR_BEYOND(sc)) { + /* XXX: magic value from Linux driver */ + CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE | 0x08); + } else { + CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); + } - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5787M, - "Broadcom BCM5787M Gigabit Ethernet", - }, + /* Turn on send BD initiator state machine */ + CSR_WRITE_4(sc, BGE_SBDI_MODE, BGE_SBDIMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5788, - "Broadcom BCM5788 Gigabit Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5789, - "Broadcom BCM5789 Gigabit Ethernet", - }, + /* Turn on send BD selector state machine */ + CSR_WRITE_4(sc, BGE_SRS_MODE, BGE_SRSMODE_ENABLE); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5901, - "Broadcom BCM5901 Fast Ethernet", - }, - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5901A2, - "Broadcom BCM5901A2 Fast Ethernet", - }, + CSR_WRITE_4(sc, BGE_SDI_STATS_ENABLE_MASK, 0x007FFFFF); + CSR_WRITE_4(sc, BGE_SDI_STATS_CTL, + BGE_SDISTATSCTL_ENABLE|BGE_SDISTATSCTL_FASTER); - { PCI_VENDOR_SCHNEIDERKOCH, - PCI_PRODUCT_SCHNEIDERKOCH_SK_9DX1, - "SysKonnect SK-9Dx1 Gigabit Ethernet", - }, + /* ack/clear link change events */ + CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED| + BGE_MACSTAT_CFG_CHANGED); + CSR_WRITE_4(sc, BGE_MI_STS, 0); - { PCI_VENDOR_3COM, - PCI_PRODUCT_3COM_3C996, - "3Com 3c996 Gigabit Ethernet", - }, + /* Enable PHY auto polling (for MII/GMII only) */ + if (sc->bge_flags & BGE_PHY_FIBER_TBI) { + CSR_WRITE_4(sc, BGE_MI_STS, BGE_MISTS_LINK); + } else { + BGE_SETBIT(sc, BGE_MI_MODE, BGE_MIMODE_AUTOPOLL|10<<16); + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5700) + CSR_WRITE_4(sc, BGE_MAC_EVT_ENB, + BGE_EVTENB_MI_INTERRUPT); + } - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5906, - "Broadcom BCM5906 Fast Ethernet", - }, + /* Enable link state change attentions. */ + BGE_SETBIT(sc, BGE_MAC_EVT_ENB, BGE_EVTENB_LINK_CHANGED); - { PCI_VENDOR_BROADCOM, - PCI_PRODUCT_BROADCOM_BCM5906M, - "Broadcom BCM5906M Fast Ethernet", - }, + return (0); +} - { 0, - 0, - NULL }, -}; +static const struct bge_revision * +bge_lookup_rev(uint32_t chipid) +{ + const struct bge_revision *br; + + for (br = bge_revisions; br->br_name != NULL; br++) { + if (br->br_chipid == chipid) + return (br); + } + + for (br = bge_majorrevs; br->br_name != NULL; br++) { + if (br->br_chipid == BGE_ASICREV(chipid)) + return (br); + } + + return (NULL); +} static const struct bge_product * bge_lookup(const struct pci_attach_args *pa) @@ -3832,7 +3659,7 @@ error = bus_dmamap_load_mbuf(sc->bge_dmatag, dmamap, m_head, BUS_DMA_NOWAIT); if (error) { - return(ENOBUFS); + return (ENOBUFS); } /* * Sanity check: avoid coming within 16 descriptors @@ -3912,9 +3739,9 @@ *txidx = frag; - return(0); + return (0); - fail_unload: +fail_unload: bus_dmamap_unload(sc->bge_dmatag, dmamap); return ENOBUFS; @@ -3991,7 +3818,8 @@ /* Transmit */ bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); - if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) /* 5700 b2 errata */ + /* 5700 b2 errata */ + if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5700_BX) bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); sc->bge_tx_prodidx = prodidx; @@ -4108,7 +3936,7 @@ /* If this is a 1000baseX NIC, enable the TBI port. */ if (sc->bge_flags & BGE_PHY_FIBER_TBI) { if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) - return(EINVAL); + return (EINVAL); switch(IFM_SUBTYPE(ifm->ifm_media)) { case IFM_AUTO: break; @@ -4122,10 +3950,10 @@ } break; default: - return(EINVAL); + return (EINVAL); } /* XXX 802.3x flow control for 1000BASE-SX */ - return(0); + return (0); } sc->bge_link = 0; @@ -4251,7 +4079,7 @@ splx(s); - return(error); + return (error); } static void