summaryrefslogtreecommitdiff
path: root/drivers/smsc9118.h
blob: c338f58b73dd067d52aeac52f20516358e5fbd1a (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
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
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
//--------------------------------------------------------------------------
//
// File name:      smsc9118.h
//
// Abstract:      Address map and register definitions for SMSC LAN9118
//          ethernet controller.
//
// Start Automated RH
// *** Do not edit between "Start Automated RH" and "End Automated RH" ***
//
// Copyright 2005, Seagate Technology LLC
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
//
// Revision History
//
// *** Do not edit between "Start Automated RH" and "End Automated RH" ***
// End Automated RH
//
//
//--------------------------------------------------------------------------
/*---------------------------------------------------------------------------
 * Copyright(c) 2005-2006 SMSC
 *
 *  Use of this source code is subject to the terms of the SMSC Software
 *  License Agreement (SLA) under which you licensed this software product.	 
 *  If you did not accept the terms of the SLA, you are not authorized to use
 *  this source code. 
 *  
 *  This code and information is provided as is without warranty of any kind,
 *  either expressed or implied, including but not limited to the implied
 *  warranties of merchantability and/or fitness for a particular purpose.
 *   
 *  File name   : smsc9118.c 
 *  Description : smsc9118 polled driver (non-interrupt driven)
 *  
 *  History	    :
 *  	09-27-06 MDG		First Release
 *			modified for ARM platform
 *----------------------------------------------------------------------------*/

#ifdef CONFIG_DRIVER_SMSC9118

//*************************************************************************
 //  GLOBAL DEFINITIONS

//*************************************************************************
#define 	LAN9118_WARN(s) (printf("%s", s))

#define DRIVER_VERSION          0x101
#define	BUILD_NUMBER			"092706"

//*************************************************************************
 //  DATA STRUCTURE DEFINITIONS

//*************************************************************************


#ifndef 	_SMSC9118_H
#define 	_SMSC9118_H

#ifndef	CONFIG_SMSC9118_BASE
#error	"CONFIG_SMSC9118_BASE is not defined."
#else
#define 	SMSC9118_BASE		CONFIG_SMSC9118_BASE
#endif

#define 	MAC_TIMEOUT 		200
#define 	PHY_TIMEOUT			200
//#define	PHY_AN_TIMEOUT	  3000 * 1000 // 3 seconds
#define 	PHY_AN_TIMEOUT		10	// 3 seconds
#define 	SRST_TIMEOUT		100
#define 	TX_TIMEOUT			3000		// 3000 * 1/HZ
#define 	FFWD_TIMEOUT		100
#define 	PHY_ADDR			1
#define 	FALSE				0
#define 	TRUE				1

#define 	DELAY(n)	( {   \
						int _i = 100*n; \
						do { \
							  volatile ulong _temp; \
							  _temp = *BYTE_TEST; \
						} while (--_i); \
				  } )

struct rxQue {
	  int	index;		// Index into NetRxPackets[]
	  int	len;  		// Length of packet at this index
};

// Lan9118 memory map

// Control/Status Register Map (directly addressable registers)
#define RX_FIFO_PORT				(volatile ulong *)(SMSC9118_BASE + 0x0)
#define RX_FIFO_ALIAS_PORTS 		(volatile ulong *)(SMSC9118_BASE + 0x4)
#define TX_FIFO_PORT				(volatile ulong *)(SMSC9118_BASE + 0x20)
#define TX_FIFO_ALIAS_PORTS 		(volatile ulong *)(SMSC9118_BASE + 0x24)
#define RX_STATUS_FIFO_PORT 		(volatile ulong *)(SMSC9118_BASE + 0x40)
#define RX_STATUS_FIFO_PEEK 		(volatile ulong *)(SMSC9118_BASE + 0x44)
#define TX_STATUS_FIFO_PORT 		(volatile ulong *)(SMSC9118_BASE + 0x48)
#define TX_STATUS_FIFO_PEEK 		(volatile ulong *)(SMSC9118_BASE + 0x4C)
#define TX_STATUS_FIFO_ES 			(0x00008000)
#define TX_STATUS_FIFO_TAG_MSK		(0xffff0000)

#define ID_REV						(volatile ulong *)(SMSC9118_BASE + 0x50)
#define		ID_REV_ID_MASK			(0xFFFF0000)
#define 	ID_REV_CHIP_118   		(0x01180000)
#define 	ID_REV_CHIP_218   		(0x118A0000)
#define 	ID_REV_CHIP_211   		(0x92110000)
#define 	ID_REV_CHIP_221   		(0x92210000)
#define		ID_REV_REV_MASK			(0x0000FFFF)

#define IRQ_CFG 					(volatile ulong *)(SMSC9118_BASE + 0x54)
#define 	IRQ_CFG_MASTER_INT		(0x00001000)
#define 	IRQ_CFG_ENABLE			(0x00000100)
#define 	IRQ_CFG_IRQ_POL_HIGH	(0x00000010)
#define 	IRQ_CFG_IRQ_TYPE_PUPU	(0x00000001)

#define INT_STS 					(volatile ulong *)(SMSC9118_BASE + 0x58)
#define 	INT_STS_SW_INT			(0x80000000)
#define 	INT_STS_TXSTOP_INT		(0x02000000)
#define 	INT_STS_RXSTOP_INT		(0x01000000)
#define 	INT_STS_RXDFH_INT 		(0x00800000)
#define 	INT_STS_RXDF_INT  		(0x00400000)
#define 	INT_STS_TIOC_INT  		(0x00200000)
#define 	INT_STS_GPT_INT 		(0x00080000)
#define 	INT_STS_PHY_INT 		(0x00040000)
#define 	INT_STS_PMT_INT 		(0x00020000)
#define 	INT_STS_TXSO_INT  		(0x00010000)
#define 	INT_STS_RWT_INT 		(0x00008000)
#define 	INT_STS_RXE_INT 		(0x00004000)
#define 	INT_STS_TXE_INT 		(0x00002000)
#define 	INT_STS_ERX_INT 		(0x00001000)
#define 	INT_STS_TDFU_INT  		(0x00000800)
#define 	INT_STS_TDFO_INT  		(0x00000400)
#define 	INT_STS_TDFA_INT  		(0x00000200)
#define 	INT_STS_TSFF_INT  		(0x00000100)
#define 	INT_STS_TSFL_INT  		(0x00000080)
#define 	INT_STS_RDFO_INT  		(0x00000040)
#define 	INT_STS_RDFL_INT  		(0x00000020)
#define 	INT_STS_RSFF_INT  		(0x00000010)
#define 	INT_STS_RSFL_INT  		(0x00000008)
#define 	INT_STS_GPIO2_INT 		(0x00000004)
#define 	INT_STS_GPIO1_INT 		(0x00000002)
#define 	INT_STS_GPIO0_INT 		(0x00000001)

#define INT_EN						(volatile ulong *)(SMSC9118_BASE + 0x5C)
#define 	INT_EN_SW_INT_EN  		(0x80000000)
#define 	INT_EN_TXSTOP_INT_EN	(0x02000000)
#define 	INT_EN_RXSTOP_INT_EN	(0x01000000)
#define 	INT_EN_RXDFH_INT_EN 	(0x00800000)
#define 	INT_EN_RXDF_INT_EN		(0x00400000)
#define 	INT_EN_TIOC_INT_EN		(0x00200000)
#define 	INT_EN_GPT_INT_EN 		(0x00080000)
#define 	INT_EN_PHY_INT_EN 		(0x00040000)
#define 	INT_EN_PMT_INT_EN 		(0x00020000)
#define 	INT_EN_TXSO_INT_EN		(0x00010000)
#define 	INT_EN_RWT_INT_EN 		(0x00008000)
#define 	INT_EN_RXE_INT_EN 		(0x00004000)
#define 	INT_EN_TXE_INT_EN 		(0x00002000)
#define 	INT_EN_ERX_INT_EN 		(0x00001000)
#define 	INT_EN_TDFU_INT_EN		(0x00000800)
#define 	INT_EN_TDFO_INT_EN		(0x00000400)
#define 	INT_EN_TDFA_INT_EN		(0x00000200)
#define 	INT_EN_TSFF_INT_EN		(0x00000100)
#define 	INT_EN_TSFL_INT_EN		(0x00000080)
#define 	INT_EN_RDFO_INT_EN		(0x00000040)
#define 	INT_EN_RDFL_INT_EN		(0x00000020)
#define 	INT_EN_RSFF_INT_EN		(0x00000010)
#define 	INT_EN_RSFL_INT_EN		(0x00000008)
#define 	INT_EN_GPIO2_EN 		(0x00000004)
#define 	INT_EN_GPIO1_EN 		(0x00000002)
#define 	INT_EN_GPIO0_EN 		(0x00000001)

#define BYTE_TEST		  			(volatile ulong *)(SMSC9118_BASE + 0x64)
#define 	BYTE_TEST_VAL			(0x87654321)

#define FIFO_INT		  			(volatile ulong *)(SMSC9118_BASE + 0x68)
#define 	FIFO_INT_TDAL_MSK 		(0xFF000000)
#define 	FIFO_INT_TSL_MSK  		(0x00FF0000)
#define 	FIFO_INT_RDAL_MSK 		(0x0000FF00)
#define 	FIFO_INT_RSL_MSK  		(0x000000FF)

#define RX_CFG						(volatile ulong *)(SMSC9118_BASE + 0x6C)
#define 	RX_CFG_END_ALIGN4 		(0x00000000)
#define 	RX_CFG_END_ALIGN16		(0x40000000)
#define 	RX_CFG_END_ALIGN32		(0x80000000)
#define 	RX_CFG_FORCE_DISCARD	(0x00008000)
#define 	RX_CFG_RXDOFF_MSK 		(0x00003C00)
#define 	RX_CFG_RXBAD			(0x00000001)

#define TX_CFG						(volatile ulong *)(SMSC9118_BASE + 0x70)
#define 	TX_CFG_TXS_DUMP 		(0x00008000)
#define 	TX_CFG_TXD_DUMP 		(0x00004000)
#define 	TX_CFG_TXSAO			(0x00000004)
#define 	TX_CFG_TX_ON			(0x00000002)
#define 	TX_CFG_STOP_TX			(0x00000001)

#define HW_CFG						(volatile ulong *)(SMSC9118_BASE + 0x74)
#define 	HW_CFG_TTM		  		(0x00200000)
#define 	HW_CFG_SF		  		(0x00100000)
#define 	HW_CFG_TX_FIF_SZ_MSK	(0x000F0000)
#define 	HW_CFG_TR_MSK			(0x00003000)
#define 	HW_CFG_BITMD_MSK  		(0x00000004)
#define 	HW_CFG_BITMD_32 		(0x00000004)
#define 	HW_CFG_SRST_TO			(0x00000002)
#define 	HW_CFG_SRST 	  		(0x00000001)

#define RX_DP_CTL		  			(volatile ulong *)(SMSC9118_BASE + 0x78)
#define 	RX_DP_FFWD		  		(0x80000000)
#define 	RX_DP_RX_FFWD_MSK 		(0x00000FFF)

#define RX_FIFO_INF 	  			(volatile ulong *)(SMSC9118_BASE + 0x7C)
#define 	RX_FIFO_RXSUSED_MSK 	(0x00FF0000)
#define 	RX_FIFO_RXDUSED_MSK 	(0x0000FFFF)

#define TX_FIFO_INF 	  			(volatile ulong *)(SMSC9118_BASE + 0x80)
#define 	TX_FIFO_TXSUSED_MSK 	(0x00FF0000)
#define 	TX_FIFO_TDFREE_MSK		(0x0000FFFF)

#define PWR_MGMT		  			(volatile ulong *)(SMSC9118_BASE + 0x84)
#define 	PWR_MGMT_PM_MODE_MSK	(0x00030000)
#define 	PWR_MGMT_PM_MODE_MSK_LE (0x00000003)
#define 	PWR_MGMT_PM__D0 		(0x00000000)
#define 	PWR_MGMT_PM__D1 		(0x00010000)
#define 	PWR_MGMT_PM__D2 		(0x00020000)
#define 	PWR_MGMT_PHY_RST  		(0x00000400)
#define 	PWR_MGMT_WOL_EN 		(0x00000200)
#define 	PWR_MGMT_ED_EN			(0x00000100)
#define 	PWR_MGMT_PME_TYPE_PUPU	(0x00000040)
#define 	PWR_MGMT_WUPS_MSK 		(0x00000030)
#define 	PWR_MGMT_WUPS_NOWU		(0x00000000)
#define 	PWR_MGMT_WUPS_D2D0		(0x00000010)
#define 	PWR_MGMT_WUPS_D1D0		(0x00000020)
#define 	PWR_MGMT_WUPS_UNDEF 	(0x00000030)
#define 	PWR_MGMT_PME_IND_PUL	(0x00000008)
#define 	PWR_MGMT_PME_POL_HIGH	(0x00000004)
#define 	PWR_MGMT_PME_EN 		(0x00000002)
#define 	PWR_MGMT_PME_READY		(0x00000001)

#define GPIO_CFG		  			(volatile ulong *)(SMSC9118_BASE + 0x88)
#define 	GPIO_CFG_LEDx_MSK 		(0x70000000)
#define 	GPIO_CFG_LED1_EN  		(0x10000000)
#define 	GPIO_CFG_LED2_EN  		(0x20000000)
#define 	GPIO_CFG_LED3_EN  		(0x40000000)
#define 	GPIO_CFG_GPIOBUFn_MSK	(0x00070000)
#define 	GPIO_CFG_GPIOBUF0_PUPU	(0x00010000)
#define 	GPIO_CFG_GPIOBUF1_PUPU	(0x00020000)
#define 	GPIO_CFG_GPIOBUF2_PUPU	(0x00040000)
#define 	GPIO_CFG_GPDIRn_MSK 	(0x00000700)
#define 	GPIO_CFG_GPIOBUF0_OUT	(0x00000100)
#define 	GPIO_CFG_GPIOBUF1_OUT	(0x00000200)
#define 	GPIO_CFG_GPIOBUF2_OUT	(0x00000400)
#define 	GPIO_CFG_GPIOD_MSK		(0x00000007)
#define 	GPIO_CFG_GPIOD0 		(0x00000001)
#define 	GPIO_CFG_GPIOD1 		(0x00000002)
#define 	GPIO_CFG_GPIOD2 		(0x00000004)

#define GPT_CFG 					(volatile ulong *)(SMSC9118_BASE + 0x8C)
#define 	GPT_CFG_TIMER_EN  		(0x20000000)
#define 	GPT_CFG_GPT_LOAD_MSK	(0x0000FFFF)

#define	GPT_CNT 					(volatile ulong *)(SMSC9118_BASE + 0x90)
#define 	GPT_CNT_MSK 	  		(0x0000FFFF)

#define FPGA_REV		  			(volatile ulong *)(SMSC9118_BASE + 0x94)

#define ENDIAN						(volatile ulong *)(SMSC9118_BASE + 0x98)
#define 	ENDIAN_BIG		  		(0xFFFFFFFF)

#define FREE_RUN		  			(volatile ulong *)(SMSC9118_BASE + 0x9C)
#define 	FREE_RUN_FR_CNT_MSK 	(0xFFFFFFFF)

#define RX_DROP 					(volatile ulong *)(SMSC9118_BASE + 0xA0)
#define 	RX_DROP_RX_DFC_MSK		(0xFFFFFFFF)

#define MAC_CSR_CMD 	  			(volatile ulong *)(SMSC9118_BASE + 0xA4)
#define 	MAC_CSR_CMD_CSR_BUSY	(0x80000000)
#define 	MAC_CSR_CMD_RNW 		(0x40000000)
#define 	MAC_RD_CMD(Reg)   		((Reg & 0x000000FF) | \
									 (MAC_CSR_CMD_CSR_BUSY | MAC_CSR_CMD_RNW))
#define 	MAC_WR_CMD(Reg)   		((Reg & 0x000000FF) | \
									 (MAC_CSR_CMD_CSR_BUSY))

#define MAC_CSR_DATA				(volatile ulong *)(SMSC9118_BASE + 0xA8)

#define AFC_CFG 					(volatile ulong *)(SMSC9118_BASE + 0xAC)
#define 	AFC_CFG_AFC_HI_MSK		(0x00FF0000)
#define 	AFC_CFG_AFC_LO_MSK		(0x0000FF00)

#define E2P_CMD 					(volatile ulong *)(SMSC9118_BASE + 0xB0)
#define E2P_DATA		  			(volatile ulong *)(SMSC9118_BASE + 0xB4)

// MAC Control and Status Registers (accessed through MAC_CSR_CMD/_DATA regs)
#define MAC_CR						(0x1)
#define 	MAC_CR_RXALL			(0x80000000)
#define 	MAC_CR_HBDIS			(0x10000000)
#define 	MAC_CR_RCVOWN			(0x00800000)
#define 	MAC_CR_LOOPBK			(0x00200000)
#define 	MAC_CR_FDPX 	  		(0x00100000)
#define 	MAC_CR_MCPAS			(0x00080000)
#define 	MAC_CR_PRMS 	  		(0x00040000)
#define 	MAC_CR_INVFILT			(0x00020000)
#define 	MAC_CR_PASSBAD			(0x00010000)
#define 	MAC_CR_HFILT			(0x00008000)
#define 	MAC_CR_HPFILT			(0x00002000)
#define 	MAC_CR_LCOLL			(0x00001000)
#define 	MAC_CR_BCAST			(0x00000800)
#define 	MAC_CR_DISRTY			(0x00000400)
#define 	MAC_CR_PADSTR			(0x00000100)
#define 	MAC_CR_BOLMT_MSK  		(0x000000C0)
#define 	MAC_CR_BOLMT_10 		(0x00000000)
#define 	MAC_CR_BOLMT_8			(0x00000040)
#define 	MAC_CR_BOLMT_4			(0x00000080)
#define 	MAC_CR_BOLMT_1			(0x000000C0)
#define 	MAC_CR_DFCHK			(0x00000020)
#define 	MAC_CR_TXEN 	  		(0x00000008)
#define 	MAC_CR_RXEN 	  		(0x00000004)

#define MAC_ADDRH		  			(0x2)
#define 	MAC_ADDRH_MSK			(0x0000FFFF)

#define MAC_ADDRL		  			(0x3)
#define 	MAC_ADDRL_MSK			(0xFFFFFFFF)

#define MAC_HASHH		  			(0x4)
#define 	MAC_HASHH_MSK			(0xFFFFFFFF)

#define MAC_HASHL		  			(0x5)
#define 	MAC_HASHL_MSK			(0xFFFFFFFF)

#define MAC_MIIACC		  			(0x6)
#define 	MAC_MIIACC_MII_WRITE	(0x00000002)
#define 	MAC_MIIACC_MII_BUSY 	(0x00000001)
#define 	MAC_MII_RD_CMD(Addr,Reg)	(((Addr & 0x1f) << 11) | \
										 ((Reg & 0x1f)) << 6)
#define 	MAC_MII_WR_CMD(Addr,Reg)	(((Addr & 0x1f) << 11) | \
							  			 ((Reg & 0x1f) << 6) | \
							  			 MAC_MIIACC_MII_WRITE)

#define MAC_MIIDATA 	  			(0x7)
#define 	MAC_MIIDATA_MSK 		(0x0000FFFF)
#define 	MAC_MII_DATA(Data)		(Data & MAC_MIIDATA_MSK)

#define MAC_FLOW		  			(0x8)
#define 	MAC_FLOW_FCPT_MSK 		(0xFFFF0000)
#define 	MAC_FLOW_FCPASS 		(0x00000004)
#define 	MAC_FLOW_FCEN			(0x00000002)
#define 	MAC_FLOW_FCBSY			(0x00000001)

#define MAC_VLAN1		  			(0x9)
#define MAC_VLAN2		  			(0xA)
#define MAC_WUFF		  			(0xB)

#define MAC_WUCSR		  			(0xC)
#define 	MAC_WUCSR_GUE			(0x00000200)
#define 	MAC_WUCSR_WUFR			(0x00000040)
#define 	MAC_WUCSR_MPR			(0x00000020)
#define 	MAC_WUCSR_WUEN			(0x00000004)
#define 	MAC_WUCSR_MPEN			(0x00000002)

// PHY Control and Status Registers (accessed through MAC_MIIACC/_MIIDATA regs)
#define PHY_BCR 					(0x0)
#define 	PHY_BCR_RST 	  		(0x8000)
#define 	PHY_BCR_LOOPBK			(0x4000)
#define 	PHY_BCR_SS		  		(0x2000)
#define 	PHY_BCR_ANE 	  		(0x1000)
#define 	PHY_BCR_PWRDN			(0x0800)
#define 	PHY_BCR_RSTAN			(0x0200)
#define 	PHY_BCR_FDPLX			(0x0100)
#define 	PHY_BCR_COLLTST 		(0x0080)

#define PHY_BSR 					(0x1)
#define 	PHY_BSR_100_T4_ABLE 	(0x8000)
#define 	PHY_BSR_100_TX_FDPLX	(0x4000)
#define 	PHY_BSR_100_TX_HDPLX	(0x2000)
#define 	PHY_BSR_10_FDPLX  		(0x1000)
#define 	PHY_BSR_10_HDPLX  		(0x0800)
#define 	PHY_BSR_ANC 	  		(0x0020)
#define 	PHY_BSR_REM_FAULT 		(0x0010)
#define 	PHY_BSR_AN_ABLE 		(0x0008)
#define 	PHY_BSR_LINK_STATUS 	(0x0004)
#define 	PHY_BSR_JAB_DET 		(0x0002)
#define 	PHY_BSR_EXT_CAP 		(0x0001)

#define PHY_ID1 					(0x2)
#define 	PHY_ID1_MSK 	  		(0xFFFF)
#define 	PHY_ID1_LAN9118 		(0x0007)
#define 	PHY_ID1_LAN9218 		(PHY_ID1_LAN9118)

#define PHY_ID2 					(0x3)
#define 	PHY_ID2_MSK 	  		(0xFFFF)
#define 	PHY_ID2_MODEL_MSK 		(0x03F0)
#define 	PHY_ID2_REV_MSK 		(0x000F)
#define 	PHY_ID2_LAN9118 		(0xC0D1)
#define 	PHY_ID2_LAN9218 		(0xC0C3)

#define PHY_ANAR		  			(0x4)
#define 	PHY_ANAR_NXTPG_CAP		(0x8000)
#define 	PHY_ANAR_REM_FAULT		(0x2000)
#define 	PHY_ANAR_PAUSE_OP_MSK	(0x0C00)
#define 	PHY_ANAR_PAUSE_OP_NONE	(0x0000)
#define 	PHY_ANAR_PAUSE_OP_ASLP	(0x0400)
#define 	PHY_ANAR_PAUSE_OP_SLP	(0x0800)
#define 	PHY_ANAR_PAUSE_OP_BOTH	(0x0C00)
#define 	PHY_ANAR_100_T4_ABLE	(0x0200)
#define 	PHY_ANAR_100_TX_FDPLX	(0x0100)
#define 	PHY_ANAR_100_TX_ABLE	(0x0080)
#define 	PHY_ANAR_10_FDPLX 		(0x0040)
#define 	PHY_ANAR_10_ABLE  		(0x0020)

#define PHY_ANLPAR		  			(0x5)
#define 	PHY_ANLPAR_NXTPG_CAP	(0x8000)
#define 	PHY_ANLPAR_ACK			(0x4000)
#define 	PHY_ANLPAR_REM_FAULT	(0x2000)
#define 	PHY_ANLPAR_PAUSE_CAP	(0x0400)
#define 	PHY_ANLPAR_100_T4_ABLE	(0x0200)
#define 	PHY_ANLPAR_100_TX_FDPLX (0x0100)
#define 	PHY_ANLPAR_100_TX_ABLE	(0x0080)
#define 	PHY_ANLPAR_10_FDPLX 	(0x0040)
#define 	PHY_ANLPAR_10_ABLE		(0x0020)

#define PHY_ANEXPR		  			(0x6)
#define 	PHY_ANEXPR_PARDET_FAULT (0x0010)
#define 	PHY_ANEXPR_LP_NXTPG_CAP (0x0008)
#define 	PHY_ANEXPR_NXTPG_CAP	(0x0004)
#define 	PHY_ANEXPR_NEWPG_REC	(0x0002)
#define 	PHY_ANEXPR_LP_AN_ABLE	(0x0001)

#define PHY_SILREV		  			(0x10)

#define PHY_MCSR		  			(0x11)
#define 	PHY_MCSR_FASTRIP  		(0x4000)
#define 	PHY_MCSR_EDPWRDOWN		(0x2000)
#define 	PHY_MCSR_LOWSQEN  		(0x0800)
#define 	PHY_MCSR_MDPREBP  		(0x0400)
#define 	PHY_MCSR_FASTEST  		(0x0100)
#define 	PHY_MCSR_PHYADBP  		(0x0008)
#define 	PHY_MCSR_FGLS			(0x0004)
#define 	PHY_MCSR_ENERGYON 		(0x0002)

#define PHY_SPMODES 	  			(0x12)

#define PHY_CSIR		  			(0x1B)
#define 	PHY_CSIR_SQEOFF 		(0x0800)
#define 	PHY_CSIR_FEFIEN 		(0x0020)
#define 	PHY_CSIR_XPOL			(0x0010)

#define PHY_ISR 					(0x1C)
#define 	PHY_ISR_INT7			(0x0080)
#define 	PHY_ISR_INT6			(0x0040)
#define 	PHY_ISR_INT5			(0x0020)
#define 	PHY_ISR_INT4			(0x0010)
#define 	PHY_ISR_INT3			(0x0008)
#define 	PHY_ISR_INT2			(0x0004)
#define 	PHY_ISR_INT1			(0x0002)

#define PHY_IMR 					(0x1E)
#define 	PHY_IMR_INT7			(0x0080)
#define 	PHY_IMR_INT6			(0x0040)
#define 	PHY_IMR_INT5			(0x0020)
#define 	PHY_IMR_INT4			(0x0010)
#define 	PHY_IMR_INT3			(0x0008)
#define 	PHY_IMR_INT2			(0x0004)
#define 	PHY_IMR_INT1			(0x0002)

#define PHY_PHYSCSR 	  			(0x1F)
#define 	PHY_PHYSCSR_ANDONE		(0x1000)
#define 	PHY_PHYSCSR_4B5B_EN 	(0x0040)
#define 	PHY_PHYSCSR_SPEED_MSK	(0x001C)
#define 	PHY_PHYSCSR_SPEED_10HD	(0x0004)
#define 	PHY_PHYSCSR_SPEED_10FD	(0x0014)
#define 	PHY_PHYSCSR_SPEED_100HD (0x0008)
#define 	PHY_PHYSCSR_SPEED_100FD (0x0018)
#endif		// #ifndef _SMSC9118_H

#endif		// CONFIG_DRIVER_SMSC9118