xref: /netbsd-src/sys/dev/ic/cs89x0var.h (revision 233f556c2e23eed8ab45275c5718a1f0efb8fe2b)
1*233f556cSriastradh /*	$NetBSD: cs89x0var.h,v 1.17 2015/04/13 16:33:24 riastradh Exp $	*/
2dbaca003Syamt 
3dbaca003Syamt /*
4dbaca003Syamt  * Copyright 1997
5dbaca003Syamt  * Digital Equipment Corporation. All rights reserved.
6dbaca003Syamt  *
7dbaca003Syamt  * This software is furnished under license and may be used and
8dbaca003Syamt  * copied only in accordance with the following terms and conditions.
9dbaca003Syamt  * Subject to these conditions, you may download, copy, install,
10dbaca003Syamt  * use, modify and distribute this software in source and/or binary
11dbaca003Syamt  * form. No title or ownership is transferred hereby.
12dbaca003Syamt  *
13dbaca003Syamt  * 1) Any source code used, modified or distributed must reproduce
14dbaca003Syamt  *    and retain this copyright notice and list of conditions as
15dbaca003Syamt  *    they appear in the source file.
16dbaca003Syamt  *
17dbaca003Syamt  * 2) No right is granted to use any trade name, trademark, or logo of
18dbaca003Syamt  *    Digital Equipment Corporation. Neither the "Digital Equipment
19dbaca003Syamt  *    Corporation" name nor any trademark or logo of Digital Equipment
20dbaca003Syamt  *    Corporation may be used to endorse or promote products derived
21dbaca003Syamt  *    from this software without the prior written permission of
22dbaca003Syamt  *    Digital Equipment Corporation.
23dbaca003Syamt  *
24dbaca003Syamt  * 3) This software is provided "AS-IS" and any express or implied
25dbaca003Syamt  *    warranties, including but not limited to, any implied warranties
26dbaca003Syamt  *    of merchantability, fitness for a particular purpose, or
27dbaca003Syamt  *    non-infringement are disclaimed. In no event shall DIGITAL be
28dbaca003Syamt  *    liable for any damages whatsoever, and in particular, DIGITAL
29dbaca003Syamt  *    shall not be liable for special, indirect, consequential, or
30dbaca003Syamt  *    incidental damages or damages for lost profits, loss of
31dbaca003Syamt  *    revenue or loss of use, whether such damages arise in contract,
32dbaca003Syamt  *    negligence, tort, under statute, in equity, at law or otherwise,
33dbaca003Syamt  *    even if advised of the possibility of such damage.
34dbaca003Syamt  */
35dbaca003Syamt 
36dbaca003Syamt /*
37dbaca003Syamt **++
38dbaca003Syamt **  FACILITY  Crystal CS8900 Ethernet driver header file
39dbaca003Syamt **
40dbaca003Syamt **  ABSTRACT
41dbaca003Syamt **
42dbaca003Syamt **     This module provides CS8900 driver softc and related definitions
43dbaca003Syamt **
44dbaca003Syamt **  AUTHORS
45dbaca003Syamt **
46dbaca003Syamt **     Peter Dettori   SEA - Software Engineering.
47dbaca003Syamt **
48dbaca003Syamt **  CREATION DATE:
49dbaca003Syamt **
50dbaca003Syamt **       13-Feb-1997.
51dbaca003Syamt **
52dbaca003Syamt **  MODIFICATION HISTORY:
53dbaca003Syamt **
54dbaca003Syamt **--
55dbaca003Syamt */
56dbaca003Syamt 
57dbaca003Syamt #ifndef _DEV_IC_CS89X0VAR_H_
58dbaca003Syamt #define	_DEV_IC_CS89X0VAR_H_
59dbaca003Syamt 
60*233f556cSriastradh #include <sys/rndsource.h>
61*233f556cSriastradh 
62dbaca003Syamt /*
63dbaca003Syamt  * Ethernet software status per interface.
64dbaca003Syamt  *
65dbaca003Syamt  * Each interface is referenced by a network interface structure,
66dbaca003Syamt  * arpcom.ac_if, which the routing code uses to locate the interface.
67dbaca003Syamt  * This structure contains the output queue for the interface,
68dbaca003Syamt  * its address, ...
69dbaca003Syamt  */
70dbaca003Syamt struct cs_softc {
713b0a685fStsutsui 	device_t sc_dev;		/* base device glue */
72dbaca003Syamt 	struct ethercom sc_ethercom;	/* Ethernet common */
73dbaca003Syamt 	struct ifmedia sc_media;	/* media control structures */
74dbaca003Syamt 
757e681f70Swiz 	void	*sc_ih;			/* interrupt handler */
76dbaca003Syamt 
77dbaca003Syamt 	bus_space_tag_t sc_iot;		/* bus space tag for IO */
78dbaca003Syamt 	bus_space_tag_t sc_memt;	/* bus space tag for memory mode */
79dbaca003Syamt 	bus_space_handle_t sc_ioh;	/* bus space handles */
80dbaca003Syamt 	bus_space_handle_t sc_memh;
81dbaca003Syamt 
82dbaca003Syamt #if 0
83dbaca003Syamt 	isa_chipset_tag_t sc_ic;	/* ISA chipset */
84dbaca003Syamt #endif
85dbaca003Syamt 
86dbaca003Syamt 	int	sc_irq;			/* IRQ line */
87dbaca003Syamt 
88dbaca003Syamt 	int	sc_prodid;		/* saved product ID */
89dbaca003Syamt 	int	sc_prodrev;		/* saved product rev */
90dbaca003Syamt 
91dbaca003Syamt 	bus_addr_t sc_pktpgaddr;	/* PacketPage bus memory address */
92dbaca003Syamt 
93dbaca003Syamt 	int	sc_cfgflags;		/* software configuration flags */
94dbaca003Syamt 
95dbaca003Syamt 	int	sc_memorymode;		/* are we in memory mode? */
96dbaca003Syamt 	int	sc_txbusy;		/* transmit in progress */
97dbaca003Syamt 	int	sc_resetting;		/* reset in progress */
98dbaca003Syamt 
99dbaca003Syamt 	int	sc_xe_ent;		/* current early-xmit table entry */
100dbaca003Syamt 	int	sc_xe_togo;		/* # of packets to go at this ent */
101dbaca003Syamt 
102dbaca003Syamt 	int	sc_carrier;		/* has carrier */
103dbaca003Syamt 
104dbaca003Syamt 	u_int8_t sc_enaddr[ETHER_ADDR_LEN];	/* MAC address */
105dbaca003Syamt 
1068276e3abSchris 	int	eeprom_size;		/* how large is the eeprom (in bytes) */
1078276e3abSchris 	u_int16_t *eeprom_data;		/* copy of the eeprom data */
1088276e3abSchris 
1093afd44cfStls 	krndsource_t rnd_source; /* random source */
110dbaca003Syamt 
111dbaca003Syamt 	/* power management */
1121906cd67Saugustss 	int (*sc_enable)(struct cs_softc *);
1131906cd67Saugustss 	void (*sc_disable)(struct cs_softc *);
114dbaca003Syamt 
1151ffa7b76Swiz 	/* DMA hooks */
1161906cd67Saugustss 	void (*sc_dma_process_rx)(struct cs_softc *);
1171906cd67Saugustss 	void (*sc_dma_chipinit)(struct cs_softc *);
1181906cd67Saugustss 	void (*sc_dma_attach)(struct cs_softc *);
1191c66d185Saugustss 
1201c66d185Saugustss 	/* register access hooks */
1211c66d185Saugustss 	u_int8_t (*sc_io_read_1)(struct cs_softc *, bus_size_t);
1221c66d185Saugustss 	u_int16_t (*sc_io_read_2)(struct cs_softc *, bus_size_t);
1231c66d185Saugustss 	void (*sc_io_read_multi_2)(struct cs_softc *, bus_size_t, u_int16_t *,
1241c66d185Saugustss 				bus_size_t);
1251c66d185Saugustss 	void (*sc_io_write_2)(struct cs_softc *, bus_size_t, u_int16_t);
1261c66d185Saugustss 	void (*sc_io_write_multi_2)(struct cs_softc *, bus_size_t,
1271c66d185Saugustss 				 const u_int16_t *, bus_size_t);
1281c66d185Saugustss 	u_int16_t (*sc_mem_read_2)(struct cs_softc *, bus_size_t);
1291c66d185Saugustss 	void (*sc_mem_write_2)(struct cs_softc *, bus_size_t, u_int16_t);
1301c66d185Saugustss 	void (*sc_mem_write_region_2)(struct cs_softc *, bus_size_t,
1311c66d185Saugustss 				      const u_int16_t *, bus_size_t);
132dbaca003Syamt };
133dbaca003Syamt 
1341c66d185Saugustss #define IO_READ_1(sc, a) \
1351c66d185Saugustss 	(sc)->sc_io_read_1 ? \
1361c66d185Saugustss 		(sc)->sc_io_read_1((sc), (a)) : \
1371c66d185Saugustss 		bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (a))
1381c66d185Saugustss #define IO_READ_2(sc, a) \
1391c66d185Saugustss 	(sc)->sc_io_read_2 ? \
1401c66d185Saugustss 		(sc)->sc_io_read_2((sc), (a)) : \
1411c66d185Saugustss 		bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, (a))
1421c66d185Saugustss #define IO_READ_MULTI_2(sc, a, b, c) \
1431c66d185Saugustss 	if ((sc)->sc_io_read_multi_2) \
1441c66d185Saugustss 		(sc)->sc_io_read_multi_2((sc), (a), (b), (c)); else \
1451c66d185Saugustss 		bus_space_read_multi_2((sc)->sc_iot, (sc)->sc_ioh, (a), (b), (c))
1461c66d185Saugustss #define IO_WRITE_2(sc, a, d) \
1471c66d185Saugustss 	if ((sc)->sc_io_write_2) \
1481c66d185Saugustss 		(sc)->sc_io_write_2((sc), (a), (d)); else \
1491c66d185Saugustss 		bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, (a), (d))
1501c66d185Saugustss #define IO_WRITE_MULTI_2(sc, a, d, c) \
1511c66d185Saugustss 	if ((sc)->sc_io_write_multi_2) \
1521c66d185Saugustss 		(sc)->sc_io_write_multi_2((sc), (a), (d), (c)); else \
1531c66d185Saugustss 		bus_space_write_multi_2((sc)->sc_iot, (sc)->sc_ioh, (a), (d), (c))
1541c66d185Saugustss #define MEM_READ_2(sc, a) \
1551c66d185Saugustss 	(sc)->sc_mem_read_2 ? \
1561c66d185Saugustss 		(sc)->sc_mem_read_2((sc), (a)) : \
1571c66d185Saugustss 		bus_space_read_2((sc)->sc_memt, (sc)->sc_memh, (a))
1581c66d185Saugustss #define MEM_WRITE_2(sc, a, d) \
1591c66d185Saugustss 	if ((sc)->sc_mem_write_2) \
1601c66d185Saugustss 		(sc)->sc_mem_write_2((sc), (a), (d)); else \
1611c66d185Saugustss 		bus_space_write_2((sc)->sc_memt, (sc)->sc_memh, (a), (d))
1621c66d185Saugustss #define MEM_WRITE_REGION_2(sc, a, d, c) \
1631c66d185Saugustss 	if ((sc)->sc_mem_write_region_2) \
1641c66d185Saugustss 		(sc)->sc_mem_write_region_2((sc), (a), (d), (c)); else \
1651c66d185Saugustss 		bus_space_write_region_2((sc)->sc_memt, (sc)->sc_memh, (a), (d), (c))
1661c66d185Saugustss 
167dbaca003Syamt 
168dbaca003Syamt /* Config Flags in cs_softc */
169dbaca003Syamt 
170dbaca003Syamt #define CFGFLG_MEM_MODE     0x0001
171dbaca003Syamt #define CFGFLG_USE_SA       0x0002
172dbaca003Syamt #define CFGFLG_IOCHRDY      0x0004
173dbaca003Syamt #define CFGFLG_DCDC_POL     0x0008
174dbaca003Syamt #define CFGFLG_DMA_MODE	    0x0020
175dbaca003Syamt #define CFGFLG_ATTACHED     0x0040 /* XXX should not be here? */
176dbaca003Syamt #define CFGFLG_CARDBUS_HACK 0x0080
177dbaca003Syamt #define CFGFLG_ENABLED      0x0100 /* XXX should not be here? */
1788276e3abSchris #define CFGFLG_PARSE_EEPROM 0x0200
179dbaca003Syamt #define CFGFLG_NOT_EEPROM   0x8000
180dbaca003Syamt 
181dbaca003Syamt 
182dbaca003Syamt /*
183dbaca003Syamt  * Inlines for reading/writing the packet page area.
184dbaca003Syamt  */
185dbaca003Syamt 
186fbae48b9Sperry static __inline u_int16_t _cs_read_port(struct cs_softc *, int);
187dbaca003Syamt 
188fbae48b9Sperry static __inline u_int16_t
_cs_read_port(struct cs_softc * sc,int off)189dbaca003Syamt _cs_read_port(struct cs_softc *sc, int off)
190dbaca003Syamt {
191dbaca003Syamt 	u_int16_t result;
192dbaca003Syamt 
193dbaca003Syamt 	if (sc->sc_cfgflags & CFGFLG_CARDBUS_HACK) {
194dbaca003Syamt 	    /*
195dbaca003Syamt 		 * hack for EtherJet PCMCIA and cardbus (obtained from freebsd)
196dbaca003Syamt 		 *
197dbaca003Syamt 	     * EtherJet PCMCIA don't work with cardbus bridges
198dbaca003Syamt 	     * (at least TI1250) without this hack.
199dbaca003Syamt 	     */
2001c66d185Saugustss 	    result = (IO_READ_1(sc, off) & 0xff);
2011c66d185Saugustss 	    result |= ((IO_READ_1(sc, off+1) & 0xff) << 8);
202dbaca003Syamt 	}
203dbaca003Syamt 	else {
2041c66d185Saugustss 	    result = IO_READ_2(sc, off);
205dbaca003Syamt 	}
206dbaca003Syamt 
207dbaca003Syamt 	return result;
208dbaca003Syamt }
209dbaca003Syamt 
210fbae48b9Sperry static __inline u_int16_t _CS_READ_PACKET_PAGE_IO(struct cs_softc *, int);
211dbaca003Syamt 
212fbae48b9Sperry static __inline u_int16_t
_CS_READ_PACKET_PAGE_IO(struct cs_softc * sc,int offset)213dbaca003Syamt _CS_READ_PACKET_PAGE_IO(struct cs_softc *sc, int offset)
214dbaca003Syamt {
215dbaca003Syamt 
2161c66d185Saugustss 	IO_WRITE_2(sc, PORT_PKTPG_PTR, offset);
217dbaca003Syamt 	return (_cs_read_port(sc, PORT_PKTPG_DATA));
218dbaca003Syamt }
219dbaca003Syamt 
220fbae48b9Sperry static __inline u_int16_t CS_READ_PACKET_PAGE_IO(struct cs_softc *, int);
221dbaca003Syamt 
222fbae48b9Sperry static __inline u_int16_t
CS_READ_PACKET_PAGE_IO(struct cs_softc * sc,int offset)2231c66d185Saugustss CS_READ_PACKET_PAGE_IO(struct cs_softc *sc, int offset)
224dbaca003Syamt {
225dbaca003Syamt 
2261c66d185Saugustss 	IO_WRITE_2(sc, PORT_PKTPG_PTR, offset);
2271c66d185Saugustss 	return (IO_READ_2(sc, PORT_PKTPG_DATA));
228dbaca003Syamt }
229dbaca003Syamt 
2301c66d185Saugustss #define	CS_READ_PACKET_PAGE_MEM(sc, offset)				\
2311c66d185Saugustss 	MEM_READ_2((sc), (offset))
232dbaca003Syamt 
233dbaca003Syamt #define	CS_READ_PACKET_PAGE(sc, offset)					\
2341c66d185Saugustss 	((sc)->sc_memorymode ? CS_READ_PACKET_PAGE_MEM((sc), (offset)) :\
235dbaca003Syamt 	 _CS_READ_PACKET_PAGE_IO((sc), (offset)))
236dbaca003Syamt 
2371c66d185Saugustss #define	CS_WRITE_PACKET_PAGE_IO(sc, offset, val)			\
238dbaca003Syamt do {									\
2391c66d185Saugustss 	IO_WRITE_2((sc), PORT_PKTPG_PTR, (offset));			\
2401c66d185Saugustss 	IO_WRITE_2((sc), PORT_PKTPG_DATA, (val));			\
241dbaca003Syamt } while (0)
242dbaca003Syamt 
2431c66d185Saugustss #define	CS_WRITE_PACKET_PAGE_MEM(sc, offset, val)		\
2441c66d185Saugustss 	MEM_WRITE_2((sc), (offset), (val))
245dbaca003Syamt 
246dbaca003Syamt #define	CS_WRITE_PACKET_PAGE(sc, offset, val)				\
247dbaca003Syamt do {									\
248dbaca003Syamt 	if ((sc)->sc_memorymode)					\
2491c66d185Saugustss 		CS_WRITE_PACKET_PAGE_MEM((sc), (offset), (val));	\
250dbaca003Syamt 	else								\
2511c66d185Saugustss 		CS_WRITE_PACKET_PAGE_IO((sc), (offset), (val));		\
252dbaca003Syamt } while (0)
253dbaca003Syamt 
254dbaca003Syamt #define CS_READ_PORT(sc, off)\
2551c66d185Saugustss 	IO_READ_2((sc), (off))
256dbaca003Syamt 
257dbaca003Syamt #define CS_WRITE_PORT(sc, off, val)\
2581c66d185Saugustss 	IO_WRITE_2((sc), (off), (val))
259dbaca003Syamt 
260dbaca003Syamt 
261dbaca003Syamt /* Return Status */
262dbaca003Syamt #define	CS_ERROR   -1
263dbaca003Syamt #define CS_OK       1
264dbaca003Syamt 
265dbaca003Syamt 
266dbaca003Syamt /* Media Type in cs_softc */
267dbaca003Syamt 
268dbaca003Syamt #define MEDIA_AUI           0x0001
269dbaca003Syamt #define MEDIA_10BASE2       0x0002
270dbaca003Syamt #define MEDIA_10BASET       0x0003
271dbaca003Syamt 
272dbaca003Syamt 
273dbaca003Syamt /* Miscellaneous definitions */
274dbaca003Syamt 
275dbaca003Syamt #define MAXLOOP            0x8888
276dbaca003Syamt 
2777f6ed16eSitojun int	cs_attach(struct cs_softc *, u_int8_t *, int *, int, int);
2787f6ed16eSitojun int	cs_detach(struct cs_softc *);
2797f6ed16eSitojun int	cs_verify_eeprom(struct cs_softc *);
2801c66d185Saugustss int	cs_read_eeprom(struct cs_softc *, int, u_int16_t *);
2811906cd67Saugustss int	cs_intr(void *);
282529e91fcScegger int	cs_activate(device_t, enum devact);
2831906cd67Saugustss void	cs_ether_input(struct cs_softc *, struct mbuf *);
2841906cd67Saugustss void	cs_print_rx_errors(struct cs_softc *, u_int16_t);
2851906cd67Saugustss int	cs_init(struct ifnet *);
286dbaca003Syamt 
287dbaca003Syamt #define CS_IS_ENABLED(sc)	((sc)->sc_cfgflags & CFGFLG_ENABLED)
288dbaca003Syamt 
289dbaca003Syamt #endif /* _DEV_IC_CS89X0VAR_H_ */
290