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

Annotation of sys/dev/dec/if_le_dec.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_le_dec.c,v 1.4 2007/06/18 21:24:43 jasper Exp $    */
                      2: /*     $NetBSD: if_le_dec.c,v 1.12 2001/11/13 12:49:45 lukem Exp $     */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1997 Jonathan Stone. All rights reserved.
                      6:  * Copyright (c) 1995 Charles M. Hannum.  All rights reserved.
                      7:  * Copyright (c) 1992, 1993
                      8:  *     The Regents of the University of California.  All rights reserved.
                      9:  *
                     10:  * This code is derived from software contributed to Berkeley by
                     11:  * Ralph Campbell and Rick Macklem.
                     12:  *
                     13:  * Redistribution and use in source and binary forms, with or without
                     14:  * modification, are permitted provided that the following conditions
                     15:  * are met:
                     16:  * 1. Redistributions of source code must retain the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer.
                     18:  * 2. Redistributions in binary form must reproduce the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer in the
                     20:  *    documentation and/or other materials provided with the distribution.
                     21:  * 3. Neither the name of the University nor the names of its contributors
                     22:  *    may be used to endorse or promote products derived from this software
                     23:  *    without specific prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  *     @(#)if_le.c     8.2 (Berkeley) 11/16/93
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/mbuf.h>
                     43: #include <sys/syslog.h>
                     44: #include <sys/socket.h>
                     45: #include <sys/device.h>
                     46:
                     47: #include <net/if.h>
                     48: #include <net/if_media.h>
                     49:
                     50: #ifdef INET
                     51: #include <netinet/in.h>
                     52: #include <netinet/if_ether.h>
                     53: #endif
                     54:
                     55: #include <dev/ic/am7990reg.h>
                     56: #include <dev/ic/am7990var.h>
                     57:
                     58: #include <dev/tc/if_levar.h>
                     59: #include <dev/tc/tcvar.h>
                     60:
                     61: #include <machine/bus.h>
                     62:
                     63: /* access LANCE registers */
                     64: void le_dec_writereg(volatile u_short *regptr, u_short val);
                     65: #define        LERDWR(cntl, src, dst)  { (dst) = (src); tc_mb(); }
                     66: #define        LEWREG(src, dst)        le_dec_writereg(&(dst), (src))
                     67:
                     68: void le_dec_wrcsr(struct am7990_softc *, u_int16_t, u_int16_t);
                     69: u_int16_t le_dec_rdcsr(struct am7990_softc *, u_int16_t);
                     70:
                     71: void
                     72: dec_le_common_attach(struct am7990_softc *sc, u_char *eap)
                     73: {
                     74:        int i;
                     75:
                     76:        sc->sc_rdcsr = le_dec_rdcsr;
                     77:        sc->sc_wrcsr = le_dec_wrcsr;
                     78:        sc->sc_hwinit = NULL;
                     79:
                     80:        sc->sc_conf3 = 0;
                     81:        sc->sc_addr = 0;
                     82:        sc->sc_memsize = 65536;
                     83:
                     84:        /*
                     85:         * Get the ethernet address out of rom
                     86:         */
                     87:        for (i = 0; i < sizeof(sc->sc_arpcom.ac_enaddr); i++) {
                     88:                sc->sc_arpcom.ac_enaddr[i] = *eap;
                     89:                eap += 4;
                     90:        }
                     91:
                     92:        am7990_config(sc);
                     93: }
                     94:
                     95: void
                     96: le_dec_wrcsr(struct am7990_softc *sc, u_int16_t port, u_int16_t val)
                     97: {
                     98:        struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
                     99:
                    100:        LEWREG(port, ler1->ler1_rap);
                    101:        LERDWR(port, val, ler1->ler1_rdp);
                    102: }
                    103:
                    104: u_int16_t
                    105: le_dec_rdcsr(struct am7990_softc *sc, u_int16_t port)
                    106: {
                    107:        struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
                    108:        u_int16_t val;
                    109:
                    110:        LEWREG(port, ler1->ler1_rap);
                    111:        LERDWR(0, ler1->ler1_rdp, val);
                    112:        return (val);
                    113: }
                    114:
                    115: /*
                    116:  * Write a lance register port, reading it back to ensure success. This seems
                    117:  * to be necessary during initialization, since the chip appears to be a bit
                    118:  * pokey sometimes.
                    119:  */
                    120: void
                    121: le_dec_writereg(volatile u_short *regptr, u_short val)
                    122: {
                    123:        int i = 0;
                    124:
                    125:        while (*regptr != val) {
                    126:                *regptr = val;
                    127:                tc_mb();
                    128:                if (++i > 10000) {
                    129:                        printf("le: Reg did not settle (to x%x): x%x\n", val,
                    130:                            *regptr);
                    131:                        return;
                    132:                }
                    133:                DELAY(100);
                    134:        }
                    135: }
                    136:
                    137: /*
                    138:  * Routines for accessing the transmit and receive buffers are provided
                    139:  * by am7990.c, because of the LE_NEED_BUF_* macros defined above.
                    140:  * Unfortunately, CPU addressing of these buffers is done in one of
                    141:  * 3 ways:
                    142:  * - contiguous (for the 3max and turbochannel option card)
                    143:  * - gap2, which means shorts (2 bytes) interspersed with short (2 byte)
                    144:  *   spaces (for the pmax, vax 3400, and ioasic LANCE descriptors)
                    145:  * - gap16, which means 16bytes interspersed with 16byte spaces
                    146:  *   for buffers which must begin on a 32byte boundary (for 3min, maxine,
                    147:  *   and alpha)
                    148:  * The buffer offset is the logical byte offset, assuming contiguous storage.
                    149:  */

CVSweb