1/*
2 * Copyright 2008-2012 Freescale Semiconductor Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above copyright
9 *       notice, this list of conditions and the following disclaimer in the
10 *       documentation and/or other materials provided with the distribution.
11 *     * Neither the name of Freescale Semiconductor nor the
12 *       names of its contributors may be used to endorse or promote products
13 *       derived from this software without specific prior written permission.
14 *
15 *
16 * ALTERNATIVELY, this software may be distributed under the terms of the
17 * GNU General Public License ("GPL") as published by the Free Software
18 * Foundation, either version 2 of that License or (at your option) any
19 * later version.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33
34/******************************************************************************
35 @File          tgec.c
36
37 @Description   FM 10G MAC ...
38*//***************************************************************************/
39
40#include "std_ext.h"
41#include "string_ext.h"
42#include "error_ext.h"
43#include "xx_ext.h"
44#include "endian_ext.h"
45#include "debug_ext.h"
46#include "crc_mac_addr_ext.h"
47
48#include "fm_common.h"
49#include "fsl_fman_tgec.h"
50#include "tgec.h"
51
52
53/*****************************************************************************/
54/*                      Internal routines                                    */
55/*****************************************************************************/
56
57static t_Error CheckInitParameters(t_Tgec    *p_Tgec)
58{
59    if (ENET_SPEED_FROM_MODE(p_Tgec->enetMode) < e_ENET_SPEED_10000)
60        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC driver only support 10G speed"));
61#if (FM_MAX_NUM_OF_10G_MACS > 0)
62    if (p_Tgec->macId >= FM_MAX_NUM_OF_10G_MACS)
63        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("macId of 10G can not be greater than 0"));
64#endif /* (FM_MAX_NUM_OF_10G_MACS > 0) */
65
66    if (p_Tgec->addr == 0)
67        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Ethernet 10G MAC Must have a valid MAC Address"));
68    if (!p_Tgec->f_Exception)
69        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Exception"));
70    if (!p_Tgec->f_Event)
71        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("uninitialized f_Event"));
72#ifdef FM_LEN_CHECK_ERRATA_FMAN_SW002
73    if (!p_Tgec->p_TgecDriverParam->no_length_check_enable)
74       RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("LengthCheck!"));
75#endif /* FM_LEN_CHECK_ERRATA_FMAN_SW002 */
76    return E_OK;
77}
78
79/* ......................................................................... */
80
81static uint32_t GetMacAddrHashCode(uint64_t ethAddr)
82{
83    uint32_t crc;
84
85    /* CRC calculation */
86    GET_MAC_ADDR_CRC(ethAddr, crc);
87
88    crc = GetMirror32(crc);
89
90    return crc;
91}
92
93/* ......................................................................... */
94
95static void TgecErrException(t_Handle h_Tgec)
96{
97    t_Tgec              *p_Tgec = (t_Tgec *)h_Tgec;
98    uint32_t            event;
99    struct tgec_regs    *p_TgecMemMap = p_Tgec->p_MemMap;
100
101    /* do not handle MDIO events */
102    event = fman_tgec_get_event(p_TgecMemMap, ~(TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
103    event &= fman_tgec_get_interrupt_mask(p_TgecMemMap);
104
105    fman_tgec_ack_event(p_TgecMemMap, event);
106
107    if (event & TGEC_IMASK_REM_FAULT)
108        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_REM_FAULT);
109    if (event & TGEC_IMASK_LOC_FAULT)
110        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_LOC_FAULT);
111    if (event & TGEC_IMASK_TX_ECC_ER)
112        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_1TX_ECC_ER);
113    if (event & TGEC_IMASK_TX_FIFO_UNFL)
114        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_UNFL);
115    if (event & TGEC_IMASK_TX_FIFO_OVFL)
116        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_FIFO_OVFL);
117    if (event & TGEC_IMASK_TX_ER)
118        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_TX_ER);
119    if (event & TGEC_IMASK_RX_FIFO_OVFL)
120        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FIFO_OVFL);
121    if (event & TGEC_IMASK_RX_ECC_ER)
122        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ECC_ER);
123    if (event & TGEC_IMASK_RX_JAB_FRM)
124        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_JAB_FRM);
125    if (event & TGEC_IMASK_RX_OVRSZ_FRM)
126        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_OVRSZ_FRM);
127    if (event & TGEC_IMASK_RX_RUNT_FRM)
128        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_RUNT_FRM);
129    if (event & TGEC_IMASK_RX_FRAG_FRM)
130        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_FRAG_FRM);
131    if (event & TGEC_IMASK_RX_LEN_ER)
132        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_LEN_ER);
133    if (event & TGEC_IMASK_RX_CRC_ER)
134        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_CRC_ER);
135    if (event & TGEC_IMASK_RX_ALIGN_ER)
136        p_Tgec->f_Exception(p_Tgec->h_App, e_FM_MAC_EX_10G_RX_ALIGN_ER);
137}
138
139/* ......................................................................... */
140
141static void TgecException(t_Handle h_Tgec)
142{
143     t_Tgec             *p_Tgec = (t_Tgec *)h_Tgec;
144     uint32_t           event;
145     struct tgec_regs   *p_TgecMemMap = p_Tgec->p_MemMap;
146
147     /* handle only MDIO events */
148     event = fman_tgec_get_event(p_TgecMemMap, (TGEC_IMASK_MDIO_SCAN_EVENT | TGEC_IMASK_MDIO_CMD_CMPL));
149     event &= fman_tgec_get_interrupt_mask(p_TgecMemMap);
150
151     fman_tgec_ack_event(p_TgecMemMap, event);
152
153     if (event & TGEC_IMASK_MDIO_SCAN_EVENT)
154         p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_SCAN_EVENTMDIO);
155     if (event & TGEC_IMASK_MDIO_CMD_CMPL)
156         p_Tgec->f_Event(p_Tgec->h_App, e_FM_MAC_EX_10G_MDIO_CMD_CMPL);
157}
158
159/* ......................................................................... */
160
161static void FreeInitResources(t_Tgec *p_Tgec)
162{
163    if (p_Tgec->mdioIrq != NO_IRQ)
164    {
165        XX_DisableIntr(p_Tgec->mdioIrq);
166        XX_FreeIntr(p_Tgec->mdioIrq);
167    }
168
169    FmUnregisterIntr(p_Tgec->fmMacControllerDriver.h_Fm, e_FM_MOD_10G_MAC, p_Tgec->macId, e_FM_INTR_TYPE_ERR);
170
171    /* release the driver's group hash table */
172    FreeHashTable(p_Tgec->p_MulticastAddrHash);
173    p_Tgec->p_MulticastAddrHash =   NULL;
174
175    /* release the driver's individual hash table */
176    FreeHashTable(p_Tgec->p_UnicastAddrHash);
177    p_Tgec->p_UnicastAddrHash =     NULL;
178}
179
180
181/*****************************************************************************/
182/*                     10G MAC API routines                                  */
183/*****************************************************************************/
184
185/* ......................................................................... */
186
187static t_Error TgecEnable(t_Handle h_Tgec,  e_CommMode mode)
188{
189    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
190
191    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
192    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
193
194    fman_tgec_enable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
195
196    return E_OK;
197}
198
199/* ......................................................................... */
200
201static t_Error TgecDisable (t_Handle h_Tgec, e_CommMode mode)
202{
203    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
204
205    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
206    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
207
208    fman_tgec_disable(p_Tgec->p_MemMap, (mode & e_COMM_MODE_RX), (mode & e_COMM_MODE_TX));
209
210    return E_OK;
211}
212
213/* ......................................................................... */
214
215static t_Error TgecSetPromiscuous(t_Handle h_Tgec, bool newVal)
216{
217    t_Tgec       *p_Tgec = (t_Tgec *)h_Tgec;
218
219    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
220    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
221
222    fman_tgec_set_promiscuous(p_Tgec->p_MemMap, newVal);
223
224    return E_OK;
225}
226
227
228/*****************************************************************************/
229/*                      Tgec Configs modification functions                 */
230/*****************************************************************************/
231
232/* ......................................................................... */
233
234static t_Error TgecConfigLoopback(t_Handle h_Tgec, bool newVal)
235{
236    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
237
238    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
239    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
240
241    p_Tgec->p_TgecDriverParam->loopback_enable = newVal;
242
243    return E_OK;
244}
245
246/* ......................................................................... */
247
248static t_Error TgecConfigWan(t_Handle h_Tgec, bool newVal)
249{
250    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
251
252    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
253    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
254
255    p_Tgec->p_TgecDriverParam->wan_mode_enable = newVal;
256
257    return E_OK;
258}
259
260/* ......................................................................... */
261
262static t_Error TgecConfigMaxFrameLength(t_Handle h_Tgec, uint16_t newVal)
263{
264    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
265
266    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
267    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
268
269    p_Tgec->p_TgecDriverParam->max_frame_length = newVal;
270
271    return E_OK;
272}
273
274/* ......................................................................... */
275
276static t_Error TgecConfigLengthCheck(t_Handle h_Tgec, bool newVal)
277{
278    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
279
280    UNUSED(newVal);
281
282    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
283    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
284
285    p_Tgec->p_TgecDriverParam->no_length_check_enable = !newVal;
286
287    return E_OK;
288}
289
290/* ......................................................................... */
291
292static t_Error TgecConfigException(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
293{
294    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
295    uint32_t    bitMask = 0;
296
297    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
298    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
299
300    GET_EXCEPTION_FLAG(bitMask, exception);
301    if (bitMask)
302    {
303        if (enable)
304            p_Tgec->exceptions |= bitMask;
305        else
306            p_Tgec->exceptions &= ~bitMask;
307    }
308    else
309        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
310
311    return E_OK;
312}
313
314#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
315/* ......................................................................... */
316
317static t_Error TgecConfigSkipFman11Workaround(t_Handle h_Tgec)
318{
319    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
320
321    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
322    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
323
324    p_Tgec->p_TgecDriverParam->skip_fman11_workaround = TRUE;
325
326    return E_OK;
327}
328#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
329
330
331/*****************************************************************************/
332/*                      Tgec Run Time API functions                         */
333/*****************************************************************************/
334
335/* ......................................................................... */
336/* backward compatibility. will be removed in the future. */
337static t_Error TgecTxMacPause(t_Handle h_Tgec, uint16_t pauseTime)
338{
339    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
340
341    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
342    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
343    fman_tgec_set_tx_pause_frames(p_Tgec->p_MemMap, pauseTime);
344
345
346    return E_OK;
347}
348
349/* ......................................................................... */
350
351static t_Error TgecSetTxPauseFrames(t_Handle h_Tgec,
352                                    uint8_t  priority,
353                                    uint16_t pauseTime,
354                                    uint16_t threshTime)
355{
356    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
357
358    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
359    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
360
361    UNUSED(priority); UNUSED(threshTime);
362
363    fman_tgec_set_tx_pause_frames(p_Tgec->p_MemMap, pauseTime);
364
365    return E_OK;
366}
367
368/* ......................................................................... */
369
370static t_Error TgecRxIgnoreMacPause(t_Handle h_Tgec, bool en)
371{
372    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
373
374    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_STATE);
375    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
376
377    fman_tgec_set_rx_ignore_pause_frames(p_Tgec->p_MemMap, en);
378
379    return E_OK;
380}
381
382/* ......................................................................... */
383
384static t_Error TgecGetStatistics(t_Handle h_Tgec, t_FmMacStatistics *p_Statistics)
385{
386    t_Tgec              *p_Tgec = (t_Tgec *)h_Tgec;
387    struct tgec_regs    *p_TgecMemMap;
388
389    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
390    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
391    SANITY_CHECK_RETURN_ERROR(p_Statistics, E_NULL_POINTER);
392
393    p_TgecMemMap = p_Tgec->p_MemMap;
394
395    p_Statistics->eStatPkts64           = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R64);
396    p_Statistics->eStatPkts65to127      = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R127);
397    p_Statistics->eStatPkts128to255     = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R255);
398    p_Statistics->eStatPkts256to511     = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R511);
399    p_Statistics->eStatPkts512to1023    = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1023);
400    p_Statistics->eStatPkts1024to1518   = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1518);
401    p_Statistics->eStatPkts1519to1522   = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_R1519X);
402/* */
403    p_Statistics->eStatFragments        = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRFRG);
404    p_Statistics->eStatJabbers          = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRJBR);
405
406    p_Statistics->eStatsDropEvents      = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RDRP);
407    p_Statistics->eStatCRCAlignErrors   = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RALN);
408
409    p_Statistics->eStatUndersizePkts    = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TRUND);
410    p_Statistics->eStatOversizePkts     = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TROVR);
411/* Pause */
412    p_Statistics->reStatPause           = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RXPF);
413    p_Statistics->teStatPause           = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TXPF);
414
415/* MIB II */
416    p_Statistics->ifInOctets            = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_ROCT);
417    p_Statistics->ifInUcastPkts         = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RUCA);
418    p_Statistics->ifInMcastPkts         = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RMCA);
419    p_Statistics->ifInBcastPkts         = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RBCA);
420    p_Statistics->ifInPkts              = p_Statistics->ifInUcastPkts
421                                        + p_Statistics->ifInMcastPkts
422                                        + p_Statistics->ifInBcastPkts;
423    p_Statistics->ifInDiscards          = 0;
424    p_Statistics->ifInErrors            = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_RERR);
425
426    p_Statistics->ifOutOctets           = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TOCT);
427    p_Statistics->ifOutUcastPkts        = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TUCA);
428    p_Statistics->ifOutMcastPkts        = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TMCA);
429    p_Statistics->ifOutBcastPkts        = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TBCA);
430    p_Statistics->ifOutPkts             = p_Statistics->ifOutUcastPkts
431                                        + p_Statistics->ifOutMcastPkts
432                                        + p_Statistics->ifOutBcastPkts;
433    p_Statistics->ifOutDiscards         = 0;
434    p_Statistics->ifOutErrors           = fman_tgec_get_counter(p_TgecMemMap, E_TGEC_COUNTER_TERR);
435
436    return E_OK;
437}
438
439/* ......................................................................... */
440
441static t_Error TgecEnable1588TimeStamp(t_Handle h_Tgec)
442{
443    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
444
445    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
446    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
447
448    fman_tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 1);
449
450    return E_OK;
451}
452
453/* ......................................................................... */
454
455static t_Error TgecDisable1588TimeStamp(t_Handle h_Tgec)
456{
457    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
458
459    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
460    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
461
462    fman_tgec_enable_1588_time_stamp(p_Tgec->p_MemMap, 0);
463
464    return E_OK;
465}
466
467/* ......................................................................... */
468
469static t_Error TgecModifyMacAddress (t_Handle h_Tgec, t_EnetAddr *p_EnetAddr)
470{
471    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
472
473    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
474    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
475
476    p_Tgec->addr = ENET_ADDR_TO_UINT64(*p_EnetAddr);
477    fman_tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)(*p_EnetAddr));
478
479    return E_OK;
480}
481
482/* ......................................................................... */
483
484static t_Error TgecResetCounters (t_Handle h_Tgec)
485{
486    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
487
488    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
489    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
490
491    fman_tgec_reset_stat(p_Tgec->p_MemMap);
492
493    return E_OK;
494}
495
496/* ......................................................................... */
497
498static t_Error TgecAddExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
499{
500    t_Tgec      *p_Tgec = (t_Tgec *) h_Tgec;
501    uint64_t    ethAddr;
502    uint8_t     paddrNum;
503
504    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
505    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
506
507    ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
508
509    if (ethAddr & GROUP_ADDRESS)
510        /* Multicast address has no effect in PADDR */
511        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Multicast address"));
512
513    /* Make sure no PADDR contains this address */
514    for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
515        if (p_Tgec->indAddrRegUsed[paddrNum])
516            if (p_Tgec->paddr[paddrNum] == ethAddr)
517                RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, NO_MSG);
518
519    /* Find first unused PADDR */
520    for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
521    {
522        if (!(p_Tgec->indAddrRegUsed[paddrNum]))
523        {
524            /* mark this PADDR as used */
525            p_Tgec->indAddrRegUsed[paddrNum] = TRUE;
526            /* store address */
527            p_Tgec->paddr[paddrNum] = ethAddr;
528
529            /* put in hardware */
530            fman_tgec_add_addr_in_paddr(p_Tgec->p_MemMap, (uint8_t*)(*p_EthAddr)/* , paddrNum */);
531            p_Tgec->numOfIndAddrInRegs++;
532
533            return E_OK;
534        }
535    }
536
537    /* No free PADDR */
538    RETURN_ERROR(MAJOR, E_FULL, NO_MSG);
539}
540
541/* ......................................................................... */
542
543static t_Error TgecDelExactMatchMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
544{
545    t_Tgec      *p_Tgec = (t_Tgec *) h_Tgec;
546    uint64_t    ethAddr;
547    uint8_t     paddrNum;
548
549    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
550    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
551
552    ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
553
554    /* Find used PADDR containing this address */
555    for (paddrNum = 0; paddrNum < TGEC_NUM_OF_PADDRS; paddrNum++)
556    {
557        if ((p_Tgec->indAddrRegUsed[paddrNum]) &&
558            (p_Tgec->paddr[paddrNum] == ethAddr))
559        {
560            /* mark this PADDR as not used */
561            p_Tgec->indAddrRegUsed[paddrNum] = FALSE;
562            /* clear in hardware */
563            fman_tgec_clear_addr_in_paddr(p_Tgec->p_MemMap /*, paddrNum */);
564            p_Tgec->numOfIndAddrInRegs--;
565
566            return E_OK;
567        }
568    }
569
570    RETURN_ERROR(MAJOR, E_NOT_FOUND, NO_MSG);
571}
572
573/* ......................................................................... */
574
575static t_Error TgecAddHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
576{
577    t_Tgec          *p_Tgec = (t_Tgec *)h_Tgec;
578    t_EthHashEntry  *p_HashEntry;
579    uint32_t        crc;
580    uint32_t        hash;
581    uint64_t        ethAddr;
582
583    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
584    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
585
586    ethAddr = ENET_ADDR_TO_UINT64(*p_EthAddr);
587
588    if (!(ethAddr & GROUP_ADDRESS))
589        /* Unicast addresses not supported in hash */
590        RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unicast Address"));
591
592    /* CRC calculation */
593    crc = GetMacAddrHashCode(ethAddr);
594
595    hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK;        /* Take 9 MSB bits */
596
597    /* Create element to be added to the driver hash table */
598    p_HashEntry = (t_EthHashEntry *)XX_Malloc(sizeof(t_EthHashEntry));
599    p_HashEntry->addr = ethAddr;
600    INIT_LIST(&p_HashEntry->node);
601
602    NCSW_LIST_AddToTail(&(p_HashEntry->node), &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]));
603    fman_tgec_set_hash_table(p_Tgec->p_MemMap, (hash | TGEC_HASH_MCAST_EN));
604
605    return E_OK;
606}
607
608/* ......................................................................... */
609
610static t_Error TgecDelHashMacAddress(t_Handle h_Tgec, t_EnetAddr *p_EthAddr)
611{
612    t_Tgec           *p_Tgec = (t_Tgec *)h_Tgec;
613    t_EthHashEntry   *p_HashEntry = NULL;
614    t_List           *p_Pos;
615    uint32_t         crc;
616    uint32_t         hash;
617    uint64_t         ethAddr;
618
619    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_NULL_POINTER);
620    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
621
622    ethAddr = ((*(uint64_t *)p_EthAddr) >> 16);
623
624    /* CRC calculation */
625    crc = GetMacAddrHashCode(ethAddr);
626
627    hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK;        /* Take 9 MSB bits */
628
629    NCSW_LIST_FOR_EACH(p_Pos, &(p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
630    {
631        p_HashEntry = ETH_HASH_ENTRY_OBJ(p_Pos);
632        if (p_HashEntry->addr == ethAddr)
633        {
634            NCSW_LIST_DelAndInit(&p_HashEntry->node);
635            XX_Free(p_HashEntry);
636            break;
637        }
638    }
639    if (NCSW_LIST_IsEmpty(&p_Tgec->p_MulticastAddrHash->p_Lsts[hash]))
640        fman_tgec_set_hash_table(p_Tgec->p_MemMap, (hash & ~TGEC_HASH_MCAST_EN));
641
642    return E_OK;
643}
644
645/* ......................................................................... */
646
647static t_Error TgecGetId(t_Handle h_Tgec, uint32_t *macId)
648{
649    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
650
651    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
652    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
653
654    UNUSED(p_Tgec);
655    UNUSED(macId);
656    RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("TgecGetId Not Supported"));
657}
658
659/* ......................................................................... */
660
661static t_Error TgecGetVersion(t_Handle h_Tgec, uint32_t *macVersion)
662{
663    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
664
665    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
666    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
667
668    *macVersion = fman_tgec_get_revision(p_Tgec->p_MemMap);
669
670    return E_OK;
671}
672
673/* ......................................................................... */
674
675static t_Error TgecSetExcpetion(t_Handle h_Tgec, e_FmMacExceptions exception, bool enable)
676{
677    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
678    uint32_t    bitMask = 0;
679
680    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
681    SANITY_CHECK_RETURN_ERROR(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
682
683    GET_EXCEPTION_FLAG(bitMask, exception);
684    if (bitMask)
685    {
686        if (enable)
687            p_Tgec->exceptions |= bitMask;
688        else
689            p_Tgec->exceptions &= ~bitMask;
690   }
691    else
692        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
693
694    if (enable)
695        fman_tgec_enable_interrupt(p_Tgec->p_MemMap, bitMask);
696    else
697        fman_tgec_disable_interrupt(p_Tgec->p_MemMap, bitMask);
698
699    return E_OK;
700}
701
702/* ......................................................................... */
703
704static uint16_t TgecGetMaxFrameLength(t_Handle h_Tgec)
705{
706    t_Tgec      *p_Tgec = (t_Tgec *)h_Tgec;
707
708    SANITY_CHECK_RETURN_VALUE(p_Tgec, E_INVALID_HANDLE, 0);
709    SANITY_CHECK_RETURN_VALUE(!p_Tgec->p_TgecDriverParam, E_INVALID_STATE, 0);
710
711    return fman_tgec_get_max_frame_len(p_Tgec->p_MemMap);
712}
713
714/* ......................................................................... */
715
716#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
717static t_Error TgecTxEccWorkaround(t_Tgec *p_Tgec)
718{
719    t_Error err;
720
721#if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
722    XX_Print("Applying 10G TX ECC workaround (10GMAC-A004) ... ");
723#endif /* (DEBUG_ERRORS > 0) */
724    /* enable and set promiscuous */
725    fman_tgec_enable(p_Tgec->p_MemMap, TRUE, TRUE);
726    fman_tgec_set_promiscuous(p_Tgec->p_MemMap, TRUE);
727    err = Fm10GTxEccWorkaround(p_Tgec->fmMacControllerDriver.h_Fm, p_Tgec->macId);
728    /* disable */
729    fman_tgec_set_promiscuous(p_Tgec->p_MemMap, FALSE);
730    fman_tgec_enable(p_Tgec->p_MemMap, FALSE, FALSE);
731    fman_tgec_reset_stat(p_Tgec->p_MemMap);
732    fman_tgec_ack_event(p_Tgec->p_MemMap, 0xffffffff);
733#if defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)
734    if (err)
735        XX_Print("FAILED!\n");
736    else
737        XX_Print("done.\n");
738#endif /* (DEBUG_ERRORS > 0) */
739
740    return err;
741}
742#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
743
744/*****************************************************************************/
745/*                      FM Init & Free API                                   */
746/*****************************************************************************/
747
748/* ......................................................................... */
749
750static t_Error TgecInit(t_Handle h_Tgec)
751{
752    t_Tgec                  *p_Tgec = (t_Tgec *)h_Tgec;
753    struct tgec_cfg         *p_TgecDriverParam;
754    t_EnetAddr              ethAddr;
755    t_Error                 err;
756
757    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
758    SANITY_CHECK_RETURN_ERROR(p_Tgec->p_TgecDriverParam, E_INVALID_STATE);
759    SANITY_CHECK_RETURN_ERROR(p_Tgec->fmMacControllerDriver.h_Fm, E_INVALID_HANDLE);
760
761    FM_GetRevision(p_Tgec->fmMacControllerDriver.h_Fm, &p_Tgec->fmMacControllerDriver.fmRevInfo);
762    CHECK_INIT_PARAMETERS(p_Tgec, CheckInitParameters);
763
764    p_TgecDriverParam = p_Tgec->p_TgecDriverParam;
765
766    MAKE_ENET_ADDR_FROM_UINT64(p_Tgec->addr, ethAddr);
767    fman_tgec_set_mac_address(p_Tgec->p_MemMap, (uint8_t *)ethAddr);
768
769    /* interrupts */
770#ifdef FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005
771    {
772        if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev <=2)
773            p_Tgec->exceptions &= ~(TGEC_IMASK_REM_FAULT | TGEC_IMASK_LOC_FAULT);
774    }
775#endif /* FM_10G_REM_N_LCL_FLT_EX_10GMAC_ERRATA_SW005 */
776
777#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
778    if (!p_Tgec->p_TgecDriverParam->skip_fman11_workaround &&
779        ((err = TgecTxEccWorkaround(p_Tgec)) != E_OK))
780    {
781        FreeInitResources(p_Tgec);
782        REPORT_ERROR(MINOR, err, ("TgecTxEccWorkaround FAILED"));
783    }
784#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
785
786    err = fman_tgec_init(p_Tgec->p_MemMap, p_TgecDriverParam, p_Tgec->exceptions);
787    if (err)
788    {
789        FreeInitResources(p_Tgec);
790        RETURN_ERROR(MAJOR, err, ("This TGEC version does not support the required i/f mode"));
791    }
792
793    /* Max Frame Length */
794    err = FmSetMacMaxFrame(p_Tgec->fmMacControllerDriver.h_Fm,
795                           e_FM_MAC_10G,
796                           p_Tgec->fmMacControllerDriver.macId,
797                           p_TgecDriverParam->max_frame_length);
798    if (err != E_OK)
799    {
800        FreeInitResources(p_Tgec);
801        RETURN_ERROR(MINOR, err, NO_MSG);
802    }
803/* we consider having no IPC a non crasher... */
804
805#ifdef FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007
806    if (p_Tgec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
807        fman_tgec_set_erratum_tx_fifo_corruption_10gmac_a007(p_Tgec->p_MemMap);
808#endif /* FM_TX_FIFO_CORRUPTION_ERRATA_10GMAC_A007 */
809
810    p_Tgec->p_MulticastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
811    if (!p_Tgec->p_MulticastAddrHash)
812    {
813        FreeInitResources(p_Tgec);
814        RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
815    }
816
817    p_Tgec->p_UnicastAddrHash = AllocHashTable(HASH_TABLE_SIZE);
818    if (!p_Tgec->p_UnicastAddrHash)
819    {
820        FreeInitResources(p_Tgec);
821        RETURN_ERROR(MAJOR, E_NO_MEMORY, ("allocation hash table is FAILED"));
822    }
823
824    FmRegisterIntr(p_Tgec->fmMacControllerDriver.h_Fm,
825                   e_FM_MOD_10G_MAC,
826                   p_Tgec->macId,
827                   e_FM_INTR_TYPE_ERR,
828                   TgecErrException,
829                   p_Tgec);
830    if (p_Tgec->mdioIrq != NO_IRQ)
831    {
832        XX_SetIntr(p_Tgec->mdioIrq, TgecException, p_Tgec);
833        XX_EnableIntr(p_Tgec->mdioIrq);
834    }
835
836    XX_Free(p_TgecDriverParam);
837    p_Tgec->p_TgecDriverParam = NULL;
838
839    return E_OK;
840}
841
842/* ......................................................................... */
843
844static t_Error TgecFree(t_Handle h_Tgec)
845{
846    t_Tgec       *p_Tgec = (t_Tgec *)h_Tgec;
847
848    SANITY_CHECK_RETURN_ERROR(p_Tgec, E_INVALID_HANDLE);
849
850    if (p_Tgec->p_TgecDriverParam)
851    {
852        /* Called after config */
853        XX_Free(p_Tgec->p_TgecDriverParam);
854        p_Tgec->p_TgecDriverParam = NULL;
855    }
856    else
857        /* Called after init */
858        FreeInitResources(p_Tgec);
859
860    XX_Free(p_Tgec);
861
862    return E_OK;
863}
864
865/* ......................................................................... */
866
867static void InitFmMacControllerDriver(t_FmMacControllerDriver *p_FmMacControllerDriver)
868{
869    p_FmMacControllerDriver->f_FM_MAC_Init                      = TgecInit;
870    p_FmMacControllerDriver->f_FM_MAC_Free                      = TgecFree;
871
872    p_FmMacControllerDriver->f_FM_MAC_SetStatistics             = NULL;
873    p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback            = TgecConfigLoopback;
874    p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength      = TgecConfigMaxFrameLength;
875
876    p_FmMacControllerDriver->f_FM_MAC_ConfigWan                 = TgecConfigWan;
877
878    p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc           = NULL; /* TGEC always works with pad+crc */
879    p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex          = NULL; /* half-duplex is not supported in xgec */
880    p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck         = TgecConfigLengthCheck;
881    p_FmMacControllerDriver->f_FM_MAC_ConfigException           = TgecConfigException;
882    p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit         = NULL;
883
884#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
885    p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround= TgecConfigSkipFman11Workaround;
886#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
887
888    p_FmMacControllerDriver->f_FM_MAC_SetException              = TgecSetExcpetion;
889
890    p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp       = TgecEnable1588TimeStamp;
891    p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp      = TgecDisable1588TimeStamp;
892
893    p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous            = TgecSetPromiscuous;
894    p_FmMacControllerDriver->f_FM_MAC_AdjustLink                = NULL;
895    p_FmMacControllerDriver->f_FM_MAC_SetWakeOnLan              = NULL;
896    p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg            = NULL;
897
898    p_FmMacControllerDriver->f_FM_MAC_Enable                    = TgecEnable;
899    p_FmMacControllerDriver->f_FM_MAC_Disable                   = TgecDisable;
900    p_FmMacControllerDriver->f_FM_MAC_Resume                    = NULL;
901
902    p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames      = TgecTxMacPause;
903    p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames          = TgecSetTxPauseFrames;
904    p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames    = TgecRxIgnoreMacPause;
905
906    p_FmMacControllerDriver->f_FM_MAC_ResetCounters             = TgecResetCounters;
907    p_FmMacControllerDriver->f_FM_MAC_GetStatistics             = TgecGetStatistics;
908
909    p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr             = TgecModifyMacAddress;
910    p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr            = TgecAddHashMacAddress;
911    p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr         = TgecDelHashMacAddress;
912    p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr      = TgecAddExactMatchMacAddress;
913    p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr  = TgecDelExactMatchMacAddress;
914    p_FmMacControllerDriver->f_FM_MAC_GetId                     = TgecGetId;
915    p_FmMacControllerDriver->f_FM_MAC_GetVersion                = TgecGetVersion;
916    p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength         = TgecGetMaxFrameLength;
917
918    p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg           = TGEC_MII_WritePhyReg;
919    p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg            = TGEC_MII_ReadPhyReg;
920}
921
922
923/*****************************************************************************/
924/*                      Tgec Config  Main Entry                             */
925/*****************************************************************************/
926
927/* ......................................................................... */
928
929t_Handle TGEC_Config(t_FmMacParams *p_FmMacParam)
930{
931    t_Tgec              *p_Tgec;
932    struct tgec_cfg     *p_TgecDriverParam;
933    uintptr_t           baseAddr;
934
935    SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_NULL_POINTER, NULL);
936
937    baseAddr = p_FmMacParam->baseAddr;
938    /* allocate memory for the UCC GETH data structure. */
939    p_Tgec = (t_Tgec *)XX_Malloc(sizeof(t_Tgec));
940    if (!p_Tgec)
941    {
942        REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver structure"));
943        return NULL;
944    }
945    memset(p_Tgec, 0, sizeof(t_Tgec));
946    InitFmMacControllerDriver(&p_Tgec->fmMacControllerDriver);
947
948    /* allocate memory for the 10G MAC driver parameters data structure. */
949    p_TgecDriverParam = (struct tgec_cfg *) XX_Malloc(sizeof(struct tgec_cfg));
950    if (!p_TgecDriverParam)
951    {
952        REPORT_ERROR(MAJOR, E_NO_MEMORY, ("10G MAC driver parameters"));
953        XX_Free(p_Tgec);
954        return NULL;
955    }
956    memset(p_TgecDriverParam, 0, sizeof(struct tgec_cfg));
957
958    /* Plant parameter structure pointer */
959    p_Tgec->p_TgecDriverParam = p_TgecDriverParam;
960
961    fman_tgec_defconfig(p_TgecDriverParam);
962
963    p_Tgec->p_MemMap        = (struct tgec_regs *)UINT_TO_PTR(baseAddr);
964    p_Tgec->p_MiiMemMap     = (t_TgecMiiAccessMemMap *)UINT_TO_PTR(baseAddr + TGEC_TO_MII_OFFSET);
965    p_Tgec->addr            = ENET_ADDR_TO_UINT64(p_FmMacParam->addr);
966    p_Tgec->enetMode        = p_FmMacParam->enetMode;
967    p_Tgec->macId           = p_FmMacParam->macId;
968    p_Tgec->exceptions      = DEFAULT_exceptions;
969    p_Tgec->mdioIrq         = p_FmMacParam->mdioIrq;
970    p_Tgec->f_Exception     = p_FmMacParam->f_Exception;
971    p_Tgec->f_Event         = p_FmMacParam->f_Event;
972    p_Tgec->h_App           = p_FmMacParam->h_App;
973
974    return p_Tgec;
975}
976