/** ============================================================================ * @n@b Init_SGMII * * @b Description * @n SGMII peripheral initialization code. * * @param[in] * @n macPortNum MAC port number for which the SGMII port setup must * be performed. * * @return * @n None * ============================================================================= */ void Init_SGMII (uint32_t macPortNum) { CSL_SGMII_ADVABILITY sgmiiCfg; /* Reset the port before configuring it */ CSL_SGMII_doSoftReset (macPortNum); while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0); /* Hold the port in soft reset and set up * the SGMII control register: * (1) Enable Master Mode * (2) Enable Auto-negotiation */ CSL_SGMII_startRxTxSoftReset (macPortNum); CSL_SGMII_enableMasterMode (macPortNum); CSL_SGMII_enableAutoNegotiation (macPortNum); CSL_SGMII_endRxTxSoftReset (macPortNum); /* Setup the Advertised Ability register for this port: * (1) Enable Full duplex mode * (2) Enable Auto Negotiation * (3) Enable the Link */ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS; sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX; CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg); /* All done with configuration. Return Now. */ return; }
void Init_SGMII (uint32_t macPortNum) { CSL_SGMII_ADVABILITY sgmiiCfg; CSL_SGMII_STATUS sgmiiStatus; /* Reset the port before configuring it */ CSL_SGMII_doSoftReset (macPortNum); while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0); if (macPortNum == 1) { /* Hold the port in soft reset and set up * the SGMII control register: * (1) Enable Master Mode * (2) Enable Auto-negotiation */ CSL_SGMII_startRxTxSoftReset (macPortNum); CSL_SGMII_disableMasterMode (macPortNum); CSL_SGMII_enableAutoNegotiation (macPortNum); CSL_SGMII_endRxTxSoftReset (macPortNum); /* Setup the Advertised Ability register for this port: * (1) Enable Full duplex mode * (2) Enable Auto Negotiation * (3) Enable the Link */ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS; sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX; CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg); do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); } while (sgmiiStatus.bIsLinkUp != 1); /* Wait for SGMII Autonegotiation to complete without error */ do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); if (sgmiiStatus.bIsAutoNegError != 0) return; /* This is an error condition */ } while (sgmiiStatus.bIsAutoNegComplete != 1); } if (macPortNum == 0) { /* Hold the port in soft reset and set up * the SGMII control register: * (1) Disable Master Mode * (2) Enable Auto-negotiation */ CSL_SGMII_startRxTxSoftReset (macPortNum); CSL_SGMII_disableMasterMode (macPortNum); CSL_SGMII_enableAutoNegotiation (macPortNum); CSL_SGMII_endRxTxSoftReset (macPortNum); /* Setup the Advertised Ability register for this port: * (1) Enable Full duplex mode * (2) Enable Auto Negotiation * (3) Enable the Link */ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS; sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX; sgmiiCfg.bLinkUp = 1; CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg); do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); } while (sgmiiStatus.bIsLinkUp != 1); } /* All done with configuration. Return Now. */ return; }
/** ============================================================================ * @n@b Init_SGMII * * @b Description * @n SGMII peripheral initialization code. * * @param[in] * @n macPortNum MAC port number for which the SGMII port setup must * be performed. * * @return * @n None * ============================================================================= */ Int32 Init_SGMII(UInt32 macPortNum) { CSL_SGMII_ADVABILITY sgmiiCfg; CSL_SGMII_STATUS sgmiiStatus; /* Configure SGMII Port 1 only since it is connected to RJ45 at all known EVMs */ // if(cpswSimTest || (macPortNum == 1)) //{ /* Reset the port before configuring it */ CSL_SGMII_doSoftReset (macPortNum); while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0); /* Hold the port in soft reset and set up * the SGMII control register: * (1) Enable Master Mode (default) * (2) Enable Auto-negotiation */ CSL_SGMII_startRxTxSoftReset (macPortNum); if (cpswLpbkMode == CPSW_LOOPBACK_NONE) { CSL_SGMII_disableMasterMode (macPortNum); } else { CSL_SGMII_enableMasterMode (macPortNum); if (cpswLpbkMode == CPSW_LOOPBACK_INTERNAL) { CSL_SGMII_enableLoopback (macPortNum); } } /* Setup the Advertised Ability register for this port: * (1) Enable Full duplex mode * (2) Enable Auto Negotiation */ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS; sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX; CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg); CSL_SGMII_enableAutoNegotiation (macPortNum); CSL_SGMII_endRxTxSoftReset (macPortNum); /* Wait for SGMII Link */ if (!cpswSimTest) { do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); } while (sgmiiStatus.bIsLinkUp != 1); /* Wait for SGMII Autonegotiation to complete without error */ do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); if (sgmiiStatus.bIsAutoNegError != 0) return -1; } while (sgmiiStatus.bIsAutoNegComplete != 1); /* * May need to wait some more time for the external PHY to be ready to transmit packets reliabily. * It is possible to access the PHY status register through the MDIO interface to check when * the PHY is ready. * To avoid platform-dependent code, we just introduce about 2ms wait here */ if((cpswLpbkMode == CPSW_LOOPBACK_EXTERNAL) || (cpswLpbkMode == CPSW_LOOPBACK_NONE)) CycleDelay(2000000); } // } //platform_write("SGMII configured and link up for port num %d\n",macPortNum); /* All done with configuration. Return Now. */ return 0; }