hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
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
/*
 * Copyright (C) 2011 Ilya Yanok, Emcraft Systems
 *
 * Based on: mach-davinci/emac_defs.h
 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#ifndef _DAVINCI_EMAC_H_
#define _DAVINCI_EMAC_H_
/* Ethernet Min/Max packet size */
#define EMAC_MIN_ETHERNET_PKT_SIZE    60
#define EMAC_MAX_ETHERNET_PKT_SIZE    1518
/* Buffer size (should be aligned on 32 byte and cache line) */
#define EMAC_RXBUF_SIZE    ALIGN(ALIGN(EMAC_MAX_ETHERNET_PKT_SIZE, 32),\
               ARCH_DMA_MINALIGN)
 
/* Number of RX packet buffers
 * NOTE: Only 1 buffer supported as of now
 */
#define EMAC_MAX_RX_BUFFERS        10
 
 
/***********************************************
 ******** Internally used macros ***************
 ***********************************************/
 
#define EMAC_CH_TX            1
#define EMAC_CH_RX            0
 
/* Each descriptor occupies 4 words, lets start RX desc's at 0 and
 * reserve space for 64 descriptors max
 */
#define EMAC_RX_DESC_BASE        0x0
#define EMAC_TX_DESC_BASE        0x1000
 
/* EMAC Teardown value */
#define EMAC_TEARDOWN_VALUE        0xfffffffc
 
/* MII Status Register */
#define MII_STATUS_REG            1
/* PHY Configuration register */
#define PHY_CONF_TXCLKEN        (1 << 5)
 
/* Number of statistics registers */
#define EMAC_NUM_STATS            36
 
 
/* EMAC Descriptor */
typedef volatile struct _emac_desc
{
   u_int32_t    next;        /* Pointer to next descriptor
                      in chain */
   u_int8_t    *buffer;    /* Pointer to data buffer */
   u_int32_t    buff_off_len;    /* Buffer Offset(MSW) and Length(LSW) */
   u_int32_t    pkt_flag_len;    /* Packet Flags(MSW) and Length(LSW) */
} emac_desc;
 
/* CPPI bit positions */
#define EMAC_CPPI_SOP_BIT        (0x80000000)
#define EMAC_CPPI_EOP_BIT        (0x40000000)
#define EMAC_CPPI_OWNERSHIP_BIT        (0x20000000)
#define EMAC_CPPI_EOQ_BIT        (0x10000000)
#define EMAC_CPPI_TEARDOWN_COMPLETE_BIT    (0x08000000)
#define EMAC_CPPI_PASS_CRC_BIT        (0x04000000)
 
#define EMAC_CPPI_RX_ERROR_FRAME    (0x03fc0000)
 
#define EMAC_MACCONTROL_MIIEN_ENABLE        (0x20)
#define EMAC_MACCONTROL_FULLDUPLEX_ENABLE    (0x1)
#define EMAC_MACCONTROL_GIGABIT_ENABLE        (1 << 7)
#define EMAC_MACCONTROL_GIGFORCE        (1 << 17)
#define EMAC_MACCONTROL_RMIISPEED_100        (1 << 15)
 
#define EMAC_MAC_ADDR_MATCH        (1 << 19)
#define EMAC_MAC_ADDR_IS_VALID        (1 << 20)
 
#define EMAC_RXMBPENABLE_RXCAFEN_ENABLE    (0x200000)
#define EMAC_RXMBPENABLE_RXBROADEN    (0x2000)
 
 
#define MDIO_CONTROL_IDLE        (0x80000000)
#define MDIO_CONTROL_ENABLE        (0x40000000)
#define MDIO_CONTROL_FAULT_ENABLE    (0x40000)
#define MDIO_CONTROL_FAULT        (0x80000)
#define MDIO_USERACCESS0_GO        (0x80000000)
#define MDIO_USERACCESS0_WRITE_READ    (0x0)
#define MDIO_USERACCESS0_WRITE_WRITE    (0x40000000)
#define MDIO_USERACCESS0_ACK        (0x20000000)
 
/* Ethernet MAC Registers Structure */
typedef struct  {
   dv_reg        TXIDVER;
   dv_reg        TXCONTROL;
   dv_reg        TXTEARDOWN;
   u_int8_t    RSVD0[4];
   dv_reg        RXIDVER;
   dv_reg        RXCONTROL;
   dv_reg        RXTEARDOWN;
   u_int8_t    RSVD1[100];
   dv_reg        TXINTSTATRAW;
   dv_reg        TXINTSTATMASKED;
   dv_reg        TXINTMASKSET;
   dv_reg        TXINTMASKCLEAR;
   dv_reg        MACINVECTOR;
   u_int8_t    RSVD2[12];
   dv_reg        RXINTSTATRAW;
   dv_reg        RXINTSTATMASKED;
   dv_reg        RXINTMASKSET;
   dv_reg        RXINTMASKCLEAR;
   dv_reg        MACINTSTATRAW;
   dv_reg        MACINTSTATMASKED;
   dv_reg        MACINTMASKSET;
   dv_reg        MACINTMASKCLEAR;
   u_int8_t    RSVD3[64];
   dv_reg        RXMBPENABLE;
   dv_reg        RXUNICASTSET;
   dv_reg        RXUNICASTCLEAR;
   dv_reg        RXMAXLEN;
   dv_reg        RXBUFFEROFFSET;
   dv_reg        RXFILTERLOWTHRESH;
   u_int8_t    RSVD4[8];
   dv_reg        RX0FLOWTHRESH;
   dv_reg        RX1FLOWTHRESH;
   dv_reg        RX2FLOWTHRESH;
   dv_reg        RX3FLOWTHRESH;
   dv_reg        RX4FLOWTHRESH;
   dv_reg        RX5FLOWTHRESH;
   dv_reg        RX6FLOWTHRESH;
   dv_reg        RX7FLOWTHRESH;
   dv_reg        RX0FREEBUFFER;
   dv_reg        RX1FREEBUFFER;
   dv_reg        RX2FREEBUFFER;
   dv_reg        RX3FREEBUFFER;
   dv_reg        RX4FREEBUFFER;
   dv_reg        RX5FREEBUFFER;
   dv_reg        RX6FREEBUFFER;
   dv_reg        RX7FREEBUFFER;
   dv_reg        MACCONTROL;
   dv_reg        MACSTATUS;
   dv_reg        EMCONTROL;
   dv_reg        FIFOCONTROL;
   dv_reg        MACCONFIG;
   dv_reg        SOFTRESET;
   u_int8_t    RSVD5[88];
   dv_reg        MACSRCADDRLO;
   dv_reg        MACSRCADDRHI;
   dv_reg        MACHASH1;
   dv_reg        MACHASH2;
   dv_reg        BOFFTEST;
   dv_reg        TPACETEST;
   dv_reg        RXPAUSE;
   dv_reg        TXPAUSE;
   u_int8_t    RSVD6[16];
   dv_reg        RXGOODFRAMES;
   dv_reg        RXBCASTFRAMES;
   dv_reg        RXMCASTFRAMES;
   dv_reg        RXPAUSEFRAMES;
   dv_reg        RXCRCERRORS;
   dv_reg        RXALIGNCODEERRORS;
   dv_reg        RXOVERSIZED;
   dv_reg        RXJABBER;
   dv_reg        RXUNDERSIZED;
   dv_reg        RXFRAGMENTS;
   dv_reg        RXFILTERED;
   dv_reg        RXQOSFILTERED;
   dv_reg        RXOCTETS;
   dv_reg        TXGOODFRAMES;
   dv_reg        TXBCASTFRAMES;
   dv_reg        TXMCASTFRAMES;
   dv_reg        TXPAUSEFRAMES;
   dv_reg        TXDEFERRED;
   dv_reg        TXCOLLISION;
   dv_reg        TXSINGLECOLL;
   dv_reg        TXMULTICOLL;
   dv_reg        TXEXCESSIVECOLL;
   dv_reg        TXLATECOLL;
   dv_reg        TXUNDERRUN;
   dv_reg        TXCARRIERSENSE;
   dv_reg        TXOCTETS;
   dv_reg        FRAME64;
   dv_reg        FRAME65T127;
   dv_reg        FRAME128T255;
   dv_reg        FRAME256T511;
   dv_reg        FRAME512T1023;
   dv_reg        FRAME1024TUP;
   dv_reg        NETOCTETS;
   dv_reg        RXSOFOVERRUNS;
   dv_reg        RXMOFOVERRUNS;
   dv_reg        RXDMAOVERRUNS;
   u_int8_t    RSVD7[624];
   dv_reg        MACADDRLO;
   dv_reg        MACADDRHI;
   dv_reg        MACINDEX;
   u_int8_t    RSVD8[244];
   dv_reg        TX0HDP;
   dv_reg        TX1HDP;
   dv_reg        TX2HDP;
   dv_reg        TX3HDP;
   dv_reg        TX4HDP;
   dv_reg        TX5HDP;
   dv_reg        TX6HDP;
   dv_reg        TX7HDP;
   dv_reg        RX0HDP;
   dv_reg        RX1HDP;
   dv_reg        RX2HDP;
   dv_reg        RX3HDP;
   dv_reg        RX4HDP;
   dv_reg        RX5HDP;
   dv_reg        RX6HDP;
   dv_reg        RX7HDP;
   dv_reg        TX0CP;
   dv_reg        TX1CP;
   dv_reg        TX2CP;
   dv_reg        TX3CP;
   dv_reg        TX4CP;
   dv_reg        TX5CP;
   dv_reg        TX6CP;
   dv_reg        TX7CP;
   dv_reg        RX0CP;
   dv_reg        RX1CP;
   dv_reg        RX2CP;
   dv_reg        RX3CP;
   dv_reg        RX4CP;
   dv_reg        RX5CP;
   dv_reg        RX6CP;
   dv_reg        RX7CP;
} emac_regs;
 
/* EMAC Wrapper Registers Structure */
typedef struct  {
#ifdef DAVINCI_EMAC_VERSION2
   dv_reg        idver;
   dv_reg        softrst;
   dv_reg        emctrl;
   dv_reg        c0rxthreshen;
   dv_reg        c0rxen;
   dv_reg        c0txen;
   dv_reg        c0miscen;
   dv_reg        c1rxthreshen;
   dv_reg        c1rxen;
   dv_reg        c1txen;
   dv_reg        c1miscen;
   dv_reg        c2rxthreshen;
   dv_reg        c2rxen;
   dv_reg        c2txen;
   dv_reg        c2miscen;
   dv_reg        c0rxthreshstat;
   dv_reg        c0rxstat;
   dv_reg        c0txstat;
   dv_reg        c0miscstat;
   dv_reg        c1rxthreshstat;
   dv_reg        c1rxstat;
   dv_reg        c1txstat;
   dv_reg        c1miscstat;
   dv_reg        c2rxthreshstat;
   dv_reg        c2rxstat;
   dv_reg        c2txstat;
   dv_reg        c2miscstat;
   dv_reg        c0rximax;
   dv_reg        c0tximax;
   dv_reg        c1rximax;
   dv_reg        c1tximax;
   dv_reg        c2rximax;
   dv_reg        c2tximax;
#else
   u_int8_t    RSVD0[4100];
   dv_reg        EWCTL;
   dv_reg        EWINTTCNT;
#endif
} ewrap_regs;
 
/* EMAC MDIO Registers Structure */
typedef struct  {
   dv_reg        VERSION;
   dv_reg        CONTROL;
   dv_reg        ALIVE;
   dv_reg        LINK;
   dv_reg        LINKINTRAW;
   dv_reg        LINKINTMASKED;
   u_int8_t    RSVD0[8];
   dv_reg        USERINTRAW;
   dv_reg        USERINTMASKED;
   dv_reg        USERINTMASKSET;
   dv_reg        USERINTMASKCLEAR;
   u_int8_t    RSVD1[80];
   dv_reg        USERACCESS0;
   dv_reg        USERPHYSEL0;
   dv_reg        USERACCESS1;
   dv_reg        USERPHYSEL1;
} mdio_regs;
 
int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data);
int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data);
 
typedef struct {
   char    name[64];
   int    (*init)(int phy_addr);
   int    (*is_phy_connected)(int phy_addr);
   int    (*get_link_speed)(int phy_addr);
   int    (*auto_negotiate)(int phy_addr);
} phy_t;
 
#endif /* _DAVINCI_EMAC_H_ */