Description
Source
Call Graph
Start Line: 484
unsigned char DM9161_GetLinkSpeed(Dm9161 *pDm, unsigned char applySettings)
{
unsigned int retryMax;
unsigned int stat1;
unsigned int stat2;
unsigned char phyAddress;
unsigned char rc = 1;
TRACE_DEBUG("DM9161_GetLinkSpeed\n\r");
ASSERT(pDm, "-F- DM9161_GetLinkSpeed\n\r");
EMAC_EnableMdio();
phyAddress = pDm->phyAddress;
retryMax = pDm->retryMax;
rc = EMAC_ReadPhy(phyAddress, DM9161_BMSR, &stat1, retryMax);
if (rc == 0) {
goto GetLinkSpeedExit;
}
if ((stat1 & DM9161_LINK_STATUS) == 0) {
TRACE_ERROR("Pb: LinkStat: 0x%x\n\r", stat1);
rc = 0;
goto GetLinkSpeedExit;
}
if (applySetting == 0) {
TRACE_ERROR("Pb: applySetting: 0x%x\n\r", applySetting);
goto GetLinkSpeedExit;
}
// Re-configure Link speed
rc = EMAC_ReadPhy(phyAddress, DM9161_DSCSR, &stat2, retryMax);
if (rc == 0) {
TRACE_ERROR("Pb: rc: 0x%x\n\r", rc);
goto GetLinkSpeedExit;
}
if ((stat1 & DM9161_100BASE_TX_FD) && (stat2 & DM9161_100FDX)) {
// set Emac for 100BaseTX and Full Duplex
EMAC_SetLinkSpeed(1, 1);
}
if ((stat1 & DM9161_10BASE_T_FD) && (stat2 & DM9161_10FDX)) {
// set MII for 10BaseT and Full Duplex
EMAC_SetLinkSpeed(0, 1);
}
if ((stat1 & DM9161_100BASE_T4_HD) && (stat2 & DM9161_100HDX)) {
// set MII for 100BaseTX and Half Duplex
EMAC_SetLinkSpeed(1, 0);
}
if ((stat1 & DM9161_10BASE_T_HD) && (stat2 & DM9161_10HDX)) {
// set MII for 10BaseT and Half Duplex
EMAC_SetLinkSpeed(0, 0);
}
// Start the EMAC transfers
TRACE_DEBUG("DM9161_GetLinkSpeed passed\n\r");
GetLinkSpeedExit:
EMAC_DisableMdio();
return rc;
}