Annotation of sys/dev/ic/rtl80x9.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: rtl80x9.c,v 1.7 2003/06/25 17:35:36 miod Exp $ */
! 2: /* $NetBSD: rtl80x9.c,v 1.1 1998/10/31 00:44:33 thorpej Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to The NetBSD Foundation
! 9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
! 10: * NASA Ames Research Center.
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. All advertising materials mentioning features or use of this software
! 21: * must display the following acknowledgement:
! 22: * This product includes software developed by the NetBSD
! 23: * Foundation, Inc. and its contributors.
! 24: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 25: * contributors may be used to endorse or promote products derived
! 26: * from this software without specific prior written permission.
! 27: *
! 28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 38: * POSSIBILITY OF SUCH DAMAGE.
! 39: */
! 40:
! 41: #include "bpfilter.h"
! 42:
! 43: #include <sys/param.h>
! 44: #include <sys/systm.h>
! 45: #include <sys/mbuf.h>
! 46: #include <sys/syslog.h>
! 47: #include <sys/socket.h>
! 48: #include <sys/device.h>
! 49:
! 50: #include <net/if.h>
! 51: #include <net/if_media.h>
! 52:
! 53: #ifdef INET
! 54: #include <netinet/in.h>
! 55: #include <netinet/if_ether.h>
! 56: #endif
! 57:
! 58: #include <machine/bus.h>
! 59:
! 60: #include <dev/ic/dp8390reg.h>
! 61: #include <dev/ic/dp8390var.h>
! 62:
! 63: #include <dev/ic/ne2000reg.h>
! 64: #include <dev/ic/ne2000var.h>
! 65:
! 66: #include <dev/ic/rtl80x9reg.h>
! 67: #include <dev/ic/rtl80x9var.h>
! 68:
! 69: int
! 70: rtl80x9_mediachange(dsc)
! 71: struct dp8390_softc *dsc;
! 72: {
! 73:
! 74: /*
! 75: * Current media is already set up. Just reset the interface
! 76: * to let the new value take hold. The new media will be
! 77: * set up in ne_pci_rtl8029_init_card() called via dp8390_init().
! 78: */
! 79: dp8390_reset(dsc);
! 80: return (0);
! 81: }
! 82:
! 83: void
! 84: rtl80x9_mediastatus(sc, ifmr)
! 85: struct dp8390_softc *sc;
! 86: struct ifmediareq *ifmr;
! 87: {
! 88: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
! 89: u_int8_t cr_proto = sc->cr_proto |
! 90: ((ifp->if_flags & IFF_RUNNING) ? ED_CR_STA : ED_CR_STP);
! 91:
! 92: /*
! 93: * Sigh, can detect which media is being used, but can't
! 94: * detect if we have link or not.
! 95: */
! 96:
! 97: /* Set NIC to page 3 registers. */
! 98: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_3);
! 99:
! 100: if (NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG0) &
! 101: RTL3_CONFIG0_BNC)
! 102: ifmr->ifm_active = IFM_ETHER|IFM_10_2;
! 103: else {
! 104: ifmr->ifm_active = IFM_ETHER|IFM_10_T;
! 105: if (NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3) &
! 106: RTL3_CONFIG3_FUDUP)
! 107: ifmr->ifm_active |= IFM_FDX;
! 108: }
! 109:
! 110: /* Set NIC to page 0 registers. */
! 111: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_0);
! 112: }
! 113:
! 114: void
! 115: rtl80x9_init_card(sc)
! 116: struct dp8390_softc *sc;
! 117: {
! 118: struct ifmedia *ifm = &sc->sc_media;
! 119: struct ifnet *ifp = &sc->sc_arpcom.ac_if;
! 120: u_int8_t cr_proto = sc->cr_proto |
! 121: ((ifp->if_flags & IFF_RUNNING) ? ED_CR_STA : ED_CR_STP);
! 122: u_int8_t reg;
! 123:
! 124: /* Set NIC to page 3 registers. */
! 125: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_3);
! 126:
! 127: /* write enable config1-3. */
! 128: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_EECR,
! 129: RTL3_EECR_EEM1|RTL3_EECR_EEM0);
! 130:
! 131: /* First, set basic media type. */
! 132: reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2);
! 133: reg &= ~(RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0);
! 134: switch (IFM_SUBTYPE(ifm->ifm_cur->ifm_media)) {
! 135: case IFM_AUTO:
! 136: /* Nothing to do; both bits clear == auto-detect. */
! 137: break;
! 138:
! 139: case IFM_10_T:
! 140: /*
! 141: * According to docs, this should be:
! 142: * reg |= RTL3_CONFIG2_PL0;
! 143: * but this doesn't work, so make it the same as AUTO.
! 144: */
! 145: break;
! 146:
! 147: case IFM_10_2:
! 148: reg |= RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0;
! 149: break;
! 150: }
! 151: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2, reg);
! 152:
! 153: /* Now, set duplex mode. */
! 154: reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3);
! 155: if (ifm->ifm_cur->ifm_media & IFM_FDX)
! 156: reg |= RTL3_CONFIG3_FUDUP;
! 157: else
! 158: reg &= ~RTL3_CONFIG3_FUDUP;
! 159: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3, reg);
! 160:
! 161: /* write disable config1-3 */
! 162: NIC_PUT(sc->sc_regt, sc->sc_regh, NERTL_RTL3_EECR, 0);
! 163:
! 164: /* Set NIC to page 0 registers. */
! 165: NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_0);
! 166: }
! 167:
! 168: void
! 169: rtl80x9_media_init(sc)
! 170: struct dp8390_softc *sc;
! 171: {
! 172: static int rtl80x9_media[] = {
! 173: IFM_ETHER|IFM_AUTO,
! 174: IFM_ETHER|IFM_10_T,
! 175: IFM_ETHER|IFM_10_T|IFM_FDX,
! 176: IFM_ETHER|IFM_10_2,
! 177: };
! 178: static const int rtl80x9_nmedia =
! 179: sizeof(rtl80x9_media) / sizeof(rtl80x9_media[0]);
! 180:
! 181: int i, defmedia;
! 182: u_int8_t conf2, conf3;
! 183:
! 184: /* Set NIC to page 3 registers. */
! 185: bus_space_write_1(sc->sc_regt, sc->sc_regh, ED_P0_CR, ED_CR_PAGE_3);
! 186:
! 187: conf2 = bus_space_read_1(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2);
! 188: conf3 = bus_space_read_1(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3);
! 189:
! 190: conf2 &= RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0;
! 191:
! 192: switch (conf2) {
! 193: case 0:
! 194: defmedia = IFM_ETHER|IFM_AUTO;
! 195: break;
! 196:
! 197: case RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0:
! 198: case RTL3_CONFIG2_PL1: /* XXX rtl docs sys 10base5, but chip cant do */
! 199: defmedia = IFM_ETHER|IFM_10_2;
! 200: break;
! 201:
! 202: case RTL3_CONFIG2_PL0:
! 203: if (conf3 & RTL3_CONFIG3_FUDUP)
! 204: defmedia = IFM_ETHER|IFM_10_T|IFM_FDX;
! 205: else
! 206: defmedia = IFM_ETHER|IFM_10_T;
! 207: break;
! 208: }
! 209:
! 210: /* Set NIC to page 0 registers. */
! 211: bus_space_write_1(sc->sc_regt, sc->sc_regh, ED_P0_CR, ED_CR_PAGE_0);
! 212:
! 213: ifmedia_init(&sc->sc_media, 0, dp8390_mediachange, dp8390_mediastatus);
! 214: for (i = 0; i < rtl80x9_nmedia; i++)
! 215: ifmedia_add(&sc->sc_media, rtl80x9_media[i], 0, NULL);
! 216: ifmedia_set(&sc->sc_media, defmedia);
! 217: }
CVSweb