Index: if_bge.c =================================================================== RCS file: /home/ncvs/src/sys/dev/bge/if_bge.c,v retrieving revision 1.86 diff -u -r1.86 if_bge.c --- if_bge.c 5 May 2005 03:37:27 -0000 1.86 +++ if_bge.c 19 May 2005 17:23:32 -0000 @@ -32,7 +32,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.86 2005/05/05 03:37:27 dwhite Exp $"); +__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/dev/bge/if_bge.c,v 1.85 2005/04/24 02:45:27 scottl Exp $"); /* * Broadcom BCM570x family gigabit ethernet driver for FreeBSD. @@ -3431,10 +3431,34 @@ /* If this is a 1000baseX NIC, enable the TBI port. */ if (sc->bge_tbi) { + uint32_t sgdig; if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) return(EINVAL); switch(IFM_SUBTYPE(ifm->ifm_media)) { case IFM_AUTO: + /* + * The BCM5704 ASIC appears to have a special + * mechanism for programming the autoneg + * advertisement registers in TBI mode. + */ + if(sc->bge_asicrev == BGE_ASICREV_BCM5704) { + switch(sc->bge_chipid) { + case BGE_CHIPID_BCM5704_A0: + case BGE_CHIPID_BCM5704_A1: + case BGE_CHIPID_BCM5704_A2: + break; + default: /* apply fix for newer chips */ + CSR_WRITE_4(sc, BGE_TX_TBI_AUTONEG, 0); + sgdig = CSR_READ_4(sc, BGE_SGDIG_CFG); + sgdig |= BGE_SGDIGCFG_AUTO| + BGE_SGDIGCFG_PAUSE_CAP| + BGE_SGDIGCFG_ASYM_PAUSE; + CSR_WRITE_4(sc, BGE_SGDIG_CFG, + sgdig|BGE_SGDIGCFG_SEND); + DELAY(5); + CSR_WRITE_4(sc, BGE_SGDIG_CFG, sgdig); + } + } break; case IFM_1000_SX: if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {