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_ETH1_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC589_ETH1_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC589_ETH1_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC589_ETH1_RAM_SECTION
124 TRACE_INFO(
"Initializing ADSP-SC589 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_ADZS_SC589_EZLITE)
232 temp = *pREG_PORTA_MUX;
233 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
234 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
235 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
236 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
237 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
238 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
239 temp = (temp & ~BITM_PORT_MUX_MUX6) | (0 << BITP_PORT_MUX_MUX6);
240 temp = (temp & ~BITM_PORT_MUX_MUX7) | (0 << BITP_PORT_MUX_MUX7);
241 temp = (temp & ~BITM_PORT_MUX_MUX8) | (0 << BITP_PORT_MUX_MUX8);
242 temp = (temp & ~BITM_PORT_MUX_MUX9) | (0 << BITP_PORT_MUX_MUX9);
243 temp = (temp & ~BITM_PORT_MUX_MUX10) | (0 << BITP_PORT_MUX_MUX10);
244 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
245 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
246 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
247 *pREG_PORTA_MUX = temp;
250 *pREG_PORTA_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
251 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
252 BITM_PORT_FER_PX5 | BITM_PORT_FER_PX6 | BITM_PORT_FER_PX7 |
253 BITM_PORT_FER_PX8 | BITM_PORT_FER_PX9 | BITM_PORT_FER_PX10 |
254 BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 | BITM_PORT_FER_PX13;
257 *pREG_PORTC_FER_CLR = BITM_PORT_FER_PX15;
258 *pREG_PORTC_DIR_CLR = BITM_PORT_DIR_PX15;
259 *pREG_PORTC_INEN_SET = BITM_PORT_INEN_PX15;
262 *pREG_PORTB_FER_CLR = BITM_PORT_FER_PX14;
263 *pREG_PORTB_DIR_SET = BITM_PORT_DIR_PX14;
266 *pREG_PORTB_DATA_CLR = BITM_PORT_DATA_PX14;
268 *pREG_PORTB_DATA_SET = BITM_PORT_DATA_PX14;
272 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACPHYISEL;
274 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACRESET;
297 txDmaDesc[i].tdes2 = adi_rtl_internal_to_system_addr(
301 txDmaDesc[i].tdes3 = adi_rtl_internal_to_system_addr(
326 rxDmaDesc[i].rdes2 = adi_rtl_internal_to_system_addr(
330 rxDmaDesc[i].rdes3 = adi_rtl_internal_to_system_addr(
343 rxDmaDesc[i - 1].rdes3 = adi_rtl_internal_to_system_addr(
350 *pREG_EMAC0_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
354 *pREG_EMAC0_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
371 if(interface->phyDriver != NULL)
374 interface->phyDriver->tick(interface);
376 else if(interface->switchDriver != NULL)
379 interface->switchDriver->tick(interface);
396 adi_int_EnableInt(INTR_EMAC0_STAT,
true);
399 if(interface->phyDriver != NULL)
402 interface->phyDriver->enableIrq(interface);
404 else if(interface->switchDriver != NULL)
407 interface->switchDriver->enableIrq(interface);
424 adi_int_EnableInt(INTR_EMAC0_STAT,
false);
427 if(interface->phyDriver != NULL)
430 interface->phyDriver->disableIrq(interface);
432 else if(interface->switchDriver != NULL)
435 interface->switchDriver->disableIrq(interface);
462 status = *pREG_EMAC0_DMA0_STAT;
465 if((status & BITM_EMAC_DMA0_STAT_TI) != 0)
468 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TI;
479 if((status & BITM_EMAC_DMA0_STAT_RI) != 0)
482 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RI;
485 nicDriverInterface->nicEvent =
TRUE;
491 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_NIS;
566 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TU;
568 *pREG_EMAC0_DMA0_TXPOLL = 0;
572 txCurDmaDesc->
tdes3);
618 rxCurDmaDesc->
rdes2),
n, &ancillary);
640 rxCurDmaDesc->
rdes3);
649 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RU;
651 *pREG_EMAC0_DMA0_RXPOLL = 0;
670 uint32_t hashTable[2];
678 if(interface->promiscuous)
681 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_PR;
686 *pREG_EMAC0_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
687 *pREG_EMAC0_ADDR0_HI = interface->macAddr.w[2];
701 entry = &interface->macAddrFilter[i];
714 k = (crc >> 26) & 0x3F;
717 hashTable[k / 32] |= (1 << (k % 32));
725 unicastMacAddr[j++] = entry->
addr;
735 *pREG_EMAC0_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
736 *pREG_EMAC0_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR1_HI_AE;
741 *pREG_EMAC0_ADDR1_LO = 0;
742 *pREG_EMAC0_ADDR1_HI = 0;
747 if(interface->acceptAllMulticast)
750 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_PM;
755 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_HMC;
758 *pREG_EMAC0_HASHTBL_LO = hashTable[0];
759 *pREG_EMAC0_HASHTBL_HI = hashTable[1];
762 TRACE_DEBUG(
" EMAC_HASHTBL_LO = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_LO);
763 TRACE_DEBUG(
" EMAC_HASHTBL_HI = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_HI);
783 config = *pREG_EMAC0_MACCFG;
788 config &= ~BITM_EMAC_MACCFG_PS;
789 config &= ~BITM_EMAC_MACCFG_FES;
794 config |= BITM_EMAC_MACCFG_PS;
795 config |= BITM_EMAC_MACCFG_FES;
800 config |= BITM_EMAC_MACCFG_PS;
801 config &= ~BITM_EMAC_MACCFG_FES;
807 config |= BITM_EMAC_MACCFG_DM;
811 config &= ~BITM_EMAC_MACCFG_DM;
815 *pREG_EMAC0_MACCFG = config;
839 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
841 temp |= BITM_EMAC_SMI_ADDR_SMIW | BITM_EMAC_SMI_ADDR_SMIB;
843 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
845 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
848 *pREG_EMAC0_SMI_DATA =
data & BITM_EMAC_SMI_DATA_SMID;
851 *pREG_EMAC0_SMI_ADDR = temp;
853 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
882 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
884 temp |= BITM_EMAC_SMI_ADDR_SMIB;
886 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
888 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
891 *pREG_EMAC0_SMI_ADDR = temp;
893 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
898 data = *pREG_EMAC0_SMI_DATA & BITM_EMAC_SMI_DATA_SMID;
926 p = (uint8_t *)
data;
931 for(i = 0; i <
length; i++)
934 for(j = 0; j < 8; j++)
937 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
939 crc = (crc << 1) ^ 0x04C11DB7;