summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/smc/if_smcreg.h
blob: 4642966f0d4903977c471057d77b8728b8502e55 (plain) (blame)
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/*-
 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
 *
 * Copyright (c) 2006 Benno Rice.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 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.
 *
 * 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 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.
 *
 * $FreeBSD$
 *
 */

#ifndef	_IF_SMCREG_H_
#define	_IF_SMCREG_H_

/* All Banks, Offset 0xe: Bank Select Register */
#define	BSR			0xe
#define	BSR_BANK_MASK		0x0007	/* Which bank is currently selected */
#define	BSR_IDENTIFY		0x3300	/* Static value for identification */
#define	BSR_IDENTIFY_MASK	0xff00

/* Bank 0, Offset 0x0: Transmit Control Register */
#define	TCR			0x0
#define	TCR_TXENA		0x0001	/* Enable/disable transmitter */
#define	TCR_LOOP		0x0002	/* Put the PHY into loopback mode */
#define	TCR_FORCOL		0x0004	/* Force a collision */
#define	TCR_PAD_EN		0x0080	/* Pad TX frames to 64 bytes */
#define	TCR_NOCRC		0x0100	/* Disable/enable CRC */
#define	TCR_MON_CSN		0x0400	/* Monitor carrier signal */
#define	TCR_FDUPLX		0x0800	/* Enable/disable full duplex */
#define	TCR_STP_SQET		0x1000	/* Stop TX on signal quality error */
#define	TCR_EPH_LOOP		0x2000	/* Internal loopback */
#define	TCR_SWFDUP		0x8000	/* Switched full duplex */

/* Bank 0, Offset 0x2: EPH Status Register */
#define	EPHSR			0x2
#define	EPHSR_TX_SUC		0x0001	/* Last TX was successful */
#define	EPHSR_SNGLCOL		0x0002	/* Single collision on last TX */
#define	EPHSR_MULCOL		0x0004	/* Multiple collisions on last TX */
#define	EPHSR_LTX_MULT		0x0008	/* Last TX was multicast */
#define	EPHSR_16COL		0x0010	/* 16 collisions on last TX */
#define	EPHSR_SQET		0x0020	/* Signal quality error test */
#define	EPHSR_LTX_BRD		0x0040	/* Last TX was broadcast */
#define	EPHSR_TX_DEFR		0x0080	/* Transmit deferred */
#define	EPHSR_LATCOL		0x0200	/* Late collision on last TX */
#define	EPHSR_LOST_CARR		0x0400	/* Lost carrier sense */
#define	EPHSR_EXC_DEF		0x0800	/* Excessive deferral */
#define	EPHSR_CTR_ROL		0x1000	/* Counter rollover */
#define	EPHSR_LINK_OK		0x4000	/* Inverse of nLNK pin */
#define	EPHSR_TXUNRN		0x8000	/* Transmit underrun */

/* Bank 0, Offset 0x4: Receive Control Register */
#define	RCR			0x4
#define	RCR_RX_ABORT		0x0001	/* RX aborted */
#define	RCR_PRMS		0x0002	/* Enable/disable promiscuous mode */
#define	RCR_ALMUL		0x0004	/* Accept all multicast frames */
#define	RCR_RXEN		0x0100	/* Enable/disable receiver */
#define	RCR_STRIP_CRC		0x0200	/* Strip CRC from RX packets */
#define	RCR_ABORT_ENB		0x2000	/* Abort RX on collision */
#define	RCR_FILT_CAR		0x4000	/* Filter leading 12 bits of carrier */
#define	RCR_SOFT_RST		0x8000	/* Software reset */

/* Bank 0, Offset 0x6: Counter Register */
#define	ECR			0x6
#define	ECR_SNGLCOL_MASK	0x000f	/* Single collisions */
#define	ECR_SNGLCOL_SHIFT	0
#define	ECR_MULCOL_MASK		0x00f0	/* Multiple collisions */
#define	ECR_MULCOL_SHIFT	4
#define	ECR_TX_DEFR_MASK	0x0f00	/* Transmit deferrals */
#define	ECR_TX_DEFR_SHIFT	8
#define	ECR_EXC_DEF_MASK	0xf000	/* Excessive deferrals */
#define	ECR_EXC_DEF_SHIFT	12

/* Bank 0, Offset 0x8: Memory Information Register */
#define	MIR			0x8
#define	MIR_SIZE_MASK		0x00ff	/* Memory size (2k pages) */
#define	MIR_SIZE_SHIFT		0
#define	MIR_FREE_MASK		0xff00	/* Memory free (2k pages) */
#define	MIR_FREE_SHIFT		8
#define	MIR_PAGE_SIZE		2048

/* Bank 0, Offset 0xa: Receive/PHY Control Reigster */
#define	RPCR			0xa
#define	RPCR_ANEG		0x0800	/* Put PHY in autonegotiation mode */
#define	RPCR_DPLX		0x1000	/* Put PHY in full-duplex mode */
#define	RPCR_SPEED		0x2000	/* Manual speed selection */
#define	RPCR_LSA_MASK		0x00e0	/* Select LED A function */
#define	RPCR_LSA_SHIFT		5
#define	RPCR_LSB_MASK		0x001c	/* Select LED B function */
#define	RPCR_LSB_SHIFT		2
#define	RPCR_LED_LINK_ANY	0x0	/* 10baseT or 100baseTX link detected */
#define	RPCR_LED_LINK_10	0x2	/* 10baseT link detected */
#define	RPCR_LED_LINK_FDX	0x3	/* Full-duplex link detected */
#define	RPCR_LED_LINK_100	0x5	/* 100baseTX link detected */
#define	RPCR_LED_ACT_ANY	0x4	/* TX or RX activity detected */
#define	RPCR_LED_ACT_RX		0x6	/* RX activity detected */
#define	RPCR_LED_ACT_TX		0x7	/* TX activity detected */

/* Bank 1, Offset 0x0: Configuration Register */
#define	CR			0x0
#define	CR_EXT_PHY		0x0200	/* Enable/disable external PHY */
#define	CR_GPCNTRL		0x0400	/* Inverse drives nCNTRL pin */
#define	CR_NO_WAIT		0x1000	/* Do not request additional waits */
#define	CR_EPH_POWER_EN		0x8000	/* Disable/enable low power mode */

/* Bank 1, Offset 0x2: Base Address Register */
#define	BAR			0x2
#define	BAR_HIGH_MASK		0xe000
#define	BAR_LOW_MASK		0x1f00
#define	BAR_LOW_SHIFT		4
#define	BAR_ADDRESS(val)	\
	((val & BAR_HIGH_MASK) | ((val & BAR_LOW_MASK) >> BAR_LOW_SHIFT))

/* Bank 1, Offsets 0x4: Individual Address Registers */
#define	IAR0			0x4
#define	IAR1			0x5
#define	IAR2			0x6
#define	IAR3			0x7
#define	IAR4			0x8
#define	IAR5			0x9

/* Bank 1, Offset 0xa: General Purpose Register */
#define	GPR			0xa

/* Bank 1, Offset 0xc: Control Register */
#define	CTR			0xa
#define	CTR_STORE		0x0001	/* Store registers to EEPROM */
#define	CTR_RELOAD		0x0002	/* Reload registers from EEPROM */
#define	CTR_EEPROM_SELECT	0x0004	/* Select registers to store/reload */
#define	CTR_TE_ENABLE		0x0020	/* TX error causes EPH interrupt */
#define	CTR_CR_ENABLE		0x0040	/* Ctr rollover causes EPH interrupt */
#define	CTR_LE_ENABLE		0x0080	/* Link error causes EPH interrupt */
#define	CTR_AUTO_RELEASE	0x0800	/* Automatically release TX packets */
#define	CTR_RCV_BAD		0x4000	/* Receive/discard bad CRC packets */

/* Bank 2, Offset 0x0: MMU Command Register */
#define	MMUCR			0x0
#define	MMUCR_BUSY		0x0001	/* MMU is busy */
#define	MMUCR_CMD_NOOP		(0<<5)	/* No operation */
#define	MMUCR_CMD_TX_ALLOC	(1<<5)	/* Alloc TX memory (256b chunks) */
#define	MMUCR_CMD_MMU_RESET	(2<<5)	/* Reset MMU */
#define	MMUCR_CMD_REMOVE	(3<<5)	/* Remove frame from RX FIFO */
#define	MMUCR_CMD_RELEASE	(4<<5)	/* Remove and release from RX FIFO */
#define	MMUCR_CMD_RELEASE_PKT	(5<<5)	/* Release packet specified in PNR */
#define	MMUCR_CMD_ENQUEUE	(6<<5)	/* Enqueue packet for TX */
#define	MMUCR_CMD_TX_RESET	(7<<5)	/* Reset TX FIFOs */

/* Bank 2, Offset 0x2: Packet Number Register */
#define	PNR			0x2
#define	PNR_MASK		0x3fff

/* Bank 2, Offset 0x3: Allocation Result Register */
#define	ARR			0x3
#define	ARR_FAILED		0x8000	/* Last allocation request failed */
#define	ARR_MASK		0x3000

/* Bank 2, Offset 0x4: FIFO Ports Register */
#define	FIFO_TX			0x4
#define	FIFO_RX			0x5
#define	FIFO_EMPTY		0x80	/* FIFO empty */
#define	FIFO_PACKET_MASK	0x3f	/* Packet number mask */

/* Bank 2, Offset 0x6: Pointer Register */
#define	PTR			0x6
#define	PTR_MASK		0x07ff	/* Address accessible within TX/RX */
#define	PTR_NOT_EMPTY		0x0800	/* Write Data FIFO not empty */
#define	PTR_ETEN		0x1000	/* Enable early TX underrun detection */
#define	PTR_READ		0x2000	/* Set read/write */
#define	PTR_AUTO_INCR		0x4000	/* Auto increment on read/write */
#define	PTR_RCV			0x8000	/* Read/write to/from RX/TX */

/* Bank 2, Offset 0x8: Data Registers */
#define	DATA0			0x8
#define	DATA1			0xa

/* Bank 2, Offset 0xc: Interrupt Status Registers */
#define	IST			0xc	/* read only */
#define	ACK			0xc	/* write only */
#define	MSK			0xd

#define	RCV_INT			0x0001	/* RX */
#define	TX_INT			0x0002	/* TX */
#define	TX_EMPTY_INT		0x0004	/* TX empty */
#define	ALLOC_INT		0x0008	/* Allocation complete */
#define	RX_OVRN_INT		0x0010	/* RX overrun */
#define	EPH_INT			0x0020	/* EPH interrupt */
#define	ERCV_INT		0x0040	/* Early RX */
#define	MD_INT			0x0080	/* MII */

#define	IST_PRINTF		"\20\01RCV\02TX\03TX_EMPTY\04ALLOC" \
				"\05RX_OVRN\06EPH\07ERCV\10MD"

/* Bank 3, Offset 0x0: Multicast Table Registers */
#define	MT			0x0

/* Bank 3, Offset 0x8: Management Interface */
#define	MGMT			0x8
#define	MGMT_MDO		0x0001	/* MII management output */
#define	MGMT_MDI		0x0002	/* MII management input */
#define	MGMT_MCLK		0x0004	/* MII management clock */
#define	MGMT_MDOE		0x0008	/* MII management output enable */
#define	MGMT_MSK_CRS100		0x4000	/* Disable CRS100 detection during TX */

/* Bank 3, Offset 0xa: Revision Register */
#define	REV			0xa
#define	REV_CHIP_MASK		0x00f0	/* Chip ID */
#define	REV_CHIP_SHIFT		4
#define	REV_REV_MASK		0x000f	/* Revision ID */
#define	REV_REV_SHIFT		0

#define	REV_CHIP_9192		3
#define	REV_CHIP_9194		4
#define	REV_CHIP_9195		5
#define	REV_CHIP_9196		6
#define	REV_CHIP_91100		7
#define	REV_CHIP_91100FD	8
#define	REV_CHIP_91110FD	9

/* Bank 3, Offset 0xc: Early RCV Register */
#define	ERCV			0xc
#define	ERCV_THRESHOLD_MASK	0x001f	/* ERCV int threshold (64b chunks) */
#define	ERCV_RCV_DISCARD	0x0080	/* Discard packet being received */

/* Control Byte */
#define	CTRL_CRC		0x10	/* Frame has CRC */
#define	CTRL_ODD		0x20	/* Frame has odd byte count */

/* Receive Frame Status */
#define	RX_MULTCAST		0x0001	/* Frame was multicast */
#define	RX_HASH_MASK		0x007e	/* Hash value for multicast */
#define	RX_HASH_SHIFT		1
#define	RX_TOOSHORT		0x0400	/* Frame was too short */
#define	RX_TOOLNG		0x0800	/* Frame was too long */
#define	RX_ODDFRM		0x1000	/* Frame has odd number of bytes */
#define	RX_BADCRC		0x2000	/* Frame failed CRC */
#define	RX_BROADCAST		0x4000	/* Frame was broadcast */
#define	RX_ALGNERR		0x8000	/* Frame had alignment error */
#define	RX_LEN_MASK		0x07ff

/* Length of status word + byte count + control bytes for packets */
#define	PKT_CTRL_DATA_LEN	6

/* Number of times to spin on TX allocations */
#define	TX_ALLOC_WAIT_TIME	1000

#endif /* IF_SMCREG_H_ */