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 = SC589_ETH2_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC589_ETH2_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC589_ETH2_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC589_ETH2_RAM_SECTION
124 TRACE_INFO(
"Initializing ADSP-SC589 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_ADZS_SC589_EZLITE)
230 temp = *pREG_PORTF_MUX;
231 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
232 temp = (temp & ~BITM_PORT_MUX_MUX14) | (0 << BITP_PORT_MUX_MUX14);
233 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
234 *pREG_PORTF_MUX = temp;
237 *pREG_PORTF_FER_SET = BITM_PORT_FER_PX13 | BITM_PORT_FER_PX14 |
242 temp = *pREG_PORTG_MUX;
243 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
244 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
245 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
246 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
247 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
248 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
249 *pREG_PORTG_MUX = temp;
252 *pREG_PORTG_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
253 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
257 *pREG_PORTD_FER_CLR = BITM_PORT_FER_PX0;
258 *pREG_PORTD_DIR_CLR = BITM_PORT_DIR_PX0;
259 *pREG_PORTD_INEN_SET = BITM_PORT_INEN_PX0;
282 txDmaDesc[i].tdes2 = adi_rtl_internal_to_system_addr(
286 txDmaDesc[i].tdes3 = adi_rtl_internal_to_system_addr(
304 rxDmaDesc[i].rdes2 = adi_rtl_internal_to_system_addr(
308 rxDmaDesc[i].rdes3 = adi_rtl_internal_to_system_addr(
313 rxDmaDesc[i - 1].rdes3 = adi_rtl_internal_to_system_addr(
320 *pREG_EMAC1_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
324 *pREG_EMAC1_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
341 if(interface->phyDriver != NULL)
344 interface->phyDriver->tick(interface);
346 else if(interface->switchDriver != NULL)
349 interface->switchDriver->tick(interface);
366 adi_int_EnableInt(INTR_EMAC1_STAT,
true);
369 if(interface->phyDriver != NULL)
372 interface->phyDriver->enableIrq(interface);
374 else if(interface->switchDriver != NULL)
377 interface->switchDriver->enableIrq(interface);
394 adi_int_EnableInt(INTR_EMAC1_STAT,
false);
397 if(interface->phyDriver != NULL)
400 interface->phyDriver->disableIrq(interface);
402 else if(interface->switchDriver != NULL)
405 interface->switchDriver->disableIrq(interface);
432 status = *pREG_EMAC1_DMA0_STAT;
435 if((status & BITM_EMAC_DMA0_STAT_TI) != 0)
438 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_TI;
449 if((status & BITM_EMAC_DMA0_STAT_RI) != 0)
452 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_RI;
455 nicDriverInterface->nicEvent =
TRUE;
461 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_NIS;
536 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_TU;
538 *pREG_EMAC1_DMA0_TXPOLL = 0;
542 txCurDmaDesc->
tdes3);
588 rxCurDmaDesc->
rdes2),
n, &ancillary);
610 rxCurDmaDesc->
rdes3);
619 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA0_STAT_RU;
621 *pREG_EMAC1_DMA0_RXPOLL = 0;
640 uint32_t hashTable[2];
648 if(interface->promiscuous)
651 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_PR;
656 *pREG_EMAC1_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
657 *pREG_EMAC1_ADDR0_HI = interface->macAddr.w[2];
671 entry = &interface->macAddrFilter[i];
684 k = (crc >> 26) & 0x3F;
687 hashTable[k / 32] |= (1 << (k % 32));
695 unicastMacAddr[j++] = entry->
addr;
705 *pREG_EMAC1_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
706 *pREG_EMAC1_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR1_HI_AE;
711 *pREG_EMAC1_ADDR1_LO = 0;
712 *pREG_EMAC1_ADDR1_HI = 0;
717 if(interface->acceptAllMulticast)
720 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_PM;
725 *pREG_EMAC1_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_HMC;
728 *pREG_EMAC1_HASHTBL_LO = hashTable[0];
729 *pREG_EMAC1_HASHTBL_HI = hashTable[1];
732 TRACE_DEBUG(
" EMAC_HASHTBL_LO = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_LO);
733 TRACE_DEBUG(
" EMAC_HASHTBL_HI = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_HI);
753 config = *pREG_EMAC1_MACCFG;
758 config |= BITM_EMAC_MACCFG_FES;
762 config &= ~BITM_EMAC_MACCFG_FES;
768 config |= BITM_EMAC_MACCFG_DM;
772 config &= ~BITM_EMAC_MACCFG_DM;
776 *pREG_EMAC1_MACCFG = config;
800 temp = *pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
802 temp |= BITM_EMAC_SMI_ADDR_SMIW | BITM_EMAC_SMI_ADDR_SMIB;
804 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
806 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
809 *pREG_EMAC1_SMI_DATA =
data & BITM_EMAC_SMI_DATA_SMID;
812 *pREG_EMAC1_SMI_ADDR = temp;
814 while((*pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
843 temp = *pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
845 temp |= BITM_EMAC_SMI_ADDR_SMIB;
847 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
849 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
852 *pREG_EMAC1_SMI_ADDR = temp;
854 while((*pREG_EMAC1_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
859 data = *pREG_EMAC1_SMI_DATA & BITM_EMAC_SMI_DATA_SMID;
887 p = (uint8_t *)
data;
892 for(i = 0; i <
length; i++)
895 for(j = 0; j < 8; j++)
898 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
900 crc = (crc << 1) ^ 0x04C11DB7;