32 #define TRACE_LEVEL NIC_TRACE_LEVEL
46 #if defined(__ICCARM__)
49 #pragma data_alignment = 8
50 #pragma location = SAMA5D3_ETH2_RAM_SECTION
53 #pragma data_alignment = 8
54 #pragma location = SAMA5D3_ETH2_RAM_SECTION
57 #pragma data_alignment = 8
58 #pragma location = SAMA5D3_ETH2_RAM_SECTION
61 #pragma data_alignment = 8
62 #pragma location = SAMA5D3_ETH2_RAM_SECTION
84 static uint_t txBufferIndex;
86 static uint_t rxBufferIndex;
123 volatile uint32_t status;
126 TRACE_INFO(
"Initializing SAMA5D3 Ethernet MAC (GMAC)...\r\n");
129 nicDriverInterface = interface;
132 PMC->PMC_PCER1 = (1 << (ID_GMAC0 - 32));
134 PMC->PMC_PCER1 = (1 << (ID_AIC - 32));
143 GMAC0->GMAC_NCFGR = GMAC_NCFGR_DBW_DBW64 | GMAC_NCFGR_CLK_MCK_224;
145 GMAC0->GMAC_NCR |= GMAC_NCR_MPE;
148 if(interface->phyDriver != NULL)
151 error = interface->phyDriver->init(interface);
153 else if(interface->switchDriver != NULL)
156 error = interface->switchDriver->init(interface);
171 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
172 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
175 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
176 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
177 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
184 GMAC0->GMAC_NCFGR |= GMAC_NCFGR_MAXFS | GMAC_NCFGR_MTIHEN;
190 GMAC0->GMAC_TSR = GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP |
191 GMAC_TSR_TFC | GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL |
195 GMAC0->GMAC_RSR = GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC |
199 GMAC0->GMAC_IDR = 0xFFFFFFFF;
202 GMAC0->GMAC_IER = GMAC_IER_HRESP | GMAC_IER_ROVR | GMAC_IER_TCOMP |
203 GMAC_IER_TFC | GMAC_IER_RLEX | GMAC_IER_TUR | GMAC_IER_RXUBR |
207 status = GMAC0->GMAC_ISR;
211 AIC->AIC_SSR = ID_GMAC0;
216 GMAC0->GMAC_NCR |= GMAC_NCR_TXEN | GMAC_NCR_RXEN;
234 #if defined(CONFIG_BOARD_SAMA5D3_XPLAINED)
238 PMC->PMC_PCER0 = (1 << ID_PIOB);
241 mask = PIO_PB18A_G125CK | PIO_PB17A_GMDIO | PIO_PB16A_GMDC |
242 PIO_PB13A_GRXER | PIO_PB12A_GRXDV | PIO_PB11A_GRXCK | PIO_PB9A_GTXEN |
243 PIO_PB8A_GTXCK | PIO_PB7A_GRX3 | PIO_PB6A_GRX2 | PIO_PB5A_GRX1 |
244 PIO_PB4A_GRX0 | PIO_PB3A_GTX3 | PIO_PB2A_GTX2 | PIO_PB1A_GTX1 |
248 PIOB->PIO_PUDR =
mask;
250 PIOB->PIO_IDR =
mask;
252 PIOB->PIO_ABCDSR[0] &= ~
mask;
253 PIOB->PIO_ABCDSR[1] &= ~
mask;
255 PIOB->PIO_PDR =
mask;
258 GMAC0->GMAC_UR = GMAC_UR_RGMII;
297 rxBufferDesc[i].
status = 0;
306 GMAC0->GMAC_TBQB = (uint32_t) txBufferDesc;
308 GMAC0->GMAC_RBQB = (uint32_t) rxBufferDesc;
324 if(interface->phyDriver != NULL)
327 interface->phyDriver->tick(interface);
329 else if(interface->switchDriver != NULL)
332 interface->switchDriver->tick(interface);
349 AIC->AIC_SSR = ID_GMAC0;
350 AIC->AIC_IECR = AIC_IECR_INTEN;
353 if(interface->phyDriver != NULL)
356 interface->phyDriver->enableIrq(interface);
358 else if(interface->switchDriver != NULL)
361 interface->switchDriver->enableIrq(interface);
378 AIC->AIC_SSR = ID_GMAC0;
379 AIC->AIC_IDCR = AIC_IDCR_INTD;
382 if(interface->phyDriver != NULL)
385 interface->phyDriver->disableIrq(interface);
387 else if(interface->switchDriver != NULL)
390 interface->switchDriver->disableIrq(interface);
406 volatile uint32_t isr;
407 volatile uint32_t tsr;
408 volatile uint32_t rsr;
418 isr = GMAC0->GMAC_ISR;
419 tsr = GMAC0->GMAC_TSR;
420 rsr = GMAC0->GMAC_RSR;
424 if((tsr & (GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP | GMAC_TSR_TFC |
425 GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL | GMAC_TSR_UBR)) != 0)
428 GMAC0->GMAC_TSR = tsr;
440 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
443 nicDriverInterface->nicEvent =
TRUE;
467 rsr = GMAC0->GMAC_RSR;
470 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
473 GMAC0->GMAC_RSR = rsr;
515 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) == 0)
547 GMAC0->GMAC_NCR |= GMAC_NCR_TSTART;
550 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
588 j = rxBufferIndex + i;
611 if((rxBufferDesc[j].status &
GMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
625 if(eofIndex != UINT_MAX)
629 else if(sofIndex != UINT_MAX)
642 for(i = 0; i < j; i++)
645 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
705 uint32_t hashTable[2];
713 GMAC0->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
714 GMAC0->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
730 entry = &interface->macAddrFilter[i];
742 k = (
p[0] >> 6) ^
p[0];
743 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
744 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
745 k ^= (
p[3] >> 6) ^
p[3];
746 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
747 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
753 hashTable[k / 32] |= (1 << (k % 32));
761 unicastMacAddr[j] = entry->
addr;
769 k = (
p[0] >> 6) ^
p[0];
770 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
771 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
772 k ^= (
p[3] >> 6) ^
p[3];
773 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
774 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
780 hashTable[k / 32] |= (1 << (k % 32));
793 GMAC0->GMAC_SA[1].GMAC_SAB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
794 GMAC0->GMAC_SA[1].GMAC_SAT = unicastMacAddr[0].w[2];
799 GMAC0->GMAC_SA[1].GMAC_SAB = 0;
806 GMAC0->GMAC_SA[2].GMAC_SAB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
807 GMAC0->GMAC_SA[2].GMAC_SAT = unicastMacAddr[1].w[2];
812 GMAC0->GMAC_SA[2].GMAC_SAB = 0;
819 GMAC0->GMAC_SA[3].GMAC_SAB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
820 GMAC0->GMAC_SA[3].GMAC_SAT = unicastMacAddr[2].w[2];
825 GMAC0->GMAC_SA[3].GMAC_SAB = 0;
831 GMAC0->GMAC_NCFGR |= GMAC_NCFGR_UNIHEN;
835 GMAC0->GMAC_NCFGR &= ~GMAC_NCFGR_UNIHEN;
839 GMAC0->GMAC_HRB = hashTable[0];
840 GMAC0->GMAC_HRT = hashTable[1];
843 TRACE_DEBUG(
" HRB = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRB);
844 TRACE_DEBUG(
" HRT = 0x%08" PRIX32
"\r\n", GMAC0->GMAC_HRT);
862 config = GMAC0->GMAC_NCFGR;
867 config |= GMAC_NCFGR_GBE;
868 config &= ~GMAC_NCFGR_SPD;
873 config &= ~GMAC_NCFGR_GBE;
874 config |= GMAC_NCFGR_SPD;
879 config &= ~GMAC_NCFGR_GBE;
880 config &= ~GMAC_NCFGR_SPD;
886 config |= GMAC_NCFGR_FD;
890 config &= ~GMAC_NCFGR_FD;
894 GMAC0->GMAC_NCFGR = config;
927 GMAC0->GMAC_MAN = temp;
929 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)
965 GMAC0->GMAC_MAN = temp;
967 while((GMAC0->GMAC_NSR & GMAC_NSR_IDLE) == 0)