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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
/*
* Copyright (c) 2011 Jason King.
* Copyright (c) 2000 Berkeley Software Design, Inc.
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ee.columbia.edu>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Bill Paul.
* 4. Neither the name of the author nor the names of any co-contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _PCNIMPL_H
#define _PCNIMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#define PCN_VENDORID 0x1022
#define PCN_DEVICEID_PCNET 0x2000
#define PCN_DEVICEID_HOME 0x2001
typedef struct pcn_type {
uint16_t pcn_vid;
uint16_t pcn_did;
char *pcn_name; /* ddi_set_prop takes char * */
} pcn_type_t;
#define PCN_TXRECLAIM 8
#define PCN_HEADROOM 34
#define PCN_TXRESCHED 120
#define PCN_RXSTAT_BAM 0x0008 /* broadcast address match */
#define PCN_RXSTAT_LAFM 0x0010 /* logical address filter match */
#define PCN_RXSTAT_PAM 0x0020 /* physical address match */
#define PCN_RXSTAT_BPE 0x0080 /* bus parity error */
#define PCN_RXSTAT_ENP 0x0100 /* end of packet */
#define PCN_RXSTAT_STP 0x0200 /* start of packet */
#define PCN_RXSTAT_BUFF 0x0400 /* buffer error */
#define PCN_RXSTAT_CRC 0x0800 /* CRC error */
#define PCN_RXSTAT_OFLOW 0x1000 /* rx overrun */
#define PCN_RXSTAT_FRAM 0x2000 /* framing error */
#define PCN_RXSTAT_ERR 0x4000 /* error summary */
#define PCN_RXSTAT_OWN 0x8000
#define PCN_RXSTAT_STR \
"\020" \
"\004BAM" \
"\005LAFM" \
"\006PAM" \
"\010BPE" \
"\011ENP" \
"\012STP" \
"\013BUFF" \
"\014CRC" \
"\015OFLOW" \
"\016FRAM" \
"\017ERR" \
"\020OWN"
#define PCN_RXLEN_MBO 0xF000
#define PCN_RXLEN_BUFSZ 0x0FFF
typedef struct pcn_rx_desc {
uint16_t pcn_rxlen;
uint16_t pcn_rsvd0;
uint16_t pcn_bufsz;
uint16_t pcn_rxstat;
uint32_t pcn_rbaddr;
uint32_t pcn_uspace;
} pcn_rx_desc_t;
typedef struct pcn_tx_desc {
uint32_t pcn_txstat;
uint32_t pcn_txctl;
uint32_t pcn_tbaddr;
uint32_t pcn_uspace;
} pcn_tx_desc_t;
#define PCN_TXCTL_OWN 0x80000000
#define PCN_TXCTL_ERR 0x40000000 /* error summary */
#define PCN_TXCTL_ADD_FCS 0x20000000 /* add FCS to pkt */
#define PCN_TXCTL_MORE_LTINT 0x10000000
#define PCN_TXCTL_ONE 0x08000000
#define PCN_TXCTL_DEF 0x04000000
#define PCN_TXCTL_STP 0x02000000
#define PCN_TXCTL_ENP 0x01000000
#define PCN_TXCTL_BPE 0x00800000
#define PCN_TXCTL_MBO 0x0000F000
#define PCN_TXCTL_BUFSZ 0x00000FFF
#define PCN_TXCTL_STR \
"\020" \
"\040OWN" \
"\037ERR" \
"\036ADD_FCS" \
"\035MORE_LTINT" \
"\034ONE" \
"\033DEF" \
"\032STP" \
"\031ENP" \
"\030BPE"
typedef struct pcn_buf {
caddr_t pb_buf;
ddi_dma_handle_t pb_dmah;
ddi_acc_handle_t pb_acch;
uint32_t pb_paddr;
} pcn_buf_t;
/* Constants, do not change */
#define PCN_BUFSZ (1664)
#define PCN_MCHASH (64)
/* Number of descriptor entries */
#define PCN_RXRING 64
#define PCN_TXRING 256
typedef struct pcn {
dev_info_t *pcn_dip;
mac_handle_t pcn_mh;
mii_handle_t pcn_mii;
uint16_t pcn_cachesize;
int pcn_flags;
int pcn_instance;
kmutex_t pcn_xmtlock;
kmutex_t pcn_intrlock;
kmutex_t pcn_reglock;
ddi_iblock_cookie_t pcn_icookie;
uint_t pcn_int_pri;
int pcn_type;
int8_t pcn_extphyaddr;
/*
* Register and DMA access
*/
uintptr_t pcn_regs;
ddi_acc_handle_t pcn_regshandle;
/*
* Receive descriptors.
*/
int pcn_rxhead;
pcn_rx_desc_t *pcn_rxdescp;
ddi_dma_handle_t pcn_rxdesc_dmah;
ddi_acc_handle_t pcn_rxdesc_acch;
uint32_t pcn_rxdesc_paddr;
pcn_buf_t **pcn_rxbufs;
/*
* Transmit descriptors.
*/
int pcn_txreclaim;
int pcn_txsend;
int pcn_txavail;
pcn_tx_desc_t *pcn_txdescp;
ddi_dma_handle_t pcn_txdesc_dmah;
ddi_acc_handle_t pcn_txdesc_acch;
uint32_t pcn_txdesc_paddr;
pcn_buf_t **pcn_txbufs;
hrtime_t pcn_txstall_time;
boolean_t pcn_wantw;
/*
* Address management.
*/
uchar_t pcn_addr[ETHERADDRL];
boolean_t pcn_promisc;
uint16_t pcn_mccount[PCN_MCHASH];
uint16_t pcn_mctab[PCN_MCHASH / 16];
/*
* stats
*/
uint64_t pcn_ipackets;
uint64_t pcn_opackets;
uint64_t pcn_rbytes;
uint64_t pcn_obytes;
uint64_t pcn_brdcstxmt;
uint64_t pcn_multixmt;
uint64_t pcn_brdcstrcv;
uint64_t pcn_multircv;
uint64_t pcn_norcvbuf;
uint64_t pcn_errrcv;
uint64_t pcn_errxmt;
uint64_t pcn_missed;
uint64_t pcn_underflow;
uint64_t pcn_overflow;
uint64_t pcn_align_errors;
uint64_t pcn_fcs_errors;
uint64_t pcn_carrier_errors;
uint64_t pcn_collisions;
uint64_t pcn_ex_collisions;
uint64_t pcn_tx_late_collisions;
uint64_t pcn_defer_xmts;
uint64_t pcn_first_collisions;
uint64_t pcn_multi_collisions;
uint64_t pcn_sqe_errors;
uint64_t pcn_macxmt_errors;
uint64_t pcn_macrcv_errors;
uint64_t pcn_toolong_errors;
uint64_t pcn_runt;
uint64_t pcn_jabber;
} pcn_t;
/* Flags */
#define PCN_RUNNING (1L << 0)
#define PCN_SUSPENDED (1L << 1)
#define PCN_INTR_ENABLED (1L << 2)
#define PCN_FLAGSTR \
"\020" \
"\001RUNNING" \
"\002SUSPENDED" \
"\003INTR_ENABLED"
#define IS_RUNNING(p) ((p)->pcn_flags & PCN_RUNNING)
#define IS_SUSPENDED(p) ((p)->pcn_flags & PCN_SUSPENDED)
#define SYNCTXDESC(pcnp, index, who) \
(void) ddi_dma_sync(pcnp->pcn_txdesc_dmah, \
(index * sizeof (pcn_tx_desc_t)), sizeof (pcn_tx_desc_t), who)
#define SYNCRXDESC(pcnp, index, who) \
(void) ddi_dma_sync(pcnp->pcn_rxdesc_dmah, \
(index * sizeof (pcn_rx_desc_t)), sizeof (pcn_rx_desc_t), who)
#define SYNCBUF(pb, len, who) \
(void) ddi_dma_sync(pb->pb_dmah, 0, len, who)
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _PCNIMPL_H */
|