[BACK]Return to rtl80x9.c CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/rtl80x9.c, Revision 1.1.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