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