32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include <sys/platform.h>
36 #include <services/int/adi_int.h>
45 #if defined(__ICCARM__)
48 #pragma data_alignment = 4
49 #pragma location = SC594_ETH2_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC594_ETH2_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC594_ETH2_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC594_ETH2_RAM_SECTION
124 TRACE_INFO(
"Initializing ADSP-SC594 Ethernet MAC (EMAC1)...\r\n");
127 nicDriverInterface = interface;
133 *pREG_EMAC1_DMA0_BUSMODE |= BITM_EMAC_DMA0_BUSMODE_SWR;
135 while((*pREG_EMAC1_DMA0_BUSMODE & BITM_EMAC_DMA0_BUSMODE_SWR) != 0)
143 if(interface->phyDriver != NULL)
146 error = interface->phyDriver->init(interface);
148 else if(interface->switchDriver != NULL)
151 error = interface->switchDriver->init(interface);
166 *pREG_EMAC1_MACCFG = BITM_EMAC_MACCFG_PS | BITM_EMAC_MACCFG_DO;
172 *pREG_EMAC1_FLOWCTL = 0;
175 *pREG_EMAC1_DMA0_OPMODE = ENUM_EMAC_DMA1_OPMODE_TTC_64 |
176 ENUM_EMAC_DMA1_OPMODE_RTC_32;
179 *pREG_EMAC1_DMA0_BUSMODE = BITM_EMAC_DMA0_BUSMODE_AAL |
188 *pREG_EMAC1_MMC_TXIMSK = 0x01FFFFFF;
189 *pREG_EMAC1_MMC_RXIMSK = 0x01FFFFFF;
190 *pREG_EMAC1_IPC_RXIMSK = 0x3FFFFFFF;
193 *pREG_EMAC1_IMSK = BITM_EMAC_IMSK_LPIIM | BITM_EMAC_IMSK_TS;
196 *pREG_EMAC1_DMA0_IEN = BITM_EMAC_DMA0_IEN_NIE | BITM_EMAC_DMA0_IEN_RIE |
197 BITM_EMAC_DMA0_IEN_TIE;
204 *pREG_EMAC1_MACCFG |= BITM_EMAC_MACCFG_TE | BITM_EMAC_MACCFG_RE;
207 *pREG_EMAC1_DMA0_OPMODE |= BITM_EMAC_DMA0_OPMODE_ST |
208 BITM_EMAC_DMA0_OPMODE_SR;
226 #if defined(USE_EV_SC594_SOM)
231 temp = *pREG_PORTE_MUX;
232 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
233 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
234 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
235 temp = (temp & ~BITM_PORT_MUX_MUX14) | (0 << BITP_PORT_MUX_MUX14);
236 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
237 *pREG_PORTE_MUX = temp;
240 *pREG_PORTE_FER_SET = BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 |
241 BITM_PORT_FER_PX13 | BITM_PORT_FER_PX14 | BITM_PORT_FER_PX15;
245 temp = *pREG_PORTF_MUX;
246 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
247 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
248 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
249 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
250 *pREG_PORTF_MUX = temp;
253 *pREG_PORTF_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
254 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3;
290 txDmaDesc[i].tdes2 = adi_rtl_internal_to_system_addr(
294 txDmaDesc[i].tdes3 = adi_rtl_internal_to_system_addr(
312 rxDmaDesc[i].rdes2 = adi_rtl_internal_to_system_addr(
316 rxDmaDesc[i].rdes3 = adi_rtl_internal_to_system_addr(
321 rxDmaDesc[i - 1].rdes3 = adi_rtl_internal_to_system_addr(
328 *pREG_EMAC1_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
332 *pREG_EMAC1_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
349 if(interface->phyDriver != NULL)
352 interface->phyDriver->tick(interface);
354 else if(interface->switchDriver != NULL)
357 interface->switchDriver->tick(interface);
374 adi_int_EnableInt(INTR_EMAC1_DMA0,
true);
377 if(interface->phyDriver != NULL)
380 interface->phyDriver->enableIrq(interface);
382 else if(interface->switchDriver != NULL)
385 interface->switchDriver->enableIrq(interface);
402 adi_int_EnableInt(INTR_EMAC1_DMA0,
false);
405 if(interface->phyDriver != NULL)
408 interface->phyDriver->disableIrq(interface);
410 else if(interface->switchDriver != NULL)
413 interface->switchDriver->disableIrq(interface);
440 status = *pREG_EMAC1_DMA0_STAT;
443 if((status & BITM_EMAC_DMA0_STAT_TI) != 0)
446 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_TI;
457 if((status & BITM_EMAC_DMA0_STAT_RI) != 0)
460 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_RI;
463 nicDriverInterface->nicEvent =
TRUE;
469 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_NIS;
544 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_TU;
546 *pREG_EMAC1_DMA0_TXPOLL = 0;
550 txCurDmaDesc->
tdes3);
596 rxCurDmaDesc->
rdes2),
n, &ancillary);
618 rxCurDmaDesc->
rdes3);
627 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_RU;
629 *pREG_EMAC1_DMA0_RXPOLL = 0;
648 uint32_t hashTable[2];
656 if(interface->promiscuous)
659 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_PR;
664 *pREG_EMAC1_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
665 *pREG_EMAC1_ADDR0_HI = interface->macAddr.w[2];
679 entry = &interface->macAddrFilter[i];
692 k = (crc >> 26) & 0x3F;
695 hashTable[k / 32] |= (1 << (k % 32));
703 unicastMacAddr[j++] = entry->
addr;
713 *pREG_EMAC1_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
714 *pREG_EMAC1_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR1_HI_AE;
719 *pREG_EMAC1_ADDR1_LO = 0;
720 *pREG_EMAC1_ADDR1_HI = 0;
725 if(interface->acceptAllMulticast)
728 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_PM;
733 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_HMC;
736 *pREG_EMAC1_HASHTBL_LO = hashTable[0];
737 *pREG_EMAC1_HASHTBL_HI = hashTable[1];
740 TRACE_DEBUG(
" EMAC_HASHTBL_LO = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_LO);
741 TRACE_DEBUG(
" EMAC_HASHTBL_HI = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_HI);
761 config = *pREG_EMAC1_MACCFG;
766 config |= BITM_EMAC_MACCFG_FES;
770 config &= ~BITM_EMAC_MACCFG_FES;
776 config |= BITM_EMAC_MACCFG_DM;
780 config &= ~BITM_EMAC_MACCFG_DM;
784 *pREG_EMAC1_MACCFG = config;
808 temp = *pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
810 temp |= BITM_EMAC_SMI_ADDR_SMIW | BITM_EMAC_SMI_ADDR_SMIB;
812 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
814 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
817 *pREG_EMAC1_SMI_DATA =
data & BITM_EMAC_SMI_DATA_SMID;
820 *pREG_EMAC1_SMI_ADDR = temp;
822 while((*pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
851 temp = *pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
853 temp |= BITM_EMAC_SMI_ADDR_SMIB;
855 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
857 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
860 *pREG_EMAC1_SMI_ADDR = temp;
862 while((*pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
867 data = *pREG_EMAC1_SMI_DATA & BITM_EMAC_SMI_DATA_SMID;
895 p = (uint8_t *)
data;
900 for(i = 0; i <
length; i++)
903 for(j = 0; j < 8; j++)
906 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
908 crc = (crc << 1) ^ 0x04C11DB7;