summaryrefslogtreecommitdiff
path: root/sys/dev/ic/dm9000reg.h
blob: 27e86c676681f5116d32a91621345fe12853d988 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*	$NetBSD: dm9000reg.h,v 1.11 2023/03/25 21:33:46 andvar Exp $	*/

/*
 * Copyright (c) 2009 Paul Fleischer
 * All rights reserved.
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the company nor the name of the author may be used to
 *    endorse or promote products derived from this software without specific
 *    prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef _DEV_IC_DM9000REG_H_
#define _DEV_IC_DM9000REG_H_

/*
 * Registers accessible on the DM9000, extracted from pp. 11-12 from
 * the data sheet
 */

/*
 * There are two interesting addresses for the DM9000 (at least in
 * the context of the FriendlyARM MINI2440) The I/O or register select
 * address, which is the base address.  The DATA address, which is
 * located at offset 4 from the base address.
 *
 * Chances are that this will not work generally, as it really depends
 * on how the address lines are mapped from the CPU to the DM9000.
 * But for now it is a good starting point.
 */

#define DM9000_IOSIZE 4

#define DM9000_NCR		0x00	/* "network" control */
#define  DM9000_NCR_RST		(1<<0)	/* reset chip, self clear */
#define  DM9000_NCR_LBK_MASK	(0x06)	/* loopback test selection */
#define  DM9000_NCR_LBK_SHIFT	(1)
#define  DM9000_NCR_LBK_NORMAL	(0<<1)	/* normal operation */
#define  DM9000_NCR_LBK_MAC_INTERNAL (1<<1) /* MAC loopback */
#define  DM9000_NCR_LBK_INT_PHY (2<<1)	/* PHY loopback */
#define  DM9000_NCR_FDX		(1<<3)	/* use full-duplex, RO when int PHY */
#define  DM9000_NCR_FCOL	(1<<4)	/* force coll. mode. test only */
#define  DM9000_NCR_WAKEEN	(1<<6)	/* wakeup event enable */
#define  DM9000_NCR_EXY_PHY	(1<<7)	/* select ext. PHY, immune SW reset */
#define DM9000_NSR		0x01	/* "network" status */
#define  DM9000_NSR_RXOV	(1<<1)	/* receive overflow detected */
#define  DM9000_NSR_TX1END	(1<<2)	/* transmit 1 completed, W1C */
#define  DM9000_NSR_TX2END	(1<<3) 	/* transmit 2 completed, W1C */
#define  DM9000_NSR_WAKEST	(1<<5)	/* wakeup event, W1C */
#define  DM9000_NSR_LINKST	(1<<6)	/* link is up */
#define  DM9000_NSR_SPEED	(1<<7)	/* 1: 100Mbps, 0: 10Mbps */
#define DM9000_TCR		0x02	/* Tx control */
#define  DM9000_TCR_TXREQ	(1<<0)	/* request to start Tx, self clear */
#define  DM9000_TCR_CRC_DIS1	(1<<1)	/* disable PAD op on Tx1 */
#define  DM9000_TCR_PAD_DIS1	(1<<2)	/* disable CRC append on Tx1 */
#define  DM9000_TCR_CRC_DIS2	(1<<3)	/* disable PAD op on Tx2 */
#define  DM9000_TCR_PAD_DIS2	(1<<4)	/* disable CRC append on Tx2 */
#define  DM9000_TCR_EXCECM	(1<<5)	/* allow infinite colli. retries */
#define  DM9000_TCR_TJDIS	(1<<6)	/* disable xmit jabber, otherwise on */
#define DM9000_TSR1		0x03	/* transmit completion status 1 */
#define DM9000_TSR2		0x04	/* transmit completion status 2 */
#define  DM9000_TSR_EC		(1<<2)	/* aborted after 16 collision */
#define  DM9000_TSR_COL		(1<<3)	/* collision detected while xmit */
#define  DM9000_TSR_LCOL	(1<<4)	/* out of window "late" collision */
#define  DM9000_TSR_NC		(1<<5)	/* no carrier signal found */
#define  DM9000_TSR_CLOSS	(1<<6)	/* loss of carrier */
#define  DM9000_TSR_TJTO	(1<<7)	/* Tx jabber time out */
#define DM9000_RCR		0x05	/* Rx control */
#define  DM9000_RCR_RXEN	(1<<0)	/* activate Rx */
#define  DM9000_RCR_PRMSC	(1<<1)	/* enable promisc mode */
#define  DM9000_RCR_RUNT	(1<<2)	/* accept damaged runt frame */
#define  DM9000_RCR_ALL		(1<<3)	/* accept all multicast */
#define  DM9000_RCR_DIS_CRC	(1<<4)	/* drop bad CRC frame */
#define  DM9000_RCR_DIS_LONG	(1<<5)	/* drop too long frame >1522 */
#define  DM9000_RCR_WTDIS	(1<<6)	/* disable >2048 Rx detect timer */
#define DM9000_RSR		0x06	/* Rx status */
#define  DM9000_RSR_FOE		(1<<0)	/* Rx FIFO overflow detected */
#define  DM9000_RSR_CE		(1<<1)	/* CRC error found */
#define  DM9000_RSR_AE		(1<<2)	/* tail not ended in byte boundary */
#define  DM9000_RSR_PLE		(1<<3)	/* physical layer error */
#define  DM9000_RSR_RWTO	(1<<4)	/* >2048 condition detected */
#define  DM9000_RSR_LCS		(1<<5)	/* late colli. detected */
#define  DM9000_RSR_MF		(1<<6)	/* mcast/bcast frame received */
#define  DM9000_RSR_RF		(1<<7)	/* damaged runt frame received <64 */
#define DM9000_ROCR		0x07	/* receive overflow counter */
/* 7: OVF detected, 6:0 statistic counter */
#define DM9000_BPTR		0x08	/* back pressure threshold */
/* 7:4 back pressure high watermark (3 def), 3:0 jam pattern time (7 def) */
#define DM9000_FCTR		0x09	/* flow control threshold */
/* 7:4 Rx FIFO high w.m. (3 def), low w.m. (8 def) */
#define DM9000_FCR		0x0A	/* Rx flow control */
#define  DM9000_FCR_FLCE	(1<<0)	/* flow control enable */
#define  DM9000_FCR_RXPCS	(1<<1)	/* Rx PAUSE current status */
#define  DM9000_FCR_RXPS	(1<<2)	/* Rx PAUSE status, latched R2C */
#define  DM9000_FCR_BKPM	(1<<3)	/* HDX back pressure for my frames */
#define  DM9000_FCR_BKPA	(1<<4)	/* HDX back pressure for any frames */
#define  DM9000_FCR_TXPEN	(1<<5)	/* activate auto PAUSE operation */
#define  DM9000_FCR_TXPF	(1<<6)	/* Tx PAUSE packet (when full) */
#define  DM9000_FCR_TXP0	(1<<7)	/* Tx PAUSE packet (when empty) */
#define DM9000_EPCR		0x0B	/* EEPROM / PHY control */
#define  DM9000_EPCR_ERRE	(1<<0)	/* operation in progress, busy bit */
#define  DM9000_EPCR_ERPRW	(1<<1)	/* instruct to write, not SC */
#define  DM9000_EPCR_ERPRR	(1<<2)	/* instruct to read, not SC */
#define  DM9000_EPCR_EPOS_EEPROM (0<<3)	/* EEPROM operation */
#define  DM9000_EPCR_EPOS_PHY    (1<<3)	/* PHY operation */
#define  DM9000_EPCR_WEP	(1<<4)	/* EEPROM write enable */
#define  DM9000_EPCR_REEP	(1<<5)	/* reload EEPROM contents, not SC */
#define DM9000_EPAR		0x0C	/* EEPROM / PHY address */
#define  DM9000_EPAR_EROA_MASK	0x3F	/* 7:6 (!!) PHY id, 5:0 addr/reg */
#define  DM9000_EPAR_INT_PHY	0x40	/* EPAR[7:6] = 01 for internal PHY */
#define DM9000_EPDRL		0x0D	/* EEPROM / PHY data 7:0 */
#define DM9000_EPDRH		0x0E	/* EEPROM / PHY data 15:8 */
#define DM9000_WCR		0x0F	/* wakeup control and status */
#define  DM9000_MAGIC		(1<<0)	/* magic frame arrived */
#define  DM9000_SAMPLE		(1<<1)	/* sample frame arrived */
#define  DM9000_LINK		(1<<2)	/* link change / status change found */
#define  DM9000_MAGICEN		(1<<3)	/* enable magic frame event detect */
#define  DM9000_SMAPLEEN	(1<<4)	/* enable sample frame event detect */
#define  DM9000_LINKEN		(1<<5)	/* enable link change event detect */

#define DM9000_PAB0		0x10	/* my station address 7:0 */
#define DM9000_PAB1		0x11
#define DM9000_PAB2		0x12
#define DM9000_PAB3		0x13
#define DM9000_PAB4		0x14
#define DM9000_PAB5		0x15	/* my station address 47:40 */

#define DM9000_MAB0		0x16	/* 64bit mcast hash filter 7:0 */
#define DM9000_MAB1		0x17
#define DM9000_MAB2		0x18
#define DM9000_MAB3		0x19
#define DM9000_MAB4		0x1A
#define DM9000_MAB5		0x1B
#define DM9000_MAB6		0x1C
#define DM9000_MAB7		0x1D	/* 63:56, needs 0x80 to catch bcast */

#define DM9000_GPCR		0x1E	/* GPIO control */
#define  DM9000_GPCR_GPIO0_OUT	(1<<0)	/* bit-0 to control PHY */
/* 3:0 select pin I/O direction (0001 def) */
#define DM9000_GPR		0x1F	/* GPIO value to read / write */
#define  DM9000_GPR_PHY_PWROFF	(1<<0)	/* power down internal PHY */
#define DM9000_TRPAL		0x22	/* Tx SRAM read pointer 7:0 */
#define DM9000_TRPAH		0x23	/* Tx SRAM read pointer 15:8 */
#define DM9000_RWPAL		0x24	/* Rx SRAM read pointer 7:0 */
#define DM9000_RWPAH		0x25	/* Rx SRAM read pointer 15:8 */

/* VID 0x0a46, PID 0x9000 */
#define DM9000_VID0	0x28	/* vender ID 7:0 */
#define DM9000_VID1	0x29	/* vender ID 15:8 */
#define DM9000_PID0	0x2A	/* product ID 7:0 */
#define DM9000_PID1	0x2B	/* product ID 15:8 */
#define DM9000_CHIPR	0x2C	/* chip revision */

#define DM9000_TCR2	0x2D	/* Tx control 2 */
#define DM9000_OTCR	0x2E	/* operation test control */
#define DM9000_SMCR	0x2F	/* special mode control */
#define  DM9000_FB0	(1<<0)	/* force shortest back-off time */
#define  DM9000_FB1	(1<<1)	/* force longest back-off time */
#define  DM9000_FLC	(1<<2)	/* force late collision */
#define  DM9000_SM_EN	(1<<7)	/* serial mode enable */
#define DM9000_ETXCSR	0x30	/* early xmit control and status */
#define DM9000_TCSCR	0x31	/* xmit checksum control */
#define DM9000_RCSCSR	0x32	/* recv checksum control and status */
#define DM9000_MPAR	0x33	/* MII PHY address */
#define DM9000_LEDCR	0x34	/* LED pin control */
#define DM9000_BUSCR	0x38	/* processor bus control */
#define DM9000_INTCR	0x39	/* INT pin control */
#define DM9000_SCCR	0x50	/* system clock turn on control */
#define DM9000_RSCCR	0x51	/* resume system clock control */
#define DM9000_MRCMDX	0xF0	/* "no increment" pre-fetch read */
#define DM9000_MRCMDX1	0xF1	/* "no increment" read */
#define DM9000_MRCMD	0xF2	/* "auto increment" read */
#define DM9000_MRRL	0xF4	/* memory read address 7:0 */
#define DM9000_MRRH	0xF5	/* memory read address 15:8 */
#define DM9000_MWCMDX	0xF6	/* "no increment" write */
#define DM9000_MWCMD	0xF8	/* "auto increment" write */
#define DM9000_MWRL	0xFA	/* memory write address 7:0 */
#define DM9000_MWRH	0xFB	/* memory write address 15:8 */
#define DM9000_TXPLL	0xFC	/* frame len 7:0 to transmit */
#define DM9000_TXPLH	0xFD	/* frame len 15:8 to transmit */
#define DM9000_ISR	0xFE	/* interrupt status report */
#define  DM9000_IOMODE_MASK	0xC0
#define  DM9000_IOMODE_SHIFT	6
/* 7:6 I/O size (hard wired) 10b: 8-bit, 00b: 16-bit, 01b: 32-bit */
#define  DM9000_ISR_PRS		(1<<0)	/* receive completed, W1C */
#define  DM9000_ISR_PTS		(1<<1)	/* transmit completed, W1C */
#define  DM9000_ISR_ROS		(1<<2)	/* Rx overflow latch, W1C */
#define  DM9000_ISR_ROOS	(1<<3)	/* Rx overflow cntr overflowed, W1C */
#define  DM9000_ISR_UNDERRUN	(1<<4)	/* Tx underrun detected */
#define  DM9000_ISR_LNKCHNG	(1<<5)	/* link status change detected */
#define DM9000_IMR	0xFF	/* interrupt mask */
#define  DM9000_IMR_PRM 	(1<<0)	/* enable receive event report */
#define  DM9000_IMR_PTM 	(1<<1)	/* enable xmit done event report */
#define  DM9000_IMR_ROM 	(1<<2)	/* enable Rx overflow event report */
#define  DM9000_IMR_ROOM	(1<<3)	/* enable Rx overflow cntr ov report */
#define  DM9000_IMR_PAR 	(1<<7)	/* use 3/13K SRAM w/ auto wrap */

#endif