32 #define TRACE_LEVEL NIC_TRACE_LEVEL
48 #if defined(__ICCARM__)
51 #pragma data_alignment = 8
52 #pragma location = SAMA5D2_ETH_RAM_SECTION
55 #pragma data_alignment = 8
56 #pragma location = SAMA5D2_ETH_RAM_SECTION
59 #pragma data_alignment = 4
60 #pragma location = SAMA5D2_ETH_RAM_SECTION
63 #pragma data_alignment = 4
64 #pragma location = SAMA5D2_ETH_RAM_SECTION
68 #pragma data_alignment = 8
69 #pragma location = SAMA5D2_ETH_RAM_SECTION
72 #pragma data_alignment = 8
73 #pragma location = SAMA5D2_ETH_RAM_SECTION
76 #pragma data_alignment = 4
77 #pragma location = SAMA5D2_ETH_RAM_SECTION
80 #pragma data_alignment = 4
81 #pragma location = SAMA5D2_ETH_RAM_SECTION
116 static uint_t txBufferIndex;
118 static uint_t rxBufferIndex;
155 volatile uint32_t status;
158 TRACE_INFO(
"Initializing SAMA5D2 Ethernet MAC...\r\n");
161 nicDriverInterface = interface;
164 PMC->PMC_PCER0 = (1 << ID_GMAC0);
173 GMAC0->GMAC_NCFGR = GMAC_NCFGR_CLK_MCK_96;
175 GMAC0->GMAC_NCR |= GMAC_NCR_MPE;
178 if(interface->phyDriver != NULL)
181 error = interface->phyDriver->init(interface);
183 else if(interface->switchDriver != NULL)
186 error = interface->switchDriver->init(interface);
201 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
202 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
205 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
206 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
207 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
214 GMAC0->GMAC_NCFGR |= GMAC_NCFGR_MAXFS | GMAC_NCFGR_MTIHEN;
218 GMAC_DCFGR_TXPBMS | GMAC_DCFGR_RXBMS_FULL | GMAC_DCFGR_FBLDO_INCR4;
227 GMAC0->GMAC_TSR = GMAC_TSR_HRESP | GMAC_TSR_TXCOMP | GMAC_TSR_TFC |
228 GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL | GMAC_TSR_UBR;
231 GMAC0->GMAC_RSR = GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC |
235 GMAC0->GMAC_IDR = 0xFFFFFFFF;
236 GMAC0->GMAC_IDRPQ[0] = 0xFFFFFFFF;
237 GMAC0->GMAC_IDRPQ[1] = 0xFFFFFFFF;
240 GMAC0->GMAC_IER = GMAC_IER_HRESP | GMAC_IER_ROVR | GMAC_IER_TCOMP |
241 GMAC_IER_TFC | GMAC_IER_RLEX | GMAC_IER_TUR | GMAC_IER_RXUBR |
245 status = GMAC0->GMAC_ISR;
246 status = GMAC0->GMAC_ISRPQ[0];
247 status = GMAC0->GMAC_ISRPQ[1];
253 aic_configure_mode(ID_GMAC0, IRQ_MODE_LOW_LEVEL);
258 GMAC0->GMAC_NCR |= GMAC_NCR_TXEN | GMAC_NCR_RXEN;
276 #if defined(CONFIG_BOARD_SAMA5D2_XPLAINED)
277 struct _pin rmiiPins[] = PINS_GMAC_RMII_IOS3;
280 pio_configure(rmiiPins,
arraysize(rmiiPins));
283 GMAC0->GMAC_UR = GMAC_UR_RMII;
322 rxBufferDesc[i].
status = 0;
334 address = (uint32_t) dummyTxBuffer[i];
348 address = (uint32_t) dummyRxBuffer[i];
352 dummyRxBufferDesc[i].
status = 0;
359 GMAC0->GMAC_TBQB = (uint32_t) txBufferDesc;
360 GMAC0->GMAC_TBQBAPQ[0] = (uint32_t) dummyTxBufferDesc;
361 GMAC0->GMAC_TBQBAPQ[1] = (uint32_t) dummyTxBufferDesc;
364 GMAC0->GMAC_RBQB = (uint32_t) rxBufferDesc;
365 GMAC0->GMAC_RBQBAPQ[0] = (uint32_t) dummyRxBufferDesc;
366 GMAC0->GMAC_RBQBAPQ[1] = (uint32_t) dummyRxBufferDesc;
382 if(interface->phyDriver != NULL)
385 interface->phyDriver->tick(interface);
387 else if(interface->switchDriver != NULL)
390 interface->switchDriver->tick(interface);
407 aic_enable(ID_GMAC0);
410 if(interface->phyDriver != NULL)
413 interface->phyDriver->enableIrq(interface);
415 else if(interface->switchDriver != NULL)
418 interface->switchDriver->enableIrq(interface);
435 aic_disable(ID_GMAC0);
438 if(interface->phyDriver != NULL)
441 interface->phyDriver->disableIrq(interface);
443 else if(interface->switchDriver != NULL)
446 interface->switchDriver->disableIrq(interface);
462 volatile uint32_t isr;
463 volatile uint32_t tsr;
464 volatile uint32_t rsr;
474 isr = GMAC0->GMAC_ISRPQ[0];
475 isr = GMAC0->GMAC_ISRPQ[1];
476 isr = GMAC0->GMAC_ISR;
477 tsr = GMAC0->GMAC_TSR;
478 rsr = GMAC0->GMAC_RSR;
482 if((tsr & (GMAC_TSR_HRESP | GMAC_TSR_TXCOMP | GMAC_TSR_TFC |
483 GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL | GMAC_TSR_UBR)) != 0)
486 GMAC0->GMAC_TSR = tsr;
489 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
497 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
500 nicDriverInterface->nicEvent =
TRUE;
524 rsr = GMAC0->GMAC_RSR;
527 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
530 GMAC0->GMAC_RSR = rsr;
572 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) == 0)
604 GMAC0->GMAC_NCR |= GMAC_NCR_TSTART;
607 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
645 j = rxBufferIndex + i;
668 if((rxBufferDesc[j].status &
GMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
682 if(eofIndex != UINT_MAX)
686 else if(sofIndex != UINT_MAX)
699 for(i = 0; i < j; i++)
702 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
762 uint32_t hashTable[2];
770 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
771 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
787 entry = &interface->macAddrFilter[i];
799 k = (
p[0] >> 6) ^
p[0];
800 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
801 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
802 k ^= (
p[3] >> 6) ^
p[3];
803 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
804 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
810 hashTable[k / 32] |= (1 << (k % 32));
818 unicastMacAddr[j++] = entry->
addr;
828 GMAC0->GMAC_SA[1].GMAC_SAB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
829 GMAC0->GMAC_SA[1].GMAC_SAT = unicastMacAddr[0].w[2];
834 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
841 GMAC0->GMAC_SA[2].GMAC_SAB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
842 GMAC0->GMAC_SA[2].GMAC_SAT = unicastMacAddr[1].w[2];
847 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
854 GMAC0->GMAC_SA[3].GMAC_SAB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
855 GMAC0->GMAC_SA[3].GMAC_SAT = unicastMacAddr[2].w[2];
860 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
864 GMAC0->GMAC_HRB = hashTable[0];
865 GMAC0->GMAC_HRT = hashTable[1];
868 TRACE_DEBUG(
" HRB = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRB);
869 TRACE_DEBUG(
" HRT = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRT);
887 config = GMAC0->GMAC_NCFGR;
892 config |= GMAC_NCFGR_SPD;
896 config &= ~GMAC_NCFGR_SPD;
902 config |= GMAC_NCFGR_FD;
906 config &= ~GMAC_NCFGR_FD;
910 GMAC0->GMAC_NCFGR = config;
943 GMAC0->GMAC_MAN = temp;
945 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)
981 GMAC0->GMAC_MAN = temp;
983 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)