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);
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);
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_get_subvendor(dev) == PCI_PRODUCT_SCHNEIDERKOCH_SK_9D41)
- sc->bge_flags |= BGE_FLAG_TBI;
+ if (pci_get_subvendor(dev) == PCI_PRODUCT_SCHNEIDERKOCH_SK_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,