summaryrefslogtreecommitdiffstats
path: root/sys/dev/bge/if_bge.c
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2010-01-14 19:08:43 +0000
committeryongari <yongari@FreeBSD.org>2010-01-14 19:08:43 +0000
commitf7e4a5787f639b612b99b87269f5a468eba6f33e (patch)
tree7edb6f18ed4984039950893dd23dfa68f651b316 /sys/dev/bge/if_bge.c
parent79a6a9e7ebbed3741457d842876c8556ee9d210c (diff)
downloadFreeBSD-src-f7e4a5787f639b612b99b87269f5a468eba6f33e.zip
FreeBSD-src-f7e4a5787f639b612b99b87269f5a468eba6f33e.tar.gz
For controllers that has dual mode PHY(copper or fiber) interfaces
over GMII, make sure to enable GMII. With this change brgphy(4) is used to handle the dual mode PHY. Since we still don't have a sane way to pass PHY specific information to mii(4) layer special handling is needed in brgphy(4) to determine which mode of PHY was configured in parent interface. This change make BCM5715S work. Tested by: olli Obtained from: OpenBSD MFC after: 1 week
Diffstat (limited to 'sys/dev/bge/if_bge.c')
-rw-r--r--sys/dev/bge/if_bge.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 957e4ad..85f0302 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -902,7 +902,8 @@ bge_miibus_statchg(device_t dev)
mii = device_get_softc(sc->bge_miibus);
BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_PORTMODE);
- if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
+ if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T ||
+ IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX)
BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_GMII);
else
BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_MII);
@@ -1783,13 +1784,20 @@ bge_blockinit(struct bge_softc *sc)
if (!(BGE_IS_5705_PLUS(sc)))
CSR_WRITE_4(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE);
+ val = 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;
+
+ if (sc->bge_flags & BGE_FLAG_TBI)
+ val |= BGE_PORTMODE_TBI;
+ else if (sc->bge_flags & BGE_FLAG_MII_SERDES)
+ val |= BGE_PORTMODE_GMII;
+ else
+ val |= BGE_PORTMODE_MII;
+
/* 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_FLAG_TBI) ?
- BGE_PORTMODE_TBI : BGE_PORTMODE_MII));
+ CSR_WRITE_4(sc, BGE_MAC_MODE, val);
/* Set misc. local control, enable interrupts on attentions */
CSR_WRITE_4(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_INTR_ONATTN);
@@ -2851,12 +2859,14 @@ bge_attach(device_t dev)
hwcfg = ntohl(hwcfg);
}
- if ((hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER)
- sc->bge_flags |= BGE_FLAG_TBI;
-
/* The SysKonnect SK-9D41 is a 1000baseSX card. */
- if ((pci_read_config(dev, BGE_PCI_SUBSYS, 4) >> 16) == SK_SUBSYSID_9D41)
- sc->bge_flags |= BGE_FLAG_TBI;
+ if ((pci_read_config(dev, BGE_PCI_SUBSYS, 4) >> 16) ==
+ SK_SUBSYSID_9D41 || (hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER) {
+ if (BGE_IS_5714_FAMILY(sc))
+ sc->bge_flags |= BGE_FLAG_MII_SERDES;
+ else
+ sc->bge_flags |= BGE_FLAG_TBI;
+ }
if (sc->bge_flags & BGE_FLAG_TBI) {
ifmedia_init(&sc->bge_ifmedia, IFM_IMASK, bge_ifmedia_upd,
OpenPOWER on IntegriCloud