summaryrefslogtreecommitdiff
path: root/drivers/net/ax88180.h
blob: d2113df4bd152ca9a3d45de77070264cd15e4965 (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
/* ax88180.h: ASIX AX88180 Non-PCI Gigabit Ethernet u-boot driver */
/*
 *
 *  This program is free software; you can distribute it and/or modify it
 *  under the terms of the GNU General Public License (Version 2) as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope 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.
 *
 */

#ifndef _AX88180_H_
#define _AX88180_H_

#include <asm/types.h>
#include <config.h>

typedef enum _ax88180_link_state {
	INS_LINK_DOWN,
	INS_LINK_UP,
	INS_LINK_UNKNOWN
} ax88180_link_state;

struct ax88180_private {
	unsigned char BusWidth;
	unsigned char PadSize;
	unsigned short PhyAddr;
	unsigned short PhyID0;
	unsigned short FirstTxDesc;
	unsigned short NextTxDesc;
	ax88180_link_state LinkState;
};

#define BUS_WIDTH_16			1
#define BUS_WIDTH_32			2

#define ENABLE_JUMBO			1
#define DISABLE_JUMBO			0

#define ENABLE_BURST			1
#define DISABLE_BURST			0

#define NORMAL_RX_MODE		0
#define RX_LOOPBACK_MODE		1
#define RX_INIFINIT_LOOP_MODE		2
#define TX_INIFINIT_LOOP_MODE		3

#define DEFAULT_ETH_MTU		1500

/* Jumbo packet size 4086 bytes included 4 bytes CRC*/
#define MAX_JUMBO_MTU		4072

/* Max Tx Jumbo size 4086 bytes included 4 bytes CRC */
#define MAX_TX_JUMBO_SIZE		4086

/* Max Rx Jumbo size is 15K Bytes */
#define MAX_RX_SIZE			0x3C00

#define MARVELL_88E1111_PHYADDR	0x18
#define MARVELL_88E1111_PHYIDR0	0x0141

#define CICADA_CIS8201_PHYADDR	0x01
#define CICADA_CIS8201_PHYIDR0		0x000F

#define MEDIA_AUTO			0
#define MEDIA_1000FULL			1
#define MEDIA_1000HALF			2
#define MEDIA_100FULL			3
#define MEDIA_100HALF			4
#define MEDIA_10FULL			5
#define MEDIA_10HALF			6
#define MEDIA_UNKNOWN		7

#define AUTO_MEDIA			0
#define FORCE_MEDIA			1

#define TXDP_MASK			3
#define TXDP0				0
#define TXDP1				1
#define TXDP2				2
#define TXDP3				3

#define CMD_MAP_SIZE			0x100

#if defined (CONFIG_DRIVER_AX88180_16BIT)
  #define AX88180_MEMORY_SIZE		0x00004000
  #define START_BASE			0x1000

  #define RX_BUF_SIZE			0x1000
  #define TX_BUF_SIZE			0x0F00

  #define TX_BASE			START_BASE
  #define CMD_BASE			(TX_BASE + TX_BUF_SIZE)
  #define RX_BASE			(CMD_BASE + CMD_MAP_SIZE)
#else
  #define AX88180_MEMORY_SIZE	0x00010000

  #define RX_BUF_SIZE			0x8000
  #define TX_BUF_SIZE			0x7C00

  #define RX_BASE			0x0000
  #define TX_BASE			(RX_BASE + RX_BUF_SIZE)
  #define CMD_BASE			(TX_BASE + TX_BUF_SIZE)
#endif

/* AX88180 Memory Mapping Definition */
#define RXBUFFER_START			RX_BASE
  #define RX_PACKET_LEN_OFFSET	0
  #define RX_PAGE_NUM_MASK		0x7FF	/* RX pages 0~7FFh */
#define TXBUFFER_START			TX_BASE

/* AX88180 MAC Register Definition */
#define DECODE		(0)
  #define DECODE_EN		0x00000001
#define BASE		(6)
#define CMD		(CMD_BASE + 0x0000)
  #define WAKEMOD		0x00000001
  #define TXEN			0x00000100
  #define RXEN			0x00000200
  #define DEFAULT_CMD		WAKEMOD
#define IMR		(CMD_BASE + 0x0004)
  #define IMR_RXBUFFOVR	0x00000001
  #define IMR_WATCHDOG	0x00000002
  #define IMR_TX		0x00000008
  #define IMR_RX		0x00000010
  #define IMR_PHY		0x00000020
  #define CLEAR_IMR		0x00000000
  #define DEFAULT_IMR		(IMR_PHY | IMR_RX | IMR_TX |\
					 IMR_RXBUFFOVR | IMR_WATCHDOG)
#define ISR		(CMD_BASE + 0x0008)
  #define ISR_RXBUFFOVR	0x00000001
  #define ISR_WATCHDOG	0x00000002
  #define ISR_TX			0x00000008
  #define ISR_RX			0x00000010
  #define ISR_PHY		0x00000020
#define TXCFG		(CMD_BASE + 0x0010)
  #define AUTOPAD_CRC		0x00000050
  #define DEFAULT_TXCFG	AUTOPAD_CRC
#define TXCMD		(CMD_BASE + 0x0014)
  #define TXCMD_TXDP_MASK	0x00006000
  #define TXCMD_TXDP0		0x00000000
  #define TXCMD_TXDP1		0x00002000
  #define TXCMD_TXDP2		0x00004000
  #define TXCMD_TXDP3		0x00006000
  #define TX_START_WRITE	0x00008000
  #define TX_STOP_WRITE		0x00000000
  #define DEFAULT_TXCMD	0x00000000
#define TXBS		(CMD_BASE + 0x0018)
  #define TXDP0_USED		0x00000001
  #define TXDP1_USED		0x00000002
  #define TXDP2_USED		0x00000004
  #define TXDP3_USED		0x00000008
  #define DEFAULT_TXBS		0x00000000
#define TXDES0		(CMD_BASE + 0x0020)
  #define TXDPx_ENABLE		0x00008000
  #define TXDPx_LEN_MASK	0x00001FFF
  #define DEFAULT_TXDES0	0x00000000
#define TXDES1		(CMD_BASE + 0x0024)
  #define TXDPx_ENABLE		0x00008000
  #define TXDPx_LEN_MASK	0x00001FFF
  #define DEFAULT_TXDES1	0x00000000
#define TXDES2		(CMD_BASE + 0x0028)
  #define TXDPx_ENABLE		0x00008000
  #define TXDPx_LEN_MASK	0x00001FFF
  #define DEFAULT_TXDES2	0x00000000
#define TXDES3		(CMD_BASE + 0x002C)
  #define TXDPx_ENABLE		0x00008000
  #define TXDPx_LEN_MASK	0x00001FFF
  #define DEFAULT_TXDES3	0x00000000
#define RXCFG		(CMD_BASE + 0x0030)
  #define RXBUFF_PROTECT	0x00000001
  #define RXTCPCRC_CHECK	0x00000010
  #define RXFLOW_ENABLE	0x00000100
  #define DEFAULT_RXCFG	RXBUFF_PROTECT
#define RXCURT		(CMD_BASE + 0x0034)
  #define DEFAULT_RXCURT	0x00000000
#define RXBOUND	(CMD_BASE + 0x0038)
  #define DEFAULT_RXBOUND	0x7FF		/* RX pages 0~7FFh */
#define MACCFG0	(CMD_BASE + 0x0040)
  #define MACCFG0_BIT3_0	0x00000007
  #define IPGT_VAL		0x00000150
  #define TXFLOW_ENABLE	0x00001000
  #define SPEED100		0x00008000
  #define DEFAULT_MACCFG0	(IPGT_VAL | MACCFG0_BIT3_0)
#define MACCFG1	(CMD_BASE + 0x0044)
  #define RGMII_EN		0x00000002
  #define RXFLOW_EN		0x00000020
  #define FULLDUPLEX		0x00000040
  #define MAX_JUMBO_LEN	0x00000780
  #define RXJUMBO_EN		0x00000800
  #define GIGA_MODE_EN	0x00001000
  #define RXCRC_CHECK		0x00002000
  #define RXPAUSE_DA_CHECK	0x00004000

  #define JUMBO_LEN_4K		0x00000200
  #define JUMBO_LEN_15K	0x00000780
  #define DEFAULT_MACCFG1	(RXCRC_CHECK | RXPAUSE_DA_CHECK | \
				 RGMII_EN)
  #define CICADA_DEFAULT_MACCFG1	(RXCRC_CHECK | RXPAUSE_DA_CHECK)
#define MACCFG2		(CMD_BASE + 0x0048)
  #define MACCFG2_BIT15_8	0x00000100
  #define JAM_LIMIT_MASK	0x000000FC
  #define DEFAULT_JAM_LIMIT	0x00000064
  #define DEFAULT_MACCFG2	MACCFG2_BIT15_8
#define MACCFG3		(CMD_BASE + 0x004C)
  #define IPGR2_VAL		0x0000000E
  #define IPGR1_VAL		0x00000600
  #define NOABORT		0x00008000
  #define DEFAULT_MACCFG3	(IPGR1_VAL | IPGR2_VAL)
#define TXPAUT		(CMD_BASE + 0x0054)
  #define DEFAULT_TXPAUT	0x001FE000
#define RXBTHD0		(CMD_BASE + 0x0058)
  #define DEFAULT_RXBTHD0	0x00000300
#define RXBTHD1		(CMD_BASE + 0x005C)
  #define DEFAULT_RXBTHD1	0x00000600
#define RXFULTHD	(CMD_BASE + 0x0060)
  #define DEFAULT_RXFULTHD	0x00000100
#define MISC		(CMD_BASE + 0x0068)
  /* Normal operation mode */
  #define MISC_NORMAL		0x00000003
  /* Clear bit 0 to reset MAC */
  #define MISC_RESET_MAC	0x00000002
  /* Clear bit 1 to reset PHY */
  #define MISC_RESET_PHY	0x00000001
  /* Clear bit 0 and 1 to reset MAC and PHY */
  #define MISC_RESET_MAC_PHY	0x00000000
  #define DEFAULT_MISC		MISC_NORMAL
#define MACID0		(CMD_BASE + 0x0070)
#define MACID1		(CMD_BASE + 0x0074)
#define MACID2		(CMD_BASE + 0x0078)
#define TXLEN		(CMD_BASE + 0x007C)
  #define DEFAULT_TXLEN	0x000005FC
#define RXFILTER	(CMD_BASE + 0x0080)
  #define RX_RXANY		0x00000001
  #define RX_MULTICAST		0x00000002
  #define RX_UNICAST		0x00000004
  #define RX_BROADCAST	0x00000008
  #define RX_MULTI_HASH	0x00000010
  #define DISABLE_RXFILTER	0x00000000
  #define DEFAULT_RXFILTER	(RX_BROADCAST + RX_UNICAST)
#define MDIOCTRL	(CMD_BASE + 0x0084)
  #define PHY_ADDR_MASK	0x0000001F
  #define REG_ADDR_MASK	0x00001F00
  #define READ_PHY		0x00004000
  #define WRITE_PHY		0x00008000
#define MDIODP		(CMD_BASE + 0x0088)
#define GPIOCTRL	(CMD_BASE + 0x008C)
#define RXINDICATOR	(CMD_BASE + 0x0090)
  #define RX_START_READ	0x00000001
  #define RX_STOP_READ		0x00000000
  #define DEFAULT_RXINDICATOR	RX_STOP_READ
#define TXST		(CMD_BASE + 0x0094)
#define MDCCLKPAT	(CMD_BASE + 0x00A0)
#define RXIPCRCCNT	(CMD_BASE + 0x00A4)
#define RXCRCCNT	(CMD_BASE + 0x00A8)
#define TXFAILCNT	(CMD_BASE + 0x00AC)
#define PROMDP		(CMD_BASE + 0x00B0)
#define PROMCTRL	(CMD_BASE + 0x00B4)
  #define RELOAD_EEPROM	0x00000200
#define MAXRXLEN	(CMD_BASE + 0x00B8)
#define HASHTAB0	(CMD_BASE + 0x00C0)
#define HASHTAB1	(CMD_BASE + 0x00C4)
#define HASHTAB2	(CMD_BASE + 0x00C8)
#define HASHTAB3	(CMD_BASE + 0x00CC)
#define DOGTHD0	(CMD_BASE + 0x00E0)
  #define DEFAULT_DOGTHD0	0x0000FFFF
#define DOGTHD1	(CMD_BASE + 0x00E4)
  #define START_WATCHDOG_TIMER	0x00008000
  #define DEFAULT_DOGTHD1		0x00000FFF
#define SOFTRST		(CMD_BASE + 0x00EC)
  #define SOFTRST_NORMAL	0x00000003
  #define SOFTRST_RESET_MAC	0x00000002

/* External PHY Register Definition */
#define BMCR		0x0000
  #define LINE_SPEED_MSB	0x0040
  #define DUPLEX_MODE		0x0100
  #define RESTART_AUTONEG	0x0200
  #define POWER_DOWN		0x0800
  #define AUTONEG_EN		0x1000
  #define LINE_SPEED_LSB	0x2000
  #define PHY_RESET		0x8000

  #define MEDIAMODE_MASK	(LINE_SPEED_MSB | LINE_SPEED_LSB |\
				 DUPLEX_MODE)
  #define BMCR_SPEED_1000	LINE_SPEED_MSB
  #define BMCR_SPEED_100	LINE_SPEED_LSB
  #define BMCR_SPEED_10	0x0000

  #define BMCR_1000FULL	(BMCR_SPEED_1000 | DUPLEX_MODE)
  #define BMCR_100FULL		(BMCR_SPEED_100 | DUPLEX_MODE)
  #define BMCR_100HALF		BMCR_SPEED_100
  #define BMCR_10FULL		DUPLEX_MODE
  #define BMCR_10HALF		0x0000
#define BMSR		0x0001
  #define LINKOK		0x0004
  #define AUTONEG_ENABLE_STS	0x0008
  #define AUTONEG_COMPLETE	0x0020
#define PHYIDR0		0x0002
#define PHYIDR1		0x0003
#define ANAR		0x0004
  #define ANAR_PAUSE		0x0400
  #define ANAR_100FULL		0x0100
  #define ANAR_100HALF		0x0080
  #define ANAR_10FULL		0x0040
  #define ANAR_10HALF		0x0020
  #define ANAR_8023BIT		0x0001
#define ANLPAR		0x0005
#define ANER		0x0006
#define AUX_1000_CTRL	0x0009
  #define ENABLE_1000HALF	0x0100
  #define ENABLE_1000FULL	0x0200
  #define DEFAULT_AUX_1000_CTRL	(ENABLE_1000HALF | ENABLE_1000FULL)
#define AUX_1000_STATUS	0x000A
  #define LP_1000HALF		0x0400
  #define LP_1000FULL		0x0800

/* Marvell 88E1111 Gigabit PHY Register Definition */
#define M88_SSR		0x0011
  #define SSR_SPEED_MASK	0xC000
  #define SSR_SPEED_1000		0x8000
  #define SSR_SPEED_100		0x4000
  #define SSR_SPEED_10		0x0000
  #define SSR_DUPLEX		0x2000
  #define SSR_MEDIA_RESOLVED_OK	0x0800

  #define SSR_MEDIA_MASK	(SSR_SPEED_MASK | SSR_DUPLEX)
  #define SSR_1000FULL		(SSR_SPEED_1000 | SSR_DUPLEX)
  #define SSR_1000HALF		SSR_SPEED_1000
  #define SSR_100FULL		(SSR_SPEED_100 | SSR_DUPLEX)
  #define SSR_100HALF		SSR_SPEED_100
  #define SSR_10FULL		(SSR_SPEED_10 | SSR_DUPLEX)
  #define SSR_10HALF		SSR_SPEED_10
#define M88_IER		0x0012
  #define LINK_CHANGE_INT	0x0400
#define M88_ISR		0x0013
  #define LINK_CHANGE_STATUS	0x0400
#define M88_EXT_SCR	0x0014
  #define RGMII_RXCLK_DELAY	0x0080
  #define RGMII_TXCLK_DELAY	0x0002
  #define DEFAULT_EXT_SCR	(RGMII_TXCLK_DELAY | RGMII_RXCLK_DELAY)
#define M88_EXT_SSR	0x001B
  #define HWCFG_MODE_MASK	0x000F
  #define RGMII_COPPER_MODE	0x000B

/* CICADA CIS8201 Gigabit PHY Register Definition */
#define CIS_IMR		0x0019
  #define CIS_INT_ENABLE	0x8000
  #define CIS_LINK_CHANGE_INT	0x2000
#define CIS_ISR		0x001A
  #define CIS_INT_PENDING	0x8000
  #define CIS_LINK_CHANGE_STATUS	0x2000
#define CIS_AUX_CTRL_STATUS	0x001C
  #define CIS_AUTONEG_COMPLETE	0x8000
  #define CIS_SPEED_MASK	0x0018
  #define CIS_SPEED_1000		0x0010
  #define CIS_SPEED_100		0x0008
  #define CIS_SPEED_10		0x0000
  #define CIS_DUPLEX		0x0020

  #define CIS_MEDIA_MASK	(CIS_SPEED_MASK | CIS_DUPLEX)
  #define CIS_1000FULL		(CIS_SPEED_1000 | CIS_DUPLEX)
  #define CIS_1000HALF		CIS_SPEED_1000
  #define CIS_100FULL		(CIS_SPEED_100 | CIS_DUPLEX)
  #define CIS_100HALF		CIS_SPEED_100
  #define CIS_10FULL		(CIS_SPEED_10 | CIS_DUPLEX)
  #define CIS_10HALF		CIS_SPEED_10
  #define CIS_SMI_PRIORITY	0x0004

static inline unsigned short INW (struct eth_device *dev, unsigned long addr)
{
	return le16_to_cpu (*(volatile unsigned short *) (addr + dev->iobase));
}

static inline void OUTW (struct eth_device *dev, unsigned short command, unsigned long addr)
{
	*(volatile unsigned short *) ((addr + dev->iobase)) = cpu_to_le16 (command);
}

/*
 Access RXBUFFER_START/TXBUFFER_START to read RX buffer/write TX buffer
*/
#if defined (CONFIG_DRIVER_AX88180_16BIT)
static inline unsigned short READ_RXBUF (struct eth_device *dev)
{
	return le16_to_cpu (*(volatile unsigned short *) (RXBUFFER_START + dev->iobase));
}

static inline void WRITE_TXBUF (struct eth_device *dev, unsigned short data)
{
	*(volatile unsigned short *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le16 (data);
}
#else
static inline unsigned long READ_RXBUF (struct eth_device *dev)
{
	return le32_to_cpu (*(volatile unsigned long *) (RXBUFFER_START + dev->iobase));
}

static inline void WRITE_TXBUF (struct eth_device *dev, unsigned long data)
{
	*(volatile unsigned long *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le32 (data);
}
#endif

#endif /* _AX88180_H_ */