1*29e83d4bSgd78059 /* 2*29e83d4bSgd78059 * Solaris driver for ethernet cards based on the Macronix 98715 3*29e83d4bSgd78059 * 4*29e83d4bSgd78059 * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>. 5*29e83d4bSgd78059 * All rights reserved. 6*29e83d4bSgd78059 * 7*29e83d4bSgd78059 * Redistribution and use in source and binary forms, with or without 8*29e83d4bSgd78059 * modification, are permitted provided that the following conditions 9*29e83d4bSgd78059 * are met: 10*29e83d4bSgd78059 * 1. Redistributions of source code must retain the above copyright 11*29e83d4bSgd78059 * notice, this list of conditions and the following disclaimer. 12*29e83d4bSgd78059 * 2. Redistributions in binary form must reproduce the above copyright 13*29e83d4bSgd78059 * notice, this list of conditions and the following disclaimer in the 14*29e83d4bSgd78059 * documentation and/or other materials provided with the distribution. 15*29e83d4bSgd78059 * 3. Neither the name of the author nor the names of any co-contributors 16*29e83d4bSgd78059 * may be used to endorse or promote products derived from this software 17*29e83d4bSgd78059 * without specific prior written permission. 18*29e83d4bSgd78059 * 19*29e83d4bSgd78059 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' 20*29e83d4bSgd78059 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*29e83d4bSgd78059 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*29e83d4bSgd78059 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*29e83d4bSgd78059 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*29e83d4bSgd78059 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*29e83d4bSgd78059 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*29e83d4bSgd78059 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*29e83d4bSgd78059 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*29e83d4bSgd78059 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*29e83d4bSgd78059 * POSSIBILITY OF SUCH DAMAGE. 30*29e83d4bSgd78059 */ 31*29e83d4bSgd78059 32*29e83d4bSgd78059 #ifndef _MXFE_H 33*29e83d4bSgd78059 #define _MXFE_H 34*29e83d4bSgd78059 35*29e83d4bSgd78059 #pragma ident "%Z%%M% %I% %E% SMI" 36*29e83d4bSgd78059 37*29e83d4bSgd78059 /* 38*29e83d4bSgd78059 * These are conveniently defined to have the same values 39*29e83d4bSgd78059 * as are used by the NDD utility, which is an undocumented 40*29e83d4bSgd78059 * interface. YMMV. 41*29e83d4bSgd78059 */ 42*29e83d4bSgd78059 #define NDIOC ('N' << 8) 43*29e83d4bSgd78059 #define NDIOC_GET (NDIOC|0) 44*29e83d4bSgd78059 #define NDIOC_SET (NDIOC|1) 45*29e83d4bSgd78059 46*29e83d4bSgd78059 /* 47*29e83d4bSgd78059 * Registers and values are here, becuase they can be exported to userland 48*29e83d4bSgd78059 * via the MXFEIOC_GETCSR and friends ioctls. These are private to this 49*29e83d4bSgd78059 * driver and the bundled diagnostic utility, and should not be used by 50*29e83d4bSgd78059 * end user application programs. 51*29e83d4bSgd78059 */ 52*29e83d4bSgd78059 53*29e83d4bSgd78059 /* 54*29e83d4bSgd78059 * MXFE register definitions. 55*29e83d4bSgd78059 */ 56*29e83d4bSgd78059 /* PCI configuration registers */ 57*29e83d4bSgd78059 #define PCI_VID 0x00 /* Loaded vendor ID */ 58*29e83d4bSgd78059 #define PCI_DID 0x02 /* Loaded device ID */ 59*29e83d4bSgd78059 #define PCI_CMD 0x04 /* Configuration command register */ 60*29e83d4bSgd78059 #define PCI_STAT 0x06 /* Configuration status register */ 61*29e83d4bSgd78059 #define PCI_RID 0x08 /* Revision ID */ 62*29e83d4bSgd78059 #define PCI_CLS 0x0c /* Cache line size */ 63*29e83d4bSgd78059 #define PCI_SVID 0x2c /* Subsystem vendor ID */ 64*29e83d4bSgd78059 #define PCI_SSID 0x2e /* Subsystem ID */ 65*29e83d4bSgd78059 #define PCI_MINGNT 0x3e /* Minimum Grant */ 66*29e83d4bSgd78059 #define PCI_MAXLAT 0x3f /* Maximum latency */ 67*29e83d4bSgd78059 68*29e83d4bSgd78059 /* 69*29e83d4bSgd78059 * Bits for PCI command register. 70*29e83d4bSgd78059 */ 71*29e83d4bSgd78059 #define PCI_CMD_MWIE 0x0010 /* memory write-invalidate enable */ 72*29e83d4bSgd78059 #define PCI_CMD_BME 0x0004 /* bus master enable */ 73*29e83d4bSgd78059 #define PCI_CMD_MAE 0x0002 /* memory access enable */ 74*29e83d4bSgd78059 #define PCI_CMD_IOE 0x0001 /* I/O access enable */ 75*29e83d4bSgd78059 76*29e83d4bSgd78059 /* Ordinary control/status registers */ 77*29e83d4bSgd78059 #define CSR_PAR 0x00 /* PCI access register */ 78*29e83d4bSgd78059 #define CSR_TDR 0x08 /* Transmit demand register */ 79*29e83d4bSgd78059 #define CSR_RDR 0x10 /* Receive demand register */ 80*29e83d4bSgd78059 #define CSR_RDB 0x18 /* Receive descriptor base address */ 81*29e83d4bSgd78059 #define CSR_TDB 0x20 /* Transmit descriptor base address */ 82*29e83d4bSgd78059 #define CSR_SR 0x28 /* Status register */ 83*29e83d4bSgd78059 #define CSR_NAR 0x30 /* Network access register */ 84*29e83d4bSgd78059 #define CSR_IER 0x38 /* Interrupt enable register */ 85*29e83d4bSgd78059 #define CSR_LPC 0x40 /* Lost packet counter */ 86*29e83d4bSgd78059 #define CSR_SPR 0x48 /* Serial port register */ 87*29e83d4bSgd78059 #define CSR_TIMER 0x58 /* Timer */ 88*29e83d4bSgd78059 #define CSR_TSTAT 0x60 /* 10Base-T status */ 89*29e83d4bSgd78059 #define CSR_SIA 0x68 /* SIA reset register */ 90*29e83d4bSgd78059 #define CSR_TCTL 0x70 /* 10Base-T control */ 91*29e83d4bSgd78059 #define CSR_WTMR 0x78 /* Watchdog timer */ 92*29e83d4bSgd78059 #define CSR_MXMAGIC 0x80 /* MXIC magic register */ 93*29e83d4bSgd78059 #define CSR_PMCSR 0x90 /* Power Management Command and Status */ 94*29e83d4bSgd78059 #define CSR_TXBR 0x9c /* Transmit burst counter/time-out register */ 95*29e83d4bSgd78059 #define CSR_FROM 0xa0 /* Flash(boot) ROM port */ 96*29e83d4bSgd78059 #define CSR_ACOMP 0xa0 /* Autocompensation */ 97*29e83d4bSgd78059 #define CSR_FLOW 0xa8 /* Flow control (newer parts only) */ 98*29e83d4bSgd78059 99*29e83d4bSgd78059 /* 100*29e83d4bSgd78059 * Bits for PCI access register. 101*29e83d4bSgd78059 */ 102*29e83d4bSgd78059 #define PAR_RESET 0x00000001U /* Reset the entire chip */ 103*29e83d4bSgd78059 #define PAR_MWIE 0x01000000U /* PCI memory-write-invalidate */ 104*29e83d4bSgd78059 #define PAR_MRLE 0x00800000U /* PCI memory-read-line */ 105*29e83d4bSgd78059 #define PAR_MRME 0x00200000U /* PCI memory-read-multiple */ 106*29e83d4bSgd78059 #define PAR_BAR 0x00000002U /* Bus arbitration */ 107*29e83d4bSgd78059 #define PAR_DESCSKIP 0x0000007cU /* Descriptor skip length in DW */ 108*29e83d4bSgd78059 #define PAR_BIGENDIAN 0x00000080U /* Use big endian data buffers */ 109*29e83d4bSgd78059 #define PAR_TXAUTOPOLL 0x00060000U /* Programmable TX autopoll interval */ 110*29e83d4bSgd78059 #define PAR_CALIGN_NONE 0x00000000U /* No cache alignment */ 111*29e83d4bSgd78059 #define PAR_CALIGN_8 0x00004000U /* 8 DW cache alignment */ 112*29e83d4bSgd78059 #define PAR_CALIGN_16 0x00008000U /* 16 DW cache alignment */ 113*29e83d4bSgd78059 #define PAR_CALIGN_32 0x0000c000U /* 32 DW cache alignment */ 114*29e83d4bSgd78059 #define PAR_BURSTLEN 0x00003F00U /* Programmable burst length */ 115*29e83d4bSgd78059 #define PAR_BURSTUNL 0x00000000U /* Unlimited burst length */ 116*29e83d4bSgd78059 #define PAR_BURST_1 0x00000100U /* 1 DW burst length */ 117*29e83d4bSgd78059 #define PAR_BURST_2 0x00000200U /* 2 DW burst length */ 118*29e83d4bSgd78059 #define PAR_BURST_4 0x00000400U /* 4 DW burst length */ 119*29e83d4bSgd78059 #define PAR_BURST_8 0x00000800U /* 8 DW burst length */ 120*29e83d4bSgd78059 #define PAR_BURST_16 0x00001000U /* 16 DW burst length */ 121*29e83d4bSgd78059 #define PAR_BURST_32 0x00002000U /* 32 DW burst length */ 122*29e83d4bSgd78059 123*29e83d4bSgd78059 /* 124*29e83d4bSgd78059 * Bits for status register. Interrupt bits are also used by 125*29e83d4bSgd78059 * the interrupt enable register. 126*29e83d4bSgd78059 */ 127*29e83d4bSgd78059 #define SR_BERR_TYPE 0x03800000U /* bus error type */ 128*29e83d4bSgd78059 #define SR_BERR_PARITY 0x00000000U /* parity error */ 129*29e83d4bSgd78059 #define SR_BERR_TARGET_ABORT 0x01000000U /* target abort */ 130*29e83d4bSgd78059 #define SR_BERR_MASTER_ABORT 0x00800000U /* master abort */ 131*29e83d4bSgd78059 #define SR_TX_STATE 0x00700000U /* transmit state */ 132*29e83d4bSgd78059 #define SR_RX_STATE 0x000E0000U /* transmit state */ 133*29e83d4bSgd78059 #define INT_100LINK 0x08000000U /* 100 Base-T link */ 134*29e83d4bSgd78059 #define INT_NORMAL 0x00010000U /* normal interrupt */ 135*29e83d4bSgd78059 #define INT_ABNORMAL 0x00008000U /* abnormal interrupt */ 136*29e83d4bSgd78059 #define INT_EARLYRX 0x00004000U /* early receive interrupt */ 137*29e83d4bSgd78059 #define INT_BUSERR 0x00002000U /* fatal bus error interrupt */ 138*29e83d4bSgd78059 #define INT_10LINK 0x00001000U /* 10 Base-T link */ 139*29e83d4bSgd78059 #define INT_TIMER 0x00000800U /* onboard timer interrupt */ 140*29e83d4bSgd78059 #define INT_EARLYTX 0x00000400U /* early transmit interrupt */ 141*29e83d4bSgd78059 #define INT_RXJABBER 0x00000200U /* receive watchdog timeout */ 142*29e83d4bSgd78059 #define INT_RXSTOPPED 0x00000100U /* receive stopped */ 143*29e83d4bSgd78059 #define INT_RXNOBUF 0x00000080U /* no rcv descriptor */ 144*29e83d4bSgd78059 #define INT_RXOK 0x00000040U /* rcv complete interrupt */ 145*29e83d4bSgd78059 #define INT_TXUNDERFLOW 0x00000020U /* transmit underflow */ 146*29e83d4bSgd78059 #define INT_ANEG 0x00000010U /* autonegotiation */ 147*29e83d4bSgd78059 #define INT_TXJABBER 0x00000008U /* transmit jabber timeout */ 148*29e83d4bSgd78059 #define INT_TXNOBUF 0x00000004U /* no xmt descriptor */ 149*29e83d4bSgd78059 #define INT_TXSTOPPED 0x00000002U /* transmit stopped */ 150*29e83d4bSgd78059 #define INT_TXOK 0x00000001U /* transmit ok interrupt */ 151*29e83d4bSgd78059 152*29e83d4bSgd78059 #define INT_NONE 0x00000000U /* no interrupts */ 153*29e83d4bSgd78059 #define INT_WANTED (INT_BUSERR | INT_RXJABBER | \ 154*29e83d4bSgd78059 INT_RXOK | INT_TXUNDERFLOW | \ 155*29e83d4bSgd78059 INT_RXNOBUF | INT_TXJABBER | \ 156*29e83d4bSgd78059 INT_RXSTOPPED | INT_TXSTOPPED | \ 157*29e83d4bSgd78059 INT_TIMER | \ 158*29e83d4bSgd78059 INT_ABNORMAL | INT_NORMAL) 159*29e83d4bSgd78059 160*29e83d4bSgd78059 #define INT_LINKSTATUS (INT_ANEG | INT_100LINK | INT_10LINK) 161*29e83d4bSgd78059 #define INT_ALL (INT_WANTED | INT_TXOK | \ 162*29e83d4bSgd78059 INT_TXNOBUF | INT_LINKSTATUS) 163*29e83d4bSgd78059 164*29e83d4bSgd78059 /* 165*29e83d4bSgd78059 * Bits for network access register. 166*29e83d4bSgd78059 */ 167*29e83d4bSgd78059 #define NAR_TX_ENABLE 0x00002000U /* Enable transmit */ 168*29e83d4bSgd78059 #define NAR_RX_MULTI 0x00000080U /* Receive all multicast packets */ 169*29e83d4bSgd78059 #define NAR_RX_PROMISC 0x00000040U /* Receive any good packet */ 170*29e83d4bSgd78059 #define NAR_RX_BAD 0x00000008U /* Pass bad packets */ 171*29e83d4bSgd78059 #define NAR_RX_HO 0x00000004U /* Hash only receive */ 172*29e83d4bSgd78059 #define NAR_RX_ENABLE 0x00000002U /* Enable receive */ 173*29e83d4bSgd78059 #define NAR_RX_HP 0x00000001U /* Hash perfect receive */ 174*29e83d4bSgd78059 #define NAR_TR 0x0000c000U /* Transmit threshold mask */ 175*29e83d4bSgd78059 #define NAR_TR_72 0x00000000U /* 72 B (128 @ 100Mbps) tx thresh */ 176*29e83d4bSgd78059 #define NAR_TR_96 0x00004000U /* 96 B (256 @ 100Mbps) tx thresh */ 177*29e83d4bSgd78059 #define NAR_TR_128 0x00008000U /* 128 B (512 @ 100Mbps) tx thresh */ 178*29e83d4bSgd78059 #define NAR_TR_160 0x0000c000U /* 160 B (1K @ 100Mbsp) tx thresh */ 179*29e83d4bSgd78059 #define NAR_SCR 0x01000000U /* scrambler mode */ 180*29e83d4bSgd78059 #define NAR_PCS 0x00800000U /* set for forced 100 mbit */ 181*29e83d4bSgd78059 #define NAR_SPEED 0x00400000U /* transmit threshold, set for 10bt */ 182*29e83d4bSgd78059 #define NAR_SF 0x00200000U /* store and forward */ 183*29e83d4bSgd78059 #define NAR_HBD 0x00080000U /* Disable SQE heartbeat */ 184*29e83d4bSgd78059 #define NAR_COE 0x00020000U /* collision offset enable */ 185*29e83d4bSgd78059 #define NAR_PORTSEL 0x00040000U /* 1 = 100 mbit */ 186*29e83d4bSgd78059 #define NAR_FDX 0x00000200U /* 1 = full duplex */ 187*29e83d4bSgd78059 188*29e83d4bSgd78059 /* 189*29e83d4bSgd78059 * Bits for lost packet counter. 190*29e83d4bSgd78059 */ 191*29e83d4bSgd78059 #define LPC_COUNT 0x0000FFFFU /* Count of missed frames */ 192*29e83d4bSgd78059 #define LPC_OFLOW 0x00010000U /* Counter overflow bit */ 193*29e83d4bSgd78059 194*29e83d4bSgd78059 /* 195*29e83d4bSgd78059 * Bits for CSR_SPR (MII and SROM access) 196*29e83d4bSgd78059 */ 197*29e83d4bSgd78059 #define SPR_MII_DIN 0x00080000U /* MII data input */ 198*29e83d4bSgd78059 #define SPR_MII_CTRL 0x00040000U /* MII management control, 1=read */ 199*29e83d4bSgd78059 #define SPR_MII_DOUT 0x00020000U /* MII data output */ 200*29e83d4bSgd78059 #define SPR_MII_CLOCK 0x00010000U /* MII data clock */ 201*29e83d4bSgd78059 #define SPR_SROM_READ 0x00004000U /* Serial EEPROM read control */ 202*29e83d4bSgd78059 #define SPR_SROM_WRITE 0x00002000U /* Serial EEPROM write control */ 203*29e83d4bSgd78059 #define SPR_SROM_SEL 0x00000800U /* Serial EEPROM select */ 204*29e83d4bSgd78059 #define SPR_SROM_DOUT 0x00000008U /* Serial EEPROM data out */ 205*29e83d4bSgd78059 #define SPR_SROM_DIN 0x00000004U /* Serial EEPROM data in */ 206*29e83d4bSgd78059 #define SPR_SROM_CLOCK 0x00000002U /* Serial EEPROM clock */ 207*29e83d4bSgd78059 #define SPR_SROM_CHIP 0x00000001U /* Serial EEPROM chip select */ 208*29e83d4bSgd78059 #define SROM_ENADDR 0x70 /* Ethernet address pointer! */ 209*29e83d4bSgd78059 #define SROM_READCMD 0x6 /* command to read SROM */ 210*29e83d4bSgd78059 211*29e83d4bSgd78059 /* 212*29e83d4bSgd78059 * Bits for CSR_TIMER 213*29e83d4bSgd78059 */ 214*29e83d4bSgd78059 #define TIMER_LOOP 0x00010000U /* continuous operating mode */ 215*29e83d4bSgd78059 #define TIMER_USEC 204 /* usecs per timer count */ 216*29e83d4bSgd78059 217*29e83d4bSgd78059 /* 218*29e83d4bSgd78059 * Bits for TSTAT 219*29e83d4bSgd78059 */ 220*29e83d4bSgd78059 #define TSTAT_LPC 0xFFFF0000U /* link partner's code word */ 221*29e83d4bSgd78059 #define TSTAT_LPN 0x00008000U /* link partner supports nway */ 222*29e83d4bSgd78059 #define TSTAT_ANS 0x00007000U /* autonegotiation state mask */ 223*29e83d4bSgd78059 #define TSTAT_TRF 0x00000800U /* transmit remote fault */ 224*29e83d4bSgd78059 #define TSTAT_APS 0x00000008U /* autopolarity state */ 225*29e83d4bSgd78059 #define TSTAT_10F 0x00000004U /* 10Base-T link failure */ 226*29e83d4bSgd78059 #define TSTAT_100F 0x00000002U /* 100Base-T link failure */ 227*29e83d4bSgd78059 #define TSTAT_ANS_DIS 0x00000000U /* autonegotiation disabled */ 228*29e83d4bSgd78059 #define TSTAT_ANS_OK 0x00005000U /* autonegotiation complete */ 229*29e83d4bSgd78059 #define TSTAT_ANS_START 0x00001000U /* restart autonegotiation */ 230*29e83d4bSgd78059 231*29e83d4bSgd78059 /* macro to convert TSTAT link partner's code word to MII equivalents */ 232*29e83d4bSgd78059 #define TSTAT_LPAR(x) ((x & TSTAT_LPC) >> 16) 233*29e83d4bSgd78059 234*29e83d4bSgd78059 /* 235*29e83d4bSgd78059 * Bits for SIA reset 236*29e83d4bSgd78059 */ 237*29e83d4bSgd78059 #define SIA_RESET 0x00000001U /* reset 100 PHY */ 238*29e83d4bSgd78059 #define SIA_NRESET 0x00000002U /* reset NWay */ 239*29e83d4bSgd78059 240*29e83d4bSgd78059 /* 241*29e83d4bSgd78059 * Bits for TCTL 242*29e83d4bSgd78059 */ 243*29e83d4bSgd78059 #define TCTL_PAUSE 0x00080000U /* Pause enable */ 244*29e83d4bSgd78059 #define TCTL_100BT4 0x00040000U /* 100 BaseT4 enable */ 245*29e83d4bSgd78059 #define TCTL_100FDX 0x00020000U /* 100 BaseT fdx enable */ 246*29e83d4bSgd78059 #define TCTL_100HDX 0x00010000U /* 100 BaseT hdx enable */ 247*29e83d4bSgd78059 #define TCTL_LTE 0x00001000U /* link test enable */ 248*29e83d4bSgd78059 #define TCTL_RSQ 0x00000100U /* receive squelch enable */ 249*29e83d4bSgd78059 #define TCTL_ANE 0x00000080U /* autoneg. enable */ 250*29e83d4bSgd78059 #define TCTL_HDX 0x00000040U /* half-duplex enable */ 251*29e83d4bSgd78059 #define TCTL_PWR 0x00000004U /* supply power to 10BaseT */ 252*29e83d4bSgd78059 253*29e83d4bSgd78059 /* 254*29e83d4bSgd78059 * Bits for flow control 255*29e83d4bSgd78059 */ 256*29e83d4bSgd78059 #define FLOW_TMVAL 0xffff0000U /* flow timer value */ 257*29e83d4bSgd78059 #define FLOW_TEST 0x00008000U /* test flow control timer */ 258*29e83d4bSgd78059 #define FLOW_RESTART 0x00004000U /* re-start mode */ 259*29e83d4bSgd78059 #define FLOW_RESTOP 0x00002000U /* re-stop mode */ 260*29e83d4bSgd78059 #define FLOW_TXFCEN 0x00001000U /* tx flow control enable */ 261*29e83d4bSgd78059 #define FLOW_RXFCEN 0x00000800U /* rx flow control enable */ 262*29e83d4bSgd78059 #define FLOW_RUFCEN 0x00000400U /* send pause when rxnobuf */ 263*29e83d4bSgd78059 #define FLOW_STOPTX 0x00000200U /* tx flow status */ 264*29e83d4bSgd78059 #define FLOW_REJECTFC 0x00000100U /* abort rx flow when set */ 265*29e83d4bSgd78059 #define FLOW_RXFCTH1 0x00000080U /* rx flow threshold 1 */ 266*29e83d4bSgd78059 #define FLOW_RXFCTH0 0x00000040U /* rx flow threshold 0 */ 267*29e83d4bSgd78059 #define FLOW_NFCEN 0x00000020U /* accept nway flow control */ 268*29e83d4bSgd78059 269*29e83d4bSgd78059 270*29e83d4bSgd78059 #endif /* _MXFE_H */ 271