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
|