diff options
author | Marius Strobl <marius@FreeBSD.org> | 2006-01-31 14:48:58 +0000 |
---|---|---|
committer | Marius Strobl <marius@FreeBSD.org> | 2006-01-31 14:48:58 +0000 |
commit | a7ee7a7d6aa723ce89a6853d54056dfec8d403d9 (patch) | |
tree | 953f82e06db86c4bd789c5ffbc9faf81666eb737 /sys/dev/le/lancevar.h | |
parent | de64f22aa4eb8bac0b1986d33f67c01451ab5593 (diff) | |
download | src-a7ee7a7d6aa723ce89a6853d54056dfec8d403d9.tar.gz src-a7ee7a7d6aa723ce89a6853d54056dfec8d403d9.zip |
Add le(4), a driver for AMD Am7900 LANCE and Am79C9xx PCnet NICs ported
from NetBSD. This driver actually can replace lnc(4). Advantages over
lnc(4) are:
- Cleaner and more flexible regarding MD needs.
- Endian-clean and MPSAFE.
- Supports ALTQ, VLAN_MTU, ifmedia.
- Uses 32bit DMA for the PCI variants.
This commit includes front-ends for the dma(4) pseudo-bus found on SBus-
based sparc64 machines (thus supports the on-board LANCE in Sun Ultra 1)
and PCI. In order to actually replace lnc(4), the front-ends for ISA and
the PC98 CBUS would have to be added but for which I don't have hardware
to test.
Reviewed and some improvements by: yongari
Tested on: i386, sparc64
Notes
Notes:
svn path=/head/; revision=155093
Diffstat (limited to 'sys/dev/le/lancevar.h')
-rw-r--r-- | sys/dev/le/lancevar.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/sys/dev/le/lancevar.h b/sys/dev/le/lancevar.h new file mode 100644 index 000000000000..51149a6895dc --- /dev/null +++ b/sys/dev/le/lancevar.h @@ -0,0 +1,169 @@ +/* $NetBSD: lancevar.h,v 1.10 2005/12/11 12:21:27 christos Exp $ */ + +/*- + * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace + * Simulation Facility, NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* $FreeBSD$ */ + +#ifndef _DEV_LE_LANCEVAR_H_ +#define _DEV_LE_LANCEVAR_H_ + +#define LE_DRIVER_NAME "le" + +extern devclass_t le_devclass; + +struct lance_softc { + struct ifnet *sc_ifp; + struct ifmedia sc_media; + struct mtx sc_mtx; + + /* + * Memory functions: + * + * copy to/from descriptor + * copy to/from buffer + * zero bytes in buffer + */ + void (*sc_copytodesc)(struct lance_softc *, void *, int, int); + void (*sc_copyfromdesc)(struct lance_softc *, void *, int, int); + void (*sc_copytobuf)(struct lance_softc *, void *, int, int); + void (*sc_copyfrombuf)(struct lance_softc *, void *, int, int); + void (*sc_zerobuf)(struct lance_softc *, int, int); + + /* + * Machine-dependent functions: + * + * read/write CSR + * hardware reset hook - may be NULL + * hardware init hook - may be NULL + * no carrier hook - may be NULL + * media change hook - may be NULL + */ + uint16_t (*sc_rdcsr)(struct lance_softc *, uint16_t); + void (*sc_wrcsr)(struct lance_softc *, uint16_t, uint16_t); + void (*sc_hwreset)(struct lance_softc *); + void (*sc_hwinit)(struct lance_softc *); + int (*sc_hwintr)(struct lance_softc *); + void (*sc_nocarrier)(struct lance_softc *); + int (*sc_mediachange)(struct lance_softc *); + void (*sc_mediastatus)(struct lance_softc *, struct ifmediareq *); + + /* + * Media-supported by this interface. If this is NULL, + * the only supported media is assumed to be "manual". + */ + const int *sc_supmedia; + int sc_nsupmedia; + int sc_defaultmedia; + + uint16_t sc_conf3; /* CSR3 value */ + + void *sc_mem; /* base address of RAM -- CPU's view */ + u_long sc_addr; /* base address of RAM -- LANCE's view */ + + u_long sc_memsize; /* size of RAM */ + + int sc_nrbuf; /* number of receive buffers */ + int sc_ntbuf; /* number of transmit buffers */ + int sc_last_rd; + int sc_first_td; + int sc_last_td; + int sc_no_td; + + int sc_initaddr; + int sc_rmdaddr; + int sc_tmdaddr; + int sc_rbufaddr; + int sc_tbufaddr; + + uint8_t sc_enaddr[ETHER_ADDR_LEN]; + + void (*sc_meminit)(struct lance_softc *); + void (*sc_start_locked)(struct lance_softc *); + + int sc_flags; +#define LE_ALLMULTI (1 << 0) +#define LE_BSWAP (1 << 1) +#define LE_CARRIER (1 << 2) +#define LE_DEBUG (1 << 3) +#define LE_PROMISC (1 << 4) +}; + +#define LE_LOCK_INIT(_sc, _name) \ + mtx_init(&(_sc)->sc_mtx, _name, MTX_NETWORK_LOCK, MTX_DEF) +#define LE_LOCK_INITIALIZED(_sc) mtx_initialized(&(_sc)->sc_mtx) +#define LE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define LE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) +#define LE_LOCK_ASSERT(_sc, _what) mtx_assert(&(_sc)->sc_mtx, (_what)) +#define LE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) + +#define LE_HTOLE16(v) (((sc)->sc_flags & LE_BSWAP) ? htole16(v) : (v)) +#define LE_HTOLE32(v) (((sc)->sc_flags & LE_BSWAP) ? htole32(v) : (v)) +#define LE_LE16TOH(v) (((sc)->sc_flags & LE_BSWAP) ? le16toh(v) : (v)) +#define LE_LE32TOH(v) (((sc)->sc_flags & LE_BSWAP) ? le32toh(v) : (v)) + +int lance_config(struct lance_softc *, const char*, int); +void lance_attach(struct lance_softc *); +void lance_detach(struct lance_softc *); +void lance_suspend(struct lance_softc *); +void lance_resume(struct lance_softc *); +void lance_init_locked(struct lance_softc *); +int lance_put(struct lance_softc *, int, struct mbuf *); +void lance_read(struct lance_softc *, int, int); +void lance_setladrf(struct lance_softc *, u_int16_t *); + +/* + * The following functions are only useful on certain CPU/bus + * combinations. They should be written in assembly language for + * maximum efficiency, but machine-independent versions are provided + * for drivers that have not yet been optimized. + */ +void lance_copytobuf_contig(struct lance_softc *, void *, int, int); +void lance_copyfrombuf_contig(struct lance_softc *, void *, int, int); +void lance_zerobuf_contig(struct lance_softc *, int, int); + +#if 0 /* Example only - see lance.c */ +void lance_copytobuf_gap2(struct lance_softc *, void *, int, int); +void lance_copyfrombuf_gap2(struct lance_softc *, void *, int, int); +void lance_zerobuf_gap2(struct lance_softc *, int, int); + +void lance_copytobuf_gap16(struct lance_softc *, void *, int, int); +void lance_copyfrombuf_gap16(struct lance_softc *, void *, int, int); +void lance_zerobuf_gap16(struct lance_softc *, int, int); +#endif /* Example only */ + +#endif /* _DEV_LE_LANCEVAR_H_ */ |