1139749Simp/*-
265832Snyan * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
365832Snyan *
465832Snyan * This software may be used, modified, copied, distributed, and sold, in
565832Snyan * both source and binary form provided that the above copyright, these
665832Snyan * terms and the following disclaimer are retained.  The name of the author
765832Snyan * and/or the contributor may not be used to endorse or promote products
865832Snyan * derived from this software without specific prior written permission.
965832Snyan *
1065832Snyan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND
1165832Snyan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1265832Snyan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1365832Snyan * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE
1465832Snyan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1565832Snyan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1665832Snyan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION.
1765832Snyan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1865832Snyan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1965832Snyan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2065832Snyan * SUCH DAMAGE.
2165832Snyan *
2265832Snyan * $FreeBSD: releng/10.2/sys/dev/fe/if_fevar.h 179959 2008-06-23 18:16:25Z jhb $
2365832Snyan */
2465832Snyan
2565832Snyan/* How many registers does an fe-supported adapter have at maximum?  */
2665832Snyan#define MAXREGISTERS 32
2765832Snyan
2865832Snyan/* Shouldn't these be defined somewhere else such as isa_device.h?  */
2965832Snyan#define NO_IRQ		0
3065832Snyan
3165832Snyan/* Flags for stability.  */
3265832Snyan#define UNSTABLE_IRQ	0x01	/* IRQ setting may be incorrect.  */
3365832Snyan#define UNSTABLE_MAC	0x02	/* Probed MAC address may be incorrect.  */
3465832Snyan#define UNSTABLE_TYPE	0x04	/* Probed vendor/model may be incorrect.  */
3565832Snyan
3665832Snyan/* Mapping between media bitmap (in fe_softc.mbitmap) and ifm_media.  */
3765832Snyan#define MB_HA	0x0001
3865832Snyan#define MB_HM	0x0002
3965832Snyan#define MB_HT	0x0004
4065832Snyan#define MB_H2	0x0008
4165832Snyan#define MB_H5	0x0010
4265832Snyan#define MB_HF	0x0020
4365832Snyan#define MB_FT	0x0040
4465832Snyan
4565832Snyan/* Card types. */
4665832Snyan#define FE_TYPE_SSI		1
4765832Snyan#define FE_TYPE_JLI		2
4865832Snyan#define FE_TYPE_FMV		3
4965832Snyan#define FE_TYPE_LNX		4
5065832Snyan#define FE_TYPE_UBN		5
5165832Snyan#define FE_TYPE_GWY		6
5265832Snyan#define FE_TYPE_MBH		7
5365832Snyan#define FE_TYPE_TDK		8
5465832Snyan#define FE_TYPE_RE1000		9
5565832Snyan#define FE_TYPE_CNET9NE		10
5665832Snyan#define FE_TYPE_REX		11
5765832Snyan
5865832Snyan/*
5965832Snyan * Data type for a multicast address filter on 8696x.
6065832Snyan */
6165832Snyanstruct fe_filter {
6265832Snyan	u_char data [FE_FILTER_LEN];
6365832Snyan};
6465832Snyan
6565832Snyan/*
6665832Snyan * fe_softc: per line info and status
6765832Snyan */
6865832Snyanstruct fe_softc {
6965832Snyan
7065832Snyan	/* Used by "common" codes.  */
71147256Sbrooks	struct ifnet		*ifp;
72121816Sbrooks	int			sc_unit;
73147256Sbrooks	u_char			enaddr[6];
7465832Snyan
7565832Snyan	/* Used by config codes.  */
7665832Snyan	int			type;
7765832Snyan	int			port_used;
7865832Snyan	struct resource *	port_res;
7965832Snyan	struct resource *	irq_res;
8065832Snyan	void *			irq_handle;
8165832Snyan
8265832Snyan	/* Set by probe() and not modified in later phases.  */
8365832Snyan	char const * typestr;	/* printable name of the interface.  */
8465832Snyan	u_short txb_size;	/* size of TX buffer, in bytes  */
8565832Snyan	u_char proto_dlcr4;	/* DLCR4 prototype.  */
8665832Snyan	u_char proto_dlcr5;	/* DLCR5 prototype.  */
8765832Snyan	u_char proto_dlcr6;	/* DLCR6 prototype.  */
8865832Snyan	u_char proto_dlcr7;	/* DLCR7 prototype.  */
8965832Snyan	u_char proto_bmpr13;	/* BMPR13 prototype.  */
9065832Snyan	u_char stability;	/* How stable is this?  */
9165832Snyan	u_short priv_info;	/* info specific to a vendor/model.  */
9265832Snyan
9365832Snyan	/* Vendor/model specific hooks.  */
9465832Snyan	void (*init)(struct fe_softc *); /* Just before fe_init().  */
9565832Snyan	void (*stop)(struct fe_softc *); /* Just after fe_stop().  */
9665832Snyan
9765832Snyan	/* Transmission buffer management.  */
9865832Snyan	u_short txb_free;	/* free bytes in TX buffer  */
9965832Snyan	u_char txb_count;	/* number of packets in TX buffer  */
10065832Snyan	u_char txb_sched;	/* number of scheduled packets  */
10165832Snyan
10265832Snyan	/* Excessive collision counter (see fe_tint() for details.)  */
10365832Snyan	u_char tx_excolls;	/* # of excessive collisions.  */
10465832Snyan
10565832Snyan	/* Multicast address filter management.  */
10665832Snyan	u_char filter_change;	/* MARs must be changed ASAP. */
10765832Snyan	struct fe_filter filter;/* new filter value.  */
10865832Snyan
10965832Snyan	/* Network management.  */
11065832Snyan	struct ifmib_iso_8802_3 mibdata;
11165832Snyan
11265832Snyan	/* Media information.  */
11365832Snyan	struct ifmedia media;	/* used by if_media.  */
11465832Snyan	u_short mbitmap;	/* bitmap for supported media; see bit2media */
11565832Snyan	int defmedia;		/* default media  */
11665832Snyan	void (* msel)(struct fe_softc *); /* media selector.  */
11765832Snyan
118179493Sjhb	struct mtx		lock;
119179493Sjhb	struct callout		timer;
120179959Sjhb	int			tx_timeout;
12165832Snyan};
12265832Snyan
12365832Snyanstruct fe_simple_probe_struct {
12465832Snyan	u_char port;	/* Offset from the base I/O address.  */
12565832Snyan	u_char mask;	/* Bits to be checked.  */
12665832Snyan	u_char bits;	/* Values to be compared against.  */
12765832Snyan};
12865832Snyan
129179493Sjhb#define	FE_LOCK(sc)		mtx_lock(&(sc)->lock)
130179493Sjhb#define	FE_UNLOCK(sc)		mtx_unlock(&(sc)->lock)
131179493Sjhb#define	FE_ASSERT_LOCKED(sc)	mtx_assert(&(sc)->lock, MA_OWNED)
13265832Snyan
13365832Snyanextern	devclass_t fe_devclass;
13465832Snyan
13565832Snyanint	fe_attach(device_t);
13665832Snyanint	fe_alloc_port(device_t, int);
13765832Snyanint	fe_alloc_irq(device_t, int);
13865832Snyanvoid	fe_release_resource(device_t);
13965832Snyan
14065832Snyanint	fe_simple_probe(struct fe_softc const *,
14165832Snyan			struct fe_simple_probe_struct const *);
142139972Simpint	fe_valid_Ether_p(u_char const *, unsigned);
14365832Snyanvoid	fe_softc_defaults(struct fe_softc *);
14465832Snyanvoid	fe_stop(struct fe_softc *sc);
14565832Snyanvoid	fe_irq_failure(char const *, int, int, char const *);
14665832Snyanvoid	fe_msel_965(struct fe_softc *);
14765832Snyanvoid	fe_read_eeprom_jli(struct fe_softc *, u_char *);
14865832Snyanvoid	fe_init_jli(struct fe_softc *);
14965832Snyanvoid	fe_read_eeprom_ssi(struct fe_softc *, u_char *);
15065832Snyanvoid	fe_read_eeprom_lnx(struct fe_softc *, u_char *);
15165832Snyanvoid	fe_init_lnx(struct fe_softc *);
15265832Snyanvoid	fe_init_ubn(struct fe_softc *);
15365832Snyan
15465832Snyan
15565832Snyan#define	fe_inb(sc, port) \
156179959Sjhb	bus_read_1((sc)->port_res, (port))
15765832Snyan
15865832Snyan#define	fe_outb(sc, port, value) \
159179959Sjhb	bus_write_1((sc)->port_res, (port), (value))
16065832Snyan
16165832Snyan#define	fe_inw(sc, port) \
162179959Sjhb	bus_read_2((sc)->port_res, (port))
16365832Snyan
16465832Snyan#define	fe_outw(sc, port, value) \
165179959Sjhb	bus_write_2((sc)->port_res, (port), (value))
16665832Snyan
16765832Snyan#define	fe_insb(sc, port, addr, count) \
168179959Sjhb	bus_read_multi_1((sc)->port_res, (port), (addr), (count))
16965832Snyan
17065832Snyan#define	fe_outsb(sc, port, addr, count) \
171179959Sjhb	bus_write_multi_1((sc)->port_res, (port), (addr), (count))
17265832Snyan
17365832Snyan#define	fe_insw(sc, port, addr, count) \
174179959Sjhb	bus_read_multi_2((sc)->port_res, (port), (addr), (count))
17565832Snyan
17665832Snyan#define	fe_outsw(sc, port, addr, count) \
177179959Sjhb	bus_write_multi_2((sc)->port_res, (port), (addr), (count))
17865832Snyan
17965832Snyan#define fe_inblk(sc, port, addr, count) \
180179959Sjhb	bus_read_region_1((sc)->port_res, (port), (addr), (count))
18165832Snyan
18265832Snyan#define fe_outblk(sc, port, addr, count) \
183179959Sjhb	bus_write_region_1((sc)->port_res, (port), (addr), (count))
184