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
|
/*
* Copyright : (C) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 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 Phytium Public License for more details.
*
*
* FilePath: fxmac.h
* Date: 2022-04-06 14:46:52
* LastEditTime: 2022-04-06 14:46:58
* Description: This file is for
*
* Modify History:
* Ver Who Date Changes
* ----- ------ -------- --------------------------------------
*/
#ifndef DRIVERS_ETH_F_XMAC_H
#define DRIVERS_ETH_F_XMAC_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "ftypes.h"
#include "fassert.h"
#include "ferror_code.h"
#include "fxmac_hw.h"
#include "fxmac_bdring.h"
#include "fparameters.h"
#define FXMAC_ERR_INVALID_PARAM FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x1u)
#define FXMAC_ERR_SG_LIST FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x2u)
#define FXMAC_ERR_GENERAL FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x4u)
#define FXMAC_ERR_SG_NO_LIST FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x5u)
#define FXMAC_ERR_PHY_BUSY FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x6u)
#define FXMAC_PHY_IS_NOT_FOUND FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x7u)
#define FXMAC_PHY_AUTO_AUTONEGOTIATION_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x8u)
#define FXMAC_ERR_MAC_IS_PROCESSING FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x9u)
/** @name Configuration options
*
* Device configuration options. See the FXMAC_SetOptions(),
* FXMACClearOptions() and FXMAC_GetOptions() for information on how to
* use options.
*
* The default state of the options are noted and are what the device and
* driver will be set to after calling FXMAC_Reset() or
* FXMAC_Initialize().
*
* @{
*/
#define FXMAC_PROMISC_OPTION 0x00000001U
/* Accept all incoming packets.
* This option defaults to disabled (cleared) */
#define FXMAC_FRAME1536_OPTION 0x00000002U
/* Frame larger than 1516 support for Tx & Rx.x
* This option defaults to disabled (cleared) */
#define FXMAC_VLAN_OPTION 0x00000004U
/* VLAN Rx & Tx frame support.
* This option defaults to disabled (cleared) */
#define FXMAC_FLOW_CONTROL_OPTION 0x00000010U
/* Enable recognition of flow control frames on Rx
* This option defaults to enabled (set) */
#define FXMAC_FCS_STRIP_OPTION 0x00000020U
/* Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not
* stripped.
* This option defaults to enabled (set) */
#define FXMAC_FCS_INSERT_OPTION 0x00000040U
/* Generate FCS field and add PAD automatically for outgoing frames.
* This option defaults to disabled (cleared) */
#define FXMAC_LENTYPE_ERR_OPTION 0x00000080U
/* Enable Length/Type error checking for incoming frames. When this option is
* set, the MAC will filter frames that have a mismatched type/length field
* and if FXMAC_REPORT_RXERR_OPTION is set, the user is notified when these
* types of frames are encountered. When this option is cleared, the MAC will
* allow these types of frames to be received.
*
* This option defaults to disabled (cleared) */
#define FXMAC_TRANSMITTER_ENABLE_OPTION 0x00000100U
/* Enable the transmitter.
* This option defaults to enabled (set) */
#define FXMAC_RECEIVER_ENABLE_OPTION 0x00000200U
/* Enable the receiver
* This option defaults to enabled (set) */
#define FXMAC_BROADCAST_OPTION 0x00000400U
/* Allow reception of the broadcast address
* This option defaults to enabled (set) */
#define FXMAC_MULTICAST_OPTION 0x00000800U
/* Allows reception of multicast addresses programmed into hash
* This option defaults to disabled (clear) */
#define FXMAC_RX_CHKSUM_ENABLE_OPTION 0x00001000U
/* Enable the RX checksum offload
* This option defaults to enabled (set) */
#define FXMAC_TX_CHKSUM_ENABLE_OPTION 0x00002000U
/* Enable the TX checksum offload
* This option defaults to enabled (set) */
#define FXMAC_JUMBO_ENABLE_OPTION 0x00004000U
#define FXMAC_SGMII_ENABLE_OPTION 0x00008000U
#define FXMAC_LOOPBACK_NO_MII_OPTION 0x00010000U
#define FXMAC_LOOPBACK_USXGMII_OPTION 0x00020000U
#define FXMAC_GET_TXRING(instance) (instance.tx_bd_queue.bdring)
#define FXMAC_GET_RXRING(instance) (instance.rx_bd_queue.bdring)
#define FXMAC_DEFAULT_OPTIONS \
((u32)FXMAC_FLOW_CONTROL_OPTION | \
(u32)FXMAC_FCS_INSERT_OPTION | \
(u32)FXMAC_FCS_STRIP_OPTION | \
(u32)FXMAC_BROADCAST_OPTION | \
(u32)FXMAC_LENTYPE_ERR_OPTION | \
(u32)FXMAC_TRANSMITTER_ENABLE_OPTION | \
(u32)FXMAC_RECEIVER_ENABLE_OPTION | \
(u32)FXMAC_RX_CHKSUM_ENABLE_OPTION | \
(u32)FXMAC_TX_CHKSUM_ENABLE_OPTION)
typedef enum
{
FXMAC_LINKDOWN = 0,
FXMAC_LINKUP = 1,
FXMAC_NEGOTIATING = 2
} FXmacLinkStatus;
/* The next few constants help upper layers determine the size of memory
* pools used for Ethernet buffers and descriptor lists.
*/
#define FXMAC_MAC_ADDR_SIZE 6U /* size of Ethernet header */
#define FXMAC_MTU 1500U /* max MTU size of Ethernet frame */
#define FXMAC_MTU_JUMBO 10240U /* max MTU size of jumbo frame */
#define FXMAC_HDR_SIZE 14U /* size of Ethernet header , DA + SA + TYPE*/
#define FXMAC_HDR_VLAN_SIZE 18U /* size of Ethernet header with VLAN */
#define FXMAC_TRL_SIZE 4U /* size of Ethernet trailer (FCS) */
#define FXMAC_MAX_FRAME_SIZE (FXMAC_MTU + FXMAC_HDR_SIZE + \
FXMAC_TRL_SIZE)
#define FXMAC_MAX_VLAN_FRAME_SIZE (FXMAC_MTU + FXMAC_HDR_SIZE + \
FXMAC_HDR_VLAN_SIZE + FXMAC_TRL_SIZE)
#define FXMAC_MAX_VLAN_FRAME_SIZE_JUMBO (FXMAC_MTU_JUMBO + FXMAC_HDR_SIZE + \
FXMAC_HDR_VLAN_SIZE + FXMAC_TRL_SIZE)
#define FXMAC_MAX_FRAME_SIZE_JUMBO (FXMAC_MTU_JUMBO + FXMAC_HDR_SIZE + FXMAC_TRL_SIZE)
/** @name Callback identifiers
*
* These constants are used as parameters to FXMAC_SetHandler()
* @{
*/
#define FXMAC_HANDLER_DMASEND 1U /* 发送中断 */
#define FXMAC_HANDLER_DMARECV 2U /* 接收中断 */
#define FXMAC_HANDLER_ERROR 3U /* 异常中断 */
#define FXMAC_HANDLER_LINKCHANGE 4U /* 连接状态 */
#define FXMAC_HANDLER_RESTART 5U /* 发送描述符队列发生异常 */
/*@}*/
#define FXMAC_DMA_SG_IS_STARTED 0
#define FXMAC_DMA_SG_IS_STOPED 1
#define FXMAC_SPEED_10 10U
#define FXMAC_SPEED_100 100U
#define FXMAC_SPEED_1000 1000U
#define FXMAC_SPEED_2500 2500U
#define FXMAC_SPEED_5000 5000U
#define FXMAC_SPEED_10000 10000U
#define FXMAC_SPEED_25000 25000U
/** @name Direction identifiers
*
* These are used by several functions and callbacks that need
* to specify whether an operation specifies a send or receive channel.
* @{
*/
#define FXMAC_SEND 1U /* send direction */
#define FXMAC_RECV 2U /* receive direction */
/****************************************************************************/
/**
*
* This macro triggers trasmit circuit to send data currently in TX buffer(s).
*
* @param instance_p is a pointer to the FXmac instance to be worked on.
*
* @return
*
* @note
*
* Signature: void FXmacTransmit(FXmac *instance_p)
*
*****************************************************************************/
#define FXmacTransmit(instance_p) \
FXMAC_WRITEREG32((instance_p)->config.base_address, \
FXMAC_NWCTRL_OFFSET, \
(FXMAC_READREG32((instance_p)->config.base_address, \
FXMAC_NWCTRL_OFFSET) | \
FXMAC_NWCTRL_STARTTX_MASK))
typedef void (*FXmacIrqHandler)(void *args);
typedef void (*FXmacErrorIrqHandler)(void *args, u32 direction, u32 error_word);
/* Interface Mode definitions */
typedef enum
{
FXMAC_PHY_INTERFACE_MODE_SGMII,
FXMAC_PHY_INTERFACE_MODE_RMII,
FXMAC_PHY_INTERFACE_MODE_RGMII,
FXMAC_PHY_INTERFACE_MODE_XGMII,
FXMAC_PHY_INTERFACE_MODE_USXGMII,
} FXmacPhyInterface;
typedef struct
{
u32 instance_id; /* Id of device*/
volatile uintptr_t base_address;
volatile uintptr_t extral_mode_base;
volatile uintptr_t extral_loopback_base;
FXmacPhyInterface interface;
u32 speed; /* FXMAC_SPEED_XXX */
u32 duplex; /* 1 is full-duplex , 0 is half-duplex */
u32 auto_neg; /* Enable auto-negotiation - when set active high, autonegotiation operation is enabled. */
u32 pclk_hz;
u32 max_queue_num; /* Number of Xmac Controller Queues */
u32 tx_queue_id; /* 0 ~ FT_XMAC_QUEUE_MAX_NUM ,Index queue number */
u32 rx_queue_id; /* 0 ~ FT_XMAC_QUEUE_MAX_NUM ,Index queue number */
u32 hotplug_irq_num;
u32 dma_brust_length; /* burst length */
u32 network_default_config;
u32 queue_irq_num[FT_XMAC_QUEUE_MAX_NUM]; /* mac0 8个 ,其他的 4个 */
} FXmacConfig;
typedef struct
{
u32 queue_id;
FXmacBdRing bdring;
} FXmacQueue;
typedef struct
{
FXmacConfig config;
u32 is_ready; /* Device is ininitialized and ready*/
u32 is_started;
u32 link_status; /* indicates link status ,FXMAC_LINKUP is link up ,FXMAC_LINKDOWN is link down,FXMAC_NEGOTIATING is need to negotiating*/
u32 options;
FXmacQueue tx_bd_queue; /* Transmit Queue */
FXmacQueue rx_bd_queue; /* Receive Queue */
FXmacIrqHandler send_irq_handler;
void *send_args;
FXmacIrqHandler recv_irq_handler;
void *recv_args;
FXmacErrorIrqHandler error_irq_handler;
void *error_args;
FXmacIrqHandler link_change_handler;
void *link_change_args;
FXmacIrqHandler restart_handler;
void *restart_args;
u32 moudle_id; /* Module identification number */
u32 max_mtu_size;
u32 max_frame_size;
u32 phy_address; /* phy address */
u32 rxbuf_mask; /* 1000,100,10 */
} FXmac;
/* fxmac_sinit.c */
const FXmacConfig *FXmacLookupConfig(u32 instance_id);
/* fgmac.c */
FError FXmacCfgInitialize(FXmac *instance_p, const FXmacConfig *config_p);
void FXmacInitInterface(FXmac *instance_p);
void FXmacGetMacAddress(FXmac *instance_p, u8 *address_ptr, u8 index);
FError FXmacSetMacAddress(FXmac *instance_p, u8 *address_ptr, u8 index);
FError FXmacSetOptions(FXmac *instance_p, u32 options, u32 queue_num);
FError FXmacClearOptions(FXmac *instance_p, u32 options, u32 queue_num);
void FXmacStart(FXmac *instance_p);
void FXmacStop(FXmac *instance_p);
void FXmacSetQueuePtr(FXmac *instance_p, uintptr QPtr, u8 QueueNum,
u32 direction);
/* phy interface */
FError FXmacPhyWrite(FXmac *instance_p, u32 phy_address,
u32 register_num, u16 phy_data);
FError FXmacPhyRead(FXmac *instance_p, u32 phy_address,
u32 register_num, u16 *phydat_aptr);
FError FXmacPhyInit(FXmac *instance_p, u32 speed, u32 duplex_mode, u32 autonegotiation_en);
void FXmacSelectClk(FXmac *instance_p);
FError FXmacSetHandler(FXmac *instance_p, u32 handler_type, void *func_pointer, void *call_back_ref);
/* interrupt */
void FXmacIntrHandler(s32 vector, void *args);
void FXmacClearHash(FXmac *instance_p);
#ifdef __cplusplus
}
#endif
#endif // !
|