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
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
|
/* $OpenBSD: hmereg.h,v 1.12 2005/02/22 20:44:26 brad Exp $ */
/*
* Copyright (c) 1998 Jason L. Wright (jason@thought.net)
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.
*/
#define HME_DEFAULT_JSIZE 4
#define HME_DEFAULT_IPKT_GAP0 16
#define HME_DEFAULT_IPKT_GAP1 8
#define HME_DEFAULT_IPKT_GAP2 4
/* global registers */
struct hme_gr {
volatile u_int32_t reset; /* reset tx/rx */
volatile u_int32_t cfg; /* config */
volatile u_int32_t _padding[62]; /* unused */
volatile u_int32_t stat; /* intr status */
volatile u_int32_t imask; /* intr mask */
};
/* hme_gr.reset (software reset register) */
#define GR_RESET_ETX 0x01 /* reset external tx */
#define GR_RESET_ERX 0x02 /* reset external rx */
#define GR_RESET_ALL (GR_RESET_ETX | GR_RESET_ERX)
/* hme_gr.cfg (configuration register) */
#define GR_CFG_BURSTMSK 0x03 /* burst mask */
#define GR_CFG_BURST16 0x00 /* 16 byte bursts */
#define GR_CFG_BURST32 0x01 /* 32 byte bursts */
#define GR_CFG_BURST64 0x02 /* 32 byte bursts */
#define GR_CFG_64BIT 0x04
#define GR_CFG_PARITY 0x08
#define GR_CFG_RESV 0x10
/* hme_gr.stat (interrupt status register) */
#define GR_STAT_GOTFRAME 0x00000001 /* frame received */
#define GR_STAT_RCNTEXP 0x00000002 /* rx frame count expired */
#define GR_STAT_ACNTEXP 0x00000004 /* align error count expired */
#define GR_STAT_CCNTEXP 0x00000008 /* crc error count expired */
#define GR_STAT_LCNTEXP 0x00000010 /* length error count expired */
#define GR_STAT_RFIFOVF 0x00000020 /* rx fifo overflow */
#define GR_STAT_CVCNTEXP 0x00000040 /* code violation counter expired */
#define GR_STAT_STSTERR 0x00000080 /* xif sqe test failed */
#define GR_STAT_SENTFRAME 0x00000100 /* frame sent */
#define GR_STAT_TFIFO_UND 0x00000200 /* tx fifo underrun */
#define GR_STAT_MAXPKTERR 0x00000400 /* max-packet size error */
#define GR_STAT_NCNTEXP 0x00000800 /* normal collision count expired */
#define GR_STAT_ECNTEXP 0x00001000 /* excess collision count expired */
#define GR_STAT_LCCNTEXP 0x00002000 /* late collision count expired */
#define GR_STAT_FCNTEXP 0x00004000 /* first collision count expired */
#define GR_STAT_DTIMEXP 0x00008000 /* defer timer expired */
#define GR_STAT_RXTOHOST 0x00010000 /* pkt moved from rx fifo->memory */
#define GR_STAT_NORXD 0x00020000 /* out of receive descriptors */
#define GR_STAT_RXERR 0x00040000 /* rx dma error */
#define GR_STAT_RXLATERR 0x00080000 /* late error during rx dma */
#define GR_STAT_RXPERR 0x00100000 /* parity error during rx dma */
#define GR_STAT_RXTERR 0x00200000 /* tag error during rx dma */
#define GR_STAT_EOPERR 0x00400000 /* tx descriptor did not set EOP */
#define GR_STAT_MIFIRQ 0x00800000 /* mif needs attention */
#define GR_STAT_HOSTTOTX 0x01000000 /* pkt moved from memory->tx fifo */
#define GR_STAT_TXALL 0x02000000 /* all pkts in fifo transmitted */
#define GR_STAT_TXEACK 0x04000000 /* error during tx dma */
#define GR_STAT_TXLERR 0x08000000 /* late error during tx dma */
#define GR_STAT_TXPERR 0x10000000 /* parity error during tx dma */
#define GR_STAT_TXTERR 0x20000000 /* tag error durig tx dma */
#define GR_STAT_SLVERR 0x40000000 /* pio access error */
#define GR_STAT_SLVPERR 0x80000000 /* pio access parity error */
/* all the errors to worry about */
#define GR_STAT_ALL_ERRORS \
(GR_STAT_SLVPERR | GR_STAT_SLVERR | GR_STAT_TXTERR | \
GR_STAT_TXPERR | GR_STAT_TXLERR | GR_STAT_TXEACK | \
GR_STAT_EOPERR | GR_STAT_RXTERR | GR_STAT_RXPERR | \
GR_STAT_RXLATERR | GR_STAT_RXERR | GR_STAT_NORXD | \
GR_STAT_DTIMEXP | GR_STAT_FCNTEXP | GR_STAT_LCCNTEXP | \
GR_STAT_ECNTEXP | GR_STAT_NCNTEXP | GR_STAT_MAXPKTERR | \
GR_STAT_TFIFO_UND | GR_STAT_STSTERR | GR_STAT_CVCNTEXP | \
GR_STAT_RFIFOVF | GR_STAT_LCNTEXP | GR_STAT_CCNTEXP | \
GR_STAT_ACNTEXP)
#define GR_STAT_BITS \
"\20\1RX\2RCNT\3ACNT\4CCNT\5LCNT\6RFIFO\7CVCNT\10STST" \
"\11TX\12TFIFO\13MAXPKT\14NCNT\15ECNT\16LCCNT\17FCNT" \
"\20DTIME\21RXHOST\22NORXD\23RXE\24EXLATE\25RXP\26RXT\27EOP" \
"\30MIF\31TXHOST\32TXALL\33TXE\34TXL\35TXP\36TXT\37SLV" \
"\40SLVP"
/* hme_gr.stat (interrupt status register) */
#define GR_IMASK_GOTFRAME 0x00000001 /* frame received */
#define GR_IMASK_RCNTEXP 0x00000002 /* rx frame count expired */
#define GR_IMASK_ACNTEXP 0x00000004 /* align error count expired */
#define GR_IMASK_CCNTEXP 0x00000008 /* crc error count expired */
#define GR_IMASK_LCNTEXP 0x00000010 /* length error count expired */
#define GR_IMASK_RFIFOVF 0x00000020 /* rx fifo overflow */
#define GR_IMASK_CVCNTEXP 0x00000040 /* code violation count expired */
#define GR_IMASK_STSTERR 0x00000080 /* xif sqe test failed */
#define GR_IMASK_SENTFRAME 0x00000100 /* frame sent */
#define GR_IMASK_TFIFO_UND 0x00000200 /* tx fifo underrun */
#define GR_IMASK_MAXPKTERR 0x00000400 /* max-packet size error */
#define GR_IMASK_NCNTEXP 0x00000800 /* normal collision count expired */
#define GR_IMASK_ECNTEXP 0x00001000 /* excess collision count expired */
#define GR_IMASK_LCCNTEXP 0x00002000 /* late collision count expired */
#define GR_IMASK_FCNTEXP 0x00004000 /* first collision count expired */
#define GR_IMASK_DTIMEXP 0x00008000 /* defer timer expired */
#define GR_IMASK_RXTOHOST 0x00010000 /* pkt moved from rx fifo->memory */
#define GR_IMASK_NORXD 0x00020000 /* out of receive descriptors */
#define GR_IMASK_RXERR 0x00040000 /* rx dma error */
#define GR_IMASK_RXLATERR 0x00080000 /* late error during rx dma */
#define GR_IMASK_RXPERR 0x00100000 /* parity error during rx dma */
#define GR_IMASK_RXTERR 0x00200000 /* tag error during rx dma */
#define GR_IMASK_EOPERR 0x00400000 /* tx descriptor did not set EOP */
#define GR_IMASK_MIFIRQ 0x00800000 /* mif needs attention */
#define GR_IMASK_HOSTTOTX 0x01000000 /* pkt moved from memory->tx fifo */
#define GR_IMASK_TXALL 0x02000000 /* all pkts in fifo transmitted */
#define GR_IMASK_TXEACK 0x04000000 /* error during tx dma */
#define GR_IMASK_TXLERR 0x08000000 /* late error during tx dma */
#define GR_IMASK_TXPERR 0x10000000 /* parity error during tx dma */
#define GR_IMASK_TXTERR 0x20000000 /* tag error during tx dma */
#define GR_IMASK_SLVERR 0x40000000 /* pio access error */
#define GR_IMASK_SLVPERR 0x80000000 /* PIO access parity error */
/*
* external transmitter registers
*/
struct hme_txr {
volatile u_int32_t tx_pnding; /* tx pending/wakeup */
volatile u_int32_t cfg; /* tx cfg */
volatile u_int32_t tx_ring; /* tx ring ptr */
volatile u_int32_t tx_bbase; /* tx buffer base */
volatile u_int32_t tx_bdisp; /* tx buffer displacement */
volatile u_int32_t tx_fifo_wptr; /* tx fifo write pointer */
volatile u_int32_t tx_fifo_swptr; /* tx fifo write ptr (shadow) */
volatile u_int32_t tx_fifo_rptr; /* tx fifo read pointer */
volatile u_int32_t tx_fifo_srptr; /* tx fifo read ptr (shadow) */
volatile u_int32_t tx_fifo_pcnt; /* tx fifo packet counter */
volatile u_int32_t smachine; /* tx state machine */
volatile u_int32_t tx_rsize; /* tx ring size */
volatile u_int32_t tx_bptr; /* tx buffer pointer */
};
/* hme_txr.tx_pnding (tx pending/wakeup) */
#define TXR_TP_DMAWAKEUP 0x00000001 /* Restart transmit dma */
/* hme_txr.tx_cfg (tx configuration) */
#define TXR_CFG_DMAENABLE 0x00000001 /* enable tx dma */
#define TXR_CFG_FIFOTHRESH 0x000003fe /* tx fifo threshold */
#define TXR_CFG_IRQDAFTER 0x00000400 /* intr after tx-fifo empty */
#define TXR_CFG_IRQDBEFORE 0x00000000 /* intr before tx-fifo empty */
#define TXR_RSIZE_SHIFT 4
/*
* external receiver registers
*/
struct hme_rxr {
volatile u_int32_t cfg; /* rx cfg */
volatile u_int32_t rx_ring; /* rx ring pointer */
volatile u_int32_t rx_bptr; /* rx buffer ptr */
volatile u_int32_t rx_fifo_wptr; /* rx fifo write ptr */
volatile u_int32_t rx_fifo_swptr; /* rx fifo write ptr (shadow) */
volatile u_int32_t rx_fifo_rptr; /* rx fifo read ptr */
volatile u_int32_t rx_fifo_srptr; /* rx fifo read ptr (shadow) */
volatile u_int32_t smachine; /* rx state machine */
};
/* hme_rxr.rx_cfg (rx configuration) */
#define RXR_CFG_DMAENABLE 0x00000001 /* rx dma enable */
#define RXR_CFG_reserved1 0x00000006 /* reserved bits */
#define RXR_CFG_BYTEOFFSET 0x00000038 /* rx first byte offset */
#define RXR_CFG_reserved2 0x000001c0 /* reserved bits */
#define RXR_CFG_RINGSIZE32 0x00000000 /* rx descptr ring size: 32 */
#define RXR_CFG_RINGSIZE64 0x00000200 /* rx descptr ring size: 64 */
#define RXR_CFG_RINGSIZE128 0x00000400 /* rx descptr ring size: 128 */
#define RXR_CFG_RINGSIZE256 0x00000600 /* rx descptr ring size: 128 */
#define RXR_CFG_reserved3 0x0000f800 /* reserved bits */
#define RXR_CFG_CSUMSTART 0x007f0000 /* rx offset of checksum */
#define RXR_CFG_CSUM_SHIFT 16
/*
* configuration registers
*/
struct hme_cr {
volatile u_int32_t xif_cfg; /* xif configuration reg */
volatile u_int32_t _padding[129]; /* reserved */
volatile u_int32_t tx_swreset; /* tx software reset */
volatile u_int32_t tx_cfg; /* tx configuration reg */
volatile u_int32_t ipkt_gap1; /* interpacket gap 1 */
volatile u_int32_t ipkt_gap2; /* interpacket gap 2 */
volatile u_int32_t attempt_limit; /* tx attempt limit */
volatile u_int32_t stime; /* tx slot time */
volatile u_int32_t preamble_len; /* len of tx preamble */
volatile u_int32_t preamble_patt; /* tx preamble pattern */
volatile u_int32_t tx_sframedelim; /* tx frame delimiter */
volatile u_int32_t jsize; /* tx jam size */
volatile u_int32_t tx_pkt_max; /* tx maximum pkt size */
volatile u_int32_t tx_pkt_min; /* tx minimum pkt size */
volatile u_int32_t peak_attempt; /* tx peak counter */
volatile u_int32_t dt_ctr; /* tx defer counter */
volatile u_int32_t nc_ctr; /* tx normal collision cntr */
volatile u_int32_t fc_ctr; /* tx first collision cntr */
volatile u_int32_t ex_ctr; /* tx execess collision cntr */
volatile u_int32_t lt_ctr; /* tx late collision cntr */
volatile u_int32_t rand_seed; /* tx random seed */
volatile u_int32_t tx_smachine; /* tx state machine */
volatile u_int32_t _padding2[44]; /* reserved */
volatile u_int32_t rx_swreset; /* rx software reset */
volatile u_int32_t rx_cfg; /* rx configuration */
volatile u_int32_t rx_pkt_max; /* rx maximum pkt size */
volatile u_int32_t rx_pkt_min; /* rx minimum pkt size */
volatile u_int32_t mac_addr2; /* macaddress register2 (MSB) */
volatile u_int32_t mac_addr1; /* macaddress register1 */
volatile u_int32_t mac_addr0; /* macaddress register0 (LSB) */
volatile u_int32_t fr_ctr; /* rx frame counter */
volatile u_int32_t gle_ctr; /* rx giant counter */
volatile u_int32_t unale_ctr; /* rx unaligned error cntr */
volatile u_int32_t rcrce_ctr; /* rx crc error cntr */
volatile u_int32_t rx_smachine; /* rx state machine */
volatile u_int32_t rx_cvalid; /* rx code violation */
volatile u_int32_t _padding3; /* reserved */
volatile u_int32_t htable3; /* hash table 3 */
volatile u_int32_t htable2; /* hash table 2 */
volatile u_int32_t htable1; /* hash table 1 */
volatile u_int32_t htable0; /* hash table 0 */
volatile u_int32_t afilter2; /* address filter 2 */
volatile u_int32_t afilter1; /* address filter 1 */
volatile u_int32_t afilter0; /* address filter 0 */
volatile u_int32_t afilter_mask; /* address filter mask */
};
/* BigMac XIF config register. */
#define CR_XCFG_ODENABLE 0x00000001 /* Output driver enable */
#define CR_XCFG_XLBACK 0x00000002 /* Loopback-mode XIF enable */
#define CR_XCFG_MLBACK 0x00000004 /* Loopback-mode MII enable */
#define CR_XCFG_MIIDISAB 0x00000008 /* MII receive buffer disable */
#define CR_XCFG_SQENABLE 0x00000010 /* SQE test enable */
#define CR_XCFG_SQETWIN 0x000003e0 /* SQE time window */
#define CR_XCFG_LANCE 0x00000010 /* Lance mode enable */
#define CR_XCFG_LIPG0 0x000003e0 /* Lance mode IPG0 */
/* BigMac transmit config register. */
#define CR_TXCFG_ENABLE 0x00000001 /* Enable the transmitter */
#define CR_TXCFG_SMODE 0x00000020 /* Enable slow transmit mode */
#define CR_TXCFG_CIGN 0x00000040 /* Ignore transmit collisions */
#define CR_TXCFG_FCSOFF 0x00000080 /* Do not emit FCS */
#define CR_TXCFG_DBACKOFF 0x00000100 /* Disable backoff */
#define CR_TXCFG_FULLDPLX 0x00000200 /* Enable full-duplex */
#define CR_TXCFG_DGIVEUP 0x00000400 /* Don't give up on transmits */
/* BigMac receive config register. */
#define CR_RXCFG_ENABLE 0x00000001 /* Enable the receiver */
#define CR_RXCFG_PSTRIP 0x00000020 /* Pad byte strip enable */
#define CR_RXCFG_PMISC 0x00000040 /* Enable promiscous mode */
#define CR_RXCFG_DERR 0x00000080 /* Disable error checking */
#define CR_RXCFG_DCRCS 0x00000100 /* Disable CRC stripping */
#define CR_RXCFG_ME 0x00000200 /* Receive packets addressed to me */
#define CR_RXCFG_PGRP 0x00000400 /* Enable promisc group mode */
#define CR_RXCFG_HENABLE 0x00000800 /* Enable the hash filter */
#define CR_RXCFG_AENABLE 0x00001000 /* Enable the address filter */
struct hme_tcvr {
volatile u_int32_t bb_clock; /* bit bang clock */
volatile u_int32_t bb_data; /* bit bang data */
volatile u_int32_t bb_oenab; /* bit bang output enable */
volatile u_int32_t frame; /* frame control & data */
volatile u_int32_t cfg; /* MIF configuration */
volatile u_int32_t int_mask; /* MIF interrupt mask */
volatile u_int32_t status; /* MIF status */
volatile u_int32_t smachine; /* MIF state machine */
};
#define FRAME_WRITE 0x50020000 /* start a frame write */
#define FRAME_READ 0x60020000 /* start a frame read */
#define TCVR_FAILURE 0x80000000 /* impossible value */
/* Transceiver config register */
#define TCVR_CFG_PSELECT 0x00000001 /* select PHY */
#define TCVR_CFG_PENABLE 0x00000002 /* enable MIF polling */
#define TCVR_CFG_BENABLE 0x00000004 /* enable bit bang */
#define TCVR_CFG_PREGADDR 0x000000f8 /* poll register addr */
#define TCVR_CFG_MDIO0 0x00000100 /* MDIO zero, data/attached */
#define TCVR_CFG_MDIO1 0x00000200 /* MDIO one, data/attached */
#define TCVR_CFG_PDADDR 0x00007c00 /* device phy addr polling */
/* Here are some PHY addresses. */
#define TCVR_PHYADDR_ETX 0 /* external transceiver */
#define TCVR_PHYADDR_ITX 1 /* internal transceiver */
/* Transceiver status register */
#define TCVR_STAT_BASIC 0xffff0000 /* The "basic" part */
#define TCVR_STAT_NORMAL 0x0000ffff /* The "non-basic" part */
/* hme flags */
#define HME_FLAG_POLL 0x00000001 /* polling mif? */
#define HME_FLAG_FENABLE 0x00000002 /* MII frame enabled? */
#define HME_FLAG_LANCE 0x00000004 /* Lance mode IPG0? */
#define HME_FLAG_RXENABLE 0x00000008 /* Receiver enabled? */
#define HME_FLAG_AUTO 0x00000010 /* Auto-Neg? 0 = force */
#define HME_FLAG_FULL 0x00000020 /* Full duplex enabled? */
#define HME_FLAG_MACFULL 0x00000040 /* Full duplex in the MAC? */
#define HME_FLAG_POLLENABLE 0x00000080 /* Try MIF polling? */
#define HME_FLAG_RXCV 0x00000100 /* RXCV enable - XXX */
#define HME_FLAG_INIT 0x00000200 /* Initialized once? */
#define HME_FLAG_LINKUP 0x00000400 /* Is link up? */
#define HME_FLAG_20_21 \
(HME_FLAG_POLLENABLE | HME_FLAG_FENABLE)
#define HME_FLAG_NOT_A0 \
(HME_FLAG_POLLENABLE | HME_FLAG_FENABLE | HME_FLAG_LANCE | HME_FLAG_RXCV)
/*
* Transceiver type
*/
#define HME_TCVR_EXTERNAL 0
#define HME_TCVR_INTERNAL 1
#define HME_TCVR_NONE 2
struct hme_rxd {
volatile u_int32_t rx_flags;
volatile u_int32_t rx_addr;
};
#define HME_RXD_OWN 0x80000000 /* desc owner: 1=hw,0=sw */
#define HME_RXD_OVERFLOW 0x40000000 /* 1 = buffer over flow */
#define HME_RXD_SIZE 0x3fff0000 /* descriptor size */
#define HME_RXD_CSUM 0x0000ffff /* checksum mask */
struct hme_txd {
volatile u_int32_t tx_flags;
volatile u_int32_t tx_addr;
};
#define HME_TXD_OWN 0x80000000 /* desc owner: 1=hw,0=sw */
#define HME_TXD_SOP 0x40000000 /* 1 = start of pkt */
#define HME_TXD_EOP 0x20000000 /* 1 = end of pkt */
#define HME_TXD_CSENABLE 0x10000000 /* 1 = use hw checksums */
#define HME_TXD_CSLOCATION 0x0ff00000 /* checksum location mask */
#define HME_TXD_CSBUFBEGIN 0x000fc000 /* checksum begin mask */
#define HME_TXD_SIZE 0x00003fff /* pkt size mask */
#define HME_RX_RING_SIZE 32 /* Must be 32,64,128, or 256 */
#define HME_TX_RING_SIZE 32 /* 16<=x<=256 and div by 16 */
#define HME_RX_RING_MAX 256 /* maximum ring size: rx */
#define HME_TX_RING_MAX 256 /* maximum ring size: tx */
#define HME_RX_PKT_BUF_SZ 2048 /* size of a rx buffer */
#define HME_RX_OFFSET 2 /* packet offset */
#define HME_RX_CSUMLOC 0x00 /* checksum location */
#define HME_TX_PKT_BUF_SZ 1546 /* size of a tx buffer */
#define HME_RX_ALIGN_SIZE 64 /* XXX rx bufs must align 64 */
#define HME_RX_ALIGN_MASK (~(RX_ALIGN_SIZE - 1))
struct hme_desc {
struct hme_rxd hme_rxd[HME_RX_RING_MAX];
struct hme_txd hme_txd[HME_TX_RING_MAX];
};
struct hme_bufs {
char rx_buf[HME_RX_RING_SIZE][HME_RX_PKT_BUF_SZ];
char tx_buf[HME_TX_RING_SIZE][HME_TX_PKT_BUF_SZ];
};
|