32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include <machine/intrinsics.h>
36 #include <machine/wdtcon.h>
37 #include "tc_inc_path.h"
38 #include TC_INCLUDE(TCPATH/Ifx_reg.h)
39 #include TC_INCLUDE(TCPATH/IfxCpu_bf.h)
40 #include "interrupts.h"
49 #if defined(__TASKING__)
122 Ifx_SCU_CCUCON5 ccucon5;
125 TRACE_INFO(
"Initializing TC3xx Ethernet MAC...\r\n");
128 nicDriverInterface = interface;
132 while(SCU_CCUCON5.B.LCK != 0)
137 unlock_safety_wdtcon();
140 ccucon5.U = SCU_CCUCON5.U;
141 ccucon5.B.GETHDIV = 2;
143 SCU_CCUCON5.U = ccucon5.U;
146 lock_safety_wdtcon();
149 while(SCU_CCUCON5.B.LCK != 0)
156 MODULE_GETH.CLC.B.DISR = 0;
166 MODULE_GETH.KRST0.B.RST = 1;
167 MODULE_GETH.KRST1.B.RST = 1;
172 while(MODULE_GETH.KRST0.B.RSTSTAT == 0)
179 MODULE_GETH.KRSTCLR.B.CLR = 1;
184 MODULE_GETH.DMA_MODE.B.SWR = 1;
186 while(MODULE_GETH.DMA_MODE.B.SWR)
191 MODULE_GETH.MAC_MDIO_ADDRESS.B.CR = 5;
194 if(interface->phyDriver != NULL)
197 error = interface->phyDriver->init(interface);
199 else if(interface->switchDriver != NULL)
202 error = interface->switchDriver->init(interface);
217 MODULE_GETH.MAC_CONFIGURATION.U = 0;
218 MODULE_GETH.MAC_CONFIGURATION.B.PS = 1;
219 MODULE_GETH.MAC_CONFIGURATION.B.DO = 1;
222 MODULE_GETH.MAC_PACKET_FILTER.U = 0;
228 MODULE_GETH.MAC_Q0_TX_FLOW_CTRL.U = 0;
229 MODULE_GETH.MAC_RX_FLOW_CTRL.U = 0;
232 MODULE_GETH.MAC_RXQ_CTRL0.B.RXQ0EN = 2;
235 MODULE_GETH.DMA_MODE.B.INTM = 0;
236 MODULE_GETH.DMA_MODE.B.PR = 0;
239 MODULE_GETH.DMA_SYSBUS_MODE.B.AAL = 1;
242 MODULE_GETH.DMA_CH[0].CONTROL.B.DSL = 0;
244 MODULE_GETH.DMA_CH[0].TX_CONTROL.B.TXPBL = 32;
247 MODULE_GETH.DMA_CH[0].RX_CONTROL.B.RXPBL = 32;
251 MODULE_GETH.MTL_TXQ0.OPERATION_MODE.B.TQS = 15;
252 MODULE_GETH.MTL_TXQ0.OPERATION_MODE.B.TXQEN = 2;
253 MODULE_GETH.MTL_TXQ0.OPERATION_MODE.B.TSF = 1;
256 MODULE_GETH.MTL_RXQ0.OPERATION_MODE.B.RQS = 31;
257 MODULE_GETH.MTL_RXQ0.OPERATION_MODE.B.RSF = 1;
263 MODULE_GETH.MMC_CONTROL.B.CNTFREEZ = 1;
266 MODULE_GETH.MAC_INTERRUPT_ENABLE.U = 0;
269 MODULE_GETH.DMA_CH[0].INTERRUPT_ENABLE.B.TIE = 1;
270 MODULE_GETH.DMA_CH[0].INTERRUPT_ENABLE.B.RIE = 1;
271 MODULE_GETH.DMA_CH[0].INTERRUPT_ENABLE.B.NIE = 1;
277 MODULE_GETH.MAC_CONFIGURATION.B.TE = 1;
278 MODULE_GETH.MAC_CONFIGURATION.B.RE = 1;
281 MODULE_GETH.DMA_CH[0].TX_CONTROL.B.ST = 1;
282 MODULE_GETH.DMA_CH[0].RX_CONTROL.B.SR = 1;
300 #if defined(USE_KIT_A2G_TC375_LITE)
302 MODULE_P11.IOCR0.B.PC2 = 22;
305 MODULE_P11.IOCR0.B.PC3 = 22;
308 MODULE_P11.IOCR4.B.PC6 = 22;
311 MODULE_P11.IOCR8.B.PC9 = 0;
312 MODULE_GETH.GPCTL.B.ALTI7 = 0;
315 MODULE_P11.IOCR8.B.PC10 = 0;
316 MODULE_GETH.GPCTL.B.ALTI6 = 0;
319 MODULE_P11.IOCR8.B.PC11 = 0;
320 MODULE_GETH.GPCTL.B.ALTI4 = 0;
323 MODULE_P11.IOCR12.B.PC12 = 0;
324 MODULE_GETH.GPCTL.B.ALTI1 = 0;
327 MODULE_P21.IOCR0.B.PC2 = 21;
330 MODULE_P21.IOCR0.B.PC3 = 0;
331 MODULE_GETH.GPCTL.B.ALTI0 = 3;
334 unlock_safety_wdtcon();
337 MODULE_P11.PCSR.B.SEL2 = 1;
338 MODULE_P11.PCSR.B.SEL3 = 1;
339 MODULE_P11.PCSR.B.SEL6 = 1;
342 lock_safety_wdtcon();
348 MODULE_P11.PDR0.B.PD2 = 3;
349 MODULE_P11.PDR0.B.PL2 = 0;
350 MODULE_P11.PDR0.B.PD3 = 3;
351 MODULE_P11.PDR0.B.PL3 = 0;
352 MODULE_P11.PDR0.B.PD6 = 3;
353 MODULE_P11.PDR0.B.PL6 = 0;
355 MODULE_P11.PDR1.B.PD9 = 3;
356 MODULE_P11.PDR1.B.PL9 = 0;
357 MODULE_P11.PDR1.B.PD10 = 3;
358 MODULE_P11.PDR1.B.PL10 = 0;
359 MODULE_P11.PDR1.B.PD11 = 3;
360 MODULE_P11.PDR1.B.PL11 = 0;
361 MODULE_P11.PDR1.B.PD12 = 3;
362 MODULE_P11.PDR1.B.PL12 = 0;
364 MODULE_P21.PDR0.B.PD2 = 3;
365 MODULE_P21.PDR0.B.PL2 = 0;
366 MODULE_P21.PDR0.B.PD3 = 3;
367 MODULE_P21.PDR0.B.PL3 = 0;
373 MODULE_GETH.GPCTL.B.EPR = 4;
376 #elif defined(USE_KIT_A2G_TC387_TFT) || defined(USE_KIT_A2G_TC397_TFT)
378 MODULE_P11.IOCR0.B.PC0 = 22;
381 MODULE_P11.IOCR0.B.PC1 = 22;
384 MODULE_P11.IOCR0.B.PC2 = 22;
387 MODULE_P11.IOCR0.B.PC3 = 22;
390 MODULE_P11.IOCR4.B.PC4 = 23;
393 MODULE_P11.IOCR4.B.PC5 = 0;
396 MODULE_P11.IOCR4.B.PC6 = 22;
399 MODULE_P11.IOCR4.B.PC7 = 0;
400 MODULE_GETH.GPCTL.B.ALTI9 = 0;
403 MODULE_P11.IOCR8.B.PC8 = 0;
404 MODULE_GETH.GPCTL.B.ALTI8 = 0;
407 MODULE_P11.IOCR8.B.PC9 = 0;
408 MODULE_GETH.GPCTL.B.ALTI7 = 0;
411 MODULE_P11.IOCR8.B.PC10 = 0;
412 MODULE_GETH.GPCTL.B.ALTI6 = 0;
415 MODULE_P11.IOCR8.B.PC11 = 0;
416 MODULE_GETH.GPCTL.B.ALTI4 = 0;
419 MODULE_P11.IOCR12.B.PC12 = 0;
420 MODULE_GETH.GPCTL.B.ALTI1 = 0;
423 MODULE_P12.IOCR0.B.PC0 = 22;
426 MODULE_P12.IOCR0.B.PC1 = 0;
427 MODULE_GETH.GPCTL.B.ALTI0 = 2;
430 unlock_safety_wdtcon();
433 MODULE_P11.PCSR.B.SEL0 = 1;
434 MODULE_P11.PCSR.B.SEL1 = 1;
435 MODULE_P11.PCSR.B.SEL2 = 1;
436 MODULE_P11.PCSR.B.SEL3 = 1;
437 MODULE_P11.PCSR.B.SEL4 = 1;
438 MODULE_P11.PCSR.B.SEL6 = 1;
441 lock_safety_wdtcon();
447 MODULE_P11.PDR0.B.PD0 = 3;
448 MODULE_P11.PDR0.B.PL0 = 0;
449 MODULE_P11.PDR0.B.PD1 = 3;
450 MODULE_P11.PDR0.B.PL1 = 0;
451 MODULE_P11.PDR0.B.PD2 = 3;
452 MODULE_P11.PDR0.B.PL2 = 0;
453 MODULE_P11.PDR0.B.PD3 = 3;
454 MODULE_P11.PDR0.B.PL3 = 0;
455 MODULE_P11.PDR0.B.PD4 = 3;
456 MODULE_P11.PDR0.B.PL4 = 0;
457 MODULE_P11.PDR0.B.PD5 = 3;
458 MODULE_P11.PDR0.B.PL5 = 0;
459 MODULE_P11.PDR0.B.PD6 = 3;
460 MODULE_P11.PDR0.B.PL6 = 0;
461 MODULE_P11.PDR0.B.PD7 = 3;
462 MODULE_P11.PDR0.B.PL7 = 0;
464 MODULE_P11.PDR1.B.PD8 = 3;
465 MODULE_P11.PDR1.B.PL8 = 0;
466 MODULE_P11.PDR1.B.PD9 = 3;
467 MODULE_P11.PDR1.B.PL9 = 0;
468 MODULE_P11.PDR1.B.PD10 = 3;
469 MODULE_P11.PDR1.B.PL10 = 0;
470 MODULE_P11.PDR1.B.PD11 = 3;
471 MODULE_P11.PDR1.B.PL11 = 0;
472 MODULE_P11.PDR1.B.PD12 = 3;
473 MODULE_P11.PDR1.B.PL12 = 0;
475 MODULE_P12.PDR0.B.PD0 = 3;
476 MODULE_P12.PDR0.B.PL0 = 0;
477 MODULE_P12.PDR0.B.PD1 = 3;
478 MODULE_P12.PDR0.B.PL1 = 0;
484 MODULE_GETH.GPCTL.B.EPR = 1;
487 MODULE_GETH.SKEWCTL.B.TXCFG = 5;
488 MODULE_GETH.SKEWCTL.B.RXCFG = 5;
552 if(interface->phyDriver != NULL)
555 interface->phyDriver->tick(interface);
557 else if(interface->switchDriver != NULL)
560 interface->switchDriver->tick(interface);
577 InterruptEnable(SRC_ID_GETH0);
580 if(interface->phyDriver != NULL)
583 interface->phyDriver->enableIrq(interface);
585 else if(interface->switchDriver != NULL)
588 interface->switchDriver->enableIrq(interface);
605 InterruptDisable(SRC_ID_GETH0);
608 if(interface->phyDriver != NULL)
611 interface->phyDriver->disableIrq(interface);
613 else if(interface->switchDriver != NULL)
616 interface->switchDriver->disableIrq(interface);
642 status = MODULE_GETH.DMA_CH[0].STATUS.U;
665 nicDriverInterface->nicEvent =
TRUE;
744 MODULE_GETH.DMA_CH[0].TXDESC_TAIL_POINTER.U = 0;
840 MODULE_GETH.DMA_CH[0].RXDESC_TAIL_POINTER.U = 0;
858 volatile Ifx_GETH_MAC_ADDRESS_LOW *macAddressLow;
859 volatile Ifx_GETH_MAC_ADDRESS_HIGH *macAddressHigh;
865 MODULE_GETH.MAC_ADDRESS_LOW0.U = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
866 MODULE_GETH.MAC_ADDRESS_HIGH0.U = interface->macAddr.w[2];
873 entry = &interface->macAddrFilter[i];
879 macAddressLow = &MODULE_GETH.MAC_ADDRESS_LOW1 + 2 * j;
881 macAddressHigh = &MODULE_GETH.MAC_ADDRESS_HIGH1 + 2 * j;
884 macAddressLow->U = entry->
addr.w[0] | (entry->
addr.w[1] << 16);
896 macAddressLow = &MODULE_GETH.MAC_ADDRESS_LOW1 + 2 * j;
898 macAddressHigh = &MODULE_GETH.MAC_ADDRESS_HIGH1 + 2 * j;
901 macAddressLow->U = 0;
902 macAddressHigh->U = 0;
921 Ifx_GETH_MAC_CONFIGURATION config;
924 config.U = MODULE_GETH.MAC_CONFIGURATION.U;
956 MODULE_GETH.MAC_CONFIGURATION.U = config.U;
978 MODULE_GETH.MAC_MDIO_ADDRESS.B.GOC_0 = 1;
979 MODULE_GETH.MAC_MDIO_ADDRESS.B.GOC_1 = 0;
982 MODULE_GETH.MAC_MDIO_ADDRESS.B.PA = phyAddr;
984 MODULE_GETH.MAC_MDIO_ADDRESS.B.RDA =
regAddr;
987 MODULE_GETH.MAC_MDIO_DATA.B.GD =
data;
990 MODULE_GETH.MAC_MDIO_ADDRESS.B.GB = 1;
992 while(MODULE_GETH.MAC_MDIO_ADDRESS.B.GB)
1020 MODULE_GETH.MAC_MDIO_ADDRESS.B.GOC_0 = 1;
1021 MODULE_GETH.MAC_MDIO_ADDRESS.B.GOC_1 = 1;
1024 MODULE_GETH.MAC_MDIO_ADDRESS.B.PA = phyAddr;
1026 MODULE_GETH.MAC_MDIO_ADDRESS.B.RDA =
regAddr;
1029 MODULE_GETH.MAC_MDIO_ADDRESS.B.GB = 1;
1031 while(MODULE_GETH.MAC_MDIO_ADDRESS.B.GB)
1036 data = MODULE_GETH.MAC_MDIO_DATA.B.GD;