aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/xe/if_xereg.h
blob: 820d10603efb24cce2f55b5a31c8dd0103a08fe2 (plain) (blame)
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
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
/*-
 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
 *
 * Copyright (c) 1998, 1999 Scott Mitchell
 * 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 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 THE AUTHOR OR CONTRIBUTORS 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.
 *
 *	$Id: if_xereg.h,v 1.5 1999/05/20 21:53:58 scott Exp $
 * $FreeBSD$
 */
#ifndef DEV_XE_IF_XEREG_H
#define DEV_XE_IF_XEREG_H

/*
 * Register definitions for Xircom PCMCIA Ethernet controllers, based on
 * Rev. B of the "Dingo" 10/100 controller used in Xircom CEM56 and RealPort
 * Ethernet/modem cards.  The Dingo can be configured to be register
 * compatible with the "Mohawk" 10/100 controller used in Xircom CE3 cards
 * (also some Intel and Compaq OEM versions of the CE3).  The older 10Mbps CE2
 * cards seem to use earlier revisions of the same device.  Some registers and
 * bits below are marked 'CE2 only'; these are used by Werner Koch's xirc2ps
 * driver that was originally for the CE2 but, according to the spec, aren't
 * present on the Dingo.  They often seem to relate to operation on coax
 * cables, which Mohawk can do in theory (it has the SSI interface) so they
 * _might_ also work on Mohawk. I've also noted the few registers that are
 * specific to Dingo.
 *
 * As far as I can tell, the Dingo is basically a Mohawk device with a few
 * registers and support for a second PCMCIA function (the modem) added.  In
 * Dingo mode the SSI (non-MII) PHY interface of the Mohawk is not available.
 * The CE2 chip is most likely a Mohawk without the MII and definitely with a
 * slightly different register set.
 *
 * In all cases, the controller uses a paged model of register access.  The
 * first eight registers are always the same, the function of the second eight 
 * is selected by the value in the Page Register (reg 0x01).
 *
 * References:
 * 1. Dingo External Reference Specification, Revision B.  Xircom Inc.,
 *    Thousand Oaks, California.  August 1998.  Available under licence from
 *    Xircom, http://www.xircom.com/
 * 2. ML6692 100BASE-TX Physical Layer with MII specification.  MicroLinear
 *    Corp, San Jose, California.  May 1997.  Available for download from
 *    http://www.microlinear.com/
 * 3. DP83840 10/100 Mb/s Ethernet Physical Layer specification.  National
 *    Semiconductor Corp., Arlington, Texas.  March 1997.  Available for
 *    download from http://www.ns.com/
 * 4. Werner Koch's xirc2ps driver for Linux, for all the CE2 and CE3 frobs
 *    that aren't documented in the Xircom spec.  Available for download from
 *    http://www.d.shuttle.de/isil/xircom/xirc2ps.html
 */

/*******************
 * PCMCIA registers
 *******************/

/*
 * These are probably Dingo-specific, but you won't need them unless you have
 * a CEM card that needs a bit of hackery to get the Ethernet function to
 * operate.  All addresses are in card attribute space.
 */
#define DINGO_CIS		0x0000	/* Start of CIS tuples */
#define DINGO_ETH		0x0800	/* Ethernet configuration registers */
#define DINGO_COR		0x0820	/* Dingo configuration option registers */
#define DINGO_2ND		0x0840  /* 2nd function configuration registers */


/*
 * Ethernet configuration registers
 */
#define DINGO_ECOR	(DINGO_ETH+0)	/* Ethernet Configuration Option Register */
#define DINGO_ECSR	(DINGO_ETH+2)	/* Ethernet Configuration Status Register */
#define DINGO_EBAR0	(DINGO_ETH+10)	/* Ethernet Base Address Register bits 7:4 (3:0 always 0) */
#define DINGO_EBAR1	(DINGO_ETH+12)	/* Ethernet Base Address Register bits 15:8 */

/* DINGO_ECOR bits */
#define DINGO_ECOR_ETH_ENABLE	0x01	/* 1 = Enable Ethernet part of adapter */
#define DINGO_ECOR_IOB_ENABLE	0x02	/* 1 = Enable EBAR, else use INDEX bits */
#define DINGO_ECOR_INT_ENABLE	0x04	/* 1 = Enable Ethernet interrupts */
#define DINGO_ECOR_IOB_INDEX	0x18	/* 00 = 0x300; 01 = 0x310; 10 = 0x320; 11 = no IO base */
#define DINGO_ECOR_IOB_SHIFT	0x03
#define DINGO_ECOR_IRQ_STSCHG	0x20	/* 1 = Route interrupts to -STSCHG pin, else use -INT pin */
#define DINGO_ECOR_IRQ_LEVEL	0x40	/* 1 = Level-triggered interrupts, else edge-triggered */
#define DINGO_ECOR_SRESET	0x80	/* 1 = Soft reset Ethernet adpater.  Must write to 0 */

/* DINGO_ECSR bits */
#define DINGO_ECSR_INT_ACK	0x01	/* 1 = Host must acknowledge interrupts (Clear ECSR_INT bit) */
#define DINGO_ECSR_INT		0x02	/* 1 = Interrupt service requested */
#define DINGO_ECSR_POWER_DOWN	0x04	/* 1 = Power down Ethernet adapter */

/*
 * EBAR0/EBAR1 set the I/O base address of the Ethernet adapter when
 * ECOR_IOB_ENABLE is set.  12 significant bits.
 */


/*
 * Dingo configuration registers
 */
#define DINGO_DCOR0	(DINGO_COR+0)	/* Dingo Configuration Options Register 0 */
#define DINGO_DCOR1	(DINGO_COR+2)	/* Dingo Configuration Options Register 1 */
#define DINGO_DCOR2	(DINGO_COR+4)	/* Dingo Configuration Options Register 2 */
#define DINGO_DCOR3	(DINGO_COR+6)	/* Dingo Configuration Options Register 3 */
#define DINGO_DCOR4	(DINGO_COR+8)	/* Dingo Configuration Options Register 4 */

/* DINGO_DCOR0 bits */
#define DINGO_DCOR0_SF_INT	0x01	/* 1 = Enable 2ndF interrupts (alternate to SFCOR:2) */
#define DINGO_DCOR0_DECODE	0x04	/* 1 = Decode 2ndF interrupts in Dingo, else in 2ndF */
#define DINGO_DCOR0_BUS		0x08	/* 1 = 2ndF bus is ISA, else PCMCIA */
#define DINGO_DCOR0_LED3_POWER	0x10	/* 1 = Drive LED3 line from SFCSR:2 */
#define DINGO_DCOR0_LED3_RESET	0x20	/* 1 = Drive LED3 line from SFCOR:7 */
#define DINGO_DCOR0_MR_POWER	0x40	/* 1 = Drive MRESET line from SFCSR:2 */
#define DINGO_DCOR0_MR_RESET	0x80	/* 1 = Drive MRESET line from SFCOR:7 */

/* DINGO_DCOR1 bits */
#define DINGO_DCOR1_INT_STSCHG	0x01	/* 1 = Route 2ndF interrupts to -STSCHG (alternate to SFCOR:5) */
#define DINGO_DCOR1_MSTSCHG	0x02	/* 1 = Route 2ndF -MSTSCHG line to -STSCHG */
#define DINGO_DCOR1_EEDIO	0x04	/* 1 = Use EEDIO pin as data line 6 to 2ndF */
#define DINGO_DCOR1_INT_LEVEL	0x08	/* 1 = Force level-triggered interrupts from 2ndF */
#define DINGO_DCOR1_SHADOW_CSR	0x10	/* Reserved, always write 0 */
#define DINGO_DCOR1_SHADOW_IOB	0x20	/* Reserved, always write 0 */
#define DINGO_DCOR1_CSR_WAIT	0xC0	/* Reserved, always write 0 */
#define DINGO_DCOR1_CSR_SHIFT	0x06

/* DINGO_DCOR2 bits */
#define DINGO_DCOR2_SHM_BASE	0x0f	/* Bits 15-12 of Ethernet shared memory window */
#define DINGO_DCOR2_SHM_SHIFT	0x00
#define DINGO_DCOR2_SHADOW_COR	0x10	/* Reserved, always write 0 */

/*
 * DCOR3/DCOR4 configure Dingo to assert -IOIS16 on any access to each pair of 
 * ports in the range SFIOB+0 .. SFIOB+31.  Each pair can be set individually,
 * eg. DCOR3:0 enables this function on ports SFIOB+0 and SFIOB+1.
 */


/*
 * Second function configuration registers
 */
#define DINGO_SFCOR	(DINGO_2ND+0)	/* 2nd Function Configuration Option Register */
#define DINGO_SFCSR	(DINGO_2ND+2)	/* 2nd Function Configuration Status Register */
#define DINGO_SFBAR0	(DINGO_2ND+10)	/* 2nd Function Base Address Register bits 7:0 */
#define DINGO_SFBAR1	(DINGO_2ND+12)	/* 2nd Function Base Address Register bits 15:8 */
#define DINGO_SFILR	(DINGO_2ND+18)	/* 2nd Function I/O Limit Register */

/* DINGO_SFCOR bits */
#define DINGO_SFCOR_SF_ENABLE	0x01	/* 1 = Enable second fuction */
#define DINGO_SFCOR_IOB_ENABLE	0x02	/* 1 = Enable SFBAR, else use COM_SELECT bits */
#define DINGO_SFCOR_INT_ENABLE	0x04	/* 1 = Enable second function interrupts */
#define DINGO_SFCOR_COM_SELECT	0x18	/* 00 = 0x3f8; 01 = 0x2f8; 10 = 0x3e8; 11 = 0x2e8 */
#define DINGO_SFCOR_COM_SHIFT	0x03
#define DINGO_SFCOR_IRQ_STSCHG	0x20	/* 1 = Route interrupts to -STSCHG pin, else use -INT pin */
#define DINGO_SFCOR_IRQ_LEVEL	0x40	/* 1 = Level-triggered interrupts, else edge-triggered */
#define DINGO_SFCOR_SRESET	0x80	/* 1 = Soft reset second function.  Must write to 0 */

/* DINGO_SFCSR bits */
#define DINGO_SFCSR_INT_ACK	0x01	/* 1 = Host must acknowledge interrupts (Clear SFCSR_INT bit) */
#define DINGO_SFCSR_INT		0x02	/* 1 = Interrupt service requested */
#define DINGO_SFCSR_POWER_DOWN	0x04	/* 1 = Power down second function */

/*
 * SFBAR0/SFBAR1 set the I/O base address of the second function when
 * SFCOR_IOB_ENABLE is set.  16 significant bits.
 */

/*
 * SFILR is a bitmap of address lines 7:0 decoded by the second function
 * device.  Eg. a device with 16 ports should write 0x0f to this register.
 */



/********************************
 * Ethernet controller registers
 ********************************/

/*
 * Common registers (available from any register page)
 *
 * Note: The EDP is actually 32 bits wide, occupying registers 2-5.  In PCMCIA 
 * operation we can only access 16 bits at once, through registers 4 & 5.
 */
#define XE_CR			0x00	/* Command register (write) */
#define XE_ESR			0x00	/* Ethernet status register (read) */
#define XE_PR			0x01	/* Page select register */
#define XE_EDP			0x04	/* Ethernet data port */
#define XE_ISR			0x06	/* Ethernet interrupt status register (read) */
#define XE_GIR			0x07	/* Global interrupt register (Dingo only) */

/* XE_CR bits */
#define XE_CR_TX_PACKET		0x01	/* Transmit packet */
#define XE_CR_SOFT_RESET	0x02	/* Software reset */
#define XE_CR_ENABLE_INTR	0x04	/* Enable interrupts */
#define XE_CR_FORCE_INTR	0x08	/* Force an interrupt */
#define XE_CR_CLEAR_FIFO	0x10	/* Clear FIFO after transmit overrun */
#define XE_CR_CLEAR_OVERRUN	0x20	/* Clear receive overrun condition */
#define XE_CR_RESTART_TX	0x40	/* Restart TX after 16 collisions or TX underrun */

/* XE_ESR bits */
#define XE_ESR_FULL_PACKET_RX	0x01	/* At least one full packet received */
#define XE_ESR_PART_PACKET_RX	0x02	/* At least 64 bytes of packet received */
#define XE_ESR_REJECT_PACKET	0x04	/* Partial packet rejected */
#define XE_ESR_TX_PENDING	0x08	/* At least one packet waiting to transmit */
#define XE_ESR_BAD_POLARITY	0x10	/* Bad cable polarity? (CE2 only) */
#define XE_ESR_MEDIA_SELECT	0x20	/* SSI(?) media select: 1 = Twisted pair; 0 = AUI */

/* XE_ISR bits */
#define XE_ISR_TX_OVERFLOW	0x01	/* No space in transmit buffer */
#define XE_ISR_TX_PACKET	0x02	/* Packet sent successfully */
#define XE_ISR_MAC_INTR		0x04	/* Some kind of MAC interrupt happened */
#define XE_ISR_RX_EARLY		0x10	/* Incoming packet in early receive mode */
#define XE_ISR_RX_PACKET	0x20	/* Complete packet received successfully */
#define XE_ISR_RX_REJECT	0x40	/* Partial incoming packet rejected by MAC */
#define XE_ISR_FORCE_INTR	0x80	/* Interrupt forced */

/* XE_GIR bits */
#define XE_GIR_ETH_IRQ		0x01	/* Ethernet IRQ pending */
#define XE_GIR_ETH_MASK		0x02	/* 1 = Mask Ethernet interrupts to host */
#define XE_GIR_SF_IRQ		0x04	/* Second function IRQ pending */
#define XE_GIR_SF_MASK		0x08	/* 1 = Mask second function interrupts to host */


/*
 * Page 0 registers
 */
#define XE_TSO			0x08	/* Transmit space open (17 bits) */
#define XE_TRS			0x0a	/* Transmit reservation size (CE2 only, removed in rev. 1) */
#define XE_DO			0x0c	/* Data offset register (13 bits/3 flags, write) */
#define XE_RSR			0x0c	/* Receive status register (read) */
#define XE_TPR			0x0d	/* Packets transmitted register (read) */
#define XE_RBC			0x0e	/* Received byte count (13 bits/3 flags, read) */

/* XE_DO bits */
#define XE_DO_OFFSET		0x1fff	/* First byte fetched when CHANGE_OFFSET issued */
#define XE_DO_OFFSET_SHIFT	0x00
#define XE_DO_CHANGE_OFFSET	0x2000	/* Flush RX FIFO, start fetching from OFFSET */
#define XE_DO_SHARED_MEM	0x4000	/* Enable shared memory mode */
#define XE_DO_SKIP_RX_PACKET	0x8000	/* Skip to next packet in buffer memory */

/* XE_RSR bits */
#define XE_RSR_PHYS_PACKET	0x01	/* 1 = Physical packet, 0 = Multicast packet */
#define XE_RSR_BCAST_PACKET	0x02	/* Broadcast packet */
#define XE_RSR_LONG_PACKET	0x04	/* Packet >1518 bytes */
#define XE_RSR_ADDR_MATCH	0x08	/* Packet matched one of our node addresses */
#define XE_RSR_ALIGN_ERROR	0x10	/* Bad alignment? (CE2 only) */
#define XE_RSR_CRC_ERROR	0x20	/* Incorrect CRC */
#define XE_RSR_RX_OK		0x80	/* No errors on received packet */

/* XE_RBC bits */
#define XE_RBC_BYTE_COUNT	0x1fff	/* Bytes received for current packet */
#define XE_RBC_COUNT_SHIFT	0x00
#define XE_RBC_FULL_PACKET_RX	0x2000	/* These mirror bits 2:0 of ESR, if ECR:7 is set */
#define XE_RBC_PART_PACKET_RX	0x4000
#define XE_RBC_REJECT_PACKET	0x8000


/*
 * Page 1 registers
 */
#define XE_IMR0			0x0c	/* Interrupt mask register 0 */
#define XE_IMR1			0x0d	/* Interrupt mask register 1 (CE2 only) */
#define XE_ECR			0x0e	/* Ethernet configuration register */

/* XE_IMR0 bits */
#define XE_IMR0_TX_OVERFLOW	0x01	/* Masks for bits in ISR */
#define XE_IMR0_TX_PACKET	0x02
#define XE_IMR0_MAC_INTR	0x04
#define XE_IMR0_TX_RESGRANT 0x08	/* Tx reservation granted (CE2) */
#define XE_IMR0_RX_EARLY	0x10
#define XE_IMR0_RX_PACKET	0x20
#define XE_IMR0_RX_REJECT	0x40
#define XE_IMR0_FORCE_INTR	0x80

/* XE_IMR1 bits */
#define XE_IMR1_TX_UNDERRUN	0x01

/* XE_ECR bits */
#define XE_ECR_EARLY_TX		0x01	/* Enable early transmit mode */
#define XE_ECR_EARLY_RX		0x02	/* Enable early receive mode */
#define XE_ECR_FULL_DUPLEX 	0x04	/* Enable full-duplex (disable collision detection) */
#define XE_ECR_LONG_TPCABLE	0x08	/* CE2 only */
#define XE_ECR_NO_POL_COL	0x10	/* CE2 only */
#define XE_ECR_NO_LINK_PULSE	0x20	/* Don't check/send link pulses (not 10BT compliant) */
#define XE_ECR_NO_AUTO_TX	0x40	/* CE2 only */
#define XE_ECR_SOFT_COMPAT	0x80	/* Map ESR bits 2:0 to RBC bits 15:13 */


/*
 * Page 2 registers
 */
#define XE_RBS			0x08	/* Receive buffer start (16 bits) */
#define XE_LED			0x0a	/* LED control register */
#define XE_LED3			0x0b	/* LED3 control register */
#define XE_MSR			0x0c	/* Misc. setup register (Mohawk specific register?) */
#define XE_GPR2			0x0d	/* General purpose register 2 */

/*
 * LED function selection:
 * 000 - Disabled
 * 001 - Collision activity
 * 010 - !Collision activity
 * 011 - 10Mbit link detected
 * 100 - 100Mbit link detected
 * 101 - 10/100Mbit link detected
 * 110 - Automatic assertion
 * 111 - Transmit activity
 */

/* XE_LED bits */
#define XE_LED_LED0_MASK	0x07	/* LED0 function selection */
#define XE_LED_LED0_SHIFT	0x00
#define XE_LED_LED1_MASK	0x38	/* LED1 function selection */
#define XE_LED_LED1_SHIFT	0x03
#define XE_LED_LED0_RX		0x40	/* Add receive activity to LED0 */
#define XE_LED_LED1_RX		0x80	/* Add receive activity to LED1 */

/* XE_LED3 bits */
#define XE_LED3_MASK		0x07	/* LED3 function selection */
#define XE_LED3_SHIFT		0x00
#define XE_LED3_RX		0x40	/* Add receive activity to LED3 */

/* XE_MSR bits */
#define XE_MSR_128K_SRAM	0x01	/* Select 128K SRAM */
#define XE_MSR_RBS_BIT16	0x02	/* Bit 16 of RBS (only useful with big SRAM) */
#define XE_MSR_MII_SELECT	0x08	/* Select MII instead of SSI interface */
#define XE_MSR_HASH_TABLE	0x20	/* Enable hash table filtering */

/* XE_GPR2 bits */
#define XE_GPR2_GP3_OUT		0x01	/* Value written to GP3 line */
#define XE_GPR2_GP4_OUT		0x02	/* Value written to GP4 line */
#define XE_GPR2_GP3_SELECT	0x04	/* 1 = GP3 is output, 0 = GP3 is input */
#define XE_GPR2_GP4_SELECT	0x08	/* 1 = GP4 is output, 0 = GP3 is input */
#define XE_GPR2_GP3_IN		0x10	/* Value read from GP3 line */
#define XE_GPR2_GP4_IN		0x20	/* Value read from GP4 line */


/*
 * Page 3 registers
 */
#define XE_TPT			0x0a	/* Transmit packet threshold (13 bits) */


/*
 * Page 4 registers
 */
#define XE_GPR0			0x08	/* General purpose register 0 */
#define XE_GPR1			0x09	/* General purpose register 1 */
#define XE_BOV			0x0a	/* Bonding version register (read) */
#define XE_EES			0x0b	/* EEPROM control register */
#define XE_LMA			0x0c	/* Local memory address (CE2 only) */
#define XE_LMD			0x0e	/* Local memory data (CE2 only) */

/* XE_GPR0 bits */
#define XE_GPR0_GP1_OUT		0x01	/* Value written to GP1 line */
#define XE_GPR0_GP2_OUT		0x02	/* Value written to GP2 line */
#define XE_GPR0_GP1_SELECT	0x04	/* 1 = GP1 is output, 0 = GP1 is input */
#define XE_GPR0_GP2_SELECT	0x08	/* 1 = GP2 is output, 0 = GP2 is input */
#define XE_GPR0_GP1_IN		0x10	/* Value read from GP1 line */
#define XE_GPR0_GP2_IN		0x20	/* Value read from GP2 line */

/* XE_GPR1 bits */
#define XE_GPR1_POWER_DOWN	0x01	/* 0 = Power down analog section */
#define XE_GPR1_AIC			0x04	/* AIC bit (CE2 only) */

/* XE_BOV values */
#define XE_BOV_DINGO		0x55	/* Dingo in Dingo mode */
#define XE_BOV_MOHAWK		0x41	/* Original Mohawk */
#define XE_BOV_MOHAWK_REV1	0x45	/* Rev. 1 Mohawk, or Dingo in Mohawk mode */
#define XE_BOV_CEM28		0x11	/* CEM28 */

/* XE_EES bits */
#define XE_EES_SCL_OUTPUT	0x01	/* Value written to SCL line, when MANUAL_ROM set */
#define XE_EES_SDA_OUTPUT	0x02	/* Value written to SDA line, when MANUAL_ROM set */
#define XE_EES_SDA_INPUT	0x04	/* Value read from SDA line */
#define XE_EES_SDA_TRISTATE	0x08	/* 1 = SDA is output, 0 = SDA is input */
#define XE_EES_MANUAL_ROM	0x20	/* Enable manual contro of serial EEPROM */


/*
 * Page 5 registers (all read only)
 */
#define XE_CRHA			0x08	/* Current Rx host address (16 bits) */
#define XE_RHSA 		0x0a	/* Rx host start address (16 bits) */
#define XE_RNSA			0x0c	/* Rx network start address (16 bits) */
#define XE_CRNA			0x0e	/* Current Rx network address (16 bits) */


/*
 * Page 6 registers (all read only)
 */
#define XE_CTHA			0x08	/* Current Tx host address (16 bits) */
#define XE_THSA			0x0a	/* Tx host start address (16 bits) */
#define XE_TNSA			0x0c	/* Tx network statr address (16 bits) */
#define XE_CTNA			0x0e	/* Current Tx network address (16 bits) */


/*
 * Page 8 registers (all read only)
 */
#define XE_THBC			0x08	/* Tx host byte count (16 bits) */
#define XE_THPS			0x0a	/* Tx host packet size (16 bits) */
#define XE_TNBC			0x0c	/* Tx network byte count (16 bits) */
#define XE_TNPS			0x0e	/* Tx network packet size (16 bits) */


/*
 * Page 0x10 registers (all read only)
 */
#define XE_DINGOID		0x08	/* Dingo ID register (16 bits) (Dingo only) */
#define XE_RevID		0x0a	/* Dingo revision ID (16 bits) (Dingo only) */
#define XE_VendorID		0x0c	/* Dingo vendor ID   (16 bits) (Dingo only) */

/* Values for the above registers */
#define XE_DINGOID_DINGO3	0x444b	/* In both Dingo and Mohawk modes */
#define XE_RevID_DINGO3		0x0001
#define XE_VendorID_DINGO3	0x0041


/*
 * Page 0x40 registers
 */
#define XE_CMD0			0x08	/* MAC Command register (write) */
#define XE_RST0			0x09	/* Receive status register */
#define XE_TXST0		0x0b	/* Transmit status register 0 */
#define XE_TXST1		0x0c	/* Transmit status register 1 */
#define XE_RX0Msk		0x0d	/* Receive status mask register */
#define XE_TX0Msk		0x0e	/* Transmit status 0 mask register */
#define XE_TX1Msk		0x0f	/* Transmit status 1 mask register */

/* CMD0 bits */
#define XE_CMD0_TX		0x01	/* CE2 only */
#define XE_CMD0_RX_ENABLE	0x04	/* Enable receiver */
#define XE_CMD0_RX_DISABLE	0x08	/* Disable receiver */
#define XE_CMD0_ABORT		0x10	/* CE2 only */
#define XE_CMD0_ONLINE		0x20	/* Take MAC online */
#define XE_CMD0_ACK_INTR	0x40	/* CE2 only */
#define XE_CMD0_OFFLINE		0x80	/* Take MAC offline */

/* RST0 bits */
#define XE_RST0_LONG_PACKET	0x02	/* Packet received with >1518 and <8184 bytes */
#define XE_RST0_CRC_ERROR	0x08	/* Packet received with incorrect CRC */
#define XE_RST0_RX_OVERRUN	0x10	/* Receiver overrun, byte(s) dropped */
#define XE_RST0_RX_ENABLE	0x20	/* Receiver enabled */
#define XE_RST0_RX_ABORT	0x40	/* Receive aborted: CRC, FIFO overrun or addr mismatch */
#define XE_RST0_RX_OK		0x80	/* Complete packet received OK */

/* TXST0 bits */
#define XE_TXST0_NO_CARRIER	0x01	/* Lost carrier.  Only valid in 10Mbit half-duplex */
#define XE_TXST0_16_COLLISIONS	0x02	/* Packet aborted after 16 collisions */
#define XE_TXST0_TX_UNDERRUN	0x08	/* MAC ran out of data to send */
#define XE_TXST0_LATE_COLLISION	0x10	/* Collision later than 512 bits */
#define XE_TXST0_SQE_FAIL	0x20	/* SQE test failed. */
#define XE_TXST0_TX_ABORT	0x40	/* Transmit aborted: collisions, underrun or overrun */
#define XE_TXST0_TX_OK		0x80	/* Complete packet sent OK */

/* TXST1 bits */
#define XE_TXST1_RETRY_COUNT	0x0f	/* Collision counter for current packet */
#define XE_TXST1_LINK_STATUS	0x10	/* Valid link status */

/* RX0Msk bits */
#define XE_RX0M_MP			0x01	/* Multicast packet? (CE2 only) */
#define XE_RX0M_LONG_PACKET	0x02	/* Masks for bits in RXST0 */
#define XE_RX0M_ALIGN_ERROR	0x04	/* Alignment error (CE2 only) */
#define XE_RX0M_CRC_ERROR	0x08
#define XE_RX0M_RX_OVERRUN	0x10
#define XE_RX0M_RX_ABORT	0x40
#define XE_RX0M_RX_OK		0x80

/* TX0Msk bits */
#define XE_TX0M_NO_CARRIER	0x01	/* Masks for bits in TXST0 */
#define XE_TX0M_16_COLLISIONS	0x02
#define XE_TX0M_TX_UNDERRUN	0x08
#define XE_TX0M_LATE_COLLISION	0x10
#define XE_TX0M_SQE_FAIL	0x20
#define XE_TX0M_TX_ABORT	0x40
#define XE_TX0M_TX_OK		0x80

/* TX1Msk bits */
#define	XE_TX1M_PKTDEF		0x20


/*
 * Page 0x42 registers
 */
#define XE_SWC0			0x08	/* Software configuration 0 */
#define XE_SWC1			0x09	/* Software configuration 1 */
#define XE_BOC			0x0a	/* Back-off configuration */
#define XE_TCD			0x0b	/* Transmit collision deferral */

/* SWC0 bits */
#define XE_SWC0_LOOPBACK_ENABLE	0x01	/* Enable loopback operation */
#define XE_SWC0_LOOPBACK_SOURCE	0x02	/* 1 = Transceiver, 0 = MAC */
#define XE_SWC0_ACCEPT_ERROR	0x04	/* Accept otherwise OK packets with CRC errors */
#define XE_SWC0_ACCEPT_SHORT	0x08	/* Accept otherwise OK packets that are too short */
#define XE_SWC0_NO_SRC_INSERT	0x20	/* Disable source insertion (CE2) */
#define XE_SWC0_NO_CRC_INSERT	0x40	/* Don't add CRC to outgoing packets */

/* SWC1 bits */
#define XE_SWC1_IA_ENABLE	0x01	/* Enable individual address filters */
#define XE_SWC1_ALLMULTI	0x02	/* Accept all multicast packets */
#define XE_SWC1_PROMISCUOUS	0x04	/* Accept all non-multicast packets */
#define XE_SWC1_BCAST_DISABLE	0x08	/* Reject broadcast packets */
#define XE_SWC1_MEDIA_SELECT	0x40	/* AUI media select (Mohawk only) */
#define XE_SWC1_AUTO_MEDIA	0x80	/* Auto media select (Mohawk only) */


/*
 * Page 0x44 registers (CE2 only)
 */
#define XE_TDR0			0x08	/* Time domain reflectometry register 0 */
#define XE_TDR1			0x09	/* Time domain reflectometry register 1 */
#define XE_RXC0			0x0a	/* Receive byte count low */
#define XE_RXC1			0x0b	/* Receive byte count high */


/*
 * Page 0x45 registers (CE2 only)
 */
#define XE_REV			0x0f	/* Revision (read) */


/*
 * Page 0x50-0x57: Individual address 0-9
 *
 * Used to filter incoming packets by matching against individual node
 * addresses.  If IA matching is enabled (SWC1, bit0) any incoming packet with 
 * a destination matching one of these 10 addresses will be received.  IA0 is
 * always enabled and usually matches the card's unique address.
 *
 * Addresses are stored LSB first, ie. IA00 (reg. 8 on page 0x50) contains the 
 * LSB of IA0, and so on.  The data is stored contiguously, in that addresses
 * can be broken across page boundaries.  That is:
 *
 * Reg: 50/8 50/9 50/a 50/b 50/c 50/d 50/e 50/f 51/8 51/9 ... 57/a 57/b
 *      IA00 IA01 IA02 IA03 IA04 IA05 IA10 IA11 IA12 IA13 ... IA94 IA95
 */

/*
 * Page 0x58: Multicast hash table filter
 *
 * In case the 10 individual addresses aren't enough, we also have a multicast
 * hash filter, enabled through MSR:5.  The most significant six bits of the
 * CRC on each incoming packet are reversed and used as an index into the 64
 * bits of the hash table.  If the appropriate bit is set the packet it
 * received, although higher layers may still need to filter it out.  The CRC
 * calculation is as follows:
 *
 * crc = 0xffffffff;
 * poly = 0x04c11db6;
 * for (i = 0; i < 6; i++) {
 *   current = mcast_addr[i];
 *   for (k = 1; k <= 8; k++) {
 *     if (crc & 0x80000000)
 *       crc31 = 0x01;
 *     else
 *       crc31 = 0;
 *     bit = crc31 ^ (current & 0x01);
 *     crc <<= 1;
 *     current >>= 1;
 *     if (bit)
 *       crc = (crc ^ poly)|1
 *   }
 * }
 */



/****************
 * MII registers
 ****************/

/*
 * Basic MII-compliant PHY register definitions.  According to the Dingo spec, 
 * PHYs from (at least) MicroLinear, National Semiconductor, ICS, TDK and
 * Quality Semiconductor have been used.  These apparently all come up with
 * PHY ID 0x00 unless the "interceptor module" on the Dingo 3 is in use.  With 
 * the interceptor enabled, the PHY is faked up to look like an ICS unit with
 * ID 0x16.  The interceptor can be enabled/disabled in software.
 *
 * The ML6692 (and maybe others) doesn't have a 10Mbps mode -- this is handled 
 * by an internal 10Mbps transceiver that we know nothing about... some cards
 * seem to work with the MII in 10Mbps mode, so I guess some PHYs must support 
 * it.  The question is, how can you figure out which one you have?  Just to
 * add to the fun there are also 10Mbps _only_ Mohawk/Dingo cards.  Aaargh!
 */

/*
 * Masks for the MII-related bits in GPR2
 */
#define XE_MII_CLK		XE_GPR2_GP3_OUT
#define XE_MII_DIR		XE_GPR2_GP4_SELECT
#define XE_MII_WRD		XE_GPR2_GP4_OUT
#define XE_MII_RDD		XE_GPR2_GP4_IN

/*
 * MII PHY ID register values
 */
#define PHY_ID_ML6692		0x0000	/* MicroLinear ML6692? Or unknown */
#define	PHY_ID_ICS1890		0x0015	/* ICS1890 */
#define	PHY_ID_QS6612		0x0181	/* Quality QS6612 */
#define	PHY_ID_DP83840		0x2000	/* National DP83840 */

/*
 * MII command (etc) bit strings.
 */
#define XE_MII_STARTDELIM	0x01
#define XE_MII_READOP		0x02
#define XE_MII_WRITEOP		0x01
#define XE_MII_TURNAROUND	0x02

/*
 * PHY registers.
 */
#define PHY_BMCR		0x00	/* Basic Mode Control Register */
#define PHY_BMSR		0x01	/* Basic Mode Status Register */
#define	PHY_ID1			0x02	/* PHY ID 1 */
#define	PHY_ID2			0x03	/* PHY ID 2 */
#define	PHY_ANAR		0x04	/* Auto-Negotiation Advertisement Register */
#define PHY_LPAR		0x05	/* Auto-Negotiation Link Partner Ability Register */
#define PHY_ANER		0x06	/* Auto-Negotiation Expansion Register */

/* BMCR bits */
#define PHY_BMCR_RESET		0x8000	/* Soft reset PHY.  Self-clearing */
#define PHY_BMCR_LOOPBK		0x4000	/* Enable loopback */
#define PHY_BMCR_SPEEDSEL	0x2000	/* 1=100Mbps, 0=10Mbps */
#define PHY_BMCR_AUTONEGENBL	0x1000	/* Auto-negotiation enabled */
#define PHY_BMCR_ISOLATE	0x0400	/* Isolate ML6692 from MII */
#define PHY_BMCR_AUTONEGRSTR	0x0200	/* Restart auto-negotiation.  Self-clearing */
#define PHY_BMCR_DUPLEX		0x0100	/* Full duplex operation */
#define PHY_BMCR_COLLTEST	0x0080	/* Enable collision test */

/* BMSR bits */
#define PHY_BMSR_100BT4		0x8000	/* 100Base-T4 capable */
#define PHY_BMSR_100BTXFULL	0x4000	/* 100Base-TX full duplex capable */
#define PHY_BMSR_100BTXHALF	0x2000	/* 100Base-TX half duplex capable */
#define PHY_BMSR_10BTFULL	0x1000	/* 10Base-T full duplex capable */
#define PHY_BMSR_10BTHALF	0x0800	/* 10Base-T half duplex capable */
#define PHY_BMSR_AUTONEGCOMP	0x0020	/* Auto-negotiation complete */
#define PHY_BMSR_CANAUTONEG	0x0008	/* Auto-negotiation supported */
#define PHY_BMSR_LINKSTAT	0x0004	/* Link is up */
#define PHY_BMSR_EXTENDED	0x0001	/* Extended register capabilities */

/* ANAR bits */
#define PHY_ANAR_NEXTPAGE	0x8000	/* Additional link code word pages */
#define PHY_ANAR_TLRFLT		0x2000	/* Remote wire fault detected */
#define PHY_ANAR_100BT4		0x0200	/* 100Base-T4 capable */
#define PHY_ANAR_100BTXFULL	0x0100	/* 100Base-TX full duplex capable */
#define PHY_ANAR_100BTXHALF	0x0080	/* 100Base-TX half duplex capable */
#define PHY_ANAR_10BTFULL	0x0040	/* 10Base-T full duplex capable */
#define PHY_ANAR_10BTHALF	0x0020	/* 10Base-T half duplex capable */
#define PHY_ANAR_PROTO4		0x0010	/* Protocol selection (00001 = 802.3) */
#define PHY_ANAR_PROTO3		0x0008
#define PHY_ANAR_PROTO2		0x0004
#define PHY_ANAR_PROTO1		0x0002
#define PHY_ANAR_PROTO0		0x0001
#define PHY_ANAR_8023		PHY_ANAR_PROTO0
#define	PHY_ANAR_DINGO		PHY_ANAR_100BT+PHY_ANAR_10BT_FD+PHY_ANAR_10BT+PHY_ANAR_8023
#define	PHY_ANAR_MOHAWK		PHY_ANAR_100BT+PHY_ANAR_10BT_FD+PHY_ANAR_10BT+PHY_ANAR_8023

/* LPAR bits */
#define PHY_LPAR_NEXTPAGE	0x8000	/* Additional link code word pages */
#define PHY_LPAR_LPACK		0x4000	/* Link partner acknowledged receipt */
#define PHY_LPAR_TLRFLT		0x2000	/* Remote wire fault detected */
#define PHY_LPAR_100BT4		0x0200	/* 100Base-T4 capable */
#define PHY_LPAR_100BTXFULL	0x0100	/* 100Base-TX full duplex capable */
#define PHY_LPAR_100BTXHALF	0x0080	/* 100Base-TX half duplex capable */
#define PHY_LPAR_10BTFULL	0x0040	/* 10Base-T full duplex capable */
#define PHY_LPAR_10BTHALF	0x0020	/* 10Base-T half duplex capable */
#define PHY_LPAR_PROTO4		0x0010	/* Protocol selection (00001 = 802.3) */
#define PHY_LPAR_PROTO3		0x0008
#define PHY_LPAR_PROTO2		0x0004
#define PHY_LPAR_PROTO1		0x0002
#define PHY_LPAR_PROTO0		0x0001

/* ANER bits */
#define PHY_ANER_MLFAULT	0x0010	/* More than one link is up! */
#define PHY_ANER_LPNPABLE	0x0008	/* Link partner supports next page */
#define PHY_ANER_NPABLE		0x0004	/* Local port supports next page */
#define PHY_ANER_PAGERX		0x0002	/* Page received */
#define PHY_ANER_LPAUTONEG	0x0001	/* Link partner can auto-negotiate */

#endif /* DEV_XE_IF_XEREG_H */