1/*	$OpenBSD: dp8390var.h,v 1.14 2024/05/29 00:48:15 jsg Exp $	*/
2/*	$NetBSD: dp8390var.h,v 1.8 1998/08/12 07:19:09 scottr Exp $	*/
3
4/*
5 * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
6 * adapters.
7 *
8 * Copyright (c) 1994, 1995 Charles M. Hannum.  All rights reserved.
9 *
10 * Copyright (C) 1993, David Greenman.  This software may be used, modified,
11 * copied, distributed, and sold, in both source and binary form provided that
12 * the above copyright and these terms are retained.  Under no circumstances is
13 * the author responsible for the proper functioning of this software, nor does
14 * the author assume any responsibility for damages incurred with its use.
15 */
16
17/*
18 * We include MII glue here -- some DP8390 compatible chips have
19 * MII interfaces on them (scary, isn't it...).
20 */
21#include <dev/mii/miivar.h>
22
23#define INTERFACE_NAME_LEN	32
24
25/*
26 * dp8390_softc: per line info and status
27 */
28struct dp8390_softc {
29	struct device	sc_dev;
30	void	*sc_ih;
31	int	sc_flags;		/* interface flags, from config */
32
33	struct arpcom sc_arpcom;	/* ethernet common */
34	struct mii_data sc_mii;		/* MII glue */
35#define sc_media sc_mii.mii_media	/* compatibility definition */
36
37	bus_space_tag_t	sc_regt;	/* NIC register space tag */
38	bus_space_handle_t sc_regh;	/* NIC register space handle */
39	bus_space_tag_t	sc_buft;	/* Buffer space tag */
40	bus_space_handle_t sc_bufh;	/* Buffer space handle */
41
42	bus_size_t sc_reg_map[16];	/* register map (offsets) */
43
44	int	is790;		/* NIC is a 790 */
45
46	u_int8_t cr_proto;	/* values always set in CR */
47	u_int8_t rcr_proto;	/* values always set in RCR */
48	u_int8_t dcr_reg;	/* override DCR iff LS is set */
49
50	int	mem_start;	/* offset of NIC memory */
51	int	mem_end;	/* offset of NIC memory end */
52	int	mem_size;	/* total shared memory size */
53	int	mem_ring;	/* offset of start of RX ring-buffer */
54
55	u_short	txb_cnt;	/* Number of transmit buffers */
56	u_short	txb_inuse;	/* number of transmit buffers active */
57
58	u_short	txb_new;	/* pointer to where new buffer will be added */
59	u_short	txb_next_tx;	/* pointer to next buffer ready to xmit */
60	u_short	txb_len[8];	/* buffered xmit buffer lengths */
61	u_short	tx_page_start;	/* first page of TX buffer area */
62	u_short	rec_page_start; /* first page of RX ring-buffer */
63	u_short	rec_page_stop;	/* last page of RX ring-buffer */
64	u_short	next_packet;	/* pointer to next unread RX packet */
65
66	int	sc_enabled;	/* boolean; power enabled on interface */
67
68	int	(*test_mem)(struct dp8390_softc *);
69	void	(*init_card)(struct dp8390_softc *);
70	void	(*stop_card)(struct dp8390_softc *);
71	void	(*read_hdr)(struct dp8390_softc *,
72		    int, struct dp8390_ring *);
73	void	(*recv_int)(struct dp8390_softc *);
74	int	(*ring_copy)(struct dp8390_softc *,
75		    int, caddr_t, u_short);
76	int	(*write_mbuf)(struct dp8390_softc *, struct mbuf *, int);
77
78	int	(*sc_enable)(struct dp8390_softc *);
79	void	(*sc_disable)(struct dp8390_softc *);
80
81	void	(*sc_media_init)(struct dp8390_softc *);
82	void	(*sc_media_fini)(struct dp8390_softc *);
83
84	int	(*sc_mediachange)(struct dp8390_softc *);
85	void	(*sc_mediastatus)(struct dp8390_softc *,
86		    struct ifmediareq *);
87};
88
89/*
90 * Vendor types
91 */
92#define DP8390_VENDOR_UNKNOWN	0xff	/* Unknown network card */
93#define DP8390_VENDOR_WD_SMC	0x00	/* Western Digital/SMC */
94#define DP8390_VENDOR_3COM	0x01	/* 3Com */
95#define DP8390_VENDOR_NOVELL	0x02	/* Novell */
96#define DP8390_VENDOR_APPLE	0x10	/* Apple Ethernet card */
97#define DP8390_VENDOR_INTERLAN	0x11	/* Interlan A310 card (GatorCard) */
98#define DP8390_VENDOR_DAYNA	0x12	/* DaynaPORT E/30s (and others?) */
99#define DP8390_VENDOR_ASANTE	0x13	/* Asante MacCon II/E */
100#define DP8390_VENDOR_FARALLON	0x14	/* Farallon EtherMac II-TP */
101#define DP8390_VENDOR_FOCUS	0x15	/* FOCUS Enhancements EtherLAN */
102#define DP8390_VENDOR_KINETICS	0x16	/* Kinetics EtherPort SE/30 */
103#define DP8390_VENDOR_CABLETRON	0x17	/* Cabletron Ethernet */
104
105/*
106 * Compile-time config flags
107 */
108/*
109 * This sets the default for enabling/disabling the transceiver.
110 */
111#define DP8390_DISABLE_TRANSCEIVER	0x0001
112
113/*
114 * This forces the board to be used in 8/16-bit mode even if it autoconfigs
115 * differently.
116 */
117#define DP8390_FORCE_8BIT_MODE		0x0002
118#define DP8390_FORCE_16BIT_MODE		0x0004
119
120/*
121 * This disables the use of multiple transmit buffers.
122 */
123#define DP8390_NO_MULTI_BUFFERING	0x0008
124
125/*
126 * This forces all operations with the NIC memory to use Programmed I/O (i.e.
127 * not via shared memory).
128 */
129#define DP8390_FORCE_PIO		0x0010
130
131/*
132 * The chip is ASIX AX88190 and needs work around.
133 */
134#define DP8390_DO_AX88190_WORKAROUND	0x0020
135
136#define DP8390_ATTACHED			0x0040	/* attach has succeeded */
137
138/*
139 * ASIX AX88796 doesn't have remote DMA complete bit in ISR, so don't
140 * check ISR.RDC
141 */
142#define DP8390_NO_REMOTE_DMA_COMPLETE	0x0080
143
144/*
145 * NIC register access macros
146 */
147#define NIC_GET(t, h, reg)	bus_space_read_1(t, h,			\
148				    ((sc)->sc_reg_map[reg]))
149#define NIC_PUT(t, h, reg, val)	bus_space_write_1(t, h,			\
150				    ((sc)->sc_reg_map[reg]), (val))
151#define NIC_BARRIER(t, h)	bus_space_barrier(t, h, 0, 0x10,	\
152		    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
153
154int	dp8390_config(struct dp8390_softc *);
155int	dp8390_intr(void *);
156int	dp8390_ioctl(struct ifnet *, u_long, caddr_t);
157void	dp8390_start(struct ifnet *);
158void	dp8390_watchdog(struct ifnet *);
159void	dp8390_reset(struct dp8390_softc *);
160void	dp8390_init(struct dp8390_softc *);
161void	dp8390_stop(struct dp8390_softc *);
162int	dp8390_enable(struct dp8390_softc *);
163void	dp8390_disable(struct dp8390_softc *);
164
165int	dp8390_mediachange(struct ifnet *);
166void	dp8390_mediastatus(struct ifnet *, struct ifmediareq *);
167
168void	dp8390_media_init(struct dp8390_softc *);
169
170int	dp8390_detach(struct dp8390_softc *, int);
171
172void	dp8390_rint(struct dp8390_softc *);
173
174void	dp8390_getmcaf(struct arpcom *, u_int8_t *);
175struct mbuf *dp8390_get(struct dp8390_softc *, int, u_short);
176