*** if_dc.c.orig Fri Mar 10 21:20:56 2000 --- if_dc.c Mon May 29 20:00:13 2000 *************** *** 1206,1213 **** } if (IFM_SUBTYPE(media) == IFM_100_TX) { - DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL); - DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT); if (sc->dc_pmode == DC_PMODE_MII) { DC_SETBIT(sc, DC_WATCHDOG, DC_WDOG_JABBERDIS); DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_PCS| --- 1206,1211 ---- *************** *** 1224,1237 **** DC_PN_GPIO_SETBIT(sc, DC_PN_GPIO_100TX_LOOP); DC_SETBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL); } ! DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL| ! DC_NETCFG_PCS|DC_NETCFG_SCRAMBLER); } } if (IFM_SUBTYPE(media) == IFM_10_T) { - DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL); - DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT); if (sc->dc_pmode == DC_PMODE_MII) { DC_SETBIT(sc, DC_WATCHDOG, DC_WDOG_JABBERDIS); DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_PCS| --- 1222,1236 ---- DC_PN_GPIO_SETBIT(sc, DC_PN_GPIO_100TX_LOOP); DC_SETBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL); } ! DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL); ! DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PCS); ! DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_SCRAMBLER); } + DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL); + DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT); } if (IFM_SUBTYPE(media) == IFM_10_T) { if (sc->dc_pmode == DC_PMODE_MII) { DC_SETBIT(sc, DC_WATCHDOG, DC_WDOG_JABBERDIS); DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_PCS| *************** *** 1248,1256 **** DC_CLRBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL); } DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL); DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SCRAMBLER); - DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_PCS); } } /* --- 1247,1257 ---- DC_CLRBIT(sc, DC_PN_NWAY, DC_PN_NWAY_SPEEDSEL); } DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL); + DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PCS); DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_SCRAMBLER); } + DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_SPEEDSEL); + DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_HEARTBEAT); } /* *************** *** 1516,1522 **** case DC_DEVICEID_21143: sc->dc_type = DC_TYPE_21143; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; ! sc->dc_flags |= DC_REDUCED_MII_POLL; break; case DC_DEVICEID_DM9100: case DC_DEVICEID_DM9102: --- 1517,1523 ---- case DC_DEVICEID_21143: sc->dc_type = DC_TYPE_21143; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; ! sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY; break; case DC_DEVICEID_DM9100: case DC_DEVICEID_DM9102: *************** *** 1541,1559 **** case DC_DEVICEID_98713_CP: if (revision < DC_REVISION_98713A) { sc->dc_type = DC_TYPE_98713; - sc->dc_flags |= DC_REDUCED_MII_POLL; } ! if (revision >= DC_REVISION_98713A) sc->dc_type = DC_TYPE_98713A; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; break; case DC_DEVICEID_987x5: sc->dc_type = DC_TYPE_987x5; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; break; case DC_DEVICEID_82C115: sc->dc_type = DC_TYPE_PNICII; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; break; case DC_DEVICEID_82C168: sc->dc_type = DC_TYPE_PNIC; --- 1542,1564 ---- case DC_DEVICEID_98713_CP: if (revision < DC_REVISION_98713A) { sc->dc_type = DC_TYPE_98713; } ! if (revision >= DC_REVISION_98713A) { sc->dc_type = DC_TYPE_98713A; + sc->dc_flags |= DC_21143_NWAY; + } + sc->dc_flags |= DC_REDUCED_MII_POLL; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; break; case DC_DEVICEID_987x5: sc->dc_type = DC_TYPE_987x5; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; + sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY; break; case DC_DEVICEID_82C115: sc->dc_type = DC_TYPE_PNICII; sc->dc_flags |= DC_TX_POLL|DC_TX_USE_TX_INTR; + sc->dc_flags |= DC_REDUCED_MII_POLL|DC_21143_NWAY; break; case DC_DEVICEID_82C168: sc->dc_type = DC_TYPE_PNIC; *************** *** 2281,2293 **** mii = device_get_softc(sc->dc_miibus); if (sc->dc_flags & DC_REDUCED_MII_POLL) { ! r = CSR_READ_4(sc, DC_ISR); ! if (DC_IS_INTEL(sc)) { ! if (r & DC_ISR_LINKFAIL) sc->dc_link = 0; if (sc->dc_link == 0) mii_tick(mii); } else { if ((r & DC_ISR_RX_STATE) == DC_RXSTATE_WAIT && sc->dc_cdata.dc_tx_prod == 0) mii_tick(mii); --- 2286,2307 ---- mii = device_get_softc(sc->dc_miibus); if (sc->dc_flags & DC_REDUCED_MII_POLL) { ! if (sc->dc_flags & DC_21143_NWAY) { ! r = CSR_READ_4(sc, DC_10BTSTAT); ! if (IFM_SUBTYPE(mii->mii_media_active) == ! IFM_100_TX && (r & DC_TSTAT_LS100)) { sc->dc_link = 0; + mii_mediachg(mii); + } + if (IFM_SUBTYPE(mii->mii_media_active) == + IFM_10_T && (r & DC_TSTAT_LS10)) { + sc->dc_link = 0; + mii_mediachg(mii); + } if (sc->dc_link == 0) mii_tick(mii); } else { + r = CSR_READ_4(sc, DC_ISR); if ((r & DC_ISR_RX_STATE) == DC_RXSTATE_WAIT && sc->dc_cdata.dc_tx_prod == 0) mii_tick(mii); *************** *** 2324,2330 **** } } ! sc->dc_stat_ch = timeout(dc_tick, sc, hz); splx(s); --- 2338,2347 ---- } } ! if (sc->dc_flags & DC_21143_NWAY && !sc->dc_link) ! sc->dc_stat_ch = timeout(dc_tick, sc, hz/10); ! else ! sc->dc_stat_ch = timeout(dc_tick, sc, hz); splx(s); *************** *** 2715,2721 **** (void)splx(s); ! sc->dc_stat_ch = timeout(dc_tick, sc, hz); #ifdef __alpha__ if(sc->dc_srm_media) { --- 2732,2741 ---- (void)splx(s); ! if (sc->dc_flags & DC_21143_NWAY) ! sc->dc_stat_ch = timeout(dc_tick, sc, hz/10); ! else ! sc->dc_stat_ch = timeout(dc_tick, sc, hz); #ifdef __alpha__ if(sc->dc_srm_media) { *** if_dcreg.h.orig Fri Mar 10 21:20:56 2000 --- if_dcreg.h Mon May 29 19:58:30 2000 *************** *** 671,676 **** --- 671,677 ---- #define DC_TX_STORENFWD 0x00000100 #define DC_REDUCED_MII_POLL 0x00000200 #define DC_TX_INTR_ALWAYS 0x00000400 + #define DC_21143_NWAY 0x00000800 /* * register space access macros