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