186d7f5d3SJohn Marino /* 286d7f5d3SJohn Marino * Copyright (c) 2002 Myson Technology Inc. 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 * without modification, immediately at the beginning of the file. 1186d7f5d3SJohn Marino * 2. The name of the author may not be used to endorse or promote products 1286d7f5d3SJohn Marino * derived from this software without specific prior written permission. 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 FOR 1886d7f5d3SJohn Marino * 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 * Written by: yen_cw@myson.com.tw available at: http://www.myson.com.tw/ 2786d7f5d3SJohn Marino * 2886d7f5d3SJohn Marino * $FreeBSD: src/sys/dev/my/if_myreg.h,v 1.1.2.2 2002/04/17 02:05:27 julian Exp $ 2986d7f5d3SJohn Marino * $DragonFly: src/sys/dev/netif/my/if_myreg.h,v 1.5 2005/11/28 17:13:43 dillon Exp $ 3086d7f5d3SJohn Marino * 3186d7f5d3SJohn Marino * Myson MTD80x register definitions. 3286d7f5d3SJohn Marino * 3386d7f5d3SJohn Marino */ 3486d7f5d3SJohn Marino #define MY_PAR0 0x0 /* physical address 0-3 */ 3586d7f5d3SJohn Marino #define MY_PAR1 0x04 /* physical address 4-5 */ 3686d7f5d3SJohn Marino #define MY_MAR0 0x08 /* multicast address 0-3 */ 3786d7f5d3SJohn Marino #define MY_MAR1 0x0C /* multicast address 4-7 */ 3886d7f5d3SJohn Marino #define MY_FAR0 0x10 /* flow-control address 0-3 */ 3986d7f5d3SJohn Marino #define MY_FAR1 0x14 /* flow-control address 4-5 */ 4086d7f5d3SJohn Marino #define MY_TCRRCR 0x18 /* receive & transmit configuration */ 4186d7f5d3SJohn Marino #define MY_BCR 0x1C /* bus command */ 4286d7f5d3SJohn Marino #define MY_TXPDR 0x20 /* transmit polling demand */ 4386d7f5d3SJohn Marino #define MY_RXPDR 0x24 /* receive polling demand */ 4486d7f5d3SJohn Marino #define MY_RXCWP 0x28 /* receive current word pointer */ 4586d7f5d3SJohn Marino #define MY_TXLBA 0x2C /* transmit list base address */ 4686d7f5d3SJohn Marino #define MY_RXLBA 0x30 /* receive list base address */ 4786d7f5d3SJohn Marino #define MY_ISR 0x34 /* interrupt status */ 4886d7f5d3SJohn Marino #define MY_IMR 0x38 /* interrupt mask */ 4986d7f5d3SJohn Marino #define MY_FTH 0x3C /* flow control high/low threshold */ 5086d7f5d3SJohn Marino #define MY_MANAGEMENT 0x40 /* bootrom/eeprom and mii management */ 5186d7f5d3SJohn Marino #define MY_TALLY 0x44 /* tally counters for crc and mpa */ 5286d7f5d3SJohn Marino #define MY_TSR 0x48 /* tally counter for transmit status */ 5386d7f5d3SJohn Marino #define MY_PHYBASE 0x4c 5486d7f5d3SJohn Marino 5586d7f5d3SJohn Marino /* 5686d7f5d3SJohn Marino * Receive Configuration Register 5786d7f5d3SJohn Marino */ 5886d7f5d3SJohn Marino #define MY_RXRUN 0x00008000 /* receive running status */ 5986d7f5d3SJohn Marino #define MY_EIEN 0x00004000 /* early interrupt enable */ 6086d7f5d3SJohn Marino #define MY_RFCEN 0x00002000 /* receive flow control packet enable */ 6186d7f5d3SJohn Marino #define MY_NDFA 0x00001000 /* not defined flow control address */ 6286d7f5d3SJohn Marino #define MY_RBLEN 0x00000800 /* receive burst length enable */ 6386d7f5d3SJohn Marino #define MY_RPBLE1 0x00000000 /* 1 word */ 6486d7f5d3SJohn Marino #define MY_RPBLE4 0x00000100 /* 4 words */ 6586d7f5d3SJohn Marino #define MY_RPBLE8 0x00000200 /* 8 words */ 6686d7f5d3SJohn Marino #define MY_RPBLE16 0x00000300 /* 16 words */ 6786d7f5d3SJohn Marino #define MY_RPBLE32 0x00000400 /* 32 words */ 6886d7f5d3SJohn Marino #define MY_RPBLE64 0x00000500 /* 64 words */ 6986d7f5d3SJohn Marino #define MY_RPBLE128 0x00000600 /* 128 words */ 7086d7f5d3SJohn Marino #define MY_RPBLE512 0x00000700 /* 512 words */ 7186d7f5d3SJohn Marino #define MY_PROM 0x000000080 /* promiscuous mode */ 7286d7f5d3SJohn Marino #define MY_AB 0x000000040 /* accept broadcast */ 7386d7f5d3SJohn Marino #define MY_AM 0x000000020 /* accept mutlicast */ 7486d7f5d3SJohn Marino #define MY_ARP 0x000000008 /* receive runt pkt */ 7586d7f5d3SJohn Marino #define MY_ALP 0x000000004 /* receive long pkt */ 7686d7f5d3SJohn Marino #define MY_SEP 0x000000002 /* receive error pkt */ 7786d7f5d3SJohn Marino #define MY_RE 0x000000001 /* receive enable */ 7886d7f5d3SJohn Marino 7986d7f5d3SJohn Marino /* 8086d7f5d3SJohn Marino * Transmit Configuration Register 8186d7f5d3SJohn Marino */ 8286d7f5d3SJohn Marino #define MY_TXRUN 0x04000000 /* transmit running status */ 8386d7f5d3SJohn Marino #define MY_Enhanced 0x02000000 /* transmit enhanced mode */ 8486d7f5d3SJohn Marino #define MY_TFCEN 0x01000000 /* tx flow control packet enable */ 8586d7f5d3SJohn Marino #define MY_TFT64 0x00000000 /* 64 bytes */ 8686d7f5d3SJohn Marino #define MY_TFT32 0x00200000 /* 32 bytes */ 8786d7f5d3SJohn Marino #define MY_TFT128 0x00400000 /* 128 bytes */ 8886d7f5d3SJohn Marino #define MY_TFT256 0x00600000 /* 256 bytes */ 8986d7f5d3SJohn Marino #define MY_TFT512 0x00800000 /* 512 bytes */ 9086d7f5d3SJohn Marino #define MY_TFT768 0x00A00000 /* 768 bytes */ 9186d7f5d3SJohn Marino #define MY_TFT1024 0x00C00000 /* 1024 bytes */ 9286d7f5d3SJohn Marino #define MY_TFTSF 0x00E00000 /* store and forward */ 9386d7f5d3SJohn Marino #define MY_FD 0x00100000 /* full duplex mode */ 9486d7f5d3SJohn Marino #define MY_PS10 0x00080000 /* port speed is 10M */ 9586d7f5d3SJohn Marino #define MY_TE 0x00040000 /* transmit enable */ 9686d7f5d3SJohn Marino #define MY_PS1000 0x00010000 /* port speed is 1000M */ 9786d7f5d3SJohn Marino /* 9886d7f5d3SJohn Marino * Bus Command Register 9986d7f5d3SJohn Marino */ 10086d7f5d3SJohn Marino #define MY_PROG 0x00000200 /* programming */ 10186d7f5d3SJohn Marino #define MY_RLE 0x00000100 /* read line command enable */ 10286d7f5d3SJohn Marino #define MY_RME 0x00000080 /* read multiple command enable */ 10386d7f5d3SJohn Marino #define MY_WIE 0x00000040 /* write and invalidate cmd enable */ 10486d7f5d3SJohn Marino #define MY_PBL1 0x00000000 /* 1 dword */ 10586d7f5d3SJohn Marino #define MY_PBL4 0x00000008 /* 4 dwords */ 10686d7f5d3SJohn Marino #define MY_PBL8 0x00000010 /* 8 dwords */ 10786d7f5d3SJohn Marino #define MY_PBL16 0x00000018 /* 16 dwords */ 10886d7f5d3SJohn Marino #define MY_PBL32 0x00000020 /* 32 dwords */ 10986d7f5d3SJohn Marino #define MY_PBL64 0x00000028 /* 64 dwords */ 11086d7f5d3SJohn Marino #define MY_PBL128 0x00000030 /* 128 dwords */ 11186d7f5d3SJohn Marino #define MY_PBL512 0x00000038 /* 512 dwords */ 11286d7f5d3SJohn Marino #define MY_ABR 0x00000004 /* arbitration rule */ 11386d7f5d3SJohn Marino #define MY_BLS 0x00000002 /* big/little endian select */ 11486d7f5d3SJohn Marino #define MY_SWR 0x00000001 /* software reset */ 11586d7f5d3SJohn Marino 11686d7f5d3SJohn Marino /* 11786d7f5d3SJohn Marino * Transmit Poll Demand Register 11886d7f5d3SJohn Marino */ 11986d7f5d3SJohn Marino #define MY_TxPollDemand 0x1 12086d7f5d3SJohn Marino 12186d7f5d3SJohn Marino /* 12286d7f5d3SJohn Marino * Receive Poll Demand Register 12386d7f5d3SJohn Marino */ 12486d7f5d3SJohn Marino #define MY_RxPollDemand 0x01 12586d7f5d3SJohn Marino 12686d7f5d3SJohn Marino /* 12786d7f5d3SJohn Marino * Interrupt Status Register 12886d7f5d3SJohn Marino */ 12986d7f5d3SJohn Marino #define MY_RFCON 0x00020000 /* receive flow control xon packet */ 13086d7f5d3SJohn Marino #define MY_RFCOFF 0x00010000 /* receive flow control xoff packet */ 13186d7f5d3SJohn Marino #define MY_LSCStatus 0x00008000 /* link status change */ 13286d7f5d3SJohn Marino #define MY_ANCStatus 0x00004000 /* autonegotiation completed */ 13386d7f5d3SJohn Marino #define MY_FBE 0x00002000 /* fatal bus error */ 13486d7f5d3SJohn Marino #define MY_FBEMask 0x00001800 13586d7f5d3SJohn Marino #define MY_ParityErr 0x00000000 /* parity error */ 13686d7f5d3SJohn Marino #define MY_MasterErr 0x00000800 /* master error */ 13786d7f5d3SJohn Marino #define MY_TargetErr 0x00001000 /* target abort */ 13886d7f5d3SJohn Marino #define MY_TUNF 0x00000400 /* transmit underflow */ 13986d7f5d3SJohn Marino #define MY_ROVF 0x00000200 /* receive overflow */ 14086d7f5d3SJohn Marino #define MY_ETI 0x00000100 /* transmit early int */ 14186d7f5d3SJohn Marino #define MY_ERI 0x00000080 /* receive early int */ 14286d7f5d3SJohn Marino #define MY_CNTOVF 0x00000040 /* counter overflow */ 14386d7f5d3SJohn Marino #define MY_RBU 0x00000020 /* receive buffer unavailable */ 14486d7f5d3SJohn Marino #define MY_TBU 0x00000010 /* transmit buffer unavilable */ 14586d7f5d3SJohn Marino #define MY_TI 0x00000008 /* transmit interrupt */ 14686d7f5d3SJohn Marino #define MY_RI 0x00000004 /* receive interrupt */ 14786d7f5d3SJohn Marino #define MY_RxErr 0x00000002 /* receive error */ 14886d7f5d3SJohn Marino 14986d7f5d3SJohn Marino /* 15086d7f5d3SJohn Marino * Interrupt Mask Register 15186d7f5d3SJohn Marino */ 15286d7f5d3SJohn Marino #define MY_MRFCON 0x00020000 /* receive flow control xon packet */ 15386d7f5d3SJohn Marino #define MY_MRFCOFF 0x00010000 /* receive flow control xoff packet */ 15486d7f5d3SJohn Marino #define MY_MLSCStatus 0x00008000 /* link status change */ 15586d7f5d3SJohn Marino #define MY_MANCStatus 0x00004000 /* autonegotiation completed */ 15686d7f5d3SJohn Marino #define MY_MFBE 0x00002000 /* fatal bus error */ 15786d7f5d3SJohn Marino #define MY_MFBEMask 0x00001800 15886d7f5d3SJohn Marino #define MY_MTUNF 0x00000400 /* transmit underflow */ 15986d7f5d3SJohn Marino #define MY_MROVF 0x00000200 /* receive overflow */ 16086d7f5d3SJohn Marino #define MY_METI 0x00000100 /* transmit early int */ 16186d7f5d3SJohn Marino #define MY_MERI 0x00000080 /* receive early int */ 16286d7f5d3SJohn Marino #define MY_MCNTOVF 0x00000040 /* counter overflow */ 16386d7f5d3SJohn Marino #define MY_MRBU 0x00000020 /* receive buffer unavailable */ 16486d7f5d3SJohn Marino #define MY_MTBU 0x00000010 /* transmit buffer unavilable */ 16586d7f5d3SJohn Marino #define MY_MTI 0x00000008 /* transmit interrupt */ 16686d7f5d3SJohn Marino #define MY_MRI 0x00000004 /* receive interrupt */ 16786d7f5d3SJohn Marino #define MY_MRxErr 0x00000002 /* receive error */ 16886d7f5d3SJohn Marino 16986d7f5d3SJohn Marino /* 90/1/18 delete */ 17086d7f5d3SJohn Marino /* #define MY_INTRS MY_FBE|MY_MRBU|MY_TBU|MY_MTI|MY_MRI|MY_METI */ 17186d7f5d3SJohn Marino #define MY_INTRS MY_MRBU|MY_TBU|MY_MTI|MY_MRI|MY_METI 17286d7f5d3SJohn Marino 17386d7f5d3SJohn Marino /* 17486d7f5d3SJohn Marino * Flow Control High/Low Threshold Register 17586d7f5d3SJohn Marino */ 17686d7f5d3SJohn Marino #define MY_FCHTShift 16 /* flow control high threshold */ 17786d7f5d3SJohn Marino #define MY_FCLTShift 0 /* flow control low threshold */ 17886d7f5d3SJohn Marino 17986d7f5d3SJohn Marino /* 18086d7f5d3SJohn Marino * BootROM/EEPROM/MII Management Register 18186d7f5d3SJohn Marino */ 18286d7f5d3SJohn Marino #define MY_MASK_MIIR_MII_READ 0x00000000 18386d7f5d3SJohn Marino #define MY_MASK_MIIR_MII_WRITE 0x00000008 18486d7f5d3SJohn Marino #define MY_MASK_MIIR_MII_MDO 0x00000004 18586d7f5d3SJohn Marino #define MY_MASK_MIIR_MII_MDI 0x00000002 18686d7f5d3SJohn Marino #define MY_MASK_MIIR_MII_MDC 0x00000001 18786d7f5d3SJohn Marino 18886d7f5d3SJohn Marino /* 18986d7f5d3SJohn Marino * Tally Counter for CRC and MPA 19086d7f5d3SJohn Marino */ 19186d7f5d3SJohn Marino #define MY_TCOVF 0x80000000 /* crc tally counter overflow */ 19286d7f5d3SJohn Marino #define MY_CRCMask 0x7fff0000 /* crc number: bit 16-30 */ 19386d7f5d3SJohn Marino #define MY_CRCShift 16 19486d7f5d3SJohn Marino #define MY_TMOVF 0x00008000 /* mpa tally counter overflow */ 19586d7f5d3SJohn Marino #define MY_MPAMask 0x00007fff /* mpa number: bit 0-14 */ 19686d7f5d3SJohn Marino #define MY_MPAShift 0 19786d7f5d3SJohn Marino 19886d7f5d3SJohn Marino /* 19986d7f5d3SJohn Marino * Tally Counters for transmit status 20086d7f5d3SJohn Marino */ 20186d7f5d3SJohn Marino #define MY_AbortMask 0xff000000 /* transmit abort number */ 20286d7f5d3SJohn Marino #define MY_AbortShift 24 20386d7f5d3SJohn Marino #define MY_LColMask 0x00ff0000 /* transmit late collisions */ 20486d7f5d3SJohn Marino #define MY_LColShift 16 20586d7f5d3SJohn Marino #define MY_NCRMask 0x0000ffff /* transmit retry number */ 20686d7f5d3SJohn Marino #define MY_NCRShift 0 20786d7f5d3SJohn Marino 20886d7f5d3SJohn Marino /* 20986d7f5d3SJohn Marino * Myson TX/RX descriptor structure. 21086d7f5d3SJohn Marino */ 21186d7f5d3SJohn Marino 21286d7f5d3SJohn Marino struct my_desc { 21386d7f5d3SJohn Marino u_int32_t my_status; 21486d7f5d3SJohn Marino u_int32_t my_ctl; 21586d7f5d3SJohn Marino u_int32_t my_data; 21686d7f5d3SJohn Marino u_int32_t my_next; 21786d7f5d3SJohn Marino }; 21886d7f5d3SJohn Marino 21986d7f5d3SJohn Marino /* 22086d7f5d3SJohn Marino * for tx/rx descriptors 22186d7f5d3SJohn Marino */ 22286d7f5d3SJohn Marino #define MY_OWNByNIC 0x80000000 22386d7f5d3SJohn Marino #define MY_OWNByDriver 0x0 22486d7f5d3SJohn Marino 22586d7f5d3SJohn Marino /* 22686d7f5d3SJohn Marino * receive descriptor 0 22786d7f5d3SJohn Marino */ 22886d7f5d3SJohn Marino #define MY_RXOWN 0x80000000 /* own bit */ 22986d7f5d3SJohn Marino #define MY_FLNGMASK 0x0fff0000 /* frame length */ 23086d7f5d3SJohn Marino #define MY_FLNGShift 16 23186d7f5d3SJohn Marino #define MY_MARSTATUS 0x00004000 /* multicast address received */ 23286d7f5d3SJohn Marino #define MY_BARSTATUS 0x00002000 /* broadcast address received */ 23386d7f5d3SJohn Marino #define MY_PHYSTATUS 0x00001000 /* physical address received */ 23486d7f5d3SJohn Marino #define MY_RXFSD 0x00000800 /* first descriptor */ 23586d7f5d3SJohn Marino #define MY_RXLSD 0x00000400 /* last descriptor */ 23686d7f5d3SJohn Marino #define MY_ES 0x00000080 /* error summary */ 23786d7f5d3SJohn Marino #define MY_RUNT 0x00000040 /* runt packet received */ 23886d7f5d3SJohn Marino #define MY_LONG 0x00000020 /* long packet received */ 23986d7f5d3SJohn Marino #define MY_FAE 0x00000010 /* frame align error */ 24086d7f5d3SJohn Marino #define MY_CRC 0x00000008 /* crc error */ 24186d7f5d3SJohn Marino #define MY_RXER 0x00000004 /* receive error */ 24286d7f5d3SJohn Marino #define MY_RDES0CHECK 0x000078fc /* only check MAR, BAR, PHY, ES, RUNT, 24386d7f5d3SJohn Marino LONG, FAE, CRC and RXER bits */ 24486d7f5d3SJohn Marino 24586d7f5d3SJohn Marino /* 24686d7f5d3SJohn Marino * receive descriptor 1 24786d7f5d3SJohn Marino */ 24886d7f5d3SJohn Marino #define MY_RXIC 0x00800000 /* interrupt control */ 24986d7f5d3SJohn Marino #define MY_RBSMASK 0x000007ff /* receive buffer size */ 25086d7f5d3SJohn Marino #define MY_RBSShift 0 25186d7f5d3SJohn Marino 25286d7f5d3SJohn Marino /* 25386d7f5d3SJohn Marino * transmit descriptor 0 25486d7f5d3SJohn Marino */ 25586d7f5d3SJohn Marino #define MY_TXERR 0x00008000 /* transmit error */ 25686d7f5d3SJohn Marino #define MY_JABTO 0x00004000 /* jabber timeout */ 25786d7f5d3SJohn Marino #define MY_CSL 0x00002000 /* carrier sense lost */ 25886d7f5d3SJohn Marino #define MY_LC 0x00001000 /* late collision */ 25986d7f5d3SJohn Marino #define MY_EC 0x00000800 /* excessive collision */ 26086d7f5d3SJohn Marino #define MY_UDF 0x00000400 /* fifo underflow */ 26186d7f5d3SJohn Marino #define MY_DFR 0x00000200 /* deferred */ 26286d7f5d3SJohn Marino #define MY_HF 0x00000100 /* heartbeat fail */ 26386d7f5d3SJohn Marino #define MY_NCRMASK 0x000000ff /* collision retry count */ 26486d7f5d3SJohn Marino #define MY_NCRShift 0 26586d7f5d3SJohn Marino 26686d7f5d3SJohn Marino /* 26786d7f5d3SJohn Marino * tx descriptor 1 26886d7f5d3SJohn Marino */ 26986d7f5d3SJohn Marino #define MY_TXIC 0x80000000 /* interrupt control */ 27086d7f5d3SJohn Marino #define MY_ETIControl 0x40000000 /* early transmit interrupt */ 27186d7f5d3SJohn Marino #define MY_TXLD 0x20000000 /* last descriptor */ 27286d7f5d3SJohn Marino #define MY_TXFD 0x10000000 /* first descriptor */ 27386d7f5d3SJohn Marino #define MY_CRCDisable 0x00000000 /* crc control */ 27486d7f5d3SJohn Marino #define MY_CRCEnable 0x08000000 27586d7f5d3SJohn Marino #define MY_PADDisable 0x00000000 /* padding control */ 27686d7f5d3SJohn Marino #define MY_PADEnable 0x04000000 27786d7f5d3SJohn Marino #define MY_RetryTxLC 0x02000000 /* retry late collision */ 27886d7f5d3SJohn Marino #define MY_PKTShift 11 /* transmit pkt size */ 27986d7f5d3SJohn Marino #define MY_TBSMASK 0x000007ff 28086d7f5d3SJohn Marino #define MY_TBSShift 0 /* transmit buffer size */ 28186d7f5d3SJohn Marino 28286d7f5d3SJohn Marino #define MY_MAXFRAGS 1 28386d7f5d3SJohn Marino #define MY_RX_LIST_CNT 64 28486d7f5d3SJohn Marino #define MY_TX_LIST_CNT 64 28586d7f5d3SJohn Marino #define MY_MIN_FRAMELEN 60 28686d7f5d3SJohn Marino 28786d7f5d3SJohn Marino /* 28886d7f5d3SJohn Marino * A transmit 'super descriptor' is actually MY_MAXFRAGS regular 28986d7f5d3SJohn Marino * descriptors clumped together. The idea here is to emulate the 29086d7f5d3SJohn Marino * multi-fragment descriptor layout found in devices such as the 29186d7f5d3SJohn Marino * Texas Instruments ThunderLAN and 3Com boomerang and cylone chips. 29286d7f5d3SJohn Marino * The advantage to using this scheme is that it avoids buffer copies. 29386d7f5d3SJohn Marino * The disadvantage is that there's a certain amount of overhead due 29486d7f5d3SJohn Marino * to the fact that each 'fragment' is 16 bytes long. In my tests, 29586d7f5d3SJohn Marino * this limits top speed to about 10.5MB/sec. It should be more like 29686d7f5d3SJohn Marino * 11.5MB/sec. However, the upshot is that you can achieve better 29786d7f5d3SJohn Marino * results on slower machines: a Pentium 200 can pump out packets at 29886d7f5d3SJohn Marino * same speed as a PII 400. 29986d7f5d3SJohn Marino */ 30086d7f5d3SJohn Marino struct my_txdesc { 30186d7f5d3SJohn Marino struct my_desc my_frag[MY_MAXFRAGS]; 30286d7f5d3SJohn Marino }; 30386d7f5d3SJohn Marino 30486d7f5d3SJohn Marino #define MY_TXSTATUS(x) x->my_ptr->my_frag[x->my_lastdesc].my_status 30586d7f5d3SJohn Marino #define MY_TXCTL(x) x->my_ptr->my_frag[x->my_lastdesc].my_ctl 30686d7f5d3SJohn Marino #define MY_TXDATA(x) x->my_ptr->my_frag[x->my_lastdesc].my_data 30786d7f5d3SJohn Marino #define MY_TXNEXT(x) x->my_ptr->my_frag[x->my_lastdesc].my_next 30886d7f5d3SJohn Marino 30986d7f5d3SJohn Marino #define MY_TXOWN(x) x->my_ptr->my_frag[0].my_status 31086d7f5d3SJohn Marino 31186d7f5d3SJohn Marino #define MY_UNSENT 0x1234 31286d7f5d3SJohn Marino 31386d7f5d3SJohn Marino struct my_list_data { 31486d7f5d3SJohn Marino struct my_desc my_rx_list[MY_RX_LIST_CNT]; 31586d7f5d3SJohn Marino struct my_txdesc my_tx_list[MY_TX_LIST_CNT]; 31686d7f5d3SJohn Marino }; 31786d7f5d3SJohn Marino 31886d7f5d3SJohn Marino struct my_chain { 31986d7f5d3SJohn Marino struct my_txdesc *my_ptr; 32086d7f5d3SJohn Marino struct mbuf *my_mbuf; 32186d7f5d3SJohn Marino struct my_chain *my_nextdesc; 32286d7f5d3SJohn Marino u_int8_t my_lastdesc; 32386d7f5d3SJohn Marino }; 32486d7f5d3SJohn Marino 32586d7f5d3SJohn Marino struct my_chain_onefrag { 32686d7f5d3SJohn Marino struct my_desc *my_ptr; 32786d7f5d3SJohn Marino struct mbuf *my_mbuf; 32886d7f5d3SJohn Marino struct my_chain_onefrag *my_nextdesc; 32986d7f5d3SJohn Marino u_int8_t my_rlast; 33086d7f5d3SJohn Marino }; 33186d7f5d3SJohn Marino 33286d7f5d3SJohn Marino struct my_chain_data { 33386d7f5d3SJohn Marino struct my_chain_onefrag my_rx_chain[MY_RX_LIST_CNT]; 33486d7f5d3SJohn Marino struct my_chain my_tx_chain[MY_TX_LIST_CNT]; 33586d7f5d3SJohn Marino 33686d7f5d3SJohn Marino struct my_chain_onefrag *my_rx_head; 33786d7f5d3SJohn Marino 33886d7f5d3SJohn Marino struct my_chain *my_tx_head; 33986d7f5d3SJohn Marino struct my_chain *my_tx_tail; 34086d7f5d3SJohn Marino struct my_chain *my_tx_free; 34186d7f5d3SJohn Marino }; 34286d7f5d3SJohn Marino 34386d7f5d3SJohn Marino struct my_type { 34486d7f5d3SJohn Marino u_int16_t my_vid; 34586d7f5d3SJohn Marino u_int16_t my_did; 34686d7f5d3SJohn Marino char *my_name; 34786d7f5d3SJohn Marino }; 34886d7f5d3SJohn Marino 34986d7f5d3SJohn Marino #define MY_FLAG_FORCEDELAY 1 35086d7f5d3SJohn Marino #define MY_FLAG_SCHEDDELAY 2 35186d7f5d3SJohn Marino #define MY_FLAG_DELAYTIMEO 3 35286d7f5d3SJohn Marino 35386d7f5d3SJohn Marino struct my_softc { 35486d7f5d3SJohn Marino struct arpcom arpcom; /* interface info */ 35586d7f5d3SJohn Marino struct ifmedia ifmedia; /* media info */ 35686d7f5d3SJohn Marino bus_space_handle_t my_bhandle; 35786d7f5d3SJohn Marino bus_space_tag_t my_btag; 35886d7f5d3SJohn Marino struct my_type *my_info; /* adapter info */ 35986d7f5d3SJohn Marino struct my_type *my_pinfo; /* phy info */ 36086d7f5d3SJohn Marino struct resource *my_res; 36186d7f5d3SJohn Marino struct resource *my_irq; 36286d7f5d3SJohn Marino void *my_intrhand; 36386d7f5d3SJohn Marino u_int8_t my_unit; /* interface number */ 36486d7f5d3SJohn Marino u_int8_t my_phy_addr; /* PHY address */ 36586d7f5d3SJohn Marino u_int8_t my_tx_pend; /* TX pending */ 36686d7f5d3SJohn Marino u_int8_t my_want_auto; 36786d7f5d3SJohn Marino u_int8_t my_autoneg; 36886d7f5d3SJohn Marino u_int16_t my_txthresh; 36986d7f5d3SJohn Marino u_int8_t my_stats_no_timeout; 37086d7f5d3SJohn Marino caddr_t my_ldata_ptr; 37186d7f5d3SJohn Marino struct my_list_data *my_ldata; 37286d7f5d3SJohn Marino struct my_chain_data my_cdata; 37386d7f5d3SJohn Marino device_t my_miibus; 37486d7f5d3SJohn Marino 37586d7f5d3SJohn Marino }; 37686d7f5d3SJohn Marino 37786d7f5d3SJohn Marino /* 37886d7f5d3SJohn Marino * register space access macros 37986d7f5d3SJohn Marino */ 38086d7f5d3SJohn Marino #define CSR_WRITE_4(sc, reg, val) \ 38186d7f5d3SJohn Marino bus_space_write_4(sc->my_btag, sc->my_bhandle, reg, val) 38286d7f5d3SJohn Marino #define CSR_WRITE_2(sc, reg, val) \ 38386d7f5d3SJohn Marino bus_space_write_2(sc->my_btag, sc->my_bhandle, reg, val) 38486d7f5d3SJohn Marino #define CSR_WRITE_1(sc, reg, val) \ 38586d7f5d3SJohn Marino bus_space_write_1(sc->my_btag, sc->my_bhandle, reg, val) 38686d7f5d3SJohn Marino 38786d7f5d3SJohn Marino #define CSR_READ_4(sc, reg) \ 38886d7f5d3SJohn Marino bus_space_read_4(sc->my_btag, sc->my_bhandle, reg) 38986d7f5d3SJohn Marino #define CSR_READ_2(sc, reg) \ 39086d7f5d3SJohn Marino bus_space_read_2(sc->my_btag, sc->my_bhandle, reg) 39186d7f5d3SJohn Marino #define CSR_READ_1(sc, reg) \ 39286d7f5d3SJohn Marino bus_space_read_1(sc->my_btag, sc->my_bhandle, reg) 39386d7f5d3SJohn Marino 39486d7f5d3SJohn Marino #define MY_TIMEOUT 1000 39586d7f5d3SJohn Marino 39686d7f5d3SJohn Marino /* 39786d7f5d3SJohn Marino * General constants that are fun to know. 39886d7f5d3SJohn Marino * 39986d7f5d3SJohn Marino * MYSON PCI vendor ID 40086d7f5d3SJohn Marino */ 40186d7f5d3SJohn Marino #define MYSONVENDORID 0x1516 40286d7f5d3SJohn Marino 40386d7f5d3SJohn Marino /* 40486d7f5d3SJohn Marino * MYSON device IDs. 40586d7f5d3SJohn Marino */ 40686d7f5d3SJohn Marino #define MTD800ID 0x0800 40786d7f5d3SJohn Marino #define MTD803ID 0x0803 40886d7f5d3SJohn Marino #define MTD891ID 0x0891 40986d7f5d3SJohn Marino 41086d7f5d3SJohn Marino /* 41186d7f5d3SJohn Marino * ST+OP+PHYAD+REGAD+TA 41286d7f5d3SJohn Marino */ 41386d7f5d3SJohn Marino #define MY_OP_READ 0x6000 /* ST:01+OP:10+PHYAD+REGAD+TA:Z0 */ 41486d7f5d3SJohn Marino #define MY_OP_WRITE 0x5002 /* ST:01+OP:01+PHYAD+REGAD+TA:10 */ 41586d7f5d3SJohn Marino 41686d7f5d3SJohn Marino /* 41786d7f5d3SJohn Marino * Constansts for Myson PHY 41886d7f5d3SJohn Marino */ 41986d7f5d3SJohn Marino #define MysonPHYID0 0x0300 42086d7f5d3SJohn Marino 42186d7f5d3SJohn Marino /* 42286d7f5d3SJohn Marino * Constansts for Seeq 80225 PHY 42386d7f5d3SJohn Marino */ 42486d7f5d3SJohn Marino #define SeeqPHYID0 0x0016 42586d7f5d3SJohn Marino 42686d7f5d3SJohn Marino #define SEEQ_MIIRegister18 18 42786d7f5d3SJohn Marino #define SEEQ_SPD_DET_100 0x80 42886d7f5d3SJohn Marino #define SEEQ_DPLX_DET_FULL 0x40 42986d7f5d3SJohn Marino 43086d7f5d3SJohn Marino /* 43186d7f5d3SJohn Marino * Constansts for Ahdoc 101 PHY 43286d7f5d3SJohn Marino */ 43386d7f5d3SJohn Marino #define AhdocPHYID0 0x0022 43486d7f5d3SJohn Marino 43586d7f5d3SJohn Marino #define AHDOC_DiagnosticReg 18 43686d7f5d3SJohn Marino #define AHDOC_DPLX_FULL 0x0800 43786d7f5d3SJohn Marino #define AHDOC_Speed_100 0x0400 43886d7f5d3SJohn Marino 43986d7f5d3SJohn Marino /* 44086d7f5d3SJohn Marino * Constansts for Marvell 88E1000/88E1000S PHY and LevelOne PHY 44186d7f5d3SJohn Marino */ 44286d7f5d3SJohn Marino #define MarvellPHYID0 0x0141 44386d7f5d3SJohn Marino #define LevelOnePHYID0 0x0013 44486d7f5d3SJohn Marino 44586d7f5d3SJohn Marino #define Marvell_SpecificStatus 17 44686d7f5d3SJohn Marino #define Marvell_Speed1000 0x8000 44786d7f5d3SJohn Marino #define Marvell_Speed100 0x4000 44886d7f5d3SJohn Marino #define Marvell_FullDuplex 0x2000 44986d7f5d3SJohn Marino 45086d7f5d3SJohn Marino /* 45186d7f5d3SJohn Marino * PCI low memory base and low I/O base register, and 45286d7f5d3SJohn Marino * other PCI registers. Note: some are only available on 45386d7f5d3SJohn Marino * the 3c905B, in particular those that related to power management. 45486d7f5d3SJohn Marino */ 45586d7f5d3SJohn Marino #define MY_PCI_VENDOR_ID 0x00 45686d7f5d3SJohn Marino #define MY_PCI_DEVICE_ID 0x02 45786d7f5d3SJohn Marino #define MY_PCI_COMMAND 0x04 45886d7f5d3SJohn Marino #define MY_PCI_STATUS 0x06 45986d7f5d3SJohn Marino #define MY_PCI_CLASSCODE 0x09 46086d7f5d3SJohn Marino #define MY_PCI_LATENCY_TIMER 0x0D 46186d7f5d3SJohn Marino #define MY_PCI_HEADER_TYPE 0x0E 46286d7f5d3SJohn Marino #define MY_PCI_LOIO 0x10 46386d7f5d3SJohn Marino #define MY_PCI_LOMEM 0x14 46486d7f5d3SJohn Marino #define MY_PCI_BIOSROM 0x30 46586d7f5d3SJohn Marino #define MY_PCI_INTLINE 0x3C 46686d7f5d3SJohn Marino #define MY_PCI_INTPIN 0x3D 46786d7f5d3SJohn Marino #define MY_PCI_MINGNT 0x3E 46886d7f5d3SJohn Marino #define MY_PCI_MINLAT 0x0F 46986d7f5d3SJohn Marino #define MY_PCI_RESETOPT 0x48 47086d7f5d3SJohn Marino #define MY_PCI_EEPROM_DATA 0x4C 47186d7f5d3SJohn Marino 47286d7f5d3SJohn Marino #define PHY_UNKNOWN 3 47386d7f5d3SJohn Marino 47486d7f5d3SJohn Marino #define MY_PHYADDR_MIN 0x00 47586d7f5d3SJohn Marino #define MY_PHYADDR_MAX 0x1F 47686d7f5d3SJohn Marino 47786d7f5d3SJohn Marino #define PHY_BMCR 0x00 47886d7f5d3SJohn Marino #define PHY_BMSR 0x01 47986d7f5d3SJohn Marino #define PHY_VENID 0x02 48086d7f5d3SJohn Marino #define PHY_DEVID 0x03 48186d7f5d3SJohn Marino #define PHY_ANAR 0x04 48286d7f5d3SJohn Marino #define PHY_LPAR 0x05 48386d7f5d3SJohn Marino #define PHY_ANEXP 0x06 48486d7f5d3SJohn Marino #define PHY_NPTR 0x07 48586d7f5d3SJohn Marino #define PHY_LPNPR 0x08 48686d7f5d3SJohn Marino #define PHY_1000CR 0x09 48786d7f5d3SJohn Marino #define PHY_1000SR 0x0a 48886d7f5d3SJohn Marino 48986d7f5d3SJohn Marino #define PHY_ANAR_NEXTPAGE 0x8000 49086d7f5d3SJohn Marino #define PHY_ANAR_RSVD0 0x4000 49186d7f5d3SJohn Marino #define PHY_ANAR_TLRFLT 0x2000 49286d7f5d3SJohn Marino #define PHY_ANAR_RSVD1 0x1000 49386d7f5d3SJohn Marino #define PHY_ANAR_RSVD2 0x0800 49486d7f5d3SJohn Marino #define PHY_ANAR_RSVD3 0x0400 49586d7f5d3SJohn Marino #define PHY_ANAR_100BT4 0x0200L 49686d7f5d3SJohn Marino #define PHY_ANAR_100BTXFULL 0x0100 49786d7f5d3SJohn Marino #define PHY_ANAR_100BTXHALF 0x0080 49886d7f5d3SJohn Marino #define PHY_ANAR_10BTFULL 0x0040 49986d7f5d3SJohn Marino #define PHY_ANAR_10BTHALF 0x0020 50086d7f5d3SJohn Marino #define PHY_ANAR_PROTO4 0x0010 50186d7f5d3SJohn Marino #define PHY_ANAR_PROTO3 0x0008 50286d7f5d3SJohn Marino #define PHY_ANAR_PROTO2 0x0004 50386d7f5d3SJohn Marino #define PHY_ANAR_PROTO1 0x0002 50486d7f5d3SJohn Marino #define PHY_ANAR_PROTO0 0x0001 50586d7f5d3SJohn Marino 50686d7f5d3SJohn Marino #define PHY_1000SR_1000BTXFULL 0x0800 50786d7f5d3SJohn Marino #define PHY_1000SR_1000BTXHALF 0x0400 50886d7f5d3SJohn Marino 50986d7f5d3SJohn Marino /* 51086d7f5d3SJohn Marino * These are the register definitions for the PHY (physical layer 51186d7f5d3SJohn Marino * interface chip). 51286d7f5d3SJohn Marino */ 51386d7f5d3SJohn Marino /* 51486d7f5d3SJohn Marino * PHY BMCR Basic Mode Control Register 51586d7f5d3SJohn Marino */ 51686d7f5d3SJohn Marino #define PHY_BMCR_RESET 0x8000 51786d7f5d3SJohn Marino #define PHY_BMCR_LOOPBK 0x4000 51886d7f5d3SJohn Marino #define PHY_BMCR_SPEEDSEL 0x2000 51986d7f5d3SJohn Marino #define PHY_BMCR_AUTONEGENBL 0x1000 52086d7f5d3SJohn Marino #define PHY_BMCR_RSVD0 0x0800 /* write as zero */ 52186d7f5d3SJohn Marino #define PHY_BMCR_ISOLATE 0x0400 52286d7f5d3SJohn Marino #define PHY_BMCR_AUTONEGRSTR 0x0200 52386d7f5d3SJohn Marino #define PHY_BMCR_DUPLEX 0x0100 52486d7f5d3SJohn Marino #define PHY_BMCR_COLLTEST 0x0080 52586d7f5d3SJohn Marino #define PHY_BMCR_1000 0x0040 /* only used for Marvell PHY */ 52686d7f5d3SJohn Marino #define PHY_BMCR_RSVD2 0x0020 /* write as zero, don't care */ 52786d7f5d3SJohn Marino #define PHY_BMCR_RSVD3 0x0010 /* write as zero, don't care */ 52886d7f5d3SJohn Marino #define PHY_BMCR_RSVD4 0x0008 /* write as zero, don't care */ 52986d7f5d3SJohn Marino #define PHY_BMCR_RSVD5 0x0004 /* write as zero, don't care */ 53086d7f5d3SJohn Marino #define PHY_BMCR_RSVD6 0x0002 /* write as zero, don't care */ 53186d7f5d3SJohn Marino #define PHY_BMCR_RSVD7 0x0001 /* write as zero, don't care */ 53286d7f5d3SJohn Marino 53386d7f5d3SJohn Marino /* 53486d7f5d3SJohn Marino * RESET: 1 == software reset, 0 == normal operation 53586d7f5d3SJohn Marino * Resets status and control registers to default values. 53686d7f5d3SJohn Marino * Relatches all hardware config values. 53786d7f5d3SJohn Marino * 53886d7f5d3SJohn Marino * LOOPBK: 1 == loopback operation enabled, 0 == normal operation 53986d7f5d3SJohn Marino * 54086d7f5d3SJohn Marino * SPEEDSEL: 1 == 100Mb/s, 0 == 10Mb/s 54186d7f5d3SJohn Marino * Link speed is selected byt his bit or if auto-negotiation if bit 54286d7f5d3SJohn Marino * 12 (AUTONEGENBL) is set (in which case the value of this register 54386d7f5d3SJohn Marino * is ignored). 54486d7f5d3SJohn Marino * 54586d7f5d3SJohn Marino * AUTONEGENBL: 1 == Autonegotiation enabled, 0 == Autonegotiation disabled 54686d7f5d3SJohn Marino * Bits 8 and 13 are ignored when autoneg is set, otherwise bits 8 and 13 54786d7f5d3SJohn Marino * determine speed and mode. Should be cleared and then set if PHY configured 54886d7f5d3SJohn Marino * for no autoneg on startup. 54986d7f5d3SJohn Marino * 55086d7f5d3SJohn Marino * ISOLATE: 1 == isolate PHY from MII, 0 == normal operation 55186d7f5d3SJohn Marino * 55286d7f5d3SJohn Marino * AUTONEGRSTR: 1 == restart autonegotiation, 0 = normal operation 55386d7f5d3SJohn Marino * 55486d7f5d3SJohn Marino * DUPLEX: 1 == full duplex mode, 0 == half duplex mode 55586d7f5d3SJohn Marino * 55686d7f5d3SJohn Marino * COLLTEST: 1 == collision test enabled, 0 == normal operation 55786d7f5d3SJohn Marino */ 55886d7f5d3SJohn Marino 55986d7f5d3SJohn Marino /* 56086d7f5d3SJohn Marino * PHY, BMSR Basic Mode Status Register 56186d7f5d3SJohn Marino */ 56286d7f5d3SJohn Marino #define PHY_BMSR_100BT4 0x8000 56386d7f5d3SJohn Marino #define PHY_BMSR_100BTXFULL 0x4000 56486d7f5d3SJohn Marino #define PHY_BMSR_100BTXHALF 0x2000 56586d7f5d3SJohn Marino #define PHY_BMSR_10BTFULL 0x1000 56686d7f5d3SJohn Marino #define PHY_BMSR_10BTHALF 0x0800 56786d7f5d3SJohn Marino #define PHY_BMSR_RSVD1 0x0400 /* write as zero, don't care */ 56886d7f5d3SJohn Marino #define PHY_BMSR_RSVD2 0x0200 /* write as zero, don't care */ 56986d7f5d3SJohn Marino #define PHY_BMSR_RSVD3 0x0100 /* write as zero, don't care */ 57086d7f5d3SJohn Marino #define PHY_BMSR_RSVD4 0x0080 /* write as zero, don't care */ 57186d7f5d3SJohn Marino #define PHY_BMSR_MFPRESUP 0x0040 57286d7f5d3SJohn Marino #define PHY_BMSR_AUTONEGCOMP 0x0020 57386d7f5d3SJohn Marino #define PHY_BMSR_REMFAULT 0x0010 57486d7f5d3SJohn Marino #define PHY_BMSR_CANAUTONEG 0x0008 57586d7f5d3SJohn Marino #define PHY_BMSR_LINKSTAT 0x0004 57686d7f5d3SJohn Marino #define PHY_BMSR_JABBER 0x0002 57786d7f5d3SJohn Marino #define PHY_BMSR_EXTENDED 0x0001 57886d7f5d3SJohn Marino 57986d7f5d3SJohn Marino 580