1 /**  <at> file
2 *  Registers and Macros for Marvell 88E1000 Series PHYs. Ported from FreeBSD.
3 *
4 *  Copyright (c) 2011-2016, ARM Limited. All rights reserved.
5 *
6 *  This program and the accompanying materials
7 *  are licensed and made available under the terms and conditions of the BSD License
8 *  which accompanies this distribution.  The full text of the license may be found at
9 *  http://opensource.org/licenses/bsd-license.php
10 *
11 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 *
14 **/
15 /* $FreeBSD: src/sys/dev/mii/e1000phyreg.h,v 1.7.2.2.2.1 2010/06/14 02:09:06 kensmith Exp $ */
16 /*-
17  * Principal Author: Parag Patel
18  * Copyright (c) 2001
19  * All rights reserved.
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice unmodified, this list of conditions, and the following
26  *    disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
32  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
35  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41  * SUCH DAMAGE.
42  *
43  * Additonal Copyright (c) 2001 by Traakan Software under same licence.
44  * Secondary Author: Matthew Jacob
45  */
46 
47 /*-
48  * Derived by information released by Intel under the following license:
49  *
50  * Copyright (c) 1999 - 2001, Intel Corporation
51  *
52  * All rights reserved.
53  *
54  * Redistribution and use in source and binary forms, with or without
55  * modification, are permitted provided that the following conditions are met:
56  *
57  *  1. Redistributions of source code must retain the above copyright notice,
58  *     this list of conditions and the following disclaimer.
59  *
60  *  2. Redistributions in binary form must reproduce the above copyright notice,
61  *     this list of conditions and the following disclaimer in the
62  *     documentation and/or other materials provided with the distribution.
63  *
64  *  3. Neither the name of Intel Corporation nor the names of its contributors
65  *     may be used to endorse or promote products derived from this software
66  *     without specific prior written permission.
67  *
68  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
69  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
70  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
71  * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
72  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
73  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
74  * LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
75  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
76  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
77  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
78  *
79  */
80 
81 /*
82  * Marvell E1000 PHY registers
83  */
84 
85 #ifndef _E1000_PHYREG_H_
86 #define _E1000_PHYREG_H_
87 
88 #define E1000_MAX_REG_ADDRESS        0x1F
89 
90 #define E1000_CR            0x00    /* control register */
91 #define E1000_CR_SPEED_SELECT_MSB   0x0040
92 #define E1000_CR_COLL_TEST_ENABLE   0x0080
93 #define E1000_CR_FULL_DUPLEX        0x0100
94 #define E1000_CR_RESTART_AUTO_NEG   0x0200
95 #define E1000_CR_ISOLATE            0x0400
96 #define E1000_CR_POWER_DOWN         0x0800
97 #define E1000_CR_AUTO_NEG_ENABLE    0x1000
98 #define E1000_CR_SPEED_SELECT_LSB   0x2000
99 #define E1000_CR_LOOPBACK           0x4000
100 #define E1000_CR_RESET              0x8000
101 
102 #define E1000_CR_SPEED_1000         0x0040
103 #define E1000_CR_SPEED_100          0x2000
104 #define E1000_CR_SPEED_10           0x0000
105 
106 #define E1000_SR                    0x01    /* status register */
107 #define E1000_SR_EXTENDED           0x0001
108 #define E1000_SR_JABBER_DETECT      0x0002
109 #define E1000_SR_LINK_STATUS        0x0004
110 #define E1000_SR_AUTO_NEG           0x0008
111 #define E1000_SR_REMOTE_FAULT       0x0010
112 #define E1000_SR_AUTO_NEG_COMPLETE  0x0020
113 #define E1000_SR_PREAMBLE_SUPPRESS  0x0040
114 #define E1000_SR_EXTENDED_STATUS    0x0100
115 #define E1000_SR_100T2              0x0200
116 #define E1000_SR_100T2_FD           0x0400
117 #define E1000_SR_10T                0x0800
118 #define E1000_SR_10T_FD             0x1000
119 #define E1000_SR_100TX              0x2000
120 #define E1000_SR_100TX_FD           0x4000
121 #define E1000_SR_100T4              0x8000
122 #define E1000_SR_MEDIAMASK  (E1000_SR_100T4|E1000_SR_100TX_FD|E1000_SR_100TX| \
123   E1000_SR_10T_FD|E1000_SR_10T|E1000_SR_100T2_FD|E1000_SR_100T2)
124 
125 #define E1000_ID1            0x02    /* ID register 1 */
126 #define E1000_ID2            0x03    /* ID register 2 */
127 #define E1000_ID_88E1000     0x01410C50
128 #define E1000_ID_88E1000S    0x01410C40
129 #define E1000_ID_88E1011     0x01410C20
130 #define E1000_ID_MASK        0xFFFFFFF0
131 
132 #define IDR2_OUILSB 0xfc00  /* OUI LSB */
133 #define IDR2_MODEL  0x03f0  /* vendor model */
134 #define IDR2_REV  0x000f    /* vendor revision */
135 #define MII_OUI(id1, id2)   (((id1) << 6) | ((id2) >> 10))
136 #define MII_MODEL(id2)      (((id2) & IDR2_MODEL) >> 4)
137 #define MII_REV(id2)        ((id2) & IDR2_REV)
138 
139 
140 #define E1000_AR                0x04    /* autonegotiation advertise reg */
141 #define E1000_AR_SELECTOR_FIELD 0x0001
142 #define E1000_AR_10T            0x0020
143 #define E1000_AR_10T_FD         0x0040
144 #define E1000_AR_100TX          0x0080
145 #define E1000_AR_100TX_FD       0x0100
146 #define E1000_AR_100T4          0x0200
147 #define E1000_AR_PAUSE          0x0400
148 #define E1000_AR_ASM_DIR        0x0800
149 #define E1000_AR_REMOTE_FAULT   0x2000
150 #define E1000_AR_NEXT_PAGE      0x8000
151 #define E1000_AR_SPEED_MASK     0x01E0
152 
153 /* Autonegotiation register bits for fiber cards (Alaska Only!) */
154 #define E1000_FA_1000X_FD       0x0020
155 #define E1000_FA_1000X          0x0040
156 #define E1000_FA_SYM_PAUSE      0x0080
157 #define E1000_FA_ASYM_PAUSE     0x0100
158 #define E1000_FA_FAULT1         0x1000
159 #define E1000_FA_FAULT2         0x2000
160 #define E1000_FA_NEXT_PAGE      0x8000
161 
162 #define E1000_LPAR                0x05    /* autoneg link partner abilities reg */
163 #define E1000_LPAR_SELECTOR_FIELD 0x0001
164 #define E1000_LPAR_10T            0x0020
165 #define E1000_LPAR_10T_FD         0x0040
166 #define E1000_LPAR_100TX          0x0080
167 #define E1000_LPAR_100TX_FD       0x0100
168 #define E1000_LPAR_100T4          0x0200
169 #define E1000_LPAR_PAUSE          0x0400
170 #define E1000_LPAR_ASM_DIR        0x0800
171 #define E1000_LPAR_REMOTE_FAULT   0x2000
172 #define E1000_LPAR_ACKNOWLEDGE    0x4000
173 #define E1000_LPAR_NEXT_PAGE      0x8000
174 
175 /* autoneg link partner ability register bits for fiber cards (Alaska Only!) */
176 #define E1000_FPAR_1000X_FD       0x0020
177 #define E1000_FPAR_1000X          0x0040
178 #define E1000_FPAR_SYM_PAUSE      0x0080
179 #define E1000_FPAR_ASYM_PAUSE     0x0100
180 #define E1000_FPAR_FAULT1         0x1000
181 #define E1000_FPAR_FAULT2         0x2000
182 #define E1000_FPAR_ACK            0x4000
183 #define E1000_FPAR_NEXT_PAGE      0x8000
184 
185 #define E1000_ER                     0x06    /* autoneg expansion reg */
186 #define E1000_ER_LP_NWAY             0x0001
187 #define E1000_ER_PAGE_RXD            0x0002
188 #define E1000_ER_NEXT_PAGE           0x0004
189 #define E1000_ER_LP_NEXT_PAGE        0x0008
190 #define E1000_ER_PAR_DETECT_FAULT    0x0100
191 
192 #define E1000_NPTX                0x07    /* autoneg next page TX */
193 #define E1000_NPTX_MSG_CODE_FIELD 0x0001
194 #define E1000_NPTX_TOGGLE         0x0800
195 #define E1000_NPTX_ACKNOWLDGE2    0x1000
196 #define E1000_NPTX_MSG_PAGE       0x2000
197 #define E1000_NPTX_NEXT_PAGE      0x8000
198 
199 #define E1000_RNPR                0x08    /* autoneg link-partner (?) next page */
200 #define E1000_RNPR_MSG_CODE_FIELD 0x0001
201 #define E1000_RNPR_TOGGLE         0x0800
202 #define E1000_RNPR_ACKNOWLDGE2    0x1000
203 #define E1000_RNPR_MSG_PAGE       0x2000
204 #define E1000_RNPR_ACKNOWLDGE     0x4000
205 #define E1000_RNPR_NEXT_PAGE      0x8000
206 
207 #define E1000_1GCR                  0x09    /* 1000T (1G) control reg */
208 #define E1000_1GCR_ASYM_PAUSE       0x0080
209 #define E1000_1GCR_1000T            0x0100
210 #define E1000_1GCR_1000T_FD         0x0200
211 #define E1000_1GCR_REPEATER_DTE     0x0400
212 #define E1000_1GCR_MS_VALUE         0x0800
213 #define E1000_1GCR_MS_ENABLE        0x1000
214 #define E1000_1GCR_TEST_MODE_NORMAL 0x0000
215 #define E1000_1GCR_TEST_MODE_1      0x2000
216 #define E1000_1GCR_TEST_MODE_2      0x4000
217 #define E1000_1GCR_TEST_MODE_3      0x6000
218 #define E1000_1GCR_TEST_MODE_4      0x8000
219 #define E1000_1GCR_SPEED_MASK       0x0300
220 
221 #define E1000_1GSR                  0x0A    /* 1000T (1G) status reg */
222 #define E1000_1GSR_IDLE_ERROR_CNT   0x0000
223 #define E1000_1GSR_ASYM_PAUSE_DIR   0x0100
224 #define E1000_1GSR_LP               0x0400
225 #define E1000_1GSR_LP_FD            0x0800
226 #define E1000_1GSR_REMOTE_RX_STATUS 0x1000
227 #define E1000_1GSR_LOCAL_RX_STATUS  0x2000
228 #define E1000_1GSR_MS_CONFIG_RES    0x4000
229 #define E1000_1GSR_MS_CONFIG_FAULT  0x8000
230 
231 #define E1000_ESR                   0x0F    /* IEEE extended status reg */
232 #define E1000_ESR_1000T             0x1000
233 #define E1000_ESR_1000T_FD          0x2000
234 #define E1000_ESR_1000X             0x4000
235 #define E1000_ESR_1000X_FD          0x8000
236 
237 #define E1000_TX_POLARITY_MASK      0x0100
238 #define E1000_TX_NORMAL_POLARITY    0
239 
240 #define E1000_AUTO_POLARITY_DISABLE 0x0010
241 
242 #define E1000_SCR                   0x10    /* special control register */
243 #define E1000_SCR_JABBER_DISABLE    0x0001
244 #define E1000_SCR_POLARITY_REVERSAL 0x0002
245 #define E1000_SCR_SQE_TEST          0x0004
246 #define E1000_SCR_INT_FIFO_DISABLE  0x0008
247 #define E1000_SCR_CLK125_DISABLE    0x0010
248 #define E1000_SCR_MDI_MANUAL_MODE   0x0000
249 #define E1000_SCR_MDIX_MANUAL_MODE  0x0020
250 #define E1000_SCR_AUTO_X_1000T      0x0040
251 #define E1000_SCR_AUTO_X_MODE       0x0060
252 #define E1000_SCR_10BT_EXT_ENABLE   0x0080
253 #define E1000_SCR_MII_5BIT_ENABLE   0x0100
254 #define E1000_SCR_SCRAMBLER_DISABLE 0x0200
255 #define E1000_SCR_FORCE_LINK_GOOD   0x0400
256 #define E1000_SCR_ASSERT_CRS_ON_TX  0x0800
257 #define E1000_SCR_RX_FIFO_DEPTH_6   0x0000
258 #define E1000_SCR_RX_FIFO_DEPTH_8   0x1000
259 #define E1000_SCR_RX_FIFO_DEPTH_10  0x2000
260 #define E1000_SCR_RX_FIFO_DEPTH_12  0x3000
261 #define E1000_SCR_TX_FIFO_DEPTH_6   0x0000
262 #define E1000_SCR_TX_FIFO_DEPTH_8   0x4000
263 #define E1000_SCR_TX_FIFO_DEPTH_10  0x8000
264 #define E1000_SCR_TX_FIFO_DEPTH_12  0xC000
265 
266 /* 88E3016 only */
267 #define    E1000_SCR_AUTO_MDIX        0x0030
268 #define    E1000_SCR_SIGDET_POLARITY  0x0040
269 #define    E1000_SCR_EXT_DISTANCE     0x0080
270 #define    E1000_SCR_FEFI_DISABLE     0x0100
271 #define    E1000_SCR_NLP_GEN_DISABLE  0x0800
272 #define    E1000_SCR_LPNP             0x1000
273 #define    E1000_SCR_NLP_CHK_DISABLE  0x2000
274 #define    E1000_SCR_EN_DETECT        0x4000
275 
276 #define E1000_SCR_EN_DETECT_MASK      0x0300
277 
278 /* 88E1112 page 1 fiber specific control */
279 #define E1000_SCR_FIB_TX_DIS          0x0008
280 #define E1000_SCR_FIB_SIGDET_POLARITY 0x0200
281 #define E1000_SCR_FIB_FORCE_LINK      0x0400
282 
283 /* 88E1112 page 2 */
284 #define E1000_SCR_MODE_MASK           0x0380
285 #define E1000_SCR_MODE_AUTO           0x0180
286 #define E1000_SCR_MODE_COPPER         0x0280
287 #define E1000_SCR_MODE_1000BX         0x0380
288 
289 /* 88E1116 page 0 */
290 #define    E1000_SCR_POWER_DOWN       0x0004
291 /* 88E1116, 88E1149 page 2 */
292 #define    E1000_SCR_RGMII_POWER_UP   0x0008
293 
294 /* 88E1116, 88E1149 page 3 */
295 #define E1000_SCR_LED_STAT0_MASK      0x000F
296 #define E1000_SCR_LED_STAT1_MASK      0x00F0
297 #define E1000_SCR_LED_INIT_MASK       0x0F00
298 #define E1000_SCR_LED_LOS_MASK        0xF000
299 #define E1000_SCR_LED_STAT0(x)        ((x) & E1000_SCR_LED_STAT0_MASK)
300 #define E1000_SCR_LED_STAT1(x)        ((x) & E1000_SCR_LED_STAT1_MASK)
301 #define E1000_SCR_LED_INIT(x)         ((x) & E1000_SCR_LED_INIT_MASK)
302 #define E1000_SCR_LED_LOS(x)          ((x) & E1000_SCR_LED_LOS_MASK)
303 
304 #define E1000_SSR                   0x11    /* special status register */
305 #define E1000_SSR_JABBER            0x0001
306 #define E1000_SSR_REV_POLARITY      0x0002
307 #define E1000_SSR_MDIX              0x0020
308 #define E1000_SSR_LINK              0x0400
309 #define E1000_SSR_SPD_DPLX_RESOLVED 0x0800
310 #define E1000_SSR_PAGE_RCVD         0x1000
311 #define E1000_SSR_DUPLEX            0x2000
312 #define E1000_SSR_SPEED             0xC000
313 #define E1000_SSR_10MBS             0x0000
314 #define E1000_SSR_100MBS            0x4000
315 #define E1000_SSR_1000MBS           0x8000
316 
317 #define E1000_IER                   0x12    /* interrupt enable reg */
318 #define E1000_IER_JABBER            0x0001
319 #define E1000_IER_POLARITY_CHANGE   0x0002
320 #define E1000_IER_MDIX_CHANGE       0x0040
321 #define E1000_IER_FIFO_OVER_UNDERUN 0x0080
322 #define E1000_IER_FALSE_CARRIER     0x0100
323 #define E1000_IER_SYMBOL_ERROR      0x0200
324 #define E1000_IER_LINK_STAT_CHANGE  0x0400
325 #define E1000_IER_AUTO_NEG_COMPLETE 0x0800
326 #define E1000_IER_PAGE_RECEIVED     0x1000
327 #define E1000_IER_DUPLEX_CHANGED    0x2000
328 #define E1000_IER_SPEED_CHANGED     0x4000
329 #define E1000_IER_AUTO_NEG_ERR      0x8000
330 
331 /* 88E1116, 88E1149 page 3, LED timer control. */
332 #define    E1000_PULSE_MASK       0x7000
333 #define    E1000_PULSE_NO_STR     0    /* no pulse stretching */
334 #define    E1000_PULSE_21MS       1    /* 21 ms to 42 ms */
335 #define    E1000_PULSE_42MS       2    /* 42 ms to 84 ms */
336 #define    E1000_PULSE_84MS       3    /* 84 ms to 170 ms */
337 #define    E1000_PULSE_170MS      4    /* 170 ms to 340 ms */
338 #define    E1000_PULSE_340MS      5    /* 340 ms to 670 ms */
339 #define    E1000_PULSE_670MS      6    /* 670 ms to 1300 ms */
340 #define    E1000_PULSE_1300MS     7    /* 1300 ms to 2700 ms */
341 #define    E1000_PULSE_DUR(x)     ((x) &    E1000_PULSE_MASK)
342 
343 #define    E1000_BLINK_MASK       0x0700
344 #define    E1000_BLINK_42MS       0    /* 42 ms */
345 #define    E1000_BLINK_84MS       1    /* 84 ms */
346 #define    E1000_BLINK_170MS      2    /* 170 ms */
347 #define    E1000_BLINK_340MS      3    /* 340 ms */
348 #define    E1000_BLINK_670MS      4    /* 670 ms */
349 #define    E1000_BLINK_RATE(x)    ((x) &    E1000_BLINK_MASK)
350 
351 #define E1000_ISR                   0x13    /* interrupt status reg */
352 #define E1000_ISR_JABBER            0x0001
353 #define E1000_ISR_POLARITY_CHANGE   0x0002
354 #define E1000_ISR_MDIX_CHANGE       0x0040
355 #define E1000_ISR_FIFO_OVER_UNDERUN 0x0080
356 #define E1000_ISR_FALSE_CARRIER     0x0100
357 #define E1000_ISR_SYMBOL_ERROR      0x0200
358 #define E1000_ISR_LINK_STAT_CHANGE  0x0400
359 #define E1000_ISR_AUTO_NEG_COMPLETE 0x0800
360 #define E1000_ISR_PAGE_RECEIVED     0x1000
361 #define E1000_ISR_DUPLEX_CHANGED    0x2000
362 #define E1000_ISR_SPEED_CHANGED     0x4000
363 #define E1000_ISR_AUTO_NEG_ERR      0x8000
364 
365 #define E1000_ESCR                  0x14    /* extended special control reg */
366 #define E1000_ESCR_FIBER_LOOPBACK   0x4000
367 #define E1000_ESCR_DOWN_NO_IDLE     0x8000
368 #define E1000_ESCR_TX_CLK_2_5       0x0060
369 #define E1000_ESCR_TX_CLK_25        0x0070
370 #define E1000_ESCR_TX_CLK_0         0x0000
371 
372 #define E1000_RECR                  0x15    /* RX error counter reg */
373 
374 #define E1000_EADR                  0x16    /* extended address reg */
375 
376 #define E1000_LCR                   0x18    /* LED control reg */
377 #define E1000_LCR_LED_TX            0x0001
378 #define E1000_LCR_LED_RX            0x0002
379 #define E1000_LCR_LED_DUPLEX        0x0004
380 #define E1000_LCR_LINK              0x0008
381 #define E1000_LCR_BLINK_42MS        0x0000
382 #define E1000_LCR_BLINK_84MS        0x0100
383 #define E1000_LCR_BLINK_170MS       0x0200
384 #define E1000_LCR_BLINK_340MS       0x0300
385 #define E1000_LCR_BLINK_670MS       0x0400
386 #define E1000_LCR_PULSE_OFF         0x0000
387 #define E1000_LCR_PULSE_21_42MS     0x1000
388 #define E1000_LCR_PULSE_42_84MS     0x2000
389 #define E1000_LCR_PULSE_84_170MS    0x3000
390 #define E1000_LCR_PULSE_170_340MS   0x4000
391 #define E1000_LCR_PULSE_340_670MS   0x5000
392 #define E1000_LCR_PULSE_670_13S     0x6000
393 #define E1000_LCR_PULSE_13_26S      0x7000
394 
395 /* The following register is found only on the 88E1011 Alaska PHY */
396 #define E1000_ESSR                  0x1B    /* Extended PHY specific sts */
397 #define E1000_ESSR_FIBER_LINK       0x2000
398 #define E1000_ESSR_GMII_COPPER      0x000f
399 #define E1000_ESSR_GMII_FIBER       0x0007
400 #define E1000_ESSR_TBI_COPPER       0x000d
401 #define E1000_ESSR_TBI_FIBER        0x0005
402 
403 struct e1000phy_softc {
404   struct mii_softc mii_sc;
405   INTN mii_model;
406   const struct msk_mii_data *mmd;
407   VOID *sc_if; /* parent logical controller */
408 };
409 
410 #endif /* _E1000_PHYREG_H_ */
411