summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/vr/vr_impl.h
blob: c86c3f48a3840b564fadeffaf4c1901225cf8da3 (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
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
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
/*
 * 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.
 */

/*
 * Register definitions for the VIA Rhine ethernet adapters
 */
#ifndef _VRREG_H
#define	_VRREG_H

#ifdef __cplusplus
	extern "C" {
#endif

/*
 * MAC address
 */
#define	VR_ETHERADDR	0x00

/*
 * Receive Configuration
 * The thresholds denote the level in the FIFO before transmission
 * to host memory starts.
 */
#define	VR_RXCFG			0x06
#define	VR_RXCFG_ACCEPTERROR		(1 << 0)
#define	VR_RXCFG_ACCEPTRUNT		(1 << 1)
#define	VR_RXCFG_ACCEPTMULTI		(1 << 2)
#define	VR_RXCFG_ACCEPTBROAD		(1 << 3)
#define	VR_RXCFG_PROMISC		(1 << 4)
#define	VR_RXCFG_FIFO_THRESHOLD_0	(1 << 5)
#define	VR_RXCFG_FIFO_THRESHOLD_1	(1 << 6)
#define	VR_RXCFG_FIFO_THRESHOLD_2	(1 << 7)
#define	VR_RXCFG_FIFO_THRESHOLD_BITS	(VR_RXCFG_FIFO_THRESHOLD_0 | \
					    VR_RXCFG_FIFO_THRESHOLD_1 | \
					    VR_RXCFG_FIFO_THRESHOLD_2)
#define	VR_RXCFG_FIFO_THRESHOLD_64	(0)
#define	VR_RXCFG_FIFO_THRESHOLD_32	(VR_RXCFG_FIFO_THRESHOLD_0)
#define	VR_RXCFG_FIFO_THRESHOLD_128	(VR_RXCFG_FIFO_THRESHOLD_1)
#define	VR_RXCFG_FIFO_THRESHOLD_256	(VR_RXCFG_FIFO_THRESHOLD_0 | \
					    VR_RXCFG_FIFO_THRESHOLD_1)
#define	VR_RXCFG_FIFO_THRESHOLD_512	(VR_RXCFG_FIFO_THRESHOLD_2)
#define	VR_RXCFG_FIFO_THRESHOLD_768	(VR_RXCFG_FIFO_THRESHOLD_0 | \
					    VR_RXCFG_FIFO_THRESHOLD_2)
#define	VR_RXCFG_FIFO_THRESHOLD_1024	(VR_RXCFG_FIFO_THRESHOLD_2 | \
					    VR_RXCFG_FIFO_THRESHOLD_1)
#define	VR_RXCFG_FIFO_THRESHOLD_STFW	(VR_RXCFG_FIFO_THRESHOLD_BITS)

/*
 * Transmit Configuration
 * The transmission starts when the data in the FIFO reaches the threshold.
 * Store and Forward means that a transmission starts when a complete frame
 * is in the FIFO.
 */
#define	VR_TXCFG			0x07
#define	VR_TXCFG_8021PQ_EN		(1 << 0)	/* VT6105M */
#define	VR_TXCFG_LOOPBACK_0		(1 << 1)
#define	VR_TXCFG_LOOPBACK_1		(2 << 2)
#define	VR_TXCFG_BACKOFF_NATIONAL	(1 << 3)	/* < VT6105M */
#define	VR_TXCFG_FIFO_THRESHOLD_0	(1 << 5)
#define	VR_TXCFG_FIFO_THRESHOLD_1	(1 << 6)
#define	VR_TXCFG_FIFO_THRESHOLD_2	(1 << 7)
#define	VR_TXCFG_FIFO_THRESHOLD_BITS	(VR_TXCFG_FIFO_THRESHOLD_0 | \
					    VR_TXCFG_FIFO_THRESHOLD_1 | \
					    VR_TXCFG_FIFO_THRESHOLD_2)
#define	VR_TXCFG_FIFO_THRESHOLD_128	(0)
#define	VR_TXCFG_FIFO_THRESHOLD_256	(VR_TXCFG_FIFO_THRESHOLD_0)
#define	VR_TXCFG_FIFO_THRESHOLD_512	(VR_TXCFG_FIFO_THRESHOLD_1)
#define	VR_TXCFG_FIFO_THRESHOLD_1024	(VR_TXCFG_FIFO_THRESHOLD_0 | \
					    VR_TXCFG_FIFO_THRESHOLD_1)
#define	VR_TXCFG_FIFO_THRESHOLD_STFW	(VR_TXCFG_FIFO_THRESHOLD_BITS)

/*
 * Chip control
 */
#define	VR_CTRL0			0x08
#define	VR_CTRL0_RESERVED		(1 << 0)
#define	VR_CTRL0_DMA_ENABLE		(1 << 1)
#define	VR_CTRL0_DMA_STOP		(1 << 2)
#define	VR_CTRL0_RX_DMA_ENABLE		(1 << 3)
#define	VR_CTRL0_TX_DMA_ENABLE		(1 << 4)
#define	VR_CTRL0_TXPOLL			(1 << 5)	/* < 6105M */
#define	VR_CTRL0_RXPOLL			(1 << 6)	/* < 6105M */

#define	VR_CTRL0_DMA_GO			(VR_CTRL0_DMA_ENABLE | \
					    VR_CTRL0_RX_DMA_ENABLE | \
					    VR_CTRL0_TX_DMA_ENABLE | \
					    VR_CTRL0_TXPOLL)
#define	VR_CTRL1			0x09
#define	VR_CTRL1_RESERVED		(1 << 0)
#define	VR_CTRL1_UNICAST_EN		(1 << 1)
#define	VR_CTRL1_MACFULLDUPLEX		(1 << 2)
#define	VR_CTRL1_NOAUTOPOLL		(1 << 3)
#define	VR_CTRL1_RESERVED2		(1 << 4)
#define	VR_CTRL1_TXPOLL			(1 << 5)	/* VT6105M */
#define	VR_CTRL1_RXPOLL			(1 << 6)	/* VT6105M */
#define	VR_CTRL1_RESET			(1 << 7)

#define	VR_T_XQNWAKE			0x0a		/* VT6105M */

/*
 * Interrupt Status
 * This register reflects NIC status
 * The host reads it to determine the cause of the interrupt
 * This register must be cleared after power-up
 */
#define	VR_ISR0			0x0C
#define	VR_ISR0_RX_DONE		(1 << 0)
#define	VR_ISR0_TX_DONE		(1 << 1)
#define	VR_ISR0_RX_ERR		(1 << 2)
#define	VR_ISR0_TX_ERR		(1 << 3)
#define	VR_ISR0_TX_BUF_UFLOW	(1 << 4)
#define	VR_ISR0_RX_LINKERR	(1 << 5)
#define	VR_ISR0_BUSERR		(1 << 6)
#define	VR_ISR0_STATSMAX	(1 << 7)
#define	VR_ISR0_RX_EARLY	(1 << 8)
#define	VR_ISR0_TX_FIFO_UFLOW	(1 << 9)
#define	VR_ISR0_RX_FIFO_OFLOW	(1 << 10)
#define	VR_ISR0_RX_DROPPED	(1 << 11)
#define	VR_ISR0_RX_NOBUF	(1 << 12)
#define	VR_ISR0_TX_ABORT	(1 << 13)
#define	VR_ISR0_LINKSTATUS	(1 << 14)
#define	VR_ISR0_GENERAL		(1 << 15)

/*
 * Interrupt Configuration
 * All bits in this register correspond to the bits in the Interrupt Status
 * register Setting individual bits will enable the corresponding interrupt
 * This register defaults to all zeros on power up
 */
#define	VR_ICR0			0x0E
#define	VR_ICR0_RX_DONE		VR_ISR0_RX_DONE
#define	VR_ICR0_TX_DONE		VR_ISR0_TX_DONE
#define	VR_ICR0_RX_ERR		VR_ISR0_RX_ERR
#define	VR_ICR0_TX_ERR		VR_ISR0_TX_ERR
#define	VR_ICR0_TX_BUF_UFLOW	VR_ISR0_TX_BUF_UFLOW
#define	VR_ICR0_RX_LINKERR	VR_ISR0_RX_LINKERR
#define	VR_ICR0_BUSERR		VR_ISR0_BUSERR
#define	VR_ICR0_STATSMAX	VR_ISR0_STATSMAX
#define	VR_ICR0_RX_EARLY	VR_ISR0_RX_EARLY
#define	VR_ICR0_TX_FIFO_UFLOW	VR_ISR0_TX_FIFO_UFLOW
#define	VR_ICR0_RX_FIFO_OFLOW	VR_ISR0_RX_FIFO_OFLOW
#define	VR_ICR0_RX_DROPPED	VR_ISR0_RX_DROPPED
#define	VR_ICR0_RX_NOBUF	VR_ISR0_RX_NOBUF
#define	VR_ICR0_TX_ABORT	VR_ISR0_TX_ABORT
#define	VR_ICR0_LINKSTATUS	VR_ISR0_LINKSTATUS
#define	VR_ICR0_GENERAL		VR_ISR0_GENERAL

/*
 * Mulicast address registers (MAR), 8 bytes
 */
#define	VR_MAR0				0x10	/* - 0x13 */
#define	VR_MAR1				0x14	/* - 0x17 */

/*
 * VT6105M has a multicast/vlan filter and the hash bits are also used as
 * CAM data port
 */
#define	VR_MCAM0			0x10	/* VT6105M */
#define	VR_MCAM1			0x11
#define	VR_MCAM2			0x12
#define	VR_MCAM3			0x13
#define	VR_MCAM4			0x14
#define	VR_MCAM5			0x15
#define	VR_VCAM0			0x16
#define	VR_VCAM1			0x17

/*
 * Start addresses of receive and transmit ring
 */
#define	VR_RXADDR			0x18	/* - 0x1B */
#define	VR_TXADDR			0x1C	/* - 0x1F */

/*
 * VT6105M has 8 TX queues
 */
#define	VR_TX7_ADDR			0x1C
#define	VR_TX6_ADDR			0x20
#define	VR_TX5_ADDR			0x24
#define	VR_TX4_ADDR			0x28
#define	VR_TX3_ADDR			0x2C
#define	VR_TX2_ADDR			0x30
#define	VR_TX1_ADDR			0x34
#define	VR_TX0_ADDR			0x38

/*
 * Current and receive- and transmit descriptors.
 * These are listed in the VT6102 manual but not in the VT6105.
 */
#define	VR_RXCUR_DES0			0x20	/* - 0x23 */
#define	VR_RXCUR_DES1			0x24	/* - 0x27 */
#define	VR_RXCUR_DES2			0x28	/* - 0x2B */
#define	VR_RXCUR_DES3			0x2C	/* - 0x2F */

/* VIA secrets here */

#define	VR_INTRLINE			0x3c
#define	VR_INTRPIN			0x3d

/* VIA secrets here */

#define	VR_TXCUR_DES0			0x40	/* - 0x43 */
#define	VR_TXCUR_DES1			0x44	/* - 0x47 */
#define	VR_TXCUR_DES2			0x48	/* - 0x4B */
#define	VR_TXCUR_DES3			0x4C	/* - 0x4F */

#define	VR_MODE0			0x50
#define	VR_MODE0_QPKTDS			0x80

#define	VR_MODE1			0x51
#define	VR_FIFOTST			0x51

/*
 * These are not in the datasheet but used in the 'fet' driver
 */
#define	VR_MODE2			0x52
#define	VR_MODE2_PCEROPT		0x80	/* VT6102 only */
#define	VR_MODE2_DISABT			0x40
#define	VR_MODE2_MRDPL			0x08	/* VT6107A1 and above */
#define	VR_MODE2_MODE10T		0x02

#define	VR_MODE3			0x53
#define	VR_MODE3_XONOPT			0x80
#define	VR_MODE3_TPACEN			0x40
#define	VR_MODE3_BACKOPT		0x20
#define	VR_MODE3_DLTSEL			0x10
#define	VR_MODE3_MIIDMY			0x08
#define	VR_MODE3_MIION			0x04

#define	VR_PCI_DELAY_TIMER		0x54
#define	VR_FIFOCMD			0x56
#define	VR_FIFOSTA			0x57

/* VIA secrets here */

/*
 * MII Configuration
 */
#define	VR_MIIPHYADDR			0x6C
#define	VR_MIIPHYADDR_ADDR0		(1 << 0)
#define	VR_MIIPHYADDR_ADDR1		(1 << 1)
#define	VR_MIIPHYADDR_ADDR2		(1 << 2)
#define	VR_MIIPHYADDR_ADDR3		(1 << 3)
#define	VR_MIIPHYADDR_ADDR4		(1 << 4)
#define	VR_MIIPHYADDR_ADDRBITS		(VR_MIIPHYADDR_ADDR0 | \
					    VR_MIIPHYADDR_ADDR1 | \
					    VR_MIIPHYADDR_ADDR2 | \
					    VR_MIIPHYADDR_ADDR3 | \
					    VR_MIIPHYADDR_ADDR4)
#define	VR_MIIPHYADDR_MD_CLOCK_FAST	(1 << 5)
#define	VR_MIIPHYADDR_POLLBITS		((1 << 7) | (1 << 6))
#define	VR_MIIPHYADDR_POLL1024		((0 << 7) | (0 << 6))
#define	VR_MIIPHYADDR_POLL512		((0 << 7) | (1 << 6))
#define	VR_MIIPHYADDR_POLL128		((1 << 7) | (0 << 6))
#define	VR_MIIPHYADDR_POLL64		((1 << 7) | (1 << 6))

/*
 * MII status
 */
#define	VR_MIISR			0x6D
#define	VR_MIISR_SPEED			(1 << 0) /* VT6102 and VT6105 */
#define	VR_MIISR_LINKFAIL		(1 << 1) /* VT6102 and VT6105 */
#define	VR_MIISR_DUPLEX			(1 << 2) /* VT6105 only */
#define	VR_MIISR_PHYERR			(1 << 3) /* VT6102 and VT6105 */
#define	VR_MIISR_PHYOPT			(1 << 4) /* VT6102 only */
#define	VR_MIISR_NWAYLINKOK		(1 << 4) /* VT6105 only */
#define	VR_MIISR_NWAYPAUSE		(1 << 5) /* VT6105M */
#define	VR_MIISR_NWAYASMPAUSE		(1 << 6) /* VT6105M */
#define	VR_MIISR_PHYRST			(1 << 7)

/*
 * Bus control
 */
#define	VR_BCR0				0x6E		/* receive */
#define	VR_BCR0_DMA0			(1 << 0)
#define	VR_BCR0_DMA1			(1 << 1)
#define	VR_BCR0_DMA2			(1 << 2)
#define	VR_BCR0_DMABITS			(VR_BCR0_DMA0|VR_BCR0_DMA1 | \
					    VR_BCR0_DMA2)
#define	VR_BCR0_DMA32			(0)
#define	VR_BCR0_DMA64			(VR_BCR0_DMA0)
#define	VR_BCR0_DMA128			(VR_BCR0_DMA1)
#define	VR_BCR0_DMA256			(VR_BCR0_DMA0|VR_BCR0_DMA1)
#define	VR_BCR0_DMA512			(VR_BCR0_DMA2)
#define	VR_BCR0_DMA1024			(VR_BCR0_DMA0|VR_BCR0_DMA2)
#define	VR_BCR0_DMASTFW			(VR_BCR0_DMABITS)
#define	VR_BCR0_RX_FIFO_THRESHOLD_0	(1 << 3)
#define	VR_BCR0_RX_FIFO_THRESHOLD_1	(1 << 4)
#define	VR_BCR0_RX_FIFO_THRESHOLD_2	(1 << 5)
#define	VR_BCR0_RX_FIFO_THRESHOLD_BITS	(VR_BCR0_RX_FIFO_THRESHOLD_0 | \
					    VR_BCR0_RX_FIFO_THRESHOLD_1 | \
					    VR_BCR0_RX_FIFO_THRESHOLD_2)
#define	VR_BCR0_RX_FIFO_THRESHOLD_64	(0)
#define	VR_BCR0_RX_FIFO_THRESHOLD_32	(VR_BCR0_RX_FIFO_THRESHOLD_0)
#define	VR_BCR0_RX_FIFO_THRESHOLD_128	(VR_BCR0_RX_FIFO_THRESHOLD_1)
#define	VR_BCR0_RX_FIFO_THRESHOLD_256	(VR_BCR0_RX_FIFO_THRESHOLD_0 | \
					    VR_BCR0_RX_FIFO_THRESHOLD_1)
#define	VR_BCR0_RX_FIFO_THRESHOLD_512	(VR_BCR0_RX_FIFO_THRESHOLD_2)
#define	VR_BCR0_RX_FIFO_THRESHOLD_768	(VR_BCR0_RX_FIFO_THRESHOLD_0 | \
					    VR_BCR0_RX_FIFO_THRESHOLD_2)
#define	VR_BCR0_RX_FIFO_THRESHOLD_1024	(VR_BCR0_RX_FIFO_THRESHOLD_1 | \
					    VR_BCR0_RX_FIFO_THRESHOLD_2)
#define	VR_BCR0_RX_FIFO_THRESHOLD_STFW	(VR_BCR0_RX_FIFO_THRESHOLD_BITS)
#define	VR_BCR0_LEDCR			(1 << 6)
#define	VR_BCR0_MSEL			(1 << 7)

#define	VR_BCR1				0x6F		/* transmit */
#define	VR_BCR1_POLLT_0			(1 << 0)
#define	VR_BCR1_POLLT_1			(1 << 1)
#define	VR_BCR1_POLLT_2			(1 << 2)
#define	VR_BCR1_TX_FIFO_THRESHOLD_0	(1 << 3)
#define	VR_BCR1_TX_FIFO_THRESHOLD_1	(1 << 4)
#define	VR_BCR1_TX_FIFO_THRESHOLD_2	(1 << 5)
#define	VR_BCR1_TX_FIFO_THRESHOLD_BITS	(VR_BCR1_TX_FIFO_THRESHOLD_0 | \
					    VR_BCR1_TX_FIFO_THRESHOLD_1 | \
					    VR_BCR1_TX_FIFO_THRESHOLD_2)
#define	VR_BCR1_TX_FIFO_THRESHOLD_128	(0)
#define	VR_BCR1_TX_FIFO_THRESHOLD_256	(VR_BCR1_TX_FIFO_THRESHOLD_0)
#define	VR_BCR1_TX_FIFO_THRESHOLD_512	(VR_BCR1_TX_FIFO_THRESHOLD_1)
#define	VR_BCR1_TX_FIFO_THRESHOLD_1024	(VR_BCR1_TX_FIFO_THRESHOLD_0 | \
					    VR_BCR1_FIFO_THRESHOLD_1)
#define	VR_BCR1_TX_FIFO_THRESHOLD_STFW	(VR_BCR1_FIFO_THRESHOLD_BITS)
#define	VR_BCR1_TXQPRIO			(1 << 6)	/* VT6105M */
#define	VR_BCR1_VLANFILTER		(1 << 7)	/* VT6105M */

/*
 * MII Configuration
 */
#define	VR_MIICMD			0x70
#define	VR_MIICMD_MD_CLOCK		(1 << 0)
#define	VR_MIICMD_MD_CLOCK_READ		(1 << 1)
#define	VR_MIICMD_MD_CLOCK_WRITE	(1 << 2)
#define	VR_MIICMD_MD_OUT		(1 << 3)
#define	VR_MIICMD_MD_MODE_AUTO		(1 << 4)
#define	VR_MIICMD_MD_WRITE		(1 << 5)
#define	VR_MIICMD_MD_READ		(1 << 6)
#define	VR_MIICMD_MD_AUTO		(1 << 7)

#define	VR_MIIADDR			0x71
#define	VR_MIIADDR_MAD0			(1 << 0)
#define	VR_MIIADDR_MAD1			(1 << 1)
#define	VR_MIIADDR_MAD2			(1 << 2)
#define	VR_MIIADDR_MAD3			(1 << 3)
#define	VR_MIIADDR_MAD4			(1 << 4)
#define	VR_MIIADDR_BITS			(VR_MIIADDR_MAD0 | \
					    VR_MIIADDR_MAD1 | \
					    VR_MIIADDR_MAD2 | \
					    VR_MIIADDR_MAD3 | \
					    VR_MIIADDR_MAD4)
#define	VR_MIIADDR_MDONE		(1 << 5)
#define	VR_MIIADDR_MAUTO		(1 << 6)
#define	VR_MIIADDR_MIDLE		(1 << 7)

#define	VR_MIIDATA			0x72
#define	VR_MIIDATA_1			0x72
#define	VR_MIIDATA_2			0x73

/*
 * EEPROM Config / Status
 */
#define	VR_PROMCTL			0x74
#define	VR_PROMCTL_DATAOUT		(1 << 0)
#define	VR_PROMCTL_DATAIN		(1 << 1)
#define	VR_PROMCTL_CLOCK		(1 << 2)
#define	VR_PROMCTL_CHIPSELECT		(1 << 3)
#define	VR_PROMCTL_DIRPROG		(1 << 4)
#define	VR_PROMCTL_RELOAD		(1 << 5)
#define	VR_PROMCTL_PROGRAM		(1 << 6)
#define	VR_PROMCTL_PRGSTATUS		(1 << 7)

/*
 * Chip Configuration A
 */
#define	VR_CFGA				0x78
#define	VR_CFGA_PRE_ACPI_WAKEUP		(1 << 0)	/* VT6105M */
#define	VR_CFGA_WAKEUP_PANIC		(1 << 1)	/* VT6105M */
#define	VR_CFGA_VLANTAG_INCRC		(1 << 5)	/* VT6105M */
#define	VR_CFGA_MIIOPT			(1 << 6)
#define	VR_CFGA_EELOAD			(1 << 7)

/*
 * Chip Configuration B
 */
#define	VR_CFGB				0x79
#define	VR_CFGB_LATENCYTIMER		(1 << 0)
#define	VR_CFGB_WWAIT			(1 << 1)
#define	VR_CFGB_RWAIT			(1 << 2)
#define	VR_CFGB_RXARBIT			(1 << 3)
#define	VR_CFGB_TXARBIT			(1 << 4)
#define	VR_CFGB_MRLDIS			(1 << 5)
#define	VR_CFGB_PERRDIS			(1 << 6)
#define	VR_CFGB_QPKTDIS			(1 << 7)

/*
 * Chip Configuration C
 */
#define	VR_CFGC				0x7A
#define	VR_CFGC_BPS0			(1 << 0)
#define	VR_CFGC_BPS1			(1 << 1)
#define	VR_CFGC_BPS2			(1 << 2)
#define	VR_CFGC_BTSEL			(1 << 3)
#define	VR_CFGC_DLYEN			(1 << 5)
#define	VR_CFGC_BROPT			(1 << 6)
#define	VR_CFGC_MED3			(1 << 7) /* VT6102 */

/*
 * Chip Configuration D
 */
#define	VR_CFGD				0x7B
#define	VR_CFGD_BAKOPT			(1 << 0)
#define	VR_CFGD_MBA			(1 << 1)
#define	VR_CFGD_CAP			(1 << 2)
#define	VR_CFGD_CRADOM			(1 << 3)
#define	VR_CFGD_PMCDIG			(1 << 4)
#define	VR_CFGD_MRLEN			(1 << 5)
#define	VR_CFGD_TAG_ON_SNAP		(1 << 5)	/* VT6105M */
#define	VR_CFGD_DIAG			(1 << 6)
#define	VR_CFGD_MMIOEN			(1 << 7)

/*
 * Tally counters
 */
#define	VR_TALLY_MPA			0x7c	/* 16 bits */
#define	VR_TALLY_CRC			0x7e	/* 16 bits */

/*
 * Misceleneous register 0
 */
#define	VR_MISC0			0x80
#define	VR_MISC0_TIMER0_EN		(1 << 0)
#define	VR_MISC0_TIMER0_SUSP		(1 << 1)
#define	VR_MISC0_HDXFEN			(1 << 2)
#define	VR_MISC0_FDXRFEN		(1 << 3)
#define	VR_MISC0_FDXTFEN		(1 << 4)
#define	VR_MISC0_TIMER0_USEC_EN		(1 << 5)

/*
 * Misceleneous register 1
 */
#define	VR_MISC1			0x81
#define	VR_MISC1_TIMER1_EN		(1 << 0)
#define	VR_MISC1_VAXJMP			(1 << 5)
#define	VR_MISC1_RESET			(1 << 6)

/*
 * Power management
 */
#define	VR_PWR				0x83
#define	VR_PWR_DS0			(1 << 0)
#define	VR_PWR_DS1			(1 << 1)
#define	VR_PWR_WOLEN			(1 << 2)
#define	VR_PWR_WOLSR			(1 << 3)
#define	VR_PWR_LGWOL			(1 << 7)

/*
 * Second interrupt register status
 */
#define	VR_ISR1				0x84
#define	VR_ISR1_TIMER0			(1 << 0)
#define	VR_ISR1_TIMER1			(1 << 1)
#define	VR_ISR1_PHYEVENT		(1 << 2)
#define	VR_ISR1_TDERR			(1 << 3)
#define	VR_ISR1_SSRCI			(1 << 4)
#define	VR_ISR1_UINTR_SET		(1 << 5)
#define	VR_ISR1_UINTR_CLR		(1 << 6)
#define	VR_ISR1_PWEI			(1 << 7)

/*
 * Second interrupt register configuration
 */
#define	VR_ICR1				0x86
#define	VR_ICR1_TIMER0			VR_ISR1_TIMER0
#define	VR_ICR1_TIMER1			VR_ISR1_TIMER1
#define	VR_ICR1_PHYEVENT		VR_ISR1_PHYEVENT
#define	VR_ICR1_TDERR			VR_ISR1_TDERR
#define	VR_ICR1_SSRCI			VR_ISR1_SSRCI
#define	VR_ICR1_UINTR_SET		VR_ISR1_UINTR_SET
#define	VR_ICR1_UINTR_CLR		VR_ISR1_UINTR_CLR
#define	VR_ICR1_PWEI			VR_ISR1_PWEI

/*
 * Content Addressable Memory (CAM) stuff for the VT6105M
 */
#define	VR_CAM_MASK			0x88

#define	VR_CAM_CTRL			0x92
#define	VR_CAM_CTRL_RD			(1 << 3)
#define	VR_CAM_CTRL_WR			(1 << 2)
#define	VR_CAM_CTRL_SELECT_VLAN		(1 << 1)
#define	VR_CAM_CTRL_ENABLE		(1 << 0)
#define	VR_CAM_CTRL_WRITE		(VR_CAM_CTRL_ENABLE | VR_CAM_CTRL_WR)
#define	VR_CAM_CTRL_READ		(VR_CAM_CTRL_ENABLE | VR_CAM_CTRL_RD)
#define	VR_CAM_CTRL_RW			(VR_CAM_CTRL_ENABLE | \
					    VR_CAM_CTRL_RD | VR_CAM_CTRL_WR)
#define	VR_CAM_CTRL_DONE		(0)

#define	VR_CAM_ADDR			0x93

/*
 * MIB Control register
 */
#define	VR_MIB_CTRL			0x94
#define	VR_MIB_CTRL_ENABLE		(1 << 4)
#define	VR_MIB_CTRL_HDUPLEX		(1 << 5)
#define	VR_MIB_CTRL_INCR		(1 << 6)
#define	VR_MIB_CTRL_RTN			(1 << 7)

/*
 * MIB port
 */
#define	VR_MIB_PORT			0x96

/*
 * MIB data
 */
#define	VR_MIB_DATA			0x97


/*
 * Power configuration
 */
#define	VR_PWRCFG			0xA1		/* VT6105LOM */
#define	VR_PWRCFG_WOLEN			(1 << 0)
#define	VR_PWRCFG_WOLSR			(1 << 1)
#define	VR_PWRCFG_PHYPOWERDOWN		(7 << 1)

/*
 * Flow control, VT6105 and above
 */
#define	VR_FCR0				0x98
#define	VR_FCR0_RXBUFCOUNT		VR_FCR0

#define	VR_FCR1				0x99
#define	VR_FCR1_HD_EN			(1 << 0)
#define	VR_FCR1_FD_RX_EN		(1 << 1)
#define	VR_FCR1_FD_TX_EN		(1 << 2)
#define	VR_FCR1_XONXOFF_EN		(1 << 3)

#define	VR_FCR1_PAUSEOFFBITS		((1 << 5) | (1 << 4))
#define	VR_FCR1_PAUSEOFF_24		((0 << 5) | (0 << 4))
#define	VR_FCR1_PAUSEOFF_32		((0 << 5) | (1 << 4))
#define	VR_FCR1_PAUSEOFF_48		((1 << 5) | (0 << 4))
#define	VR_FCR1_PAUSEOFF_64		((1 << 5) | (1 << 4))

#define	VR_FCR1_PAUSEONBITS		((1 << 7) | (1 << 6))
#define	VR_FCR1_PAUSEON_04		((0 << 7) | (0 << 6))
#define	VR_FCR1_PAUSEON_08		((0 << 7) | (1 << 6))
#define	VR_FCR1_PAUSEON_16		((1 << 7) | (0 << 6))
#define	VR_FCR1_PAUSEON_24		((1 << 7) | (1 << 6))

#define	VR_FCR2				0x9a
#define	VR_FCR2_PAUSE			(VR_FCR2)

#define	VR_TIMER0			0x9c
#define	VR_TIMER0_TIMEOUT		VR_TIMER0	/* 16 bits */

#define	VR_TIMER1			0x9e
#define	VR_TIMER1_TIMEOUT		VR_TIMER1	/* 16 bits */

#define	VR_CRC_PATTERN0			0xb0		/* 32 bits, VT6105M */
#define	VR_CRC_PATTERN1			0xb4		/* 32 bits, VT6105M */
#define	VR_CRC_PATTERN2			0xb8		/* 32 bits, VT6105M */
#define	VR_CRC_PATTERN3			0xbC		/* 32 bits, VT6105M */

/*
 * Receive desctriptor
 */
#define	VR_RDES0_RXERR		(1 << 0)
#define	VR_RDES0_CRCERR		(1 << 1)
#define	VR_RDES0_FAE		(1 << 2)
#define	VR_RDES0_FOV		(1 << 3)
#define	VR_RDES0_LONG		(1 << 4)
#define	VR_RDES0_RUNT		(1 << 5)
#define	VR_RDES0_SERR		(1 << 6)
#define	VR_RDES0_BUFF		(1 << 7)

#define	VR_RDES0_EDP		(1 << 8)
#define	VR_RDES0_STP		(1 << 9)
#define	VR_RDES0_CHN		(1 << 10)
#define	VR_RDES0_PHY		(1 << 11)
#define	VR_RDES0_BAR		(1 << 12)
#define	VR_RDES0_MAR		(1 << 13)
#define	VR_RDES0_VIDHIT		(1 << 14)	/* VT6105M or reserved */
#define	VR_RDES0_RXOK		(1 << 15)

#define	VR_RDES0_ABN		((1 << 27) | (1 << 28) | (1 << 29) | (1 << 30))
#define	VR_RDES0_OWN		(1U << 31)

/*
 * Transmit descriptor
 */
#define	VR_TDES0_NCR		((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3))
#define	VR_TDES0_COL		(1 << 4)
#define	VR_TDES0_CDH		(1 << 7)
#define	VR_TDES0_ABT		(1 << 8)
#define	VR_TDES0_OWC		(1 << 9)
#define	VR_TDES0_CRS		(1 << 10)
#define	VR_TDES0_UDF		(1 << 11)
#define	VR_TDES0_TERR		(1 << 15)
/* VLAN stuff is for VT6105M only */
#define	VR_TDES0_VLANID		((1 << 27) | (1 << 26) | (1 << 25) | (1 << 24) \
				    (1 << 23) | (1 << 22) | (1 << 21) | \
				    (1 << 20) | (1 << 19) | (1 << 18) | \
				    (1 << 17) | (1 << 16))
#define	VR_TDES0_VLANPRI	((1 << 30) | (1 << 29) | (1 << 28))
#define	VR_TDES0_OWN		(1U << 31)

#define	VR_TDES1_LEN		((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | \
				    (1 << 4) | (1 << 5) | (1 << 6) | \
				    (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10))

#define	VR_TDES1_CHN		(1 << 15)
#define	VR_TDES1_CRC		(1 << 16)
#define	VR_TDES1_STP		(1 << 21) /* EDP/STP are flipped in DS6105! */
#define	VR_TDES1_EDP		(1 << 22)
#define	VR_TDES1_INTR		(1 << 23)

#define	VR_TDES3_SUPPRESS_INTR	(1 << 0)

#endif	/* _VRREG_H */