blob: d1fce450ea04ff15d54aa6e3939004ddc0372cc5 (
plain)
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_HME_H
#define _SYS_HME_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
/* default IPG settings */
#define IPG1 8
#define IPG2 4
/*
* Declarations and definitions specific to the
* FEPS 10/100 Mbps Ethernet (hme) device.
*/
/*
* Per-Stream instance state information.
*
* Each instance is dynamically allocated at open() and free'd
* at close(). Each per-Stream instance points to at most one
* per-device structure using the sb_hmep field. All instances
* are threaded together into one list of active instances
* ordered on minor device number.
*/
#define HME_2P0_REVID 0xa0 /* hme - feps. */
#define HME_2P1_REVID 0x20
#define HME_2P1_REVID_OBP 0x21
#define HME_1C0_REVID 0xc0 /* cheerio 1.0, hme 2.0 equiv. */
#define HME_2C0_REVID 0xc1 /* cheerio 2.0, hme 2.2 equiv. */
#define HME_REV_VERS_MASK 0x0f /* Mask to retain bits for cheerio ver */
typedef struct {
ddi_dma_handle_t dmah;
ddi_acc_handle_t acch;
caddr_t kaddr;
uint32_t paddr;
} hmebuf_t;
/*
* HME Device Channel instance state information.
*
* Each instance is dynamically allocated on first attach.
*/
struct hme {
mac_handle_t hme_mh; /* GLDv3 handle */
mii_handle_t hme_mii;
dev_info_t *dip; /* associated dev_info */
int instance; /* instance */
ulong_t pagesize; /* btop(9F) */
int hme_mifpoll_enable;
int hme_frame_enable;
int hme_lance_mode_enable;
int hme_rxcv_enable;
uint32_t hme_lance_mode;
uint32_t hme_ipg0;
uint32_t hme_ipg1;
uint32_t hme_ipg2;
uint_t hme_burstsizes; /* binary encoded val */
uint32_t hme_config; /* Config reg store */
int hme_phy_failure; /* phy failure type */
int hme_64bit_xfer; /* 64-bit Sbus xfers */
int hme_phyad;
int hme_nlasttries;
int hme_cheerio_mode;
struct ether_addr hme_factaddr; /* factory mac address */
struct ether_addr hme_ouraddr; /* individual address */
uint32_t hme_addrflags; /* address flags */
uint32_t hme_flags; /* misc. flags */
boolean_t hme_wantw; /* xmit: out of resources */
boolean_t hme_started; /* mac layer started */
uint8_t hme_devno;
uint16_t hme_ladrf[4]; /* 64 bit multicast filter */
uint32_t hme_ladrf_refcnt[64];
boolean_t hme_promisc;
uint32_t hme_multi; /* refcount on mcast addrs */
struct hme_global *hme_globregp; /* HME global regs */
struct hme_etx *hme_etxregp; /* HME ETX regs */
struct hme_erx *hme_erxregp; /* HME ERX regs */
struct hme_bmac *hme_bmacregp; /* BigMAC registers */
struct hme_mif *hme_mifregp; /* HME transceiver */
unsigned char *hme_romp; /* fcode rom pointer */
kmutex_t hme_xmitlock; /* protect xmit-side fields */
kmutex_t hme_intrlock; /* protect intr-side fields */
ddi_iblock_cookie_t hme_cookie; /* interrupt cookie */
struct hme_rmd *hme_rmdp; /* receive descriptor ring start */
struct hme_tmd *hme_tmdp; /* transmit descriptor ring start */
ddi_dma_handle_t hme_rmd_dmah;
ddi_acc_handle_t hme_rmd_acch;
caddr_t hme_rmd_kaddr;
uint32_t hme_rmd_paddr;
ddi_dma_handle_t hme_tmd_dmah;
ddi_acc_handle_t hme_tmd_acch;
caddr_t hme_tmd_kaddr;
uint32_t hme_tmd_paddr;
uint64_t hme_rxindex;
uint64_t hme_txindex;
uint64_t hme_txreclaim;
hmebuf_t *hme_tbuf; /* hmebuf associated with TMD */
hmebuf_t *hme_rbuf; /* hmebuf associated with RMD */
ddi_device_acc_attr_t hme_dev_attr;
ddi_acc_handle_t hme_globregh; /* HME global regs */
ddi_acc_handle_t hme_etxregh; /* HME ETX regs */
ddi_acc_handle_t hme_erxregh; /* HME ERX regs */
ddi_acc_handle_t hme_bmacregh; /* BigMAC registers */
ddi_acc_handle_t hme_mifregh; /* HME transceiver */
ddi_acc_handle_t hme_romh; /* rom handle */
ddi_acc_handle_t pci_config_handle; /* HME PCI config */
/*
* DDI dma handle, kernel virtual base,
* and io virtual base of IOPB area.
*/
ddi_dma_handle_t hme_iopbhandle;
ulong_t hme_iopbkbase;
uint32_t hme_iopbiobase;
kstat_t *hme_ksp; /* kstat pointer */
kstat_t *hme_intrstats; /* kstat interrupt counter */
uint64_t hme_ipackets;
uint64_t hme_rbytes;
uint64_t hme_ierrors;
uint64_t hme_opackets;
uint64_t hme_obytes;
uint64_t hme_oerrors;
uint64_t hme_multircv; /* # multicast packets received */
uint64_t hme_multixmt; /* # multicast packets for xmit */
uint64_t hme_brdcstrcv; /* # broadcast packets received */
uint64_t hme_brdcstxmt; /* # broadcast packets for xmit */
uint64_t hme_oflo;
uint64_t hme_uflo;
uint64_t hme_norcvbuf; /* # rcv packets discarded */
uint64_t hme_noxmtbuf; /* # xmit packets discarded */
uint64_t hme_duplex;
uint64_t hme_align_errors;
uint64_t hme_coll;
uint64_t hme_fcs_errors;
uint64_t hme_defer_xmts;
uint64_t hme_sqe_errors;
uint64_t hme_excol;
uint64_t hme_fstcol;
uint64_t hme_tlcol;
uint64_t hme_toolong_errors;
uint64_t hme_runt;
uint64_t hme_carrier_errors;
uint64_t hme_jab;
uint32_t hme_cvc;
uint32_t hme_lenerr;
uint32_t hme_buff;
uint32_t hme_missed;
uint32_t hme_nocanput;
uint32_t hme_allocbfail;
uint32_t hme_babl;
uint32_t hme_tmder;
uint32_t hme_txlaterr;
uint32_t hme_rxlaterr;
uint32_t hme_slvparerr;
uint32_t hme_txparerr;
uint32_t hme_rxparerr;
uint32_t hme_slverrack;
uint32_t hme_txerrack;
uint32_t hme_rxerrack;
uint32_t hme_txtagerr;
uint32_t hme_rxtagerr;
uint32_t hme_eoperr;
uint32_t hme_notmds;
uint32_t hme_notbufs;
uint32_t hme_norbufs;
/*
* check if transmitter is hung
*/
uint32_t hme_starts;
uint32_t hme_txhung;
time_t hme_msg_time;
/*
* Debuging kstats
*/
uint32_t inits;
uint32_t phyfail;
uint32_t asic_rev;
};
/* flags */
#define HMERUNNING 0x01 /* chip is initialized */
#define HMESUSPENDED 0x08 /* suspended interface */
#define HMEINITIALIZED 0x10 /* interface initialized */
/* Mac address flags */
#define HME_FACTADDR_PRESENT 0x01 /* factory MAC id present */
#define HME_FACTADDR_USE 0x02 /* use factory MAC id */
struct hmekstat {
struct kstat_named hk_cvc; /* code violation errors */
struct kstat_named hk_lenerr; /* rx len errors */
struct kstat_named hk_buff; /* buff errors */
struct kstat_named hk_missed; /* missed/dropped packets */
struct kstat_named hk_nocanput; /* nocanput errors */
struct kstat_named hk_allocbfail; /* allocb failures */
struct kstat_named hk_babl; /* runt errors */
struct kstat_named hk_tmder; /* tmd errors */
struct kstat_named hk_txlaterr; /* tx late errors */
struct kstat_named hk_rxlaterr; /* rx late errors */
struct kstat_named hk_slvparerr; /* slave parity errors */
struct kstat_named hk_txparerr; /* tx parity errors */
struct kstat_named hk_rxparerr; /* rx parity errors */
struct kstat_named hk_slverrack; /* slave error acks */
struct kstat_named hk_txerrack; /* tx error acks */
struct kstat_named hk_rxerrack; /* rx error acks */
struct kstat_named hk_txtagerr; /* tx tag error */
struct kstat_named hk_rxtagerr; /* rx tag error */
struct kstat_named hk_eoperr; /* eop error */
struct kstat_named hk_notmds; /* tmd errors */
struct kstat_named hk_notbufs; /* tx buf errors */
struct kstat_named hk_norbufs; /* rx buf errors */
struct kstat_named hk_inits; /* global inits */
struct kstat_named hk_phyfail; /* phy failures */
struct kstat_named hk_asic_rev; /* asic_rev */
};
#define HMEDRAINTIME (400000) /* # microseconds xmit drain */
#define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1))
#define ROUNDUP2(a, n) (uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1))
/*
* Xmit/receive buffer structure.
* This structure is organized to meet the following requirements:
* - bb_buf starts on an HMEBURSTSIZE boundary.
* - hmebuf is an even multiple of HMEBURSTSIZE
* - bb_buf[] is large enough to contain max VLAN frame (1522) plus
* (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE
* XXX What about another 128 bytes (HMEC requirement).
* Fast aligned copy requires both the source and destination
* addresses have the same offset from some N-byte boundary.
*/
#define HMEBURSTSIZE (64)
#define HMEBURSTMASK (HMEBURSTSIZE - 1)
#define HMEBUFSIZE (1728)
/*
* Define offset from start of bb_buf[] to point receive descriptor.
* Requirements:
* - must be 14 bytes back of a 4-byte boundary so the start of
* the network packet is 4-byte aligned.
* - leave some headroom for others
*/
#define HMEHEADROOM (34)
/* Offset for the first byte in the receive buffer */
#define HME_FSTBYTE_OFFSET 2
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_HME_H */
|