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