summaryrefslogtreecommitdiffstats
path: root/drivers/s3c4510b_eth.h
blob: cbddba71a4007db112d55d11eea04733961a6859 (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
#ifndef __S3C4510B_ETH_H
#define __S3C4510B_ETH_H
/*
 * Copyright (c) 2004	Cucy Systems (http://www.cucy.com)
 * Curt Brune <curt@cucy.com>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * 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
 *
 * MODULE:        $Id:$
 * Description:   Ethernet interface
 * Runtime Env:   ARM7TDMI
 * Change History:
 *     03-02-04    Create (Curt Brune) curt@cucy.com
 *
 */

#define __packed    __attribute__ ((packed))

#define ETH_MAC_ADDR_SIZE           (6)    /*  dst,src addr is 6bytes each */
#define ETH_MaxTxFrames             (16)   /*  Max number of Tx Frames */

/*  Buffered DMA Receiver Control Register  */
#define ETH_BRxBRST     0x0000F  /*  BDMA Rx Burst Size * BRxBRST  */
				 /*  = Burst Data Size 16 */
#define ETH_BRxSTSKO    0x00020  /*  BDMA Rx Stop/Skip  Frame or Interrupt(=1)  */
				 /*  case of not OWNER the current Frame  */
#define ETH_BRxMAINC    0x00040  /*  BDMA Rx Memory Address Inc/Dec  */
#define ETH_BRxDIE      0x00080  /*  BDMA Rx Every Received Frame Interrupt Enable */
#define ETH_BRxNLIE     0x00100  /*  BDMA Rx NULL List Interrupt Enable  */
#define ETH_BRxNOIE     0x00200  /*  BDMA Rx Not Owner Interrupt Enable */
#define ETH_BRxMSOIE    0x00400  /*  BDMA Rx Maximum Size over Interrupr Enable  */
#define ETH_BRxLittle   0x00800  /*  BDMA Rx Big/Little Endian  */
#define ETH_BRxBig      0x00000  /*  BDMA Rx Big/Little Endian */
#define ETH_BRxWA01     0x01000  /*  BDMA Rx Word Alignment- one invalid byte  */
#define ETH_BRxWA10     0x02000  /*  BDMA Rx Word Alignment- two invalid byte */
#define ETH_BRxWA11     0x03000  /*  BDMA Rx Word Alignment- three invalid byte  */
#define ETH_BRxEn       0x04000  /*  BDMA Rx Enable */
#define ETH_BRxRS       0x08000  /*  BDMA Rx Reset */
#define ETH_RxEmpty     0x10000  /*  BDMA Rx Buffer empty interrupt  */
#define ETH_BRxEarly    0x20000  /*  BDMA Rx Early notify Interrupt */

/*  Buffered DMA Trasmit Control Register(BDMATXCON)  */
#define ETH_BTxBRST     0x0000F  /*  BDMA Tx Burst Size = 16  */
#define ETH_BTxSTSKO    0x00020  /*  BDMA Tx Stop/Skip Frame or Interrupt in case */
				 /*  of not Owner the current frame  */
#define ETH_BTxCPIE     0x00080  /*  BDMA Tx Complete to send control  */
				 /*  packet Enable */
#define ETH_BTxNOIE     0x00200  /*  BDMA Tx Buffer Not Owner */
#define ETH_BTxEmpty    0x00400  /*  BDMA Tx Buffer Empty Interrupt  */

/*  BDMA Tx buffer can be moved to the MAC Tx IO when the new frame comes in.  */
#define ETH_BTxMSL000   0x00000  /*  No wait to fill the BDMA  */
#define ETH_BTxMSL001   0x00800  /*  wait to fill 1/8 of the BDMA  */
#define ETH_BTxMSL010   0x01000  /*  wait to fill 2/8 of the BDMA */
#define ETH_BTxMSL011   0x01800  /*  wait to fill 3/8 of the BDMA */
#define ETH_BTxMSL100   0x02000  /*  wait to fill 4/8 of the BDMA */
#define ETH_BTxMSL101   0x02800  /*  wait to fill 5/8 of the BDMA */
#define ETH_BTxMSL110   0x03000  /*  wait to fill 6/8 of the BDMA */
#define ETH_BTxMSL111   0x03800  /*  wait to fill 7/8 of the BDMA */
#define ETH_BTxEn       0x04000  /*  BDMA Tx Enable  */
#define ETH_BTxRS       0x08000  /*  BDMA Tx Reset  */

/*  BDMA Status Register  */
#define ETH_S_BRxRDF    0x00001  /*  BDMA Rx Done Every Received Frame  */
#define ETH_S_BRxNL     0x00002  /*  BDMA Rx NULL List  */
#define ETH_S_BRxNO     0x00004  /*  BDMA Rx Not Owner  */
#define ETH_S_BRxMSO    0x00008  /*  BDMA Rx Maximum Size Over  */
#define ETH_S_BRxEmpty  0x00010  /*  BDMA Rx Buffer Empty  */
#define ETH_S_BRxSEarly 0x00020  /*  Early Notify  */
#define ETH_S_BRxFRF    0x00080  /*  One more frame data in BDMA receive buffer  */
#define ETH_S_BTxCCP    0x10000  /*  BDMA Tx Complete to send Control Packet  */
#define ETH_S_BTxNL     0x20000  /*  BDMA Tx Null List  */
#define ETH_S_BTxNO     0x40000  /*  BDMA Tx Not Owner */
#define ETH_S_BTxEmpty  0x100000 /*  BDMA Tx Buffer Empty  */

/*  MAC Control Register  */
#define ETH_HaltReg     0x0001   /*  stop transmission and reception  */
				 /*  after completion of any current packets  */
#define ETH_HaltImm     0x0002   /*  Stop transmission and reception immediately  */
#define ETH_SwReset     0x0004   /*  reset all Ethernet controller state machines */
				 /*  and FIFOs  */
#define ETH_FullDup     0x0008   /*  allow transmission to begin while reception */
				 /*  is occurring  */
#define ETH_MACLoop     0x0010   /*  MAC loopback */
#define ETH_ConnM00     0x0000   /*  Automatic-default  */
#define ETH_ConnM01     0x0020   /*  Force 10Mbits endec */
#define ETH_ConnM10     0x0040   /*  Force MII (rate determined by MII clock  */
#define ETH_MIIOFF      0x0040   /*  Force MII (rate determined by MII clock  */
#define ETH_Loop10      0x0080   /*  Loop 10Mbps  */
#define ETH_MissRoll    0x0400   /*  Missed error counter rolled over  */
#define ETH_MDCOFF      0x1000   /*  MII Station Management Clock Off */
#define ETH_EnMissRoll  0x2000   /*  Interrupt when missed error counter rolls  */
				 /*  over  */
#define ETH_Link10      0x8000   /*  Link status 10Mbps  */

/*  CAM control register(CAMCON)  */
#define ETH_StationAcc  0x0001   /*  Accept any packet with a unicast station  */
				 /*  address  */
#define ETH_GroupAcc    0x0002   /*  Accept any packet with multicast-group  */
				 /*  station address   */
#define ETH_BroadAcc    0x0004   /*  Accept any packet with a broadcast station */
				 /*  address  */
#define ETH_NegCAM      0x0008   /*  0: Accept packets CAM recognizes,  */
				 /*     reject others */
				 /*  1: reject packets CAM recognizes,  */
				 /*     accept others  */
#define ETH_CompEn      0x0010   /*  Compare Enable mode */

/*  Transmit Control Register(MACTXCON) */
#define ETH_TxEn        0x0001   /*  transmit Enable  */
#define ETH_TxHalt      0x0002   /*  Transmit Halt Request  */
#define ETH_NoPad       0x0004   /*  suppress Padding  */
#define ETH_NoCRC       0x0008   /*  Suppress CRC  */
#define ETH_FBack       0x0010   /*  Fast Back-off */
#define ETH_NoDef       0x0020   /*  Disable the defer counter */
#define ETH_SdPause     0x0040   /*  Send Pause */
#define ETH_MII10En     0x0080   /*  MII 10Mbps mode enable */
#define ETH_EnUnder     0x0100   /*  Enable Underrun */
#define ETH_EnDefer     0x0200   /*  Enable Deferral */
#define ETH_EnNCarr     0x0400   /*  Enable No Carrier  */
#define ETH_EnExColl    0x0800   /*  interrupt if 16 collision occur  */
				 /*  in the same packet  */
#define ETH_EnLateColl  0x1000   /*  interrupt if collision occurs after  */
				 /*  512 bit times(64 bytes times)  */
#define ETH_EnTxPar     0x2000   /*  interrupt if the MAC transmit FIFO  */
				 /*  has a parity error  */
#define ETH_EnComp      0x4000   /*  interrupt when the MAC transmits or  */
				 /*  discards one packet  */

/*  Transmit Status Register(MACTXSTAT) */
#define ETH_ExColl      0x0010   /*  Excessive collision  */
#define ETH_TxDeffered  0x0020   /*  set if 16 collisions occur for same packet */
#define ETH_Paused      0x0040   /*  packet waited because of pause during  */
				 /*  transmission  */
#define ETH_IntTx       0x0080   /*  set if transmission of packet causes an  */
				 /*  interrupt condiftion  */
#define ETH_Under       0x0100   /*  MAC transmit FIFO becomes empty during  */
				 /*  transmission  */
#define ETH_Defer       0x0200   /*  MAC defers for MAC deferral  */
#define ETH_NCarr       0x0400   /*  No carrier sense detected during the  */
				 /*  transmission of a packet  */
#define ETH_SQE         0x0800   /*  Signal Quality Error */
#define ETH_LateColl    0x1000   /*  a collision occures after 512 bit times  */
#define ETH_TxPar       0x2000   /*  MAC transmit FIFO has detected a parity error */
#define ETH_Comp        0x4000   /*  MAC transmit or discards one packet  */
#define ETH_TxHalted    0x8000   /*  Transmission was halted by clearing  */
				 /*  TxEn or Halt immedite  */

/*  Receive Control Register (MACRXCON)  */
#define ETH_RxEn        0x0001
#define ETH_RxHalt      0x0002
#define ETH_LongEn      0x0004
#define ETH_ShortEn     0x0008
#define ETH_StripCRC    0x0010
#define ETH_PassCtl     0x0020
#define ETH_IgnoreCRC   0x0040
#define ETH_EnAlign     0x0100
#define ETH_EnCRCErr    0x0200
#define ETH_EnOver      0x0400
#define ETH_EnLongErr   0x0800
#define ETH_EnRxPar     0x2000
#define ETH_EnGood      0x4000

/*  Receive Status Register(MACRXSTAT) */
#define ETH_MCtlRecd    0x0020
#define ETH_MIntRx      0x0040
#define ETH_MRx10Stat   0x0080
#define ETH_MAllignErr  0x0100
#define ETH_MCRCErr     0x0200
#define ETH_MOverflow   0x0400
#define ETH_MLongErr    0x0800
#define ETH_MRxPar      0x2000
#define ETH_MRxGood     0x4000
#define ETH_MRxHalted   0x8000

/*  type of ethernet packets */
#define ETH_TYPE_ARP  (0x0806)
#define ETH_TYPE_IP   (0x0800)

#define ETH_HDR_SIZE  (14)

/*  bit field for frame data pointer word */
typedef struct __BF_FrameDataPtr {
	u32 dataPtr:31;
	u32   owner: 1;
} BF_FrameDataPtr;

typedef union _FrameDataPtr {
	u32             ui;
	BF_FrameDataPtr bf;
} FrameDataPtr;

typedef struct __BF_TX_Options {
	u32    no_padding: 1;
	u32        no_crc: 1;
	u32  macTxIrqEnbl: 1;
	u32  littleEndian: 1;
	u32  frameDataDir: 1;
	u32   widgetAlign: 2;
	u32      reserved:25;
} BF_TX_Options;

typedef union _TX_Options {
	u32    ui;
	BF_TX_Options   bf;
} TX_Options;

typedef struct __BF_RX_Status {
	u32           len:16;	/*  frame length */
	u32     reserved1: 3;
	u32       overMax: 1;
	u32     reserved2: 1;
	u32       ctrlRcv: 1;
	u32         intRx: 1;
	u32      rx10stat: 1;
	u32      alignErr: 1;
	u32        crcErr: 1;
	u32      overFlow: 1;
	u32       longErr: 1;
	u32     reserved3: 1;
	u32     parityErr: 1;
	u32          good: 1;
	u32        halted: 1;
} BF_RX_Status;

typedef union _RX_Status {
	u32             ui;
	BF_RX_Status    bf;
} RX_Status;

typedef struct __BF_TX_Status {
	u32           len:16;	/*  frame length */
	u32     txCollCnt: 4;
	u32        exColl: 1;
	u32       txDefer: 1;
	u32        paused: 1;
	u32         intTx: 1;
	u32      underRun: 1;
	u32         defer: 1;
	u32     noCarrier: 1;
	u32         SQErr: 1;
	u32      lateColl: 1;
	u32     parityErr: 1;
	u32      complete: 1;
	u32        halted: 1;
} BF_TX_Status;

typedef union _TX_Status {
	u32    ui;
	BF_TX_Status    bf;
} TX_Status;

/*  TX descriptor structure  */
typedef struct __TX_FrameDescriptor {
	volatile FrameDataPtr  m_frameDataPtr;
	TX_Options                      m_opt;
	volatile TX_Status           m_status;
	struct __TX_FrameDescriptor *m_nextFD;
} TX_FrameDescriptor;

/*  RX descriptor structure  */
typedef struct __RX_FrameDescriptor {
	volatile FrameDataPtr  m_frameDataPtr;
	u32                        m_reserved;
	volatile RX_Status           m_status;
	struct __RX_FrameDescriptor *m_nextFD;
} RX_FrameDescriptor;

/*  MAC Frame Structure */
typedef struct __MACFrame {
	u8     m_dstAddr[6] __packed;
	u8     m_srcAddr[6] __packed;
	u16  m_lengthOrType __packed;
	u8  m_payload[1506] __packed;
} MACFrame;

/* Ethernet Control block */
typedef struct __ETH {
	TX_FrameDescriptor   *m_curTX_FD; /*  pointer to current TX frame descriptor */
	TX_FrameDescriptor  *m_baseTX_FD; /*  pointer to base TX frame descriptor    */
	RX_FrameDescriptor   *m_curRX_FD; /*  pointer to current RX frame descriptor */
	RX_FrameDescriptor  *m_baseRX_FD; /*  pointer to base RX frame descriptor    */
	u8                        *m_mac; /*  pointer to our MAC address             */
} ETH;

#endif
OpenPOWER on IntegriCloud