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_ETH1_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC598_ETH1_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC598_ETH1_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC598_ETH1_RAM_SECTION
125 TRACE_INFO(
"Initializing ADSP-SC598 Ethernet MAC (EMAC0)...\r\n");
128 nicDriverInterface = interface;
134 *pREG_PADS0_PCFG0 &= ~BITM_PADS_PCFG0_EMAC0_ENDIANNESS;
137 *pREG_EMAC0_DMA_MODE |= BITM_EMAC_DMA_MODE_SWR;
139 while((*pREG_EMAC0_DMA_MODE & BITM_EMAC_DMA_MODE_SWR) != 0)
144 *pREG_EMAC0_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_EMAC0_MAC_CFG = BITM_EMAC_MAC_CFG_GPSLCE | BITM_EMAC_MAC_CFG_PS |
171 BITM_EMAC_MAC_CFG_DO;
174 temp = *pREG_EMAC0_MAC_EXT_CFG & ~BITM_EMAC_MAC_EXT_CFG_GPSL;
181 *pREG_EMAC0_Q0_TXFLOW_CTL = 0;
182 *pREG_EMAC0_RXFLOW_CTL = 0;
185 *pREG_EMAC0_RXQ_CTL0 = ENUM_EMAC_RXQ_CTL0_RXQ0EN_EN_DCB_GEN;
188 *pREG_EMAC0_DMA_MODE = ENUM_EMAC_DMA_MODE_MODE0 |
189 ENUM_EMAC_DMA_MODE_DSPW_DISABLE;
192 *pREG_EMAC0_DMA_SYSBMODE |= BITM_EMAC_DMA_SYSBMODE_AAL;
195 *pREG_EMAC0_DMA0_CTL = (0 << BITP_EMAC_DMA_CTL_DSL);
197 *pREG_EMAC0_DMA0_TXCTL = (32 << BITP_EMAC_DMA_TXCTL_TXPBL);
200 *pREG_EMAC0_DMA0_RXCTL = (32 << BITP_EMAC_DMA_RXCTL_RXPBL) |
204 *pREG_EMAC0_TQ0_OPMODE |= (7 << BITP_EMAC_TQ_OPMODE_TQS) |
205 ENUM_EMAC_TQ_OPMODE_TXQEN_ENABLE | BITM_EMAC_TQ_OPMODE_TSF;
208 *pREG_EMAC0_RQ0_OPMODE |= (7 << BITP_EMAC_RQ_OPMODE_RQS) |
209 BITM_EMAC_RQ_OPMODE_RSF;
216 *pREG_EMAC0_MMC_TXIMSK = 0x0FFFFFFF;
217 *pREG_EMAC0_MMC_RXIMSK = 0x0FFFFFFF;
218 *pREG_EMAC0_MMC_IPC_RXIMSK = 0x3FFFFFFF;
219 *pREG_EMAC0_MMC_FPE_TXIMSK = 0x00000003;
220 *pREG_EMAC0_MMC_FPE_RXIMSK = 0x0000000F;
223 *pREG_EMAC0_MAC_IEN = 0;
226 *pREG_EMAC0_DMA0_IEN = BITM_EMAC_DMA_IEN_NIE | BITM_EMAC_DMA_IEN_RIE |
227 BITM_EMAC_DMA_IEN_TIE;
234 *pREG_EMAC0_MAC_CFG |= BITM_EMAC_MAC_CFG_TE | BITM_EMAC_MAC_CFG_RE;
237 *pREG_EMAC0_DMA0_TXCTL |= BITM_EMAC_DMA_TXCTL_ST;
238 *pREG_EMAC0_DMA0_RXCTL |= BITM_EMAC_DMA_RXCTL_SR;
256 #if defined(USE_EV_SC598_SOM)
263 temp = *pREG_PORTH_MUX;
264 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
265 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
266 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
267 temp = (temp & ~BITM_PORT_MUX_MUX6) | (0 << BITP_PORT_MUX_MUX6);
268 temp = (temp & ~BITM_PORT_MUX_MUX7) | (0 << BITP_PORT_MUX_MUX7);
269 temp = (temp & ~BITM_PORT_MUX_MUX8) | (0 << BITP_PORT_MUX_MUX8);
270 temp = (temp & ~BITM_PORT_MUX_MUX9) | (0 << BITP_PORT_MUX_MUX9);
271 temp = (temp & ~BITM_PORT_MUX_MUX10) | (0 << BITP_PORT_MUX_MUX10);
272 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
273 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
274 temp = (temp & ~BITM_PORT_MUX_MUX13) | (0 << BITP_PORT_MUX_MUX13);
275 temp = (temp & ~BITM_PORT_MUX_MUX14) | (0 << BITP_PORT_MUX_MUX14);
276 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
277 *pREG_PORTH_MUX = temp;
280 *pREG_PORTH_FER_SET = BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
281 BITM_PORT_FER_PX5 | BITM_PORT_FER_PX6 | BITM_PORT_FER_PX7 |
282 BITM_PORT_FER_PX8 | BITM_PORT_FER_PX9 | BITM_PORT_FER_PX10 |
283 BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12 | BITM_PORT_FER_PX13 |
284 BITM_PORT_FER_PX14 | BITM_PORT_FER_PX15;
287 temp = *pREG_PORTI_MUX;
288 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
289 *pREG_PORTI_MUX = temp;
292 *pREG_PORTI_FER_SET = BITM_PORT_FER_PX0;
298 temp = *pREG_PADS0_PCFG0 & ~BITM_PADS_PCFG0_EMACPHYISEL;
299 *pREG_PADS0_PCFG0 = temp | ENUM_PADS_PCFG0_EMACPHY_RGMII;
302 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACRESET;
343 rxDmaDesc[i].rdes0 = adi_rtl_internal_to_system_addr(
344 (uint32_t)(uintptr_t)
rxBuffer[i], 1);
355 *pREG_EMAC0_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
362 *pREG_EMAC0_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
382 if(interface->phyDriver != NULL)
385 interface->phyDriver->tick(interface);
387 else if(interface->switchDriver != NULL)
390 interface->switchDriver->tick(interface);
407 adi_int_EnableInt(INTR_EMAC0_STAT,
true);
410 if(interface->phyDriver != NULL)
413 interface->phyDriver->enableIrq(interface);
415 else if(interface->switchDriver != NULL)
418 interface->switchDriver->enableIrq(interface);
435 adi_int_EnableInt(INTR_EMAC0_STAT,
false);
438 if(interface->phyDriver != NULL)
441 interface->phyDriver->disableIrq(interface);
443 else if(interface->switchDriver != NULL)
446 interface->switchDriver->disableIrq(interface);
473 status = *pREG_EMAC0_DMA0_STAT;
476 if((status & BITM_EMAC_DMA_STAT_TI) != 0)
479 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_TI;
490 if((status & BITM_EMAC_DMA_STAT_RI) != 0)
493 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_RI;
496 nicDriverInterface->nicEvent =
TRUE;
502 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_NIS;
566 txDmaDesc[txIndex].tdes0 = adi_rtl_internal_to_system_addr(
567 (uint32_t)(uintptr_t)
txBuffer[txIndex], 1);
578 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_TBU;
580 *pREG_EMAC0_DMA0_TXDSC_TLPTR = 0;
649 rxDmaDesc[rxIndex].rdes0 = adi_rtl_internal_to_system_addr(
650 (uint32_t)(uintptr_t)
rxBuffer[rxIndex], 1);
668 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_RBU;
670 *pREG_EMAC0_DMA0_RXDSC_TLPTR = 0;
689 uint32_t hashTable[8];
697 if(interface->promiscuous)
700 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_PR;
705 *pREG_EMAC0_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
706 *pREG_EMAC0_ADDR0_HI = interface->macAddr.w[2];
728 entry = &interface->macAddrFilter[i];
741 k = (crc >> 24) & 0xFF;
744 hashTable[k / 32] |= (1 << (k % 32));
752 unicastMacAddr[j++] = entry->
addr;
762 *pREG_EMAC0_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
763 *pREG_EMAC0_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR_HI_AE;
768 *pREG_EMAC0_ADDR1_LO = 0;
769 *pREG_EMAC0_ADDR1_HI = 0;
776 *pREG_EMAC0_ADDR2_LO = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
777 *pREG_EMAC0_ADDR2_HI = unicastMacAddr[1].w[2] | BITM_EMAC_ADDR_HI_AE;
782 *pREG_EMAC0_ADDR2_LO = 0;
783 *pREG_EMAC0_ADDR2_HI = 0;
790 *pREG_EMAC0_ADDR3_LO = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
791 *pREG_EMAC0_ADDR3_HI = unicastMacAddr[2].w[2] | BITM_EMAC_ADDR_HI_AE;
796 *pREG_EMAC0_ADDR3_LO = 0;
797 *pREG_EMAC0_ADDR3_HI = 0;
802 if(interface->acceptAllMulticast)
805 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_PM;
810 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_HMC;
813 *pREG_EMAC0_HASHTBL_REG0 = hashTable[0];
814 *pREG_EMAC0_HASHTBL_REG1 = hashTable[1];
815 *pREG_EMAC0_HASHTBL_REG2 = hashTable[2];
816 *pREG_EMAC0_HASHTBL_REG3 = hashTable[3];
817 *pREG_EMAC0_HASHTBL_REG4 = hashTable[4];
818 *pREG_EMAC0_HASHTBL_REG5 = hashTable[5];
819 *pREG_EMAC0_HASHTBL_REG6 = hashTable[6];
820 *pREG_EMAC0_HASHTBL_REG7 = hashTable[7];
823 TRACE_DEBUG(
" EMAC_HASHTBL_REG0 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG0);
824 TRACE_DEBUG(
" EMAC_HASHTBL_REG1 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG1);
825 TRACE_DEBUG(
" EMAC_HASHTBL_REG2 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG2);
826 TRACE_DEBUG(
" EMAC_HASHTBL_REG3 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG3);
827 TRACE_DEBUG(
" EMAC_HASHTBL_REG4 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG4);
828 TRACE_DEBUG(
" EMAC_HASHTBL_REG5 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG5);
829 TRACE_DEBUG(
" EMAC_HASHTBL_REG6 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG6);
830 TRACE_DEBUG(
" EMAC_HASHTBL_REG7 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG7);
850 config = *pREG_EMAC0_MAC_CFG;
855 config &= ~BITM_EMAC_MAC_CFG_PS;
856 config &= ~BITM_EMAC_MAC_CFG_FES;
861 config |= BITM_EMAC_MAC_CFG_PS;
862 config |= BITM_EMAC_MAC_CFG_FES;
867 config |= BITM_EMAC_MAC_CFG_PS;
868 config &= ~BITM_EMAC_MAC_CFG_FES;
874 config |= BITM_EMAC_MAC_CFG_DM;
878 config &= ~BITM_EMAC_MAC_CFG_DM;
882 *pREG_EMAC0_MAC_CFG = config;
906 temp = *pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
908 temp |= BITM_EMAC_MDIO_ADDR_GOC_0 | BITM_EMAC_MDIO_ADDR_GB;
910 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
912 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
915 *pREG_EMAC0_MDIO_DATA =
data & BITM_EMAC_MDIO_DATA_GD;
918 *pREG_EMAC0_MDIO_ADDR = temp;
920 while((*pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
949 temp = *pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
952 temp |= BITM_EMAC_MDIO_ADDR_GOC_1 | BITM_EMAC_MDIO_ADDR_GOC_0 |
953 BITM_EMAC_MDIO_ADDR_GB;
956 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
958 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
961 *pREG_EMAC0_MDIO_ADDR = temp;
963 while((*pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
968 data = *pREG_EMAC0_MDIO_DATA & BITM_EMAC_MDIO_DATA_GD;
996 p = (uint8_t *)
data;
1001 for(i = 0; i <
length; i++)
1004 for(j = 0; j < 8; j++)
1007 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
1009 crc = (crc << 1) ^ 0x04C11DB7;