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