if_edvar.h revision 70234
1251881Speter/*
2251881Speter * Copyright (c) 1995, David Greenman
3251881Speter * All rights reserved.
4251881Speter *
5251881Speter * Redistribution and use in source and binary forms, with or without
6251881Speter * modification, are permitted provided that the following conditions
7251881Speter * are met:
8251881Speter * 1. Redistributions of source code must retain the above copyright
9251881Speter *    notice unmodified, this list of conditions, and the following
10251881Speter *    disclaimer.
11251881Speter * 2. Redistributions in binary form must reproduce the above copyright
12251881Speter *    notice, this list of conditions and the following disclaimer in the
13251881Speter *    documentation and/or other materials provided with the distribution.
14251881Speter *
15251881Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18251881Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19251881Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23251881Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24251881Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25251881Speter * SUCH DAMAGE.
26251881Speter *
27251881Speter * $FreeBSD: head/sys/dev/ed/if_edvar.h 70234 2000-12-20 17:10:28Z toshi $
28251881Speter */
29251881Speter
30251881Speter/*
31251881Speter * ed_softc: per line info and status
32251881Speter */
33251881Speterstruct ed_softc {
34251881Speter	struct arpcom arpcom;	/* ethernet common */
35251881Speter
36251881Speter	char   *type_str;	/* pointer to type string */
37251881Speter	u_char  vendor;		/* interface vendor */
38251881Speter	u_char  type;		/* interface type code */
39251881Speter	u_char	gone;		/* HW missing, presumed having a good time */
40251881Speter
41251881Speter	int	port_rid;	/* resource id for port range */
42251881Speter	int	port_used;	/* nonzero if ports used */
43251881Speter	struct resource* port_res; /* resource for port range */
44251881Speter	int	mem_rid;	/* resource id for memory range */
45251881Speter	int	mem_used;	/* nonzero if memory used */
46251881Speter	struct resource* mem_res; /* resource for memory range */
47251881Speter	int	irq_rid;	/* resource id for irq */
48251881Speter	struct resource* irq_res; /* resource for irq */
49251881Speter	void*	irq_handle;	/* handle for irq handler */
50251881Speter
51251881Speter	int	nic_offset;	/* NIC (DS8390) I/O bus address offset */
52251881Speter	int	asic_offset;	/* ASIC I/O bus address offset */
53251881Speter
54251881Speter/*
55251881Speter * The following 'proto' variable is part of a work-around for 8013EBT asics
56251881Speter *	being write-only. It's sort of a prototype/shadow of the real thing.
57251881Speter */
58251881Speter	u_char  wd_laar_proto;
59251881Speter	u_char	cr_proto;
60251881Speter	u_char  isa16bit;	/* width of access to card 0=8 or 1=16 */
61251881Speter	int	chip_type;	/* the type of chip (one of ED_CHIP_TYPE_*) */
62251881Speter
63251881Speter/*
64251881Speter * HP PC LAN PLUS card support.
65251881Speter */
66251881Speter
67251881Speter	u_short	hpp_options;	/* flags controlling behaviour of the HP card */
68251881Speter	u_short hpp_id;		/* software revision and other fields */
69251881Speter	caddr_t hpp_mem_start;	/* Memory-mapped IO register address */
70251881Speter
71251881Speter	caddr_t mem_start;	/* NIC memory start address */
72251881Speter	caddr_t mem_end;		/* NIC memory end address */
73251881Speter	u_int32_t mem_size;	/* total NIC memory size */
74251881Speter	caddr_t mem_ring;	/* start of RX ring-buffer (in NIC mem) */
75251881Speter
76251881Speter	u_char  mem_shared;	/* NIC memory is shared with host */
77251881Speter	u_char  xmit_busy;	/* transmitter is busy */
78251881Speter	u_char  txb_cnt;	/* number of transmit buffers */
79251881Speter	u_char  txb_inuse;	/* number of TX buffers currently in-use */
80251881Speter
81251881Speter	u_char  txb_new;	/* pointer to where new buffer will be added */
82251881Speter	u_char  txb_next_tx;	/* pointer to next buffer ready to xmit */
83251881Speter	u_short txb_len[8];	/* buffered xmit buffer lengths */
84251881Speter	u_char  tx_page_start;	/* first page of TX buffer area */
85251881Speter	u_char  rec_page_start;	/* first page of RX ring-buffer */
86251881Speter	u_char  rec_page_stop;	/* last page of RX ring-buffer */
87251881Speter	u_char  next_packet;	/* pointer to next unread RX packet */
88251881Speter	struct	ifmib_iso_8802_3 mibdata; /* stuff for network mgmt */
89251881Speter};
90251881Speter
91251881Speter#define	ed_nic_inb(sc, port) \
92251881Speter	bus_space_read_1(rman_get_bustag((sc)->port_res), \
93251881Speter		rman_get_bushandle((sc)->port_res), (sc)->nic_offset + (port))
94251881Speter
95251881Speter#define	ed_nic_outb(sc, port, value) \
96251881Speter	bus_space_write_1(rman_get_bustag((sc)->port_res), \
97251881Speter		rman_get_bushandle((sc)->port_res), (sc)->nic_offset + (port), \
98251881Speter		(value))
99251881Speter
100251881Speter#define	ed_nic_inw(sc, port) \
101251881Speter	bus_space_read_2(rman_get_bustag((sc)->port_res), \
102251881Speter		rman_get_bushandle((sc)->port_res), (sc)->nic_offset + (port))
103251881Speter
104251881Speter#define	ed_nic_outw(sc, port, value) \
105251881Speter	bus_space_write_2(rman_get_bustag((sc)->port_res), \
106251881Speter		rman_get_bushandle((sc)->port_res), (sc)->nic_offset + (port), \
107251881Speter		(value))
108251881Speter
109251881Speter#define	ed_nic_insb(sc, port, addr, count) \
110251881Speter	bus_space_read_multi_1(rman_get_bustag((sc)->port_res), \
111251881Speter		rman_get_bushandle((sc)->port_res), \
112251881Speter		(sc)->nic_offset + (port), (addr), (count))
113251881Speter
114251881Speter#define	ed_nic_outsb(sc, port, addr, count) \
115251881Speter	bus_space_write_multi_1(rman_get_bustag((sc)->port_res), \
116251881Speter		rman_get_bushandle((sc)->port_res), \
117251881Speter		(sc)->nic_offset + (port), (addr), (count))
118251881Speter
119251881Speter#define	ed_nic_insw(sc, port, addr, count) \
120251881Speter	bus_space_read_multi_2(rman_get_bustag((sc)->port_res), \
121251881Speter		rman_get_bushandle((sc)->port_res), \
122		(sc)->nic_offset + (port), (u_int16_t *)(addr), (count))
123
124#define	ed_nic_outsw(sc, port, addr, count) \
125	bus_space_write_multi_2(rman_get_bustag((sc)->port_res), \
126		rman_get_bushandle((sc)->port_res), \
127		(sc)->nic_offset + (port), (u_int16_t *)(addr), (count))
128
129#define	ed_nic_insl(sc, port, addr, count) \
130	bus_space_read_multi_4(rman_get_bustag((sc)->port_res), \
131		rman_get_bushandle((sc)->port_res), \
132		(sc)->nic_offset + (port), (u_int32_t *)(addr), (count))
133
134#define	ed_nic_outsl(sc, port, addr, count) \
135	bus_space_write_multi_4(rman_get_bustag((sc)->port_res), \
136		rman_get_bushandle((sc)->port_res), \
137		(sc)->nic_offset + (port), (u_int32_t *)(addr), (count))
138
139#define	ed_asic_inb(sc, port) \
140	bus_space_read_1(rman_get_bustag((sc)->port_res), \
141		rman_get_bushandle((sc)->port_res), (sc)->asic_offset + (port))
142
143#define	ed_asic_outb(sc, port, value) \
144	bus_space_write_1(rman_get_bustag((sc)->port_res), \
145		rman_get_bushandle((sc)->port_res), (sc)->asic_offset + (port), \
146		(value))
147
148#define	ed_asic_inw(sc, port) \
149	bus_space_read_2(rman_get_bustag((sc)->port_res), \
150		rman_get_bushandle((sc)->port_res), (sc)->asic_offset + (port))
151
152#define	ed_asic_outw(sc, port, value) \
153	bus_space_write_2(rman_get_bustag((sc)->port_res), \
154		rman_get_bushandle((sc)->port_res), (sc)->asic_offset + (port), \
155		(value))
156
157#define	ed_asic_insb(sc, port, addr, count) \
158	bus_space_read_multi_1(rman_get_bustag((sc)->port_res), \
159		rman_get_bushandle((sc)->port_res), \
160		(sc)->asic_offset + (port), (addr), (count))
161
162#define	ed_asic_outsb(sc, port, addr, count) \
163	bus_space_write_multi_1(rman_get_bustag((sc)->port_res), \
164		rman_get_bushandle((sc)->port_res), \
165		(sc)->asic_offset + (port), (addr), (count))
166
167#define	ed_asic_insw(sc, port, addr, count) \
168	bus_space_read_multi_2(rman_get_bustag((sc)->port_res), \
169		rman_get_bushandle((sc)->port_res), \
170		(sc)->asic_offset + (port), (u_int16_t *)(addr), (count))
171
172#define	ed_asic_outsw(sc, port, addr, count) \
173	bus_space_write_multi_2(rman_get_bustag((sc)->port_res), \
174		rman_get_bushandle((sc)->port_res), \
175		(sc)->asic_offset + (port), (u_int16_t *)(addr), (count))
176
177#define	ed_asic_insl(sc, port, addr, count) \
178	bus_space_read_multi_4(rman_get_bustag((sc)->port_res), \
179		rman_get_bushandle((sc)->port_res), \
180		(sc)->asic_offset + (port), (u_int32_t *)(addr), (count))
181
182#define	ed_asic_outsl(sc, port, addr, count) \
183	bus_space_write_multi_4(rman_get_bustag((sc)->port_res), \
184		rman_get_bushandle((sc)->port_res), \
185		(sc)->asic_offset + (port), (u_int32_t *)(addr), (count))
186
187void	ed_release_resources	__P((device_t));
188int	ed_alloc_port		__P((device_t, int, int));
189int	ed_alloc_memory		__P((device_t, int, int));
190int	ed_alloc_irq		__P((device_t, int, int));
191
192int	ed_probe_generic8390	__P((struct ed_softc *));
193int	ed_probe_WD80x3		__P((device_t, int, int));
194int	ed_probe_WD80x3_generic	__P((device_t, int, unsigned short *[]));
195int	ed_probe_3Com		__P((device_t, int, int));
196int	ed_probe_Novell		__P((device_t, int, int));
197int	ed_probe_Novell_generic	__P((device_t, int));
198int	ed_probe_HP_pclanp	__P((device_t, int, int));
199
200int	ed_attach		__P((struct ed_softc *, int, int));
201void	ed_stop			__P((struct ed_softc *));
202void	ed_pio_readmem		__P((struct ed_softc *, int, unsigned char *,
203				     unsigned short));
204void	ed_pio_writemem		__P((struct ed_softc *, char *,
205				     unsigned short, unsigned short));
206
207driver_intr_t	edintr;
208
209