dcphy.c revision 105135
154134Swpaul/* 254134Swpaul * Copyright (c) 1997, 1998, 1999 354134Swpaul * Bill Paul <wpaul@ee.columbia.edu>. All rights reserved. 454134Swpaul * 554134Swpaul * Redistribution and use in source and binary forms, with or without 654134Swpaul * modification, are permitted provided that the following conditions 754134Swpaul * are met: 854134Swpaul * 1. Redistributions of source code must retain the above copyright 954134Swpaul * notice, this list of conditions and the following disclaimer. 1054134Swpaul * 2. Redistributions in binary form must reproduce the above copyright 1154134Swpaul * notice, this list of conditions and the following disclaimer in the 1254134Swpaul * documentation and/or other materials provided with the distribution. 1354134Swpaul * 3. All advertising materials mentioning features or use of this software 1454134Swpaul * must display the following acknowledgement: 1554134Swpaul * This product includes software developed by Bill Paul. 1654134Swpaul * 4. Neither the name of the author nor the names of any co-contributors 1754134Swpaul * may be used to endorse or promote products derived from this software 1854134Swpaul * without specific prior written permission. 1954134Swpaul * 2054134Swpaul * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 2154134Swpaul * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2254134Swpaul * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2354134Swpaul * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 2454134Swpaul * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2554134Swpaul * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2654134Swpaul * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2754134Swpaul * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2854134Swpaul * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2954134Swpaul * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 3054134Swpaul * THE POSSIBILITY OF SUCH DAMAGE. 3154134Swpaul * 3254134Swpaul * $FreeBSD: head/sys/dev/dc/dcphy.c 105135 2002-10-14 22:31:52Z alfred $ 3354134Swpaul */ 3454134Swpaul 3554134Swpaul/* 3654134Swpaul * Pseudo-driver for internal NWAY support on DEC 21143 and workalike 3754134Swpaul * controllers. Technically we're abusing the miibus code to handle 3854134Swpaul * media selection and NWAY support here since there is no MII 3954134Swpaul * interface. However the logical operations are roughly the same, 4054134Swpaul * and the alternative is to create a fake MII interface in the driver, 4154134Swpaul * which is harder to do. 4254134Swpaul */ 4354134Swpaul 4454134Swpaul#include <sys/param.h> 4554134Swpaul#include <sys/systm.h> 4654134Swpaul#include <sys/kernel.h> 4754134Swpaul#include <sys/socket.h> 4854134Swpaul#include <sys/errno.h> 4974914Sjhb#include <sys/lock.h> 5054134Swpaul#include <sys/module.h> 5167365Sjhb#include <sys/mutex.h> 5254134Swpaul#include <sys/bus.h> 5354134Swpaul 5454134Swpaul#include <net/if.h> 5554134Swpaul#include <net/if_arp.h> 5654134Swpaul#include <net/if_media.h> 5754134Swpaul 5854134Swpaul#include <dev/mii/mii.h> 5954134Swpaul#include <dev/mii/miivar.h> 6054134Swpaul#include <dev/mii/miidevs.h> 6154134Swpaul 6254134Swpaul#include <machine/bus_pio.h> 6354134Swpaul#include <machine/bus_memio.h> 6454134Swpaul#include <machine/bus.h> 6554134Swpaul#include <machine/resource.h> 6654134Swpaul#include <sys/bus.h> 6754134Swpaul 6854134Swpaul#include <pci/pcivar.h> 6954134Swpaul 7054134Swpaul#include <pci/if_dcreg.h> 7154134Swpaul 7254134Swpaul#include "miibus_if.h" 7354134Swpaul 7454134Swpaul#if !defined(lint) 7554134Swpaulstatic const char rcsid[] = 7654134Swpaul "$FreeBSD: head/sys/dev/dc/dcphy.c 105135 2002-10-14 22:31:52Z alfred $"; 7754134Swpaul#endif 7854134Swpaul 7954134Swpaul#define DC_SETBIT(sc, reg, x) \ 8054134Swpaul CSR_WRITE_4(sc, reg, \ 8154134Swpaul CSR_READ_4(sc, reg) | x) 8254134Swpaul 8354134Swpaul#define DC_CLRBIT(sc, reg, x) \ 8454134Swpaul CSR_WRITE_4(sc, reg, \ 8554134Swpaul CSR_READ_4(sc, reg) & ~x) 8654134Swpaul 8754134Swpaul#define MIIF_AUTOTIMEOUT 0x0004 8854134Swpaul 8954577Swpaul/* 9054577Swpaul * This is the subsystem ID for the built-in 21143 ethernet 9154577Swpaul * in several Compaq Presario systems. Apparently these are 9254577Swpaul * 10Mbps only, so we need to treat them specially. 9354577Swpaul */ 9454577Swpaul#define COMPAQ_PRESARIO_ID 0xb0bb0e11 9554577Swpaul 96105135Salfredstatic int dcphy_probe(device_t); 97105135Salfredstatic int dcphy_attach(device_t); 9854134Swpaul 9954134Swpaulstatic device_method_t dcphy_methods[] = { 10054134Swpaul /* device interface */ 10154134Swpaul DEVMETHOD(device_probe, dcphy_probe), 10254134Swpaul DEVMETHOD(device_attach, dcphy_attach), 10395722Sphk DEVMETHOD(device_detach, mii_phy_detach), 10454134Swpaul DEVMETHOD(device_shutdown, bus_generic_shutdown), 10554134Swpaul { 0, 0 } 10654134Swpaul}; 10754134Swpaul 10854134Swpaulstatic devclass_t dcphy_devclass; 10954134Swpaul 11054134Swpaulstatic driver_t dcphy_driver = { 11154134Swpaul "dcphy", 11254134Swpaul dcphy_methods, 11354134Swpaul sizeof(struct mii_softc) 11454134Swpaul}; 11554134Swpaul 11654134SwpaulDRIVER_MODULE(dcphy, miibus, dcphy_driver, dcphy_devclass, 0, 0); 11754134Swpaul 11892739Salfredstatic int dcphy_service(struct mii_softc *, struct mii_data *, int); 11992739Salfredstatic void dcphy_status(struct mii_softc *); 12092739Salfredstatic void dcphy_reset(struct mii_softc *); 12196026Sphkstatic int dcphy_auto(struct mii_softc *); 12254134Swpaul 123105135Salfredstatic int 124105135Salfreddcphy_probe(dev) 12554134Swpaul device_t dev; 12654134Swpaul{ 12754134Swpaul struct mii_attach_args *ma; 12854134Swpaul 12954134Swpaul ma = device_get_ivars(dev); 13054134Swpaul 13154134Swpaul /* 13254134Swpaul * The dc driver will report the 21143 vendor and device 13354134Swpaul * ID to let us know that it wants us to attach. 13454134Swpaul */ 13554134Swpaul if (ma->mii_id1 != DC_VENDORID_DEC || 13654134Swpaul ma->mii_id2 != DC_DEVICEID_21143) 13754134Swpaul return(ENXIO); 13854134Swpaul 13954134Swpaul device_set_desc(dev, "Intel 21143 NWAY media interface"); 14054134Swpaul 14154134Swpaul return (0); 14254134Swpaul} 14354134Swpaul 144105135Salfredstatic int 145105135Salfreddcphy_attach(dev) 14654134Swpaul device_t dev; 14754134Swpaul{ 14854134Swpaul struct mii_softc *sc; 14954134Swpaul struct mii_attach_args *ma; 15054134Swpaul struct mii_data *mii; 15154134Swpaul struct dc_softc *dc_sc; 15254134Swpaul 15354134Swpaul sc = device_get_softc(dev); 15454134Swpaul ma = device_get_ivars(dev); 15554134Swpaul sc->mii_dev = device_get_parent(dev); 15654134Swpaul mii = device_get_softc(sc->mii_dev); 15754134Swpaul LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); 15854134Swpaul 15954134Swpaul sc->mii_inst = mii->mii_instance; 16054134Swpaul sc->mii_phy = ma->mii_phyno; 16154134Swpaul sc->mii_service = dcphy_service; 16254134Swpaul sc->mii_pdata = mii; 16354134Swpaul 16454134Swpaul sc->mii_flags |= MIIF_NOISOLATE; 16554134Swpaul mii->mii_instance++; 16654134Swpaul 16754134Swpaul#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) 16854134Swpaul 16954134Swpaul ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst), 17054134Swpaul BMCR_ISO); 17154134Swpaul 17254134Swpaul /*dcphy_reset(sc);*/ 17354134Swpaul dc_sc = mii->mii_ifp->if_softc; 17454134Swpaul CSR_WRITE_4(dc_sc, DC_10BTSTAT, 0); 17554134Swpaul CSR_WRITE_4(dc_sc, DC_10BTCTRL, 0); 17654134Swpaul 17754134Swpaul switch(pci_read_config(device_get_parent(sc->mii_dev), 17854134Swpaul DC_PCI_CSID, 4)) { 17954577Swpaul case COMPAQ_PRESARIO_ID: 18054134Swpaul /* Example of how to only allow 10Mbps modes. */ 18154577Swpaul sc->mii_capabilities = BMSR_ANEG|BMSR_10TFDX|BMSR_10THDX; 18254134Swpaul break; 18354134Swpaul default: 18466681Swpaul if (dc_sc->dc_pmode == DC_PMODE_SIA) { 18566681Swpaul sc->mii_capabilities = 18666681Swpaul BMSR_ANEG|BMSR_10TFDX|BMSR_10THDX; 18766681Swpaul } else { 18866681Swpaul ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_LOOP, 18966681Swpaul sc->mii_inst), BMCR_LOOP|BMCR_S100); 19054577Swpaul 19166681Swpaul sc->mii_capabilities = 19266681Swpaul BMSR_ANEG|BMSR_100TXFDX|BMSR_100TXHDX| 19366681Swpaul BMSR_10TFDX|BMSR_10THDX; 19466681Swpaul } 19554134Swpaul break; 19654134Swpaul } 19754134Swpaul 19854134Swpaul sc->mii_capabilities &= ma->mii_capmask; 19954134Swpaul device_printf(dev, " "); 20095667Sphk mii_add_media(sc); 20154134Swpaul printf("\n"); 20254134Swpaul#undef ADD 20354134Swpaul 20454134Swpaul MIIBUS_MEDIAINIT(sc->mii_dev); 20554134Swpaul return(0); 20654134Swpaul} 20754134Swpaul 20884145Sjlemonstatic int 20954134Swpauldcphy_service(sc, mii, cmd) 21054134Swpaul struct mii_softc *sc; 21154134Swpaul struct mii_data *mii; 21254134Swpaul int cmd; 21354134Swpaul{ 21454134Swpaul struct dc_softc *dc_sc; 21554134Swpaul struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 21654134Swpaul int reg; 21754134Swpaul u_int32_t mode; 21854134Swpaul 21954134Swpaul dc_sc = mii->mii_ifp->if_softc; 22054134Swpaul 22154134Swpaul switch (cmd) { 22254134Swpaul case MII_POLLSTAT: 22354134Swpaul /* 22454134Swpaul * If we're not polling our PHY instance, just return. 22554134Swpaul */ 22654134Swpaul if (IFM_INST(ife->ifm_media) != sc->mii_inst) { 22754134Swpaul return (0); 22854134Swpaul } 22954134Swpaul break; 23054134Swpaul 23154134Swpaul case MII_MEDIACHG: 23254134Swpaul /* 23354134Swpaul * If the media indicates a different PHY instance, 23454134Swpaul * isolate ourselves. 23554134Swpaul */ 23654134Swpaul if (IFM_INST(ife->ifm_media) != sc->mii_inst) { 23754134Swpaul return (0); 23854134Swpaul } 23954134Swpaul 24054134Swpaul /* 24154134Swpaul * If the interface is not up, don't do anything. 24254134Swpaul */ 24354134Swpaul if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 24454134Swpaul break; 24554134Swpaul 24654134Swpaul sc->mii_flags = 0; 24754134Swpaul mii->mii_media_active = IFM_NONE; 24854134Swpaul mode = CSR_READ_4(dc_sc, DC_NETCFG); 24954134Swpaul mode &= ~(DC_NETCFG_FULLDUPLEX|DC_NETCFG_PORTSEL| 25054134Swpaul DC_NETCFG_PCS|DC_NETCFG_SCRAMBLER|DC_NETCFG_SPEEDSEL); 25154134Swpaul 25254134Swpaul switch (IFM_SUBTYPE(ife->ifm_media)) { 25354134Swpaul case IFM_AUTO: 25454134Swpaul /*dcphy_reset(sc);*/ 25596026Sphk (void) dcphy_auto(sc); 25654134Swpaul break; 25754134Swpaul case IFM_100_T4: 25854134Swpaul /* 25954134Swpaul * XXX Not supported as a manual setting right now. 26054134Swpaul */ 26154134Swpaul return (EINVAL); 26254134Swpaul case IFM_100_TX: 26354134Swpaul dcphy_reset(sc); 26454134Swpaul DC_CLRBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL); 26554134Swpaul mode |= DC_NETCFG_PORTSEL|DC_NETCFG_PCS| 26654134Swpaul DC_NETCFG_SCRAMBLER; 26754134Swpaul if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) 26854134Swpaul mode |= DC_NETCFG_FULLDUPLEX; 26954134Swpaul else 27054134Swpaul mode &= ~DC_NETCFG_FULLDUPLEX; 27154134Swpaul CSR_WRITE_4(dc_sc, DC_NETCFG, mode); 27254134Swpaul break; 27354134Swpaul case IFM_10_T: 27454134Swpaul DC_CLRBIT(dc_sc, DC_SIARESET, DC_SIA_RESET); 27554134Swpaul DC_CLRBIT(dc_sc, DC_10BTCTRL, 0xFFFF); 27654134Swpaul if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) 27754134Swpaul DC_SETBIT(dc_sc, DC_10BTCTRL, 0x7F3D); 27854134Swpaul else 27954134Swpaul DC_SETBIT(dc_sc, DC_10BTCTRL, 0x7F3F); 28054134Swpaul DC_SETBIT(dc_sc, DC_SIARESET, DC_SIA_RESET); 28154134Swpaul DC_CLRBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL); 28254134Swpaul mode &= ~DC_NETCFG_PORTSEL; 28354134Swpaul mode |= DC_NETCFG_SPEEDSEL; 28454134Swpaul if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) 28554134Swpaul mode |= DC_NETCFG_FULLDUPLEX; 28654134Swpaul else 28754134Swpaul mode &= ~DC_NETCFG_FULLDUPLEX; 28854134Swpaul CSR_WRITE_4(dc_sc, DC_NETCFG, mode); 28954134Swpaul break; 29054134Swpaul default: 29154134Swpaul return(EINVAL); 29254134Swpaul break; 29354134Swpaul } 29454134Swpaul break; 29554134Swpaul 29654134Swpaul case MII_TICK: 29754134Swpaul /* 29854134Swpaul * If we're not currently selected, just return. 29954134Swpaul */ 30054134Swpaul if (IFM_INST(ife->ifm_media) != sc->mii_inst) 30154134Swpaul return (0); 30254134Swpaul 30354134Swpaul /* 30484145Sjlemon * Is the interface even up? 30554134Swpaul */ 30684145Sjlemon if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 30754134Swpaul return (0); 30854134Swpaul 30954134Swpaul /* 31084145Sjlemon * Only used for autonegotiation. 31154134Swpaul */ 31284145Sjlemon if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) 31384145Sjlemon break; 31454134Swpaul 31594994Smckay reg = CSR_READ_4(dc_sc, DC_10BTSTAT); 31661110Swpaul if (!(reg & DC_TSTAT_LS10) || !(reg & DC_TSTAT_LS100)) 31784145Sjlemon break; 31854134Swpaul 31961110Swpaul /* 32061110Swpaul * Only retry autonegotiation every 5 seconds. 32194994Smckay * 32294994Smckay * Otherwise, fall through to calling dcphy_status() 32394994Smckay * since real Intel 21143 chips don't show valid link 32494994Smckay * status until autonegotiation is switched off, and 32594994Smckay * that only happens in dcphy_status(). Without this, 32694994Smckay * successful autonegotation is never recognised on 32794994Smckay * these chips. 32861110Swpaul */ 32961110Swpaul if (++sc->mii_ticks != 50) 33094994Smckay break; 33161110Swpaul 33254134Swpaul sc->mii_ticks = 0; 33396026Sphk dcphy_auto(sc); 33454134Swpaul 33554134Swpaul break; 33654134Swpaul } 33754134Swpaul 33854134Swpaul /* Update the media status. */ 33954134Swpaul dcphy_status(sc); 34054134Swpaul 34154134Swpaul /* Callback if something changed. */ 34284145Sjlemon mii_phy_update(sc, cmd); 34354134Swpaul return (0); 34454134Swpaul} 34554134Swpaul 34684145Sjlemonstatic void 34754134Swpauldcphy_status(sc) 34854134Swpaul struct mii_softc *sc; 34954134Swpaul{ 35054134Swpaul struct mii_data *mii = sc->mii_pdata; 35161110Swpaul int reg, anlpar, tstat = 0; 35254134Swpaul struct dc_softc *dc_sc; 35354134Swpaul 35454134Swpaul dc_sc = mii->mii_ifp->if_softc; 35554134Swpaul 35654134Swpaul mii->mii_media_status = IFM_AVALID; 35754134Swpaul mii->mii_media_active = IFM_ETHER; 35854134Swpaul 35961290Swpaul if ((mii->mii_ifp->if_flags & IFF_UP) == 0) 36061290Swpaul return; 36161290Swpaul 36294994Smckay reg = CSR_READ_4(dc_sc, DC_10BTSTAT); 36354134Swpaul if (!(reg & DC_TSTAT_LS10) || !(reg & DC_TSTAT_LS100)) 36454134Swpaul mii->mii_media_status |= IFM_ACTIVE; 36554134Swpaul 36661110Swpaul if (CSR_READ_4(dc_sc, DC_10BTCTRL) & DC_TCTL_AUTONEGENBL) { 36754134Swpaul /* Erg, still trying, I guess... */ 36861110Swpaul tstat = CSR_READ_4(dc_sc, DC_10BTSTAT); 36961110Swpaul if ((tstat & DC_TSTAT_ANEGSTAT) != DC_ASTAT_AUTONEGCMP) { 37061110Swpaul if ((DC_IS_MACRONIX(dc_sc) || DC_IS_PNICII(dc_sc)) && 37161110Swpaul (tstat & DC_TSTAT_ANEGSTAT) == DC_ASTAT_DISABLE) 37261110Swpaul goto skip; 37354134Swpaul mii->mii_media_active |= IFM_NONE; 37454134Swpaul return; 37554134Swpaul } 37654134Swpaul 37761110Swpaul if (tstat & DC_TSTAT_LP_CAN_NWAY) { 37861110Swpaul anlpar = tstat >> 16; 37954577Swpaul if (anlpar & ANLPAR_T4 && 38054577Swpaul sc->mii_capabilities & BMSR_100TXHDX) 38154134Swpaul mii->mii_media_active |= IFM_100_T4; 38254577Swpaul else if (anlpar & ANLPAR_TX_FD && 38361110Swpaul sc->mii_capabilities & BMSR_100TXFDX) 38454134Swpaul mii->mii_media_active |= IFM_100_TX|IFM_FDX; 38554577Swpaul else if (anlpar & ANLPAR_TX && 38654577Swpaul sc->mii_capabilities & BMSR_100TXHDX) 38754134Swpaul mii->mii_media_active |= IFM_100_TX; 38854134Swpaul else if (anlpar & ANLPAR_10_FD) 38954134Swpaul mii->mii_media_active |= IFM_10_T|IFM_FDX; 39054134Swpaul else if (anlpar & ANLPAR_10) 39154134Swpaul mii->mii_media_active |= IFM_10_T; 39254134Swpaul else 39354134Swpaul mii->mii_media_active |= IFM_NONE; 39454134Swpaul if (DC_IS_INTEL(dc_sc)) 39554134Swpaul DC_CLRBIT(dc_sc, DC_10BTCTRL, 39654134Swpaul DC_TCTL_AUTONEGENBL); 39754134Swpaul return; 39854134Swpaul } 39954134Swpaul /* 40054134Swpaul * If the other side doesn't support NWAY, then the 40154134Swpaul * best we can do is determine if we have a 10Mbps or 40254134Swpaul * 100Mbps link. There's no way to know if the link 40354134Swpaul * is full or half duplex, so we default to half duplex 40454134Swpaul * and hope that the user is clever enough to manually 40554134Swpaul * change the media settings if we're wrong. 40654134Swpaul */ 40754134Swpaul if (!(reg & DC_TSTAT_LS100)) 40854134Swpaul mii->mii_media_active |= IFM_100_TX; 40954134Swpaul else if (!(reg & DC_TSTAT_LS10)) 41054134Swpaul mii->mii_media_active |= IFM_10_T; 41154134Swpaul else 41254134Swpaul mii->mii_media_active |= IFM_NONE; 41354134Swpaul if (DC_IS_INTEL(dc_sc)) 41454134Swpaul DC_CLRBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL); 41554134Swpaul return; 41654134Swpaul } 41754134Swpaul 41861110Swpaulskip: 41966681Swpaul 42066681Swpaul if (CSR_READ_4(dc_sc, DC_NETCFG) & DC_NETCFG_SPEEDSEL) 42166681Swpaul mii->mii_media_active |= IFM_10_T; 42266681Swpaul else 42354134Swpaul mii->mii_media_active |= IFM_100_TX; 42454134Swpaul if (CSR_READ_4(dc_sc, DC_NETCFG) & DC_NETCFG_FULLDUPLEX) 42554134Swpaul mii->mii_media_active |= IFM_FDX; 42654134Swpaul 42754134Swpaul return; 42854134Swpaul} 42954134Swpaul 43054134Swpaulstatic int 43196026Sphkdcphy_auto(mii) 43254134Swpaul struct mii_softc *mii; 43354134Swpaul{ 43454134Swpaul struct dc_softc *sc; 43554134Swpaul 43654134Swpaul sc = mii->mii_pdata->mii_ifp->if_softc; 43754134Swpaul 43896026Sphk DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL); 43996026Sphk DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_FULLDUPLEX); 44096026Sphk DC_CLRBIT(sc, DC_SIARESET, DC_SIA_RESET); 44196026Sphk if (mii->mii_capabilities & BMSR_100TXHDX) 44296026Sphk CSR_WRITE_4(sc, DC_10BTCTRL, 0x3FFFF); 44396026Sphk else 44496026Sphk CSR_WRITE_4(sc, DC_10BTCTRL, 0xFFFF); 44596026Sphk DC_SETBIT(sc, DC_SIARESET, DC_SIA_RESET); 44696026Sphk DC_SETBIT(sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL); 44796026Sphk DC_SETBIT(sc, DC_10BTSTAT, DC_ASTAT_TXDISABLE); 44854134Swpaul 44954134Swpaul return(EJUSTRETURN); 45054134Swpaul} 45154134Swpaul 45254134Swpaulstatic void 45354134Swpauldcphy_reset(mii) 45454134Swpaul struct mii_softc *mii; 45554134Swpaul{ 45654134Swpaul struct dc_softc *sc; 45754134Swpaul 45854134Swpaul sc = mii->mii_pdata->mii_ifp->if_softc; 45954134Swpaul 46054134Swpaul DC_CLRBIT(sc, DC_SIARESET, DC_SIA_RESET); 46154134Swpaul DELAY(1000); 46254134Swpaul DC_SETBIT(sc, DC_SIARESET, DC_SIA_RESET); 46354134Swpaul 46454134Swpaul return; 46554134Swpaul} 46654134Swpaul 467