xref: /dflybsd-src/sys/dev/netif/xe/if_xereg.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*-
286d7f5d3SJohn Marino  * Copyright (c) 1998, 1999 Scott Mitchell
386d7f5d3SJohn Marino  * All rights reserved.
486d7f5d3SJohn Marino  *
586d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
686d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
786d7f5d3SJohn Marino  * are met:
886d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
986d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
1086d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
1186d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
1286d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
1386d7f5d3SJohn Marino  *
1486d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1586d7f5d3SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1686d7f5d3SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1786d7f5d3SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1886d7f5d3SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1986d7f5d3SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2086d7f5d3SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2186d7f5d3SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2286d7f5d3SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2386d7f5d3SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2486d7f5d3SJohn Marino  * SUCH DAMAGE.
2586d7f5d3SJohn Marino  *
2686d7f5d3SJohn Marino  *	$Id: if_xereg.h,v 1.5 1999/05/20 21:53:58 scott Exp $
2786d7f5d3SJohn Marino  * $FreeBSD: src/sys/dev/xe/if_xereg.h,v 1.6 2003/10/14 22:51:35 rsm Exp $
2886d7f5d3SJohn Marino  * $DragonFly: src/sys/dev/netif/xe/if_xereg.h,v 1.3 2005/11/20 10:16:56 sephe Exp $
2986d7f5d3SJohn Marino  */
3086d7f5d3SJohn Marino #ifndef DEV_XE_IF_XEREG_H
3186d7f5d3SJohn Marino #define DEV_XE_IF_XEREG_H
3286d7f5d3SJohn Marino 
3386d7f5d3SJohn Marino /*
3486d7f5d3SJohn Marino  * Register definitions for Xircom PCMCIA Ethernet controllers, based on
3586d7f5d3SJohn Marino  * Rev. B of the "Dingo" 10/100 controller used in Xircom CEM56 and RealPort
3686d7f5d3SJohn Marino  * Ethernet/modem cards.  The Dingo can be configured to be register
3786d7f5d3SJohn Marino  * compatible with the "Mohawk" 10/100 controller used in Xircom CE3 cards
3886d7f5d3SJohn Marino  * (also some Intel and Compaq OEM versions of the CE3).  The older 10Mbps CE2
3986d7f5d3SJohn Marino  * cards seem to use earlier revisions of the same device.  Some registers and
4086d7f5d3SJohn Marino  * bits below are marked 'CE2 only'; these are used by Werner Koch's xirc2ps
4186d7f5d3SJohn Marino  * driver that was originally for the CE2 but, according to the spec, aren't
4286d7f5d3SJohn Marino  * present on the Dingo.  They often seem to relate to operation on coax
4386d7f5d3SJohn Marino  * cables, which Mohawk can do in theory (it has the SSI interface) so they
4486d7f5d3SJohn Marino  * _might_ also work on Mohawk. I've also noted the few registers that are
4586d7f5d3SJohn Marino  * specific to Dingo.
4686d7f5d3SJohn Marino  *
4786d7f5d3SJohn Marino  * As far as I can tell, the Dingo is basically a Mohawk device with a few
4886d7f5d3SJohn Marino  * registers and support for a second PCMCIA function (the modem) added.  In
4986d7f5d3SJohn Marino  * Dingo mode the SSI (non-MII) PHY interface of the Mohawk is not available.
5086d7f5d3SJohn Marino  * The CE2 chip is most likely a Mohawk without the MII and definitely with a
5186d7f5d3SJohn Marino  * slightly different register set.
5286d7f5d3SJohn Marino  *
5386d7f5d3SJohn Marino  * In all cases, the controller uses a paged model of register access.  The
5486d7f5d3SJohn Marino  * first eight registers are always the same, the function of the second eight
5586d7f5d3SJohn Marino  * is selected by the value in the Page Register (reg 0x01).
5686d7f5d3SJohn Marino  *
5786d7f5d3SJohn Marino  * References:
5886d7f5d3SJohn Marino  * 1. Dingo External Reference Specification, Revision B.  Xircom Inc.,
5986d7f5d3SJohn Marino  *    Thousand Oaks, California.  August 1998.  Available under licence from
6086d7f5d3SJohn Marino  *    Xircom, http://www.xircom.com/
6186d7f5d3SJohn Marino  * 2. ML6692 100BASE-TX Physical Layer with MII specification.  MicroLinear
6286d7f5d3SJohn Marino  *    Corp, San Jose, California.  May 1997.  Available for download from
6386d7f5d3SJohn Marino  *    http://www.microlinear.com/
6486d7f5d3SJohn Marino  * 3. DP83840 10/100 Mb/s Ethernet Physical Layer specification.  National
6586d7f5d3SJohn Marino  *    Semiconductor Corp., Arlington, Texas.  March 1997.  Available for
6686d7f5d3SJohn Marino  *    download from http://www.ns.com/
6786d7f5d3SJohn Marino  * 4. Werner Koch's xirc2ps driver for Linux, for all the CE2 and CE3 frobs
6886d7f5d3SJohn Marino  *    that aren't documented in the Xircom spec.  Available for download from
6986d7f5d3SJohn Marino  *    http://www.d.shuttle.de/isil/xircom/xirc2ps.html
7086d7f5d3SJohn Marino  */
7186d7f5d3SJohn Marino 
7286d7f5d3SJohn Marino /*******************
7386d7f5d3SJohn Marino  * PCMCIA registers
7486d7f5d3SJohn Marino  *******************/
7586d7f5d3SJohn Marino 
7686d7f5d3SJohn Marino /*
7786d7f5d3SJohn Marino  * These are probably Dingo-specific, but you won't need them unless you have
7886d7f5d3SJohn Marino  * a CEM card that needs a bit of hackery to get the Ethernet function to
7986d7f5d3SJohn Marino  * operate.  All addresses are in card attribute space.
8086d7f5d3SJohn Marino  */
8186d7f5d3SJohn Marino #define DINGO_CIS		0x0000	/* Start of CIS tuples */
8286d7f5d3SJohn Marino #define DINGO_ETH		0x0800	/* Ethernet configuration registers */
8386d7f5d3SJohn Marino #define DINGO_COR		0x0820	/* Dingo configuration option registers */
8486d7f5d3SJohn Marino #define DINGO_2ND		0x0840  /* 2nd function configuration registers */
8586d7f5d3SJohn Marino 
8686d7f5d3SJohn Marino 
8786d7f5d3SJohn Marino /*
8886d7f5d3SJohn Marino  * Ethernet configuration registers
8986d7f5d3SJohn Marino  */
9086d7f5d3SJohn Marino #define DINGO_ECOR	(DINGO_ETH+0)	/* Ethernet Configuration Option Register */
9186d7f5d3SJohn Marino #define DINGO_ECSR	(DINGO_ETH+2)	/* Ethernet Configuration Status Register */
9286d7f5d3SJohn Marino #define DINGO_EBAR0	(DINGO_ETH+10)	/* Ethernet Base Address Register bits 7:4 (3:0 always 0) */
9386d7f5d3SJohn Marino #define DINGO_EBAR1	(DINGO_ETH+12)	/* Ethernet Base Address Register bits 15:8 */
9486d7f5d3SJohn Marino 
9586d7f5d3SJohn Marino /* DINGO_ECOR bits */
9686d7f5d3SJohn Marino #define DINGO_ECOR_ETH_ENABLE	0x01	/* 1 = Enable Ethernet part of adapter */
9786d7f5d3SJohn Marino #define DINGO_ECOR_IOB_ENABLE	0x02	/* 1 = Enable EBAR, else use INDEX bits */
9886d7f5d3SJohn Marino #define DINGO_ECOR_INT_ENABLE	0x04	/* 1 = Enable Ethernet interrupts */
9986d7f5d3SJohn Marino #define DINGO_ECOR_IOB_INDEX	0x18	/* 00 = 0x300; 01 = 0x310; 10 = 0x320; 11 = no IO base */
10086d7f5d3SJohn Marino #define DINGO_ECOR_IOB_SHIFT	0x03
10186d7f5d3SJohn Marino #define DINGO_ECOR_IRQ_STSCHG	0x20	/* 1 = Route interrupts to -STSCHG pin, else use -INT pin */
10286d7f5d3SJohn Marino #define DINGO_ECOR_IRQ_LEVEL	0x40	/* 1 = Level-triggered interrupts, else edge-triggered */
10386d7f5d3SJohn Marino #define DINGO_ECOR_SRESET	0x80	/* 1 = Soft reset Ethernet adpater.  Must write to 0 */
10486d7f5d3SJohn Marino 
10586d7f5d3SJohn Marino /* DINGO_ECSR bits */
10686d7f5d3SJohn Marino #define DINGO_ECSR_INT_ACK	0x01	/* 1 = Host must acknowledge interrupts (Clear ECSR_INT bit) */
10786d7f5d3SJohn Marino #define DINGO_ECSR_INT		0x02	/* 1 = Interrupt service requested */
10886d7f5d3SJohn Marino #define DINGO_ECSR_POWER_DOWN	0x04	/* 1 = Power down Ethernet adapter */
10986d7f5d3SJohn Marino 
11086d7f5d3SJohn Marino /*
11186d7f5d3SJohn Marino  * EBAR0/EBAR1 set the I/O base address of the Ethernet adapter when
11286d7f5d3SJohn Marino  * ECOR_IOB_ENABLE is set.  12 significant bits.
11386d7f5d3SJohn Marino  */
11486d7f5d3SJohn Marino 
11586d7f5d3SJohn Marino 
11686d7f5d3SJohn Marino /*
11786d7f5d3SJohn Marino  * Dingo configuration registers
11886d7f5d3SJohn Marino  */
11986d7f5d3SJohn Marino #define DINGO_DCOR0	(DINGO_COR+0)	/* Dingo Configuration Options Register 0 */
12086d7f5d3SJohn Marino #define DINGO_DCOR1	(DINGO_COR+2)	/* Dingo Configuration Options Register 1 */
12186d7f5d3SJohn Marino #define DINGO_DCOR2	(DINGO_COR+4)	/* Dingo Configuration Options Register 2 */
12286d7f5d3SJohn Marino #define DINGO_DCOR3	(DINGO_COR+6)	/* Dingo Configuration Options Register 3 */
12386d7f5d3SJohn Marino #define DINGO_DCOR4	(DINGO_COR+8)	/* Dingo Configuration Options Register 4 */
12486d7f5d3SJohn Marino 
12586d7f5d3SJohn Marino /* DINGO_DCOR0 bits */
12686d7f5d3SJohn Marino #define DINGO_DCOR0_SF_INT	0x01	/* 1 = Enable 2ndF interrupts (alternate to SFCOR:2) */
12786d7f5d3SJohn Marino #define DINGO_DCOR0_DECODE	0x04	/* 1 = Decode 2ndF interrupts in Dingo, else in 2ndF */
12886d7f5d3SJohn Marino #define DINGO_DCOR0_BUS		0x08	/* 1 = 2ndF bus is ISA, else PCMCIA */
12986d7f5d3SJohn Marino #define DINGO_DCOR0_LED3_POWER	0x10	/* 1 = Drive LED3 line from SFCSR:2 */
13086d7f5d3SJohn Marino #define DINGO_DCOR0_LED3_RESET	0x20	/* 1 = Drive LED3 line from SFCOR:7 */
13186d7f5d3SJohn Marino #define DINGO_DCOR0_MR_POWER	0x40	/* 1 = Drive MRESET line from SFCSR:2 */
13286d7f5d3SJohn Marino #define DINGO_DCOR0_MR_RESET	0x80	/* 1 = Drive MRESET line from SFCOR:7 */
13386d7f5d3SJohn Marino 
13486d7f5d3SJohn Marino /* DINGO_DCOR1 bits */
13586d7f5d3SJohn Marino #define DINGO_DCOR1_INT_STSCHG	0x01	/* 1 = Route 2ndF interrupts to -STSCHG (alternate to SFCOR:5) */
13686d7f5d3SJohn Marino #define DINGO_DCOR1_MSTSCHG	0x02	/* 1 = Route 2ndF -MSTSCHG line to -STSCHG */
13786d7f5d3SJohn Marino #define DINGO_DCOR1_EEDIO	0x04	/* 1 = Use EEDIO pin as data line 6 to 2ndF */
13886d7f5d3SJohn Marino #define DINGO_DCOR1_INT_LEVEL	0x08	/* 1 = Force level-triggered interrupts from 2ndF */
13986d7f5d3SJohn Marino #define DINGO_DCOR1_SHADOW_CSR	0x10	/* Reserved, always write 0 */
14086d7f5d3SJohn Marino #define DINGO_DCOR1_SHADOW_IOB	0x20	/* Reserved, always write 0 */
14186d7f5d3SJohn Marino #define DINGO_DCOR1_CSR_WAIT	0xC0	/* Reserved, always write 0 */
14286d7f5d3SJohn Marino #define DINGO_DCOR1_CSR_SHIFT	0x06
14386d7f5d3SJohn Marino 
14486d7f5d3SJohn Marino /* DINGO_DCOR2 bits */
14586d7f5d3SJohn Marino #define DINGO_DCOR2_SHM_BASE	0x0f	/* Bits 15-12 of Ethernet shared memory window */
14686d7f5d3SJohn Marino #define DINGO_DCOR2_SHM_SHIFT	0x00
14786d7f5d3SJohn Marino #define DINGO_DCOR2_SHADOW_COR	0x10	/* Reserved, always write 0 */
14886d7f5d3SJohn Marino 
14986d7f5d3SJohn Marino /*
15086d7f5d3SJohn Marino  * DCOR3/DCOR4 configure Dingo to assert -IOIS16 on any access to each pair of
15186d7f5d3SJohn Marino  * ports in the range SFIOB+0 .. SFIOB+31.  Each pair can be set individually,
15286d7f5d3SJohn Marino  * eg. DCOR3:0 enables this function on ports SFIOB+0 and SFIOB+1.
15386d7f5d3SJohn Marino  */
15486d7f5d3SJohn Marino 
15586d7f5d3SJohn Marino 
15686d7f5d3SJohn Marino /*
15786d7f5d3SJohn Marino  * Second function configuration registers
15886d7f5d3SJohn Marino  */
15986d7f5d3SJohn Marino #define DINGO_SFCOR	(DINGO_2ND+0)	/* 2nd Function Configuration Option Register */
16086d7f5d3SJohn Marino #define DINGO_SFCSR	(DINGO_2ND+2)	/* 2nd Function Configuration Status Register */
16186d7f5d3SJohn Marino #define DINGO_SFBAR0	(DINGO_2ND+10)	/* 2nd Function Base Address Register bits 7:0 */
16286d7f5d3SJohn Marino #define DINGO_SFBAR1	(DINGO_2ND+12)	/* 2nd Function Base Address Register bits 15:8 */
16386d7f5d3SJohn Marino #define DINGO_SFILR	(DINGO_2ND+18)	/* 2nd Function I/O Limit Register */
16486d7f5d3SJohn Marino 
16586d7f5d3SJohn Marino /* DINGO_SFCOR bits */
16686d7f5d3SJohn Marino #define DINGO_SFCOR_SF_ENABLE	0x01	/* 1 = Enable second fuction */
16786d7f5d3SJohn Marino #define DINGO_SFCOR_IOB_ENABLE	0x02	/* 1 = Enable SFBAR, else use COM_SELECT bits */
16886d7f5d3SJohn Marino #define DINGO_SFCOR_INT_ENABLE	0x04	/* 1 = Enable second function interrupts */
16986d7f5d3SJohn Marino #define DINGO_SFCOR_COM_SELECT	0x18	/* 00 = 0x3f8; 01 = 0x2f8; 10 = 0x3e8; 11 = 0x2e8 */
17086d7f5d3SJohn Marino #define DINGO_SFCOR_COM_SHIFT	0x03
17186d7f5d3SJohn Marino #define DINGO_SFCOR_IRQ_STSCHG	0x20	/* 1 = Route interrupts to -STSCHG pin, else use -INT pin */
17286d7f5d3SJohn Marino #define DINGO_SFCOR_IRQ_LEVEL	0x40	/* 1 = Level-triggered interrupts, else edge-triggered */
17386d7f5d3SJohn Marino #define DINGO_SFCOR_SRESET	0x80	/* 1 = Soft reset second function.  Must write to 0 */
17486d7f5d3SJohn Marino 
17586d7f5d3SJohn Marino /* DINGO_SFCSR bits */
17686d7f5d3SJohn Marino #define DINGO_SFCSR_INT_ACK	0x01	/* 1 = Host must acknowledge interrupts (Clear SFCSR_INT bit) */
17786d7f5d3SJohn Marino #define DINGO_SFCSR_INT		0x02	/* 1 = Interrupt service requested */
17886d7f5d3SJohn Marino #define DINGO_SFCSR_POWER_DOWN	0x04	/* 1 = Power down second function */
17986d7f5d3SJohn Marino 
18086d7f5d3SJohn Marino /*
18186d7f5d3SJohn Marino  * SFBAR0/SFBAR1 set the I/O base address of the second function when
18286d7f5d3SJohn Marino  * SFCOR_IOB_ENABLE is set.  16 significant bits.
18386d7f5d3SJohn Marino  */
18486d7f5d3SJohn Marino 
18586d7f5d3SJohn Marino /*
18686d7f5d3SJohn Marino  * SFILR is a bitmap of address lines 7:0 decoded by the second function
18786d7f5d3SJohn Marino  * device.  Eg. a device with 16 ports should write 0x0f to this register.
18886d7f5d3SJohn Marino  */
18986d7f5d3SJohn Marino 
19086d7f5d3SJohn Marino 
19186d7f5d3SJohn Marino 
19286d7f5d3SJohn Marino /********************************
19386d7f5d3SJohn Marino  * Ethernet controller registers
19486d7f5d3SJohn Marino  ********************************/
19586d7f5d3SJohn Marino 
19686d7f5d3SJohn Marino /*
19786d7f5d3SJohn Marino  * Common registers (available from any register page)
19886d7f5d3SJohn Marino  *
19986d7f5d3SJohn Marino  * Note: The EDP is actually 32 bits wide, occupying registers 2-5.  In PCMCIA
20086d7f5d3SJohn Marino  * operation we can only access 16 bits at once, through registers 4 & 5.
20186d7f5d3SJohn Marino  */
20286d7f5d3SJohn Marino #define XE_CR			0x00	/* Command register (write) */
20386d7f5d3SJohn Marino #define XE_ESR			0x00	/* Ethernet status register (read) */
20486d7f5d3SJohn Marino #define XE_PR			0x01	/* Page select register */
20586d7f5d3SJohn Marino #define XE_EDP			0x04	/* Ethernet data port */
20686d7f5d3SJohn Marino #define XE_ISR			0x06	/* Ethernet interrupt status register (read) */
20786d7f5d3SJohn Marino #define XE_GIR			0x07	/* Global interrupt register (Dingo only) */
20886d7f5d3SJohn Marino 
20986d7f5d3SJohn Marino /* XE_CR bits */
21086d7f5d3SJohn Marino #define XE_CR_TX_PACKET		0x01	/* Transmit packet */
21186d7f5d3SJohn Marino #define XE_CR_SOFT_RESET	0x02	/* Software reset */
21286d7f5d3SJohn Marino #define XE_CR_ENABLE_INTR	0x04	/* Enable interrupts */
21386d7f5d3SJohn Marino #define XE_CR_FORCE_INTR	0x08	/* Force an interrupt */
21486d7f5d3SJohn Marino #define XE_CR_CLEAR_FIFO	0x10	/* Clear FIFO after transmit overrun */
21586d7f5d3SJohn Marino #define XE_CR_CLEAR_OVERRUN	0x20	/* Clear receive overrun condition */
21686d7f5d3SJohn Marino #define XE_CR_RESTART_TX	0x40	/* Restart TX after 16 collisions or TX underrun */
21786d7f5d3SJohn Marino 
21886d7f5d3SJohn Marino /* XE_ESR bits */
21986d7f5d3SJohn Marino #define XE_ESR_FULL_PACKET_RX	0x01	/* At least one full packet received */
22086d7f5d3SJohn Marino #define XE_ESR_PART_PACKET_RX	0x02	/* At least 64 bytes of packet received */
22186d7f5d3SJohn Marino #define XE_ESR_REJECT_PACKET	0x04	/* Partial packet rejected */
22286d7f5d3SJohn Marino #define XE_ESR_TX_PENDING	0x08	/* At least one packet waiting to transmit */
22386d7f5d3SJohn Marino #define XE_ESR_BAD_POLARITY	0x10	/* Bad cable polarity? (CE2 only) */
22486d7f5d3SJohn Marino #define XE_ESR_MEDIA_SELECT	0x20	/* SSI(?) media select: 1 = Twisted pair; 0 = AUI */
22586d7f5d3SJohn Marino 
22686d7f5d3SJohn Marino /* XE_ISR bits */
22786d7f5d3SJohn Marino #define XE_ISR_TX_OVERFLOW	0x01	/* No space in transmit buffer */
22886d7f5d3SJohn Marino #define XE_ISR_TX_PACKET	0x02	/* Packet sent successfully */
22986d7f5d3SJohn Marino #define XE_ISR_MAC_INTR		0x04	/* Some kind of MAC interrupt happened */
23086d7f5d3SJohn Marino #define XE_ISR_RX_EARLY		0x10	/* Incoming packet in early receive mode */
23186d7f5d3SJohn Marino #define XE_ISR_RX_PACKET	0x20	/* Complete packet received successfully */
23286d7f5d3SJohn Marino #define XE_ISR_RX_REJECT	0x40	/* Partial incoming packet rejected by MAC */
23386d7f5d3SJohn Marino #define XE_ISR_FORCE_INTR	0x80	/* Interrupt forced */
23486d7f5d3SJohn Marino 
23586d7f5d3SJohn Marino /* XE_GIR bits */
23686d7f5d3SJohn Marino #define XE_GIR_ETH_IRQ		0x01	/* Ethernet IRQ pending */
23786d7f5d3SJohn Marino #define XE_GIR_ETH_MASK		0x02	/* 1 = Mask Ethernet interrupts to host */
23886d7f5d3SJohn Marino #define XE_GIR_SF_IRQ		0x04	/* Second function IRQ pending */
23986d7f5d3SJohn Marino #define XE_GIR_SF_MASK		0x08	/* 1 = Mask second function interrupts to host */
24086d7f5d3SJohn Marino 
24186d7f5d3SJohn Marino 
24286d7f5d3SJohn Marino /*
24386d7f5d3SJohn Marino  * Page 0 registers
24486d7f5d3SJohn Marino  */
24586d7f5d3SJohn Marino #define XE_TSO			0x08	/* Transmit space open (17 bits) */
24686d7f5d3SJohn Marino #define XE_TRS			0x0a	/* Transmit reservation size (CE2 only, removed in rev. 1) */
24786d7f5d3SJohn Marino #define XE_DO			0x0c	/* Data offset register (13 bits/3 flags, write) */
24886d7f5d3SJohn Marino #define XE_RSR			0x0c	/* Receive status register (read) */
24986d7f5d3SJohn Marino #define XE_TPR			0x0d	/* Packets transmitted register (read) */
25086d7f5d3SJohn Marino #define XE_RBC			0x0e	/* Received byte count (13 bits/3 flags, read) */
25186d7f5d3SJohn Marino 
25286d7f5d3SJohn Marino /* XE_DO bits */
25386d7f5d3SJohn Marino #define XE_DO_OFFSET		0x1fff	/* First byte fetched when CHANGE_OFFSET issued */
25486d7f5d3SJohn Marino #define XE_DO_OFFSET_SHIFT	0x00
25586d7f5d3SJohn Marino #define XE_DO_CHANGE_OFFSET	0x2000	/* Flush RX FIFO, start fetching from OFFSET */
25686d7f5d3SJohn Marino #define XE_DO_SHARED_MEM	0x4000	/* Enable shared memory mode */
25786d7f5d3SJohn Marino #define XE_DO_SKIP_RX_PACKET	0x8000	/* Skip to next packet in buffer memory */
25886d7f5d3SJohn Marino 
25986d7f5d3SJohn Marino /* XE_RSR bits */
26086d7f5d3SJohn Marino #define XE_RSR_PHYS_PACKET	0x01	/* 1 = Physical packet, 0 = Multicast packet */
26186d7f5d3SJohn Marino #define XE_RSR_BCAST_PACKET	0x02	/* Broadcast packet */
26286d7f5d3SJohn Marino #define XE_RSR_LONG_PACKET	0x04	/* Packet >1518 bytes */
26386d7f5d3SJohn Marino #define XE_RSR_ADDR_MATCH	0x08	/* Packet matched one of our node addresses */
26486d7f5d3SJohn Marino #define XE_RSR_ALIGN_ERROR	0x10	/* Bad alignment? (CE2 only) */
26586d7f5d3SJohn Marino #define XE_RSR_CRC_ERROR	0x20	/* Incorrect CRC */
26686d7f5d3SJohn Marino #define XE_RSR_RX_OK		0x80	/* No errors on received packet */
26786d7f5d3SJohn Marino 
26886d7f5d3SJohn Marino /* XE_RBC bits */
26986d7f5d3SJohn Marino #define XE_RBC_BYTE_COUNT	0x1fff	/* Bytes received for current packet */
27086d7f5d3SJohn Marino #define XE_RBC_COUNT_SHIFT	0x00
27186d7f5d3SJohn Marino #define XE_RBC_FULL_PACKET_RX	0x2000	/* These mirror bits 2:0 of ESR, if ECR:7 is set */
27286d7f5d3SJohn Marino #define XE_RBC_PART_PACKET_RX	0x4000
27386d7f5d3SJohn Marino #define XE_RBC_REJECT_PACKET	0x8000
27486d7f5d3SJohn Marino 
27586d7f5d3SJohn Marino 
27686d7f5d3SJohn Marino /*
27786d7f5d3SJohn Marino  * Page 1 registers
27886d7f5d3SJohn Marino  */
27986d7f5d3SJohn Marino #define XE_IMR0			0x0c	/* Interrupt mask register 0 */
28086d7f5d3SJohn Marino #define XE_IMR1			0x0d	/* Interrupt mask register 1 (CE2 only) */
28186d7f5d3SJohn Marino #define XE_ECR			0x0e	/* Ethernet configuration register */
28286d7f5d3SJohn Marino 
28386d7f5d3SJohn Marino /* XE_IMR0 bits */
28486d7f5d3SJohn Marino #define XE_IMR0_TX_OVERFLOW	0x01	/* Masks for bits in ISR */
28586d7f5d3SJohn Marino #define XE_IMR0_TX_PACKET	0x02
28686d7f5d3SJohn Marino #define XE_IMR0_MAC_INTR	0x04
28786d7f5d3SJohn Marino #define XE_IMR0_TX_RESGRANT	0x08	/* Tx reservation granted (CE2) */
28886d7f5d3SJohn Marino #define XE_IMR0_RX_EARLY	0x10
28986d7f5d3SJohn Marino #define XE_IMR0_RX_PACKET	0x20
29086d7f5d3SJohn Marino #define XE_IMR0_RX_REJECT	0x40
29186d7f5d3SJohn Marino #define XE_IMR0_FORCE_INTR	0x80
29286d7f5d3SJohn Marino 
29386d7f5d3SJohn Marino /* XE_IMR1 bits */
29486d7f5d3SJohn Marino #define XE_IMR1_TX_UNDERRUN	0x01
29586d7f5d3SJohn Marino 
29686d7f5d3SJohn Marino /* XE_ECR bits */
29786d7f5d3SJohn Marino #define XE_ECR_EARLY_TX		0x01	/* Enable early transmit mode */
29886d7f5d3SJohn Marino #define XE_ECR_EARLY_RX		0x02	/* Enable early receive mode */
29986d7f5d3SJohn Marino #define XE_ECR_FULL_DUPLEX 	0x04	/* Enable full-duplex (disable collision detection) */
30086d7f5d3SJohn Marino #define XE_ECR_LONG_TPCABLE	0x08	/* CE2 only */
30186d7f5d3SJohn Marino #define XE_ECR_NO_POL_COL	0x10	/* CE2 only */
30286d7f5d3SJohn Marino #define XE_ECR_NO_LINK_PULSE	0x20	/* Don't check/send link pulses (not 10BT compliant) */
30386d7f5d3SJohn Marino #define XE_ECR_NO_AUTO_TX	0x40	/* CE2 only */
30486d7f5d3SJohn Marino #define XE_ECR_SOFT_COMPAT	0x80	/* Map ESR bits 2:0 to RBC bits 15:13 */
30586d7f5d3SJohn Marino 
30686d7f5d3SJohn Marino 
30786d7f5d3SJohn Marino /*
30886d7f5d3SJohn Marino  * Page 2 registers
30986d7f5d3SJohn Marino  */
31086d7f5d3SJohn Marino #define XE_RBS			0x08	/* Receive buffer start (16 bits) */
31186d7f5d3SJohn Marino #define XE_LED			0x0a	/* LED control register */
31286d7f5d3SJohn Marino #define XE_LED3			0x0b	/* LED3 control register */
31386d7f5d3SJohn Marino #define XE_MSR			0x0c	/* Misc. setup register (Mohawk specific register?) */
31486d7f5d3SJohn Marino #define XE_GPR2			0x0d	/* General purpose register 2 */
31586d7f5d3SJohn Marino 
31686d7f5d3SJohn Marino /*
31786d7f5d3SJohn Marino  * LED function selection:
31886d7f5d3SJohn Marino  * 000 - Disabled
31986d7f5d3SJohn Marino  * 001 - Collision activity
32086d7f5d3SJohn Marino  * 010 - !Collision activity
32186d7f5d3SJohn Marino  * 011 - 10Mbit link detected
32286d7f5d3SJohn Marino  * 100 - 100Mbit link detected
32386d7f5d3SJohn Marino  * 101 - 10/100Mbit link detected
32486d7f5d3SJohn Marino  * 110 - Automatic assertion
32586d7f5d3SJohn Marino  * 111 - Transmit activity
32686d7f5d3SJohn Marino  */
32786d7f5d3SJohn Marino 
32886d7f5d3SJohn Marino /* XE_LED bits */
32986d7f5d3SJohn Marino #define XE_LED_LED0_MASK	0x07	/* LED0 function selection */
33086d7f5d3SJohn Marino #define XE_LED_LED0_SHIFT	0x00
33186d7f5d3SJohn Marino #define XE_LED_LED1_MASK	0x38	/* LED1 function selection */
33286d7f5d3SJohn Marino #define XE_LED_LED1_SHIFT	0x03
33386d7f5d3SJohn Marino #define XE_LED_LED0_RX		0x40	/* Add receive activity to LED0 */
33486d7f5d3SJohn Marino #define XE_LED_LED1_RX		0x80	/* Add receive activity to LED1 */
33586d7f5d3SJohn Marino 
33686d7f5d3SJohn Marino /* XE_LED3 bits */
33786d7f5d3SJohn Marino #define XE_LED3_MASK		0x07	/* LED3 function selection */
33886d7f5d3SJohn Marino #define XE_LED3_SHIFT		0x00
33986d7f5d3SJohn Marino #define XE_LED3_RX		0x40	/* Add receive activity to LED3 */
34086d7f5d3SJohn Marino 
34186d7f5d3SJohn Marino /* XE_MSR bits */
34286d7f5d3SJohn Marino #define XE_MSR_128K_SRAM	0x01	/* Select 128K SRAM */
34386d7f5d3SJohn Marino #define XE_MSR_RBS_BIT16	0x02	/* Bit 16 of RBS (only useful with big SRAM) */
34486d7f5d3SJohn Marino #define XE_MSR_MII_SELECT	0x08	/* Select MII instead of SSI interface */
34586d7f5d3SJohn Marino #define XE_MSR_HASH_TABLE	0x20	/* Enable hash table filtering */
34686d7f5d3SJohn Marino 
34786d7f5d3SJohn Marino /* XE_GPR2 bits */
34886d7f5d3SJohn Marino #define XE_GPR2_GP3_OUT		0x01	/* Value written to GP3 line */
34986d7f5d3SJohn Marino #define XE_GPR2_GP4_OUT		0x02	/* Value written to GP4 line */
35086d7f5d3SJohn Marino #define XE_GPR2_GP3_SELECT	0x04	/* 1 = GP3 is output, 0 = GP3 is input */
35186d7f5d3SJohn Marino #define XE_GPR2_GP4_SELECT	0x08	/* 1 = GP4 is output, 0 = GP3 is input */
35286d7f5d3SJohn Marino #define XE_GPR2_GP3_IN		0x10	/* Value read from GP3 line */
35386d7f5d3SJohn Marino #define XE_GPR2_GP4_IN		0x20	/* Value read from GP4 line */
35486d7f5d3SJohn Marino 
35586d7f5d3SJohn Marino 
35686d7f5d3SJohn Marino /*
35786d7f5d3SJohn Marino  * Page 3 registers
35886d7f5d3SJohn Marino  */
35986d7f5d3SJohn Marino #define XE_TPT			0x0a	/* Transmit packet threshold (13 bits) */
36086d7f5d3SJohn Marino 
36186d7f5d3SJohn Marino 
36286d7f5d3SJohn Marino /*
36386d7f5d3SJohn Marino  * Page 4 registers
36486d7f5d3SJohn Marino  */
36586d7f5d3SJohn Marino #define XE_GPR0			0x08	/* General purpose register 0 */
36686d7f5d3SJohn Marino #define XE_GPR1			0x09	/* General purpose register 1 */
36786d7f5d3SJohn Marino #define XE_BOV			0x0a	/* Bonding version register (read) */
36886d7f5d3SJohn Marino #define XE_EES			0x0b	/* EEPROM control register */
36986d7f5d3SJohn Marino #define XE_LMA			0x0c	/* Local memory address (CE2 only) */
37086d7f5d3SJohn Marino #define XE_LMD			0x0e	/* Local memory data (CE2 only) */
37186d7f5d3SJohn Marino 
37286d7f5d3SJohn Marino /* XE_GPR0 bits */
37386d7f5d3SJohn Marino #define XE_GPR0_GP1_OUT		0x01	/* Value written to GP1 line */
37486d7f5d3SJohn Marino #define XE_GPR0_GP2_OUT		0x02	/* Value wirtten to GP2 line */
37586d7f5d3SJohn Marino #define XE_GPR0_GP1_SELECT	0x04	/* 1 = GP1 is output, 0 = GP1 is input */
37686d7f5d3SJohn Marino #define XE_GPR0_GP2_SELECT	0x08	/* 1 = GP2 is output, 0 = GP2 is input */
37786d7f5d3SJohn Marino #define XE_GPR0_GP1_IN		0x10	/* Value read from GP1 line */
37886d7f5d3SJohn Marino #define XE_GPR0_GP2_IN		0x20	/* Value read from GP2 line */
37986d7f5d3SJohn Marino 
38086d7f5d3SJohn Marino /* XE_GPR1 bits */
38186d7f5d3SJohn Marino #define XE_GPR1_POWER_DOWN	0x01	/* 0 = Power down analog section */
38286d7f5d3SJohn Marino #define XE_GPR1_AIC		0x04	/* AIC bit (CE2 only) */
38386d7f5d3SJohn Marino 
38486d7f5d3SJohn Marino /* XE_BOV values */
38586d7f5d3SJohn Marino #define XE_BOV_DINGO		0x55	/* Dingo in Dingo mode */
38686d7f5d3SJohn Marino #define XE_BOV_MOHAWK		0x41	/* Original Mohawk */
38786d7f5d3SJohn Marino #define XE_BOV_MOHAWK_REV1	0x45	/* Rev. 1 Mohawk, or Dingo in Mohawk mode */
38886d7f5d3SJohn Marino #define XE_BOV_CEM28		0x11	/* CEM28 */
38986d7f5d3SJohn Marino 
39086d7f5d3SJohn Marino /* XE_EES bits */
39186d7f5d3SJohn Marino #define XE_EES_SCL_OUTPUT	0x01	/* Value written to SCL line, when MANUAL_ROM set */
39286d7f5d3SJohn Marino #define XE_EES_SDA_OUTPUT	0x02	/* Value written to SDA line, when MANUAL_ROM set */
39386d7f5d3SJohn Marino #define XE_EES_SDA_INPUT	0x04	/* Value read from SDA line */
39486d7f5d3SJohn Marino #define XE_EES_SDA_TRISTATE	0x08	/* 1 = SDA is output, 0 = SDA is input */
39586d7f5d3SJohn Marino #define XE_EES_MANUAL_ROM	0x20	/* Enable manual contro of serial EEPROM */
39686d7f5d3SJohn Marino 
39786d7f5d3SJohn Marino 
39886d7f5d3SJohn Marino /*
39986d7f5d3SJohn Marino  * Page 5 registers (all read only)
40086d7f5d3SJohn Marino  */
40186d7f5d3SJohn Marino #define XE_CRHA			0x08	/* Current Rx host address (16 bits) */
40286d7f5d3SJohn Marino #define XE_RHSA 		0x0a	/* Rx host start address (16 bits) */
40386d7f5d3SJohn Marino #define XE_RNSA			0x0c	/* Rx network start address (16 bits) */
40486d7f5d3SJohn Marino #define XE_CRNA			0x0e	/* Current Rx network address (16 bits) */
40586d7f5d3SJohn Marino 
40686d7f5d3SJohn Marino 
40786d7f5d3SJohn Marino /*
40886d7f5d3SJohn Marino  * Page 6 registers (all read only)
40986d7f5d3SJohn Marino  */
41086d7f5d3SJohn Marino #define XE_CTHA			0x08	/* Current Tx host address (16 bits) */
41186d7f5d3SJohn Marino #define XE_THSA			0x0a	/* Tx host start address (16 bits) */
41286d7f5d3SJohn Marino #define XE_TNSA			0x0c	/* Tx network statr address (16 bits) */
41386d7f5d3SJohn Marino #define XE_CTNA			0x0e	/* Current Tx network address (16 bits) */
41486d7f5d3SJohn Marino 
41586d7f5d3SJohn Marino 
41686d7f5d3SJohn Marino /*
41786d7f5d3SJohn Marino  * Page 8 registers (all read only)
41886d7f5d3SJohn Marino  */
41986d7f5d3SJohn Marino #define XE_THBC			0x08	/* Tx host byte count (16 bits) */
42086d7f5d3SJohn Marino #define XE_THPS			0x0a	/* Tx host packet size (16 bits) */
42186d7f5d3SJohn Marino #define XE_TNBC			0x0c	/* Tx network byte count (16 bits) */
42286d7f5d3SJohn Marino #define XE_TNPS			0x0e	/* Tx network packet size (16 bits) */
42386d7f5d3SJohn Marino 
42486d7f5d3SJohn Marino 
42586d7f5d3SJohn Marino /*
42686d7f5d3SJohn Marino  * Page 0x10 registers (all read only)
42786d7f5d3SJohn Marino  */
42886d7f5d3SJohn Marino #define XE_DINGOID		0x08	/* Dingo ID register (16 bits) (Dingo only) */
42986d7f5d3SJohn Marino #define XE_RevID		0x0a	/* Dingo revision ID (16 bits) (Dingo only) */
43086d7f5d3SJohn Marino #define XE_VendorID		0x0c	/* Dingo vendor ID   (16 bits) (Dingo only) */
43186d7f5d3SJohn Marino 
43286d7f5d3SJohn Marino /* Values for the above registers */
43386d7f5d3SJohn Marino #define XE_DINGOID_DINGO3	0x444b	/* In both Dingo and Mohawk modes */
43486d7f5d3SJohn Marino #define XE_RevID_DINGO3		0x0001
43586d7f5d3SJohn Marino #define XE_VendorID_DINGO3	0x0041
43686d7f5d3SJohn Marino 
43786d7f5d3SJohn Marino 
43886d7f5d3SJohn Marino /*
43986d7f5d3SJohn Marino  * Page 0x40 registers
44086d7f5d3SJohn Marino  */
44186d7f5d3SJohn Marino #define XE_CMD0			0x08	/* MAC Command register (write) */
44286d7f5d3SJohn Marino #define XE_RST0			0x09	/* Receive status register */
44386d7f5d3SJohn Marino #define XE_TXST0		0x0b	/* Transmit status register 0 */
44486d7f5d3SJohn Marino #define XE_TXST1		0x0c	/* Transmit status register 1 */
44586d7f5d3SJohn Marino #define XE_RX0Msk		0x0d	/* Receive status mask register */
44686d7f5d3SJohn Marino #define XE_TX0Msk		0x0e	/* Transmit status 0 mask register */
44786d7f5d3SJohn Marino #define XE_TX1Msk		0x0f	/* Transmit status 1 mask register */
44886d7f5d3SJohn Marino 
44986d7f5d3SJohn Marino /* CMD0 bits */
45086d7f5d3SJohn Marino #define XE_CMD0_TX		0x01	/* CE2 only */
45186d7f5d3SJohn Marino #define XE_CMD0_RX_ENABLE	0x04	/* Enable receiver */
45286d7f5d3SJohn Marino #define XE_CMD0_RX_DISABLE	0x08	/* Disable receiver */
45386d7f5d3SJohn Marino #define XE_CMD0_ABORT		0x10	/* CE2 only */
45486d7f5d3SJohn Marino #define XE_CMD0_ONLINE		0x20	/* Take MAC online */
45586d7f5d3SJohn Marino #define XE_CMD0_ACK_INTR	0x40	/* CE2 only */
45686d7f5d3SJohn Marino #define XE_CMD0_OFFLINE		0x80	/* Take MAC offline */
45786d7f5d3SJohn Marino 
45886d7f5d3SJohn Marino /* RST0 bits */
45986d7f5d3SJohn Marino #define XE_RST0_LONG_PACKET	0x02	/* Packet received with >1518 and <8184 bytes */
46086d7f5d3SJohn Marino #define XE_RST0_CRC_ERROR	0x08	/* Packet received with incorrect CRC */
46186d7f5d3SJohn Marino #define XE_RST0_RX_OVERRUN	0x10	/* Receiver overrun, byte(s) dropped */
46286d7f5d3SJohn Marino #define XE_RST0_RX_ENABLE	0x20	/* Receiver enabled */
46386d7f5d3SJohn Marino #define XE_RST0_RX_ABORT	0x40	/* Receive aborted: CRC, FIFO overrun or addr mismatch */
46486d7f5d3SJohn Marino #define XE_RST0_RX_OK		0x80	/* Complete packet received OK */
46586d7f5d3SJohn Marino 
46686d7f5d3SJohn Marino /* TXST0 bits */
46786d7f5d3SJohn Marino #define XE_TXST0_NO_CARRIER	0x01	/* Lost carrier.  Only valid in 10Mbit half-duplex */
46886d7f5d3SJohn Marino #define XE_TXST0_16_COLLISIONS	0x02	/* Packet aborted after 16 collisions */
46986d7f5d3SJohn Marino #define XE_TXST0_TX_UNDERRUN	0x08	/* MAC ran out of data to send */
47086d7f5d3SJohn Marino #define XE_TXST0_LATE_COLLISION	0x10	/* Collision later than 512 bits */
47186d7f5d3SJohn Marino #define XE_TXST0_SQE_FAIL	0x20	/* SQE test failed. */
47286d7f5d3SJohn Marino #define XE_TXST0_TX_ABORT	0x40	/* Transmit aborted: collisions, underrun or overrun */
47386d7f5d3SJohn Marino #define XE_TXST0_TX_OK		0x80	/* Complete packet sent OK */
47486d7f5d3SJohn Marino 
47586d7f5d3SJohn Marino /* TXST1 bits */
47686d7f5d3SJohn Marino #define XE_TXST1_RETRY_COUNT	0x0f	/* Collision counter for current packet */
47786d7f5d3SJohn Marino #define XE_TXST1_LINK_STATUS	0x10	/* Valid link status */
47886d7f5d3SJohn Marino 
47986d7f5d3SJohn Marino /* RX0Msk bits */
48086d7f5d3SJohn Marino #define XE_RX0M_MP		0x01	/* Multicast packet? (CE2 only) */
48186d7f5d3SJohn Marino #define XE_RX0M_LONG_PACKET	0x02	/* Masks for bits in RXST0 */
48286d7f5d3SJohn Marino #define XE_RX0M_ALIGN_ERROR	0x04	/* Alignment error (CE2 only) */
48386d7f5d3SJohn Marino #define XE_RX0M_CRC_ERROR	0x08
48486d7f5d3SJohn Marino #define XE_RX0M_RX_OVERRUN	0x10
48586d7f5d3SJohn Marino #define XE_RX0M_RX_ABORT	0x40
48686d7f5d3SJohn Marino #define XE_RX0M_RX_OK		0x80
48786d7f5d3SJohn Marino 
48886d7f5d3SJohn Marino /* TX0Msk bits */
48986d7f5d3SJohn Marino #define XE_TX0M_NO_CARRIER	0x01	/* Masks for bits in TXST0 */
49086d7f5d3SJohn Marino #define XE_TX0M_16_COLLISIONS	0x02
49186d7f5d3SJohn Marino #define XE_TX0M_TX_UNDERRUN	0x08
49286d7f5d3SJohn Marino #define XE_TX0M_LATE_COLLISION	0x10
49386d7f5d3SJohn Marino #define XE_TX0M_SQE_FAIL	0x20
49486d7f5d3SJohn Marino #define XE_TX0M_TX_ABORT	0x40
49586d7f5d3SJohn Marino #define XE_TX0M_TX_OK		0x80
49686d7f5d3SJohn Marino 
49786d7f5d3SJohn Marino /* TX1Msk bits */
49886d7f5d3SJohn Marino #define	XE_TX1M_PKTDEF		0x20
49986d7f5d3SJohn Marino 
50086d7f5d3SJohn Marino 
50186d7f5d3SJohn Marino /*
50286d7f5d3SJohn Marino  * Page 0x42 registers
50386d7f5d3SJohn Marino  */
50486d7f5d3SJohn Marino #define XE_SWC0			0x08	/* Software configuration 0 */
50586d7f5d3SJohn Marino #define XE_SWC1			0x09	/* Software configuration 1 */
50686d7f5d3SJohn Marino #define XE_BOC			0x0a	/* Back-off configuration */
50786d7f5d3SJohn Marino #define XE_TCD			0x0b	/* Transmit collision deferral */
50886d7f5d3SJohn Marino 
50986d7f5d3SJohn Marino /* SWC0 bits */
51086d7f5d3SJohn Marino #define XE_SWC0_LOOPBACK_ENABLE	0x01	/* Enable loopback operation */
51186d7f5d3SJohn Marino #define XE_SWC0_LOOPBACK_SOURCE	0x02	/* 1 = Transceiver, 0 = MAC */
51286d7f5d3SJohn Marino #define XE_SWC0_ACCEPT_ERROR	0x04	/* Accept otherwise OK packets with CRC errors */
51386d7f5d3SJohn Marino #define XE_SWC0_ACCEPT_SHORT	0x08	/* Accept otherwise OK packets that are too short */
51486d7f5d3SJohn Marino #define XE_SWC0_NO_SRC_INSERT	0x20	/* Disable source insertion (CE2) */
51586d7f5d3SJohn Marino #define XE_SWC0_NO_CRC_INSERT	0x40	/* Don't add CRC to outgoing packets */
51686d7f5d3SJohn Marino 
51786d7f5d3SJohn Marino /* SWC1 bits */
51886d7f5d3SJohn Marino #define XE_SWC1_IA_ENABLE	0x01	/* Enable individual address filters */
51986d7f5d3SJohn Marino #define XE_SWC1_ALLMULTI	0x02	/* Accept all multicast packets */
52086d7f5d3SJohn Marino #define XE_SWC1_PROMISCUOUS	0x04	/* Accept all non-multicast packets */
52186d7f5d3SJohn Marino #define XE_SWC1_BCAST_DISABLE	0x08	/* Reject broadcast packets */
52286d7f5d3SJohn Marino #define XE_SWC1_MEDIA_SELECT	0x40	/* AUI media select (Mohawk only) */
52386d7f5d3SJohn Marino #define XE_SWC1_AUTO_MEDIA	0x80	/* Auto media select (Mohawk only) */
52486d7f5d3SJohn Marino 
52586d7f5d3SJohn Marino 
52686d7f5d3SJohn Marino /*
52786d7f5d3SJohn Marino  * Page 0x44 registers (CE2 only)
52886d7f5d3SJohn Marino  */
52986d7f5d3SJohn Marino #define XE_TDR0			0x08	/* Time domain reflectometry register 0 */
53086d7f5d3SJohn Marino #define XE_TDR1			0x09	/* Time domain reflectometry register 1 */
53186d7f5d3SJohn Marino #define XE_RXC0			0x0a	/* Receive byte count low */
53286d7f5d3SJohn Marino #define XE_RXC1			0x0b	/* Receive byte count high */
53386d7f5d3SJohn Marino 
53486d7f5d3SJohn Marino 
53586d7f5d3SJohn Marino /*
53686d7f5d3SJohn Marino  * Page 0x45 registers (CE2 only)
53786d7f5d3SJohn Marino  */
53886d7f5d3SJohn Marino #define XE_REV			0x0f	/* Revision (read) */
53986d7f5d3SJohn Marino 
54086d7f5d3SJohn Marino 
54186d7f5d3SJohn Marino /*
54286d7f5d3SJohn Marino  * Page 0x50-0x57: Individual address 0-9
54386d7f5d3SJohn Marino  *
54486d7f5d3SJohn Marino  * Used to filter incoming packets by matching against individual node
54586d7f5d3SJohn Marino  * addresses.  If IA matching is enabled (SWC1, bit0) any incoming packet with
54686d7f5d3SJohn Marino  * a destination matching one of these 10 addresses will be received.  IA0 is
54786d7f5d3SJohn Marino  * always enabled and usually matches the card's unique address.
54886d7f5d3SJohn Marino  *
54986d7f5d3SJohn Marino  * Addresses are stored LSB first, ie. IA00 (reg. 8 on page 0x50) contains the
55086d7f5d3SJohn Marino  * LSB of IA0, and so on.  The data is stored contiguously, in that addresses
55186d7f5d3SJohn Marino  * can be broken across page boundaries.  That is:
55286d7f5d3SJohn Marino  *
55386d7f5d3SJohn Marino  * 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
55486d7f5d3SJohn Marino  *      IA00 IA01 IA02 IA03 IA04 IA05 IA10 IA11 IA12 IA13 ... IA94 IA95
55586d7f5d3SJohn Marino  */
55686d7f5d3SJohn Marino 
55786d7f5d3SJohn Marino /*
55886d7f5d3SJohn Marino  * Page 0x58: Multicast hash table filter
55986d7f5d3SJohn Marino  *
56086d7f5d3SJohn Marino  * In case the 10 individual addresses aren't enough, we also have a multicast
56186d7f5d3SJohn Marino  * hash filter, enabled through MSR:5.  The most significant six bits of the
56286d7f5d3SJohn Marino  * CRC on each incoming packet are reversed and used as an index into the 64
56386d7f5d3SJohn Marino  * bits of the hash table.  If the appropriate bit is set the packet it
56486d7f5d3SJohn Marino  * received, although higher layers may still need to filter it out.  The CRC
56586d7f5d3SJohn Marino  * calculation is as follows:
56686d7f5d3SJohn Marino  *
56786d7f5d3SJohn Marino  * crc = 0xffffffff;
56886d7f5d3SJohn Marino  * poly = 0x04c11db6;
56986d7f5d3SJohn Marino  * for (i = 0; i < 6; i++) {
57086d7f5d3SJohn Marino  *   current = mcast_addr[i];
57186d7f5d3SJohn Marino  *   for (k = 1; k <= 8; k++) {
57286d7f5d3SJohn Marino  *     if (crc & 0x80000000);
57386d7f5d3SJohn Marino  *       crc31 = 0x01;
57486d7f5d3SJohn Marino  *     else
57586d7f5d3SJohn Marino  *       crc31 = 0;
57686d7f5d3SJohn Marino  *     bit = crc31 ^ (current & 0x01);
57786d7f5d3SJohn Marino  *     crc <<= 1;
57886d7f5d3SJohn Marino  *     current >>= 1;
57986d7f5d3SJohn Marino  *     if (bit)
58086d7f5d3SJohn Marino  *       crc = (crc ^ poly)|1
58186d7f5d3SJohn Marino  *   }
58286d7f5d3SJohn Marino  * }
58386d7f5d3SJohn Marino  */
58486d7f5d3SJohn Marino 
58586d7f5d3SJohn Marino 
58686d7f5d3SJohn Marino 
58786d7f5d3SJohn Marino /****************
58886d7f5d3SJohn Marino  * MII registers
58986d7f5d3SJohn Marino  ****************/
59086d7f5d3SJohn Marino 
59186d7f5d3SJohn Marino /*
59286d7f5d3SJohn Marino  * Basic MII-compliant PHY register definitions.  According to the Dingo spec,
59386d7f5d3SJohn Marino  * PHYs from (at least) MicroLinear, National Semiconductor, ICS, TDK and
59486d7f5d3SJohn Marino  * Quality Semiconductor have been used.  These apparently all come up with
59586d7f5d3SJohn Marino  * PHY ID 0x00 unless the "interceptor module" on the Dingo 3 is in use.  With
59686d7f5d3SJohn Marino  * the interceptor enabled, the PHY is faked up to look like an ICS unit with
59786d7f5d3SJohn Marino  * ID 0x16.  The interceptor can be enabled/disabled in software.
59886d7f5d3SJohn Marino  *
59986d7f5d3SJohn Marino  * The ML6692 (and maybe others) doesn't have a 10Mbps mode -- this is handled
60086d7f5d3SJohn Marino  * by an internal 10Mbps transceiver that we know nothing about... some cards
60186d7f5d3SJohn Marino  * seem to work with the MII in 10Mbps mode, so I guess some PHYs must support
60286d7f5d3SJohn Marino  * it.  The question is, how can you figure out which one you have?  Just to
60386d7f5d3SJohn Marino  * add to the fun there are also 10Mbps _only_ Mohawk/Dingo cards.  Aaargh!
60486d7f5d3SJohn Marino  */
60586d7f5d3SJohn Marino 
60686d7f5d3SJohn Marino /*
60786d7f5d3SJohn Marino  * Masks for the MII-related bits in GPR2
60886d7f5d3SJohn Marino  */
60986d7f5d3SJohn Marino #define XE_MII_CLK		XE_GPR2_GP3_OUT
61086d7f5d3SJohn Marino #define XE_MII_DIR		XE_GPR2_GP4_SELECT
61186d7f5d3SJohn Marino #define XE_MII_WRD		XE_GPR2_GP4_OUT
61286d7f5d3SJohn Marino #define XE_MII_RDD		XE_GPR2_GP4_IN
61386d7f5d3SJohn Marino 
61486d7f5d3SJohn Marino /*
61586d7f5d3SJohn Marino  * MII PHY ID register values
61686d7f5d3SJohn Marino  */
61786d7f5d3SJohn Marino #define PHY_ID_ML6692		0x0000	/* MicroLinear ML6692? Or unknown */
61886d7f5d3SJohn Marino #define	PHY_ID_ICS1890		0x0015	/* ICS1890 */
61986d7f5d3SJohn Marino #define	PHY_ID_QS6612		0x0181	/* Quality QS6612 */
62086d7f5d3SJohn Marino #define	PHY_ID_DP83840		0x2000	/* National DP83840 */
62186d7f5d3SJohn Marino 
62286d7f5d3SJohn Marino /*
62386d7f5d3SJohn Marino  * MII command (etc) bit strings.
62486d7f5d3SJohn Marino  */
62586d7f5d3SJohn Marino #define XE_MII_STARTDELIM	0x01
62686d7f5d3SJohn Marino #define XE_MII_READOP		0x02
62786d7f5d3SJohn Marino #define XE_MII_WRITEOP		0x01
62886d7f5d3SJohn Marino #define XE_MII_TURNAROUND	0x02
62986d7f5d3SJohn Marino 
63086d7f5d3SJohn Marino /*
63186d7f5d3SJohn Marino  * PHY registers.
63286d7f5d3SJohn Marino  */
63386d7f5d3SJohn Marino #define PHY_BMCR		0x00	/* Basic Mode Control Register */
63486d7f5d3SJohn Marino #define PHY_BMSR		0x01	/* Basic Mode Status Register */
63586d7f5d3SJohn Marino #define	PHY_ID1			0x02	/* PHY ID 1 */
63686d7f5d3SJohn Marino #define	PHY_ID2			0x03	/* PHY ID 2 */
63786d7f5d3SJohn Marino #define PHY_ANAR		0x04	/* Auto-Negotiation Advertisment Register */
63886d7f5d3SJohn Marino #define PHY_LPAR		0x05	/* Auto-Negotiation Link Partner Ability Register */
63986d7f5d3SJohn Marino #define PHY_ANER		0x06	/* Auto-Negotiation Expansion Register */
64086d7f5d3SJohn Marino 
64186d7f5d3SJohn Marino /* BMCR bits */
64286d7f5d3SJohn Marino #define PHY_BMCR_RESET		0x8000	/* Soft reset PHY.  Self-clearing */
64386d7f5d3SJohn Marino #define PHY_BMCR_LOOPBK		0x4000	/* Enable loopback */
64486d7f5d3SJohn Marino #define PHY_BMCR_SPEEDSEL	0x2000	/* 1=100Mbps, 0=10Mbps */
64586d7f5d3SJohn Marino #define PHY_BMCR_AUTONEGENBL	0x1000	/* Auto-negotiation enabled */
64686d7f5d3SJohn Marino #define PHY_BMCR_ISOLATE	0x0400	/* Isolate ML6692 from MII */
64786d7f5d3SJohn Marino #define PHY_BMCR_AUTONEGRSTR	0x0200	/* Restart auto-negotiation.  Self-clearing */
64886d7f5d3SJohn Marino #define PHY_BMCR_DUPLEX		0x0100	/* Full duplex operation */
64986d7f5d3SJohn Marino #define PHY_BMCR_COLLTEST	0x0080	/* Enable collision test */
65086d7f5d3SJohn Marino 
65186d7f5d3SJohn Marino /* BMSR bits */
65286d7f5d3SJohn Marino #define PHY_BMSR_100BT4		0x8000	/* 100Base-T4 capable */
65386d7f5d3SJohn Marino #define PHY_BMSR_100BTXFULL	0x4000	/* 100Base-TX full duplex capable */
65486d7f5d3SJohn Marino #define PHY_BMSR_100BTXHALF	0x2000	/* 100Base-TX half duplex capable */
65586d7f5d3SJohn Marino #define PHY_BMSR_10BTFULL	0x1000	/* 10Base-T full duplex capable */
65686d7f5d3SJohn Marino #define PHY_BMSR_10BTHALF	0x0800	/* 10Base-T half duplex capable */
65786d7f5d3SJohn Marino #define PHY_BMSR_AUTONEGCOMP	0x0020	/* Auto-negotiation complete */
65886d7f5d3SJohn Marino #define PHY_BMSR_CANAUTONEG	0x0008	/* Auto-negotiation supported */
65986d7f5d3SJohn Marino #define PHY_BMSR_LINKSTAT	0x0004	/* Link is up */
66086d7f5d3SJohn Marino #define PHY_BMSR_EXTENDED	0x0001	/* Extended register capabilities */
66186d7f5d3SJohn Marino 
66286d7f5d3SJohn Marino /* ANAR bits */
66386d7f5d3SJohn Marino #define PHY_ANAR_NEXTPAGE	0x8000	/* Additional link code word pages */
66486d7f5d3SJohn Marino #define PHY_ANAR_TLRFLT		0x2000	/* Remote wire fault detected */
66586d7f5d3SJohn Marino #define PHY_ANAR_100BT4		0x0200	/* 100Base-T4 capable */
66686d7f5d3SJohn Marino #define PHY_ANAR_100BTXFULL	0x0100	/* 100Base-TX full duplex capable */
66786d7f5d3SJohn Marino #define PHY_ANAR_100BTXHALF	0x0080	/* 100Base-TX half duplex capable */
66886d7f5d3SJohn Marino #define PHY_ANAR_10BTFULL	0x0040	/* 10Base-T full duplex capable */
66986d7f5d3SJohn Marino #define PHY_ANAR_10BTHALF	0x0020	/* 10Base-T half duplex capable */
67086d7f5d3SJohn Marino #define PHY_ANAR_PROTO4		0x0010	/* Protocol selection (00001 = 802.3) */
67186d7f5d3SJohn Marino #define PHY_ANAR_PROTO3		0x0008
67286d7f5d3SJohn Marino #define PHY_ANAR_PROTO2		0x0004
67386d7f5d3SJohn Marino #define PHY_ANAR_PROTO1		0x0002
67486d7f5d3SJohn Marino #define PHY_ANAR_PROTO0		0x0001
67586d7f5d3SJohn Marino #define PHY_ANAR_8023		PHY_ANAR_PROTO0
67686d7f5d3SJohn Marino #define	PHY_ANAR_DINGO		PHY_ANAR_100BT+PHY_ANAR_10BT_FD+PHY_ANAR_10BT+PHY_ANAR_8023
67786d7f5d3SJohn Marino #define	PHY_ANAR_MOHAWK		PHY_ANAR_100BT+PHY_ANAR_10BT_FD+PHY_ANAR_10BT+PHY_ANAR_8023
67886d7f5d3SJohn Marino 
67986d7f5d3SJohn Marino /* LPAR bits */
68086d7f5d3SJohn Marino #define PHY_LPAR_NEXTPAGE	0x8000	/* Additional link code word pages */
68186d7f5d3SJohn Marino #define PHY_LPAR_LPACK		0x4000	/* Link partner acknowledged receipt */
68286d7f5d3SJohn Marino #define PHY_LPAR_TLRFLT		0x2000	/* Remote wire fault detected */
68386d7f5d3SJohn Marino #define PHY_LPAR_100BT4		0x0200	/* 100Base-T4 capable */
68486d7f5d3SJohn Marino #define PHY_LPAR_100BTXFULL	0x0100	/* 100Base-TX full duplex capable */
68586d7f5d3SJohn Marino #define PHY_LPAR_100BTXHALF	0x0080	/* 100Base-TX half duplex capable */
68686d7f5d3SJohn Marino #define PHY_LPAR_10BTFULL	0x0040	/* 10Base-T full duplex capable */
68786d7f5d3SJohn Marino #define PHY_LPAR_10BTHALF	0x0020	/* 10Base-T half duplex capable */
68886d7f5d3SJohn Marino #define PHY_LPAR_PROTO4		0x0010	/* Protocol selection (00001 = 802.3) */
68986d7f5d3SJohn Marino #define PHY_LPAR_PROTO3		0x0008
69086d7f5d3SJohn Marino #define PHY_LPAR_PROTO2		0x0004
69186d7f5d3SJohn Marino #define PHY_LPAR_PROTO1		0x0002
69286d7f5d3SJohn Marino #define PHY_LPAR_PROTO0		0x0001
69386d7f5d3SJohn Marino 
69486d7f5d3SJohn Marino /* ANER bits */
69586d7f5d3SJohn Marino #define PHY_ANER_MLFAULT	0x0010	/* More than one link is up! */
69686d7f5d3SJohn Marino #define PHY_ANER_LPNPABLE	0x0008	/* Link partner supports next page */
69786d7f5d3SJohn Marino #define PHY_ANER_NPABLE		0x0004	/* Local port supports next page */
69886d7f5d3SJohn Marino #define PHY_ANER_PAGERX		0x0002	/* Page received */
69986d7f5d3SJohn Marino #define PHY_ANER_LPAUTONEG	0x0001	/* Link partner can auto-negotiate */
70086d7f5d3SJohn Marino 
70186d7f5d3SJohn Marino #endif /* DEV_XE_IF_XEREG_H */
702