32 #define TRACE_LEVEL NIC_TRACE_LEVEL
46 #if defined(__ICCARM__)
49 #pragma data_alignment = 8
50 #pragma location = SAMA5D4_ETH1_RAM_SECTION
53 #pragma data_alignment = 8
54 #pragma location = SAMA5D4_ETH1_RAM_SECTION
57 #pragma data_alignment = 8
58 #pragma location = SAMA5D4_ETH1_RAM_SECTION
61 #pragma data_alignment = 8
62 #pragma location = SAMA5D4_ETH1_RAM_SECTION
84 static uint_t txBufferIndex;
86 static uint_t rxBufferIndex;
123 volatile uint32_t status;
126 TRACE_INFO(
"Initializing SAMA5D4 Ethernet MAC (GMAC0)...\r\n");
129 nicDriverInterface = interface;
132 PMC->PMC_PCER1 = (1 << (ID_GMAC0 - 32));
141 GMAC0->GMAC_NCFGR = GMAC_NCFGR_CLK_MCK_96;
143 GMAC0->GMAC_NCR |= GMAC_NCR_MPE;
146 if(interface->phyDriver != NULL)
149 error = interface->phyDriver->init(interface);
151 else if(interface->switchDriver != NULL)
154 error = interface->switchDriver->init(interface);
169 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
170 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
173 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
174 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
175 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
182 GMAC0->GMAC_NCFGR |= GMAC_NCFGR_MAXFS | GMAC_NCFGR_MTIHEN;
188 GMAC0->GMAC_TSR = GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP |
189 GMAC_TSR_TFC | GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL |
193 GMAC0->GMAC_RSR = GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC |
197 GMAC0->GMAC_IDR = 0xFFFFFFFF;
200 GMAC0->GMAC_IER = GMAC_IER_HRESP | GMAC_IER_ROVR | GMAC_IER_TCOMP |
201 GMAC_IER_TFC | GMAC_IER_RLEX | GMAC_IER_TUR | GMAC_IER_RXUBR |
205 status = GMAC0->GMAC_ISR;
209 AIC->AIC_SSR = ID_GMAC0;
214 GMAC0->GMAC_NCR |= GMAC_NCR_TXEN | GMAC_NCR_RXEN;
232 #if defined(CONFIG_BOARD_SAMA5D4_XPLAINED)
236 PMC->PMC_PCER0 = (1 << ID_PIOB);
239 mask = PIO_PB0A_G0_TXCK | PIO_PB2A_G0_TXEN | PIO_PB6A_G0_RXDV |
240 PIO_PB7A_G0_RXER | PIO_PB8A_G0_RX0 | PIO_PB9A_G0_RX1 | PIO_PB12A_G0_TX0 |
241 PIO_PB13A_G0_TX1 | PIO_PB16A_G0_MDC | PIO_PB17A_G0_MDIO;
244 PIOB->PIO_PUDR =
mask;
246 PIOB->PIO_IDR =
mask;
248 PIOB->PIO_ABCDSR[0] &= ~
mask;
249 PIOB->PIO_ABCDSR[1] &= ~
mask;
251 PIOB->PIO_PDR =
mask;
254 GMAC0->GMAC_UR = GMAC_UR_RMII;
293 rxBufferDesc[i].
status = 0;
302 GMAC0->GMAC_TBQB = (uint32_t) txBufferDesc;
304 GMAC0->GMAC_RBQB = (uint32_t) rxBufferDesc;
320 if(interface->phyDriver != NULL)
323 interface->phyDriver->tick(interface);
325 else if(interface->switchDriver != NULL)
328 interface->switchDriver->tick(interface);
345 AIC->AIC_SSR = ID_GMAC0;
346 AIC->AIC_IECR = AIC_IECR_INTEN;
349 if(interface->phyDriver != NULL)
352 interface->phyDriver->enableIrq(interface);
354 else if(interface->switchDriver != NULL)
357 interface->switchDriver->enableIrq(interface);
374 AIC->AIC_SSR = ID_GMAC0;
375 AIC->AIC_IDCR = AIC_IDCR_INTD;
378 if(interface->phyDriver != NULL)
381 interface->phyDriver->disableIrq(interface);
383 else if(interface->switchDriver != NULL)
386 interface->switchDriver->disableIrq(interface);
402 volatile uint32_t isr;
403 volatile uint32_t tsr;
404 volatile uint32_t rsr;
414 isr = GMAC0->GMAC_ISR;
415 tsr = GMAC0->GMAC_TSR;
416 rsr = GMAC0->GMAC_RSR;
420 if((tsr & (GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP | GMAC_TSR_TFC |
421 GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL | GMAC_TSR_UBR)) != 0)
424 GMAC0->GMAC_TSR = tsr;
427 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
435 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
438 nicDriverInterface->nicEvent =
TRUE;
462 rsr = GMAC0->GMAC_RSR;
465 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
468 GMAC0->GMAC_RSR = rsr;
510 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) == 0)
542 GMAC0->GMAC_NCR |= GMAC_NCR_TSTART;
545 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
583 j = rxBufferIndex + i;
606 if((rxBufferDesc[j].status &
GMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
620 if(eofIndex != UINT_MAX)
624 else if(sofIndex != UINT_MAX)
637 for(i = 0; i < j; i++)
640 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
700 uint32_t hashTable[2];
708 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
709 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
725 entry = &interface->macAddrFilter[i];
737 k = (
p[0] >> 6) ^
p[0];
738 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
739 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
740 k ^= (
p[3] >> 6) ^
p[3];
741 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
742 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
748 hashTable[k / 32] |= (1 << (k % 32));
756 unicastMacAddr[j] = entry->
addr;
764 k = (
p[0] >> 6) ^
p[0];
765 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
766 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
767 k ^= (
p[3] >> 6) ^
p[3];
768 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
769 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
775 hashTable[k / 32] |= (1 << (k % 32));
788 GMAC0->GMAC_SA[1].GMAC_SAB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
789 GMAC0->GMAC_SA[1].GMAC_SAT = unicastMacAddr[0].w[2];
794 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
801 GMAC0->GMAC_SA[2].GMAC_SAB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
802 GMAC0->GMAC_SA[2].GMAC_SAT = unicastMacAddr[1].w[2];
807 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
814 GMAC0->GMAC_SA[3].GMAC_SAB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
815 GMAC0->GMAC_SA[3].GMAC_SAT = unicastMacAddr[2].w[2];
820 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
826 GMAC0->GMAC_NCFGR |= GMAC_NCFGR_UNIHEN;
830 GMAC0->GMAC_NCFGR &= ~GMAC_NCFGR_UNIHEN;
834 GMAC0->GMAC_HRB = hashTable[0];
835 GMAC0->GMAC_HRT = hashTable[1];
838 TRACE_DEBUG(
" HRB = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRB);
839 TRACE_DEBUG(
" HRT = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRT);
857 config = GMAC0->GMAC_NCFGR;
862 config |= GMAC_NCFGR_SPD;
866 config &= ~GMAC_NCFGR_SPD;
872 config |= GMAC_NCFGR_FD;
876 config &= ~GMAC_NCFGR_FD;
880 GMAC0->GMAC_NCFGR = config;
913 GMAC0->GMAC_MAN = temp;
915 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)
951 GMAC0->GMAC_MAN = temp;
953 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)