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 57 static 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 81 static 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 95 static 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 141 static 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 161 static 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 187 static 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 201 static 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 215 static 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 234 static 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 248 static 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 262 static 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 276 static 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 292 static 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 317 static 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. */ 337 static 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 351 static 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 370 static 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 384 static 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 441 static 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 455 static 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 469 static 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 484 static 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 498 static 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 543 static 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 575 static 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 610 static 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 647 static 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 661 static 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 675 static 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 704 static 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 717 static 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 750 static 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 844 static 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 867 static 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 929 t_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