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;
277 #elif defined(USE_ADZS_SC589_MINI)
285 temp = *pREG_PORTA_MUX;
286 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
287 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
288 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
289 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
290 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
291 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
292 temp = (temp & ~BITM_PORT_MUX_MUX6) | (0 << BITP_PORT_MUX_MUX6);
293 temp = (temp & ~BITM_PORT_MUX_MUX7) | (0 << BITP_PORT_MUX_MUX7);
294 temp = (temp & ~BITM_PORT_MUX_MUX8) | (0 << BITP_PORT_MUX_MUX8);
295 temp = (temp & ~BITM_PORT_MUX_MUX9) | (0 << BITP_PORT_MUX_MUX9);
296 temp = (temp & ~BITM_PORT_MUX_MUX10) | (0 << BITP_PORT_MUX_MUX10);
297 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
298 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
299 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
300 *pREG_PORTA_MUX = temp;
303 *pREG_PORTA_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
304 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
305 BITM_PORT_FER_PX5 | BITM_PORT_FER_PX6 | BITM_PORT_FER_PX7 |
306 BITM_PORT_FER_PX8 | BITM_PORT_FER_PX9 | BITM_PORT_FER_PX10 |
307 BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 | BITM_PORT_FER_PX13;
310 *pREG_PORTC_FER_CLR = BITM_PORT_FER_PX15;
311 *pREG_PORTC_DIR_CLR = BITM_PORT_DIR_PX15;
312 *pREG_PORTC_INEN_SET = BITM_PORT_INEN_PX15;
315 *pREG_PORTB_FER_CLR = BITM_PORT_FER_PX7;
316 *pREG_PORTB_DIR_SET = BITM_PORT_DIR_PX7;
319 *pREG_PORTB_DATA_CLR = BITM_PORT_DATA_PX7;
321 *pREG_PORTB_DATA_SET = BITM_PORT_DATA_PX7;
325 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACPHYISEL;
327 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACRESET;
350 txDmaDesc[i].tdes2 = adi_rtl_internal_to_system_addr(
354 txDmaDesc[i].tdes3 = adi_rtl_internal_to_system_addr(
379 rxDmaDesc[i].rdes2 = adi_rtl_internal_to_system_addr(
383 rxDmaDesc[i].rdes3 = adi_rtl_internal_to_system_addr(
396 rxDmaDesc[i - 1].rdes3 = adi_rtl_internal_to_system_addr(
403 *pREG_EMAC0_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
407 *pREG_EMAC0_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
424 if(interface->phyDriver != NULL)
427 interface->phyDriver->tick(interface);
429 else if(interface->switchDriver != NULL)
432 interface->switchDriver->tick(interface);
449 adi_int_EnableInt(INTR_EMAC0_STAT,
true);
452 if(interface->phyDriver != NULL)
455 interface->phyDriver->enableIrq(interface);
457 else if(interface->switchDriver != NULL)
460 interface->switchDriver->enableIrq(interface);
477 adi_int_EnableInt(INTR_EMAC0_STAT,
false);
480 if(interface->phyDriver != NULL)
483 interface->phyDriver->disableIrq(interface);
485 else if(interface->switchDriver != NULL)
488 interface->switchDriver->disableIrq(interface);
515 status = *pREG_EMAC0_DMA0_STAT;
518 if((status & BITM_EMAC_DMA0_STAT_TI) != 0)
521 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TI;
532 if((status & BITM_EMAC_DMA0_STAT_RI) != 0)
535 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RI;
538 nicDriverInterface->nicEvent =
TRUE;
544 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_NIS;
619 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_TU;
621 *pREG_EMAC0_DMA0_TXPOLL = 0;
625 txCurDmaDesc->
tdes3);
671 rxCurDmaDesc->
rdes2),
n, &ancillary);
693 rxCurDmaDesc->
rdes3);
702 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA0_STAT_RU;
704 *pREG_EMAC0_DMA0_RXPOLL = 0;
723 uint32_t hashTable[2];
731 if(interface->promiscuous)
734 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_PR;
739 *pREG_EMAC0_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
740 *pREG_EMAC0_ADDR0_HI = interface->macAddr.w[2];
754 entry = &interface->macAddrFilter[i];
767 k = (crc >> 26) & 0x3F;
770 hashTable[k / 32] |= (1 << (k % 32));
778 unicastMacAddr[j++] = entry->
addr;
788 *pREG_EMAC0_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
789 *pREG_EMAC0_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR1_HI_AE;
794 *pREG_EMAC0_ADDR1_LO = 0;
795 *pREG_EMAC0_ADDR1_HI = 0;
800 if(interface->acceptAllMulticast)
803 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_PM;
808 *pREG_EMAC0_MACFRMFILT = BITM_EMAC_MACFRMFILT_HPF | BITM_EMAC_MACFRMFILT_HMC;
811 *pREG_EMAC0_HASHTBL_LO = hashTable[0];
812 *pREG_EMAC0_HASHTBL_HI = hashTable[1];
815 TRACE_DEBUG(
" EMAC_HASHTBL_LO = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_LO);
816 TRACE_DEBUG(
" EMAC_HASHTBL_HI = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_HI);
836 config = *pREG_EMAC0_MACCFG;
841 config &= ~BITM_EMAC_MACCFG_PS;
842 config &= ~BITM_EMAC_MACCFG_FES;
847 config |= BITM_EMAC_MACCFG_PS;
848 config |= BITM_EMAC_MACCFG_FES;
853 config |= BITM_EMAC_MACCFG_PS;
854 config &= ~BITM_EMAC_MACCFG_FES;
860 config |= BITM_EMAC_MACCFG_DM;
864 config &= ~BITM_EMAC_MACCFG_DM;
868 *pREG_EMAC0_MACCFG = config;
892 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
894 temp |= BITM_EMAC_SMI_ADDR_SMIW | BITM_EMAC_SMI_ADDR_SMIB;
896 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
898 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
901 *pREG_EMAC0_SMI_DATA =
data & BITM_EMAC_SMI_DATA_SMID;
904 *pREG_EMAC0_SMI_ADDR = temp;
906 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
935 temp = *pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_CR;
937 temp |= BITM_EMAC_SMI_ADDR_SMIB;
939 temp |= (phyAddr << BITP_EMAC_SMI_ADDR_PA) & BITM_EMAC_SMI_ADDR_PA;
941 temp |= (
regAddr << BITP_EMAC_SMI_ADDR_SMIR) & BITM_EMAC_SMI_ADDR_SMIR;
944 *pREG_EMAC0_SMI_ADDR = temp;
946 while((*pREG_EMAC0_SMI_ADDR & BITM_EMAC_SMI_ADDR_SMIB) != 0)
951 data = *pREG_EMAC0_SMI_DATA & BITM_EMAC_SMI_DATA_SMID;
979 p = (uint8_t *)
data;
984 for(i = 0; i <
length; i++)
987 for(j = 0; j < 8; j++)
990 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
992 crc = (crc << 1) ^ 0x04C11DB7;