xref: /dflybsd-src/sys/dev/netif/my/if_myreg.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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