1/*-
2 * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
3 *
4 * This software may be used, modified, copied, distributed, and sold, in
5 * both source and binary form provided that the above copyright, these
6 * terms and the following disclaimer are retained.  The name of the author
7 * and/or the contributor may not be used to endorse or promote products
8 * derived from this software without specific prior written permission.
9 *
10 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND
11 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
12 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
13 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE
14 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
15 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
16 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION.
17 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20 * SUCH DAMAGE.
21 *
22 * $FreeBSD$
23 */
24
25/* How many registers does an fe-supported adapter have at maximum?  */
26#define MAXREGISTERS 32
27
28/* Shouldn't these be defined somewhere else such as isa_device.h?  */
29#define NO_IRQ		0
30
31/* Flags for stability.  */
32#define UNSTABLE_IRQ	0x01	/* IRQ setting may be incorrect.  */
33#define UNSTABLE_MAC	0x02	/* Probed MAC address may be incorrect.  */
34#define UNSTABLE_TYPE	0x04	/* Probed vendor/model may be incorrect.  */
35
36/* Mapping between media bitmap (in fe_softc.mbitmap) and ifm_media.  */
37#define MB_HA	0x0001
38#define MB_HM	0x0002
39#define MB_HT	0x0004
40#define MB_H2	0x0008
41#define MB_H5	0x0010
42#define MB_HF	0x0020
43#define MB_FT	0x0040
44
45/* Card types. */
46#define FE_TYPE_SSI		1
47#define FE_TYPE_JLI		2
48#define FE_TYPE_FMV		3
49#define FE_TYPE_LNX		4
50#define FE_TYPE_UBN		5
51#define FE_TYPE_GWY		6
52#define FE_TYPE_MBH		7
53#define FE_TYPE_TDK		8
54#define FE_TYPE_RE1000		9
55#define FE_TYPE_CNET9NE		10
56#define FE_TYPE_REX		11
57
58/*
59 * Data type for a multicast address filter on 8696x.
60 */
61struct fe_filter {
62	u_char data [FE_FILTER_LEN];
63};
64
65/*
66 * fe_softc: per line info and status
67 */
68struct fe_softc {
69
70	/* Used by "common" codes.  */
71	struct ifnet		*ifp;
72	int			sc_unit;
73	u_char			enaddr[6];
74
75	/* Used by config codes.  */
76	int			type;
77	int			port_used;
78	struct resource *	port_res;
79	struct resource *	irq_res;
80	void *			irq_handle;
81
82	/* Set by probe() and not modified in later phases.  */
83	char const * typestr;	/* printable name of the interface.  */
84	u_short txb_size;	/* size of TX buffer, in bytes  */
85	u_char proto_dlcr4;	/* DLCR4 prototype.  */
86	u_char proto_dlcr5;	/* DLCR5 prototype.  */
87	u_char proto_dlcr6;	/* DLCR6 prototype.  */
88	u_char proto_dlcr7;	/* DLCR7 prototype.  */
89	u_char proto_bmpr13;	/* BMPR13 prototype.  */
90	u_char stability;	/* How stable is this?  */
91	u_short priv_info;	/* info specific to a vendor/model.  */
92
93	/* Vendor/model specific hooks.  */
94	void (*init)(struct fe_softc *); /* Just before fe_init().  */
95	void (*stop)(struct fe_softc *); /* Just after fe_stop().  */
96
97	/* Transmission buffer management.  */
98	u_short txb_free;	/* free bytes in TX buffer  */
99	u_char txb_count;	/* number of packets in TX buffer  */
100	u_char txb_sched;	/* number of scheduled packets  */
101
102	/* Excessive collision counter (see fe_tint() for details.)  */
103	u_char tx_excolls;	/* # of excessive collisions.  */
104
105	/* Multicast address filter management.  */
106	u_char filter_change;	/* MARs must be changed ASAP. */
107	struct fe_filter filter;/* new filter value.  */
108
109	/* Network management.  */
110	struct ifmib_iso_8802_3 mibdata;
111
112	/* Media information.  */
113	struct ifmedia media;	/* used by if_media.  */
114	u_short mbitmap;	/* bitmap for supported media; see bit2media */
115	int defmedia;		/* default media  */
116	void (* msel)(struct fe_softc *); /* media selector.  */
117
118	struct mtx		lock;
119	struct callout		timer;
120	int			tx_timeout;
121};
122
123struct fe_simple_probe_struct {
124	u_char port;	/* Offset from the base I/O address.  */
125	u_char mask;	/* Bits to be checked.  */
126	u_char bits;	/* Values to be compared against.  */
127};
128
129#define	FE_LOCK(sc)		mtx_lock(&(sc)->lock)
130#define	FE_UNLOCK(sc)		mtx_unlock(&(sc)->lock)
131#define	FE_ASSERT_LOCKED(sc)	mtx_assert(&(sc)->lock, MA_OWNED)
132
133extern	devclass_t fe_devclass;
134
135int	fe_attach(device_t);
136int	fe_alloc_port(device_t, int);
137int	fe_alloc_irq(device_t, int);
138void	fe_release_resource(device_t);
139
140int	fe_simple_probe(struct fe_softc const *,
141			struct fe_simple_probe_struct const *);
142int	fe_valid_Ether_p(u_char const *, unsigned);
143void	fe_softc_defaults(struct fe_softc *);
144void	fe_stop(struct fe_softc *sc);
145void	fe_irq_failure(char const *, int, int, char const *);
146void	fe_msel_965(struct fe_softc *);
147void	fe_read_eeprom_jli(struct fe_softc *, u_char *);
148void	fe_init_jli(struct fe_softc *);
149void	fe_read_eeprom_ssi(struct fe_softc *, u_char *);
150void	fe_read_eeprom_lnx(struct fe_softc *, u_char *);
151void	fe_init_lnx(struct fe_softc *);
152void	fe_init_ubn(struct fe_softc *);
153
154
155#define	fe_inb(sc, port) \
156	bus_read_1((sc)->port_res, (port))
157
158#define	fe_outb(sc, port, value) \
159	bus_write_1((sc)->port_res, (port), (value))
160
161#define	fe_inw(sc, port) \
162	bus_read_2((sc)->port_res, (port))
163
164#define	fe_outw(sc, port, value) \
165	bus_write_2((sc)->port_res, (port), (value))
166
167#define	fe_insb(sc, port, addr, count) \
168	bus_read_multi_1((sc)->port_res, (port), (addr), (count))
169
170#define	fe_outsb(sc, port, addr, count) \
171	bus_write_multi_1((sc)->port_res, (port), (addr), (count))
172
173#define	fe_insw(sc, port, addr, count) \
174	bus_read_multi_2((sc)->port_res, (port), (addr), (count))
175
176#define	fe_outsw(sc, port, addr, count) \
177	bus_write_multi_2((sc)->port_res, (port), (addr), (count))
178
179#define fe_inblk(sc, port, addr, count) \
180	bus_read_region_1((sc)->port_res, (port), (addr), (count))
181
182#define fe_outblk(sc, port, addr, count) \
183	bus_write_region_1((sc)->port_res, (port), (addr), (count))
184