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_ETH1_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC594_ETH1_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC594_ETH1_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC594_ETH1_RAM_SECTION
124 TRACE_INFO(
"Initializing ADSP-SC594 Ethernet MAC (EMAC0)...\r\n");
127 nicDriverInterface = interface;
133 *pREG_EMAC0_DMA0_BUSMODE |= BITM_EMAC_DMA0_BUSMODE_SWR;
135 while((*pREG_EMAC0_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_EMAC0_MACCFG = BITM_EMAC_MACCFG_PS | BITM_EMAC_MACCFG_DO;
172 *pREG_EMAC0_FLOWCTL = 0;
175 *pREG_EMAC0_DMA0_OPMODE = BITM_EMAC_DMA0_OPMODE_RSF |
176 BITM_EMAC_DMA0_OPMODE_TSF;
179 *pREG_EMAC0_DMA0_BUSMODE = BITM_EMAC_DMA0_BUSMODE_AAL |
188 *pREG_EMAC0_MMC_TXIMSK = 0x01FFFFFF;
189 *pREG_EMAC0_MMC_RXIMSK = 0x01FFFFFF;
190 *pREG_EMAC0_IPC_RXIMSK = 0x3FFFFFFF;
193 *pREG_EMAC0_IMSK = BITM_EMAC_IMSK_LPIIM | BITM_EMAC_IMSK_TS;
196 *pREG_EMAC0_DMA0_IEN = BITM_EMAC_DMA0_IEN_NIE | BITM_EMAC_DMA0_IEN_RIE |
197 BITM_EMAC_DMA0_IEN_TIE;
204 *pREG_EMAC0_MACCFG |= BITM_EMAC_MACCFG_TE | BITM_EMAC_MACCFG_RE;
206 *pREG_EMAC0_DMA0_OPMODE |= BITM_EMAC_DMA0_OPMODE_ST | BITM_EMAC_DMA0_OPMODE_SR;
224 #if defined(USE_EV_SC594_SOM)
231 temp = *pREG_PORTH_MUX;
232 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
233 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
234 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
235 temp = (temp & ~BITM_PORT_MUX_MUX6) | (0 << BITP_PORT_MUX_MUX6);
236 temp = (temp & ~BITM_PORT_MUX_MUX7) | (0 << BITP_PORT_MUX_MUX7);
237 temp = (temp & ~BITM_PORT_MUX_MUX8) | (0 << BITP_PORT_MUX_MUX8);
238 temp = (temp & ~BITM_PORT_MUX_MUX9) | (0 << BITP_PORT_MUX_MUX9);
239 temp = (temp & ~BITM_PORT_MUX_MUX10) | (0 << BITP_PORT_MUX_MUX10);
240 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
241 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
242 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
243 temp = (temp & ~BITM_PORT_MUX_MUX14) | (0 << BITP_PORT_MUX_MUX14);
244 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
245 *pREG_PORTH_MUX = temp;
248 *pREG_PORTH_FER_SET = BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
249 BITM_PORT_FER_PX5 | BITM_PORT_FER_PX6 | BITM_PORT_FER_PX7 |
250 BITM_PORT_FER_PX8 | BITM_PORT_FER_PX9 | BITM_PORT_FER_PX10 |
251 BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 | BITM_PORT_FER_PX13 |
252 BITM_PORT_FER_PX14 | BITM_PORT_FER_PX15;
255 temp = *pREG_PORTI_MUX;
256 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
257 *pREG_PORTI_MUX = temp;
260 *pREG_PORTI_FER_SET = BITM_PORT_FER_PX0;
266 temp = *pREG_PADS0_PCFG0 & ~BITM_PADS_PCFG0_EMACPHYISEL;
267 *pREG_PADS0_PCFG0 = temp | ENUM_PADS_PCFG0_EMACPHY_RGMII;
270 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACRESET;
303 txDmaDesc[i].tdes2 = adi_rtl_internal_to_system_addr(
307 txDmaDesc[i].tdes3 = adi_rtl_internal_to_system_addr(
332 rxDmaDesc[i].rdes2 = adi_rtl_internal_to_system_addr(
336 rxDmaDesc[i].rdes3 = adi_rtl_internal_to_system_addr(
349 rxDmaDesc[i - 1].rdes3 = adi_rtl_internal_to_system_addr(
356 *pREG_EMAC0_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
360 *pREG_EMAC0_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
377 if(interface->phyDriver != NULL)
380 interface->phyDriver->tick(interface);
382 else if(interface->switchDriver != NULL)
385 interface->switchDriver->tick(interface);
402 adi_int_EnableInt(INTR_EMAC0_DMA0,
true);
405 if(interface->phyDriver != NULL)
408 interface->phyDriver->enableIrq(interface);
410 else if(interface->switchDriver != NULL)
413 interface->switchDriver->enableIrq(interface);
430 adi_int_EnableInt(INTR_EMAC0_DMA0,
false);
433 if(interface->phyDriver != NULL)
436 interface->phyDriver->disableIrq(interface);
438 else if(interface->switchDriver != NULL)
441 interface->switchDriver->disableIrq(interface);
468 status = *pREG_EMAC0_DMA0_STAT;
471 if((status & BITM_EMAC_DMA0_STAT_TI) != 0)
474 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TI;
485 if((status & BITM_EMAC_DMA0_STAT_RI) != 0)
488 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RI;
491 nicDriverInterface->nicEvent =
TRUE;
497 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_NIS;
572 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TU;
574 *pREG_EMAC0_DMA0_TXPOLL = 0;
578 txCurDmaDesc->
tdes3);
624 rxCurDmaDesc->
rdes2),
n, &ancillary);
646 rxCurDmaDesc->
rdes3);
655 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RU;
657 *pREG_EMAC0_DMA0_RXPOLL = 0;
676 uint32_t hashTable[2];
684 if(interface->promiscuous)
687 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_PR;
692 *pREG_EMAC0_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
693 *pREG_EMAC0_ADDR0_HI = interface->macAddr.w[2];
707 entry = &interface->macAddrFilter[i];
720 k = (crc >> 26) & 0x3F;
723 hashTable[k / 32] |= (1 << (k % 32));
731 unicastMacAddr[j++] = entry->
addr;
741 *pREG_EMAC0_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
742 *pREG_EMAC0_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR1_HI_AE;
747 *pREG_EMAC0_ADDR1_LO = 0;
748 *pREG_EMAC0_ADDR1_HI = 0;
753 if(interface->acceptAllMulticast)
756 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_PM;
761 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_HMC;
764 *pREG_EMAC0_HASHTBL_LO = hashTable[0];
765 *pREG_EMAC0_HASHTBL_HI = hashTable[1];
768 TRACE_DEBUG(
" EMAC_HASHTBL_LO = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_LO);
769 TRACE_DEBUG(
" EMAC_HASHTBL_HI = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_HI);
789 config = *pREG_EMAC0_MACCFG;
794 config &= ~BITM_EMAC_MACCFG_PS;
795 config &= ~BITM_EMAC_MACCFG_FES;
800 config |= BITM_EMAC_MACCFG_PS;
801 config |= BITM_EMAC_MACCFG_FES;
806 config |= BITM_EMAC_MACCFG_PS;
807 config &= ~BITM_EMAC_MACCFG_FES;
813 config |= BITM_EMAC_MACCFG_DM;
817 config &= ~BITM_EMAC_MACCFG_DM;
821 *pREG_EMAC0_MACCFG = config;
845 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
847 temp |= BITM_EMAC_SMI_ADDR_SMIW | BITM_EMAC_SMI_ADDR_SMIB;
849 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
851 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
854 *pREG_EMAC0_SMI_DATA =
data & BITM_EMAC_SMI_DATA_SMID;
857 *pREG_EMAC0_SMI_ADDR = temp;
859 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
888 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
890 temp |= BITM_EMAC_SMI_ADDR_SMIB;
892 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
894 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
897 *pREG_EMAC0_SMI_ADDR = temp;
899 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
904 data = *pREG_EMAC0_SMI_DATA & BITM_EMAC_SMI_DATA_SMID;
932 p = (uint8_t *)
data;
937 for(i = 0; i <
length; i++)
940 for(j = 0; j < 8; j++)
943 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
945 crc = (crc << 1) ^ 0x04C11DB7;