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