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 = SC598_ETH2_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC598_ETH2_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC598_ETH2_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC598_ETH2_RAM_SECTION
125 TRACE_INFO(
"Initializing ADSP-SC598 Ethernet MAC (EMAC1)...\r\n");
128 nicDriverInterface = interface;
134 *pREG_PADS0_PCFG0 &= ~BITM_PADS_PCFG0_EMAC1_ENDIANNESS;
137 *pREG_EMAC1_DMA_MODE |= BITM_EMAC_DMA_MODE_SWR;
139 while((*pREG_EMAC1_DMA_MODE & BITM_EMAC_DMA_MODE_SWR) != 0)
144 *pREG_EMAC1_MDIO_ADDR = (4 << BITP_EMAC_MDIO_ADDR_CR);
147 if(interface->phyDriver != NULL)
150 error = interface->phyDriver->init(interface);
152 else if(interface->switchDriver != NULL)
155 error = interface->switchDriver->init(interface);
170 *pREG_EMAC1_MAC_CFG = BITM_EMAC_MAC_CFG_GPSLCE | BITM_EMAC_MAC_CFG_PS |
171 BITM_EMAC_MAC_CFG_DO;
174 temp = *pREG_EMAC1_MAC_EXT_CFG & ~BITM_EMAC_MAC_EXT_CFG_GPSL;
181 *pREG_EMAC1_Q0_TXFLOW_CTL = 0;
182 *pREG_EMAC1_RXFLOW_CTL = 0;
185 *pREG_EMAC1_DMA_MODE = ENUM_EMAC_DMA_MODE_MODE0 |
186 ENUM_EMAC_DMA_MODE_DSPW_DISABLE;
189 *pREG_EMAC1_DMA_SYSBMODE |= BITM_EMAC_DMA_SYSBMODE_AAL;
192 *pREG_EMAC1_DMA0_CTL = (0 << BITP_EMAC_DMA_CTL_DSL);
194 *pREG_EMAC1_DMA0_TXCTL = (32 << BITP_EMAC_DMA_TXCTL_TXPBL);
197 *pREG_EMAC1_DMA0_RXCTL = (32 << BITP_EMAC_DMA_RXCTL_RXPBL) |
201 *pREG_EMAC1_TQ0_OPMODE = (1 << BITP_EMAC_TQ_OPMODE_TTC);
203 *pREG_EMAC1_RQ0_OPMODE = (1 << BITP_EMAC_RQ_OPMODE_RTC);
210 *pREG_EMAC1_MMC_TXIMSK = 0x0FFFFFFF;
211 *pREG_EMAC1_MMC_RXIMSK = 0x0FFFFFFF;
212 *pREG_EMAC1_MMC_IPC_RXIMSK = 0x3FFFFFFF;
215 *pREG_EMAC1_MAC_IEN = 0;
218 *pREG_EMAC1_DMA0_IEN = BITM_EMAC_DMA_IEN_NIE | BITM_EMAC_DMA_IEN_RIE |
219 BITM_EMAC_DMA_IEN_TIE;
226 *pREG_EMAC1_MAC_CFG |= BITM_EMAC_MAC_CFG_TE | BITM_EMAC_MAC_CFG_RE;
229 *pREG_EMAC1_DMA0_TXCTL |= BITM_EMAC_DMA_TXCTL_ST;
230 *pREG_EMAC1_DMA0_RXCTL |= BITM_EMAC_DMA_RXCTL_SR;
248 #if defined(USE_EV_SC598_SOM)
253 temp = *pREG_PORTE_MUX;
254 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
255 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
256 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
257 temp = (temp & ~BITM_PORT_MUX_MUX14) | (0 << BITP_PORT_MUX_MUX14);
258 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
259 *pREG_PORTE_MUX = temp;
262 *pREG_PORTE_FER_SET = BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 |
263 BITM_PORT_FER_PX13 | BITM_PORT_FER_PX14 | BITM_PORT_FER_PX15;
267 temp = *pREG_PORTF_MUX;
268 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
269 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
270 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
271 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
272 *pREG_PORTF_MUX = temp;
275 *pREG_PORTF_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
276 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3;
320 rxDmaDesc[i].rdes0 = adi_rtl_internal_to_system_addr(
321 (uint32_t)(uintptr_t)
rxBuffer[i], 1);
332 *pREG_EMAC1_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
339 *pREG_EMAC1_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
359 if(interface->phyDriver != NULL)
362 interface->phyDriver->tick(interface);
364 else if(interface->switchDriver != NULL)
367 interface->switchDriver->tick(interface);
384 adi_int_EnableInt(INTR_EMAC1_STAT,
true);
387 if(interface->phyDriver != NULL)
390 interface->phyDriver->enableIrq(interface);
392 else if(interface->switchDriver != NULL)
395 interface->switchDriver->enableIrq(interface);
412 adi_int_EnableInt(INTR_EMAC1_STAT,
false);
415 if(interface->phyDriver != NULL)
418 interface->phyDriver->disableIrq(interface);
420 else if(interface->switchDriver != NULL)
423 interface->switchDriver->disableIrq(interface);
450 status = *pREG_EMAC1_DMA0_STAT;
453 if((status & BITM_EMAC_DMA_STAT_TI) != 0)
456 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA_STAT_TI;
467 if((status & BITM_EMAC_DMA_STAT_RI) != 0)
470 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA_STAT_RI;
473 nicDriverInterface->nicEvent =
TRUE;
479 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA_STAT_NIS;
543 txDmaDesc[txIndex].tdes0 = adi_rtl_internal_to_system_addr(
544 (uint32_t)(uintptr_t)
txBuffer[txIndex], 1);
555 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA_STAT_TBU;
557 *pREG_EMAC1_DMA0_TXDSC_TLPTR = 0;
626 rxDmaDesc[rxIndex].rdes0 = adi_rtl_internal_to_system_addr(
627 (uint32_t)(uintptr_t)
rxBuffer[rxIndex], 1);
645 *pREG_EMAC1_DMA0_STAT = BITM_EMAC_DMA_STAT_RBU;
647 *pREG_EMAC1_DMA0_RXDSC_TLPTR = 0;
666 uint32_t hashTable[2];
674 if(interface->promiscuous)
677 *pREG_EMAC1_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_PR;
682 *pREG_EMAC1_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
683 *pREG_EMAC1_ADDR0_HI = interface->macAddr.w[2];
697 entry = &interface->macAddrFilter[i];
710 k = (crc >> 26) & 0x3F;
713 hashTable[k / 32] |= (1 << (k % 32));
721 unicastMacAddr[j++] = entry->
addr;
731 *pREG_EMAC1_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
732 *pREG_EMAC1_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR_HI_AE;
737 *pREG_EMAC1_ADDR1_LO = 0;
738 *pREG_EMAC1_ADDR1_HI = 0;
743 if(interface->acceptAllMulticast)
746 *pREG_EMAC1_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_PM;
751 *pREG_EMAC1_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_HMC;
754 *pREG_EMAC1_HASHTBL_REG0 = hashTable[0];
755 *pREG_EMAC1_HASHTBL_REG1 = hashTable[1];
758 TRACE_DEBUG(
" EMAC_HASHTBL_REG0 = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_REG0);
759 TRACE_DEBUG(
" EMAC_HASHTBL_REG1 = 0x%08" PRIX32
"\r\n", *pREG_EMAC1_HASHTBL_REG1);
779 config = *pREG_EMAC1_MAC_CFG;
784 config |= BITM_EMAC_MAC_CFG_FES;
788 config &= ~BITM_EMAC_MAC_CFG_FES;
794 config |= BITM_EMAC_MAC_CFG_DM;
798 config &= ~BITM_EMAC_MAC_CFG_DM;
802 *pREG_EMAC1_MAC_CFG = config;
826 temp = *pREG_EMAC1_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
828 temp |= BITM_EMAC_MDIO_ADDR_GOC_0 | BITM_EMAC_MDIO_ADDR_GB;
830 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
832 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
835 *pREG_EMAC1_MDIO_DATA =
data & BITM_EMAC_MDIO_DATA_GD;
838 *pREG_EMAC1_MDIO_ADDR = temp;
840 while((*pREG_EMAC1_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
869 temp = *pREG_EMAC1_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
872 temp |= BITM_EMAC_MDIO_ADDR_GOC_1 | BITM_EMAC_MDIO_ADDR_GOC_0 |
873 BITM_EMAC_MDIO_ADDR_GB;
876 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
878 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
881 *pREG_EMAC1_MDIO_ADDR = temp;
883 while((*pREG_EMAC1_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
888 data = *pREG_EMAC1_MDIO_DATA & BITM_EMAC_MDIO_DATA_GD;
916 p = (uint8_t *)
data;
921 for(i = 0; i <
length; i++)
924 for(j = 0; j < 8; j++)
927 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
929 crc = (crc << 1) ^ 0x04C11DB7;