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 = SC835_ETH_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = SC835_ETH_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = SC835_ETH_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = SC835_ETH_RAM_SECTION
125 TRACE_INFO(
"Initializing ADSP-SC835 Ethernet MAC...\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_ADSPSC835W_EV_SOM)
260 temp = *pREG_PORTC_MUX;
261 temp = (temp & ~BITM_PORT_MUX_MUX15) | (0 << BITP_PORT_MUX_MUX15);
262 *pREG_PORTC_MUX = temp;
265 *pREG_PORTC_FER_SET = BITM_PORT_FER_PX15;
272 temp = *pREG_PORTD_MUX;
273 temp = (temp & ~BITM_PORT_MUX_MUX0) | (0 << BITP_PORT_MUX_MUX0);
274 temp = (temp & ~BITM_PORT_MUX_MUX1) | (0 << BITP_PORT_MUX_MUX1);
275 temp = (temp & ~BITM_PORT_MUX_MUX2) | (0 << BITP_PORT_MUX_MUX2);
276 temp = (temp & ~BITM_PORT_MUX_MUX3) | (0 << BITP_PORT_MUX_MUX3);
277 temp = (temp & ~BITM_PORT_MUX_MUX4) | (0 << BITP_PORT_MUX_MUX4);
278 temp = (temp & ~BITM_PORT_MUX_MUX5) | (0 << BITP_PORT_MUX_MUX5);
279 temp = (temp & ~BITM_PORT_MUX_MUX6) | (0 << BITP_PORT_MUX_MUX6);
280 temp = (temp & ~BITM_PORT_MUX_MUX7) | (0 << BITP_PORT_MUX_MUX7);
281 temp = (temp & ~BITM_PORT_MUX_MUX8) | (0 << BITP_PORT_MUX_MUX8);
282 temp = (temp & ~BITM_PORT_MUX_MUX9) | (0 << BITP_PORT_MUX_MUX9);
283 temp = (temp & ~BITM_PORT_MUX_MUX10) | (0 << BITP_PORT_MUX_MUX10);
284 temp = (temp & ~BITM_PORT_MUX_MUX11) | (0 << BITP_PORT_MUX_MUX11);
285 temp = (temp & ~BITM_PORT_MUX_MUX12) | (0 << BITP_PORT_MUX_MUX12);
286 *pREG_PORTD_MUX = temp;
289 *pREG_PORTD_FER_SET = BITM_PORT_FER_PX0 | BITM_PORT_FER_PX1 |
290 BITM_PORT_FER_PX2 | BITM_PORT_FER_PX3 | BITM_PORT_FER_PX4 |
291 BITM_PORT_FER_PX5 | BITM_PORT_FER_PX6 | BITM_PORT_FER_PX7 |
292 BITM_PORT_FER_PX8 | BITM_PORT_FER_PX9 | BITM_PORT_FER_PX10 |
293 BITM_PORT_FER_PX11 | BITM_PORT_FER_PX12;
299 temp = *pREG_PADS0_PCFG0 & ~BITM_PADS_PCFG0_EMACPHYISEL;
300 *pREG_PADS0_PCFG0 = temp | ENUM_PADS_PCFG0_EMACPHY_RGMII;
303 *pREG_PADS0_PCFG0 |= BITM_PADS_PCFG0_EMACRESET;
344 rxDmaDesc[i].rdes0 = adi_rtl_internal_to_system_addr(
356 *pREG_EMAC0_DMA0_TXDSC_ADDR = adi_rtl_internal_to_system_addr(
363 *pREG_EMAC0_DMA0_RXDSC_ADDR = adi_rtl_internal_to_system_addr(
383 if(interface->phyDriver != NULL)
386 interface->phyDriver->tick(interface);
388 else if(interface->switchDriver != NULL)
391 interface->switchDriver->tick(interface);
408 adi_int_EnableInt(INTR_EMAC0_STAT,
true);
411 if(interface->phyDriver != NULL)
414 interface->phyDriver->enableIrq(interface);
416 else if(interface->switchDriver != NULL)
419 interface->switchDriver->enableIrq(interface);
436 adi_int_EnableInt(INTR_EMAC0_STAT,
false);
439 if(interface->phyDriver != NULL)
442 interface->phyDriver->disableIrq(interface);
444 else if(interface->switchDriver != NULL)
447 interface->switchDriver->disableIrq(interface);
474 status = *pREG_EMAC0_DMA0_STAT;
477 if((status & BITM_EMAC_DMA_STAT_TI) != 0)
480 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_TI;
491 if((status & BITM_EMAC_DMA_STAT_RI) != 0)
494 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_RI;
497 nicDriverInterface->nicEvent =
TRUE;
503 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_NIS;
567 txDmaDesc[txIndex].tdes0 = adi_rtl_internal_to_system_addr(
576 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_TBU;
578 *pREG_EMAC0_DMA0_TXDSC_TLPTR = 0;
647 rxDmaDesc[rxIndex].rdes0 = adi_rtl_internal_to_system_addr(
666 *pREG_EMAC0_DMA0_STAT = BITM_EMAC_DMA_STAT_RBU;
668 *pREG_EMAC0_DMA0_RXDSC_TLPTR = 0;
687 uint32_t hashTable[8];
695 if(interface->promiscuous)
698 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_PR;
703 *pREG_EMAC0_ADDR0_LO = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
704 *pREG_EMAC0_ADDR0_HI = interface->macAddr.w[2];
726 entry = &interface->macAddrFilter[i];
739 k = (crc >> 24) & 0xFF;
742 hashTable[k / 32] |= (1 << (k % 32));
750 unicastMacAddr[j++] = entry->
addr;
760 *pREG_EMAC0_ADDR1_LO = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
761 *pREG_EMAC0_ADDR1_HI = unicastMacAddr[0].w[2] | BITM_EMAC_ADDR_HI_AE;
766 *pREG_EMAC0_ADDR1_LO = 0;
767 *pREG_EMAC0_ADDR1_HI = 0;
774 *pREG_EMAC0_ADDR2_LO = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
775 *pREG_EMAC0_ADDR2_HI = unicastMacAddr[1].w[2] | BITM_EMAC_ADDR_HI_AE;
780 *pREG_EMAC0_ADDR2_LO = 0;
781 *pREG_EMAC0_ADDR2_HI = 0;
788 *pREG_EMAC0_ADDR3_LO = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
789 *pREG_EMAC0_ADDR3_HI = unicastMacAddr[2].w[2] | BITM_EMAC_ADDR_HI_AE;
794 *pREG_EMAC0_ADDR3_LO = 0;
795 *pREG_EMAC0_ADDR3_HI = 0;
800 if(interface->acceptAllMulticast)
803 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_PM;
808 *pREG_EMAC0_MACPKT_FILT = BITM_EMAC_MACPKT_FILT_HPF | BITM_EMAC_MACPKT_FILT_HMC;
811 *pREG_EMAC0_HASHTBL_REG0 = hashTable[0];
812 *pREG_EMAC0_HASHTBL_REG1 = hashTable[1];
813 *pREG_EMAC0_HASHTBL_REG2 = hashTable[2];
814 *pREG_EMAC0_HASHTBL_REG3 = hashTable[3];
815 *pREG_EMAC0_HASHTBL_REG4 = hashTable[4];
816 *pREG_EMAC0_HASHTBL_REG5 = hashTable[5];
817 *pREG_EMAC0_HASHTBL_REG6 = hashTable[6];
818 *pREG_EMAC0_HASHTBL_REG7 = hashTable[7];
821 TRACE_DEBUG(
" EMAC_HASHTBL_REG0 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG0);
822 TRACE_DEBUG(
" EMAC_HASHTBL_REG1 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG1);
823 TRACE_DEBUG(
" EMAC_HASHTBL_REG2 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG2);
824 TRACE_DEBUG(
" EMAC_HASHTBL_REG3 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG3);
825 TRACE_DEBUG(
" EMAC_HASHTBL_REG4 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG4);
826 TRACE_DEBUG(
" EMAC_HASHTBL_REG5 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG5);
827 TRACE_DEBUG(
" EMAC_HASHTBL_REG6 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG6);
828 TRACE_DEBUG(
" EMAC_HASHTBL_REG7 = 0x%08" PRIX32
"\r\n", *pREG_EMAC0_HASHTBL_REG7);
848 config = *pREG_EMAC0_MAC_CFG;
853 config &= ~BITM_EMAC_MAC_CFG_PS;
854 config &= ~BITM_EMAC_MAC_CFG_FES;
859 config |= BITM_EMAC_MAC_CFG_PS;
860 config |= BITM_EMAC_MAC_CFG_FES;
865 config |= BITM_EMAC_MAC_CFG_PS;
866 config &= ~BITM_EMAC_MAC_CFG_FES;
872 config |= BITM_EMAC_MAC_CFG_DM;
876 config &= ~BITM_EMAC_MAC_CFG_DM;
880 *pREG_EMAC0_MAC_CFG = config;
904 temp = *pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
906 temp |= BITM_EMAC_MDIO_ADDR_GOC_0 | BITM_EMAC_MDIO_ADDR_GB;
908 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
910 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
913 *pREG_EMAC0_MDIO_DATA =
data & BITM_EMAC_MDIO_DATA_GD;
916 *pREG_EMAC0_MDIO_ADDR = temp;
918 while((*pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
947 temp = *pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_CR;
950 temp |= BITM_EMAC_MDIO_ADDR_GOC_1 | BITM_EMAC_MDIO_ADDR_GOC_0 |
951 BITM_EMAC_MDIO_ADDR_GB;
954 temp |= (phyAddr << BITP_EMAC_MDIO_ADDR_PA) & BITM_EMAC_MDIO_ADDR_PA;
956 temp |= (
regAddr << BITP_EMAC_MDIO_ADDR_RDA) & BITM_EMAC_MDIO_ADDR_RDA;
959 *pREG_EMAC0_MDIO_ADDR = temp;
961 while((*pREG_EMAC0_MDIO_ADDR & BITM_EMAC_MDIO_ADDR_GB) != 0)
966 data = *pREG_EMAC0_MDIO_DATA & BITM_EMAC_MDIO_DATA_GD;
994 p = (uint8_t *)
data;
999 for(i = 0; i <
length; i++)
1002 for(j = 0; j < 8; j++)
1005 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
1007 crc = (crc << 1) ^ 0x04C11DB7;