IX_STATUS ixEthAccCodeletLinkSlowSpeedSet(IxEthAccPortId portId) { BOOL speed, linkUp, fullDuplex, autoneg; /* get current duplex mode */ ixEthMiiLinkStatus(ixEthAccCodeletPhyAddresses[portId], &linkUp, &speed, &fullDuplex, &autoneg); /* set 10 Mbit, current duplex mode, no negotiation */ ixEthMiiPhyConfig(ixEthAccCodeletPhyAddresses[portId], FALSE, fullDuplex, FALSE); ixEthMiiPhyReset(ixEthAccCodeletPhyAddresses[portId]); /* get the link status */ (void)ixEthAccCodeletLinkUpCheck(portId); (void)ixEthAccCodeletLinkMonitor(portId); printf("\nPHY %d configuration:\n", portId); ixEthMiiPhyShow(ixEthAccCodeletPhyAddresses[portId]); return (IX_SUCCESS); }
IX_STATUS ixEthAccCodeletLinkUpCheck(IxEthAccPortId portId) { IX_STATUS returnStatus = IX_SUCCESS; BOOL fullDuplex; BOOL linkUp; BOOL speed; BOOL autoneg; /* get the status */ ixEthMiiLinkStatus(ixEthAccCodeletPhyAddresses[portId], &linkUp, &speed, &fullDuplex, &autoneg); if (!linkUp) { unsigned int retry = 20; /* 20 retries */ printf("Wait for PHY %u to be ready ...\n", portId); while ((!linkUp) && (retry-- > 0)) { ixOsalSleep(100); /* 100 milliseconds */ /* get the status again */ ixEthMiiLinkStatus(ixEthAccCodeletPhyAddresses[portId], &linkUp, &speed, &fullDuplex, &autoneg); } if (!linkUp) { returnStatus = IX_FAIL; } } /* return fail if one of the links is not up */ return returnStatus; }
PUBLIC IX_STATUS ixEthMiiPhyShow (UINT32 phyAddr) { BOOL linkUp, speed100, fullDuplex, autoneg; UINT16 cregval; UINT16 sregval; ixEthAccMiiReadRtn(phyAddr, IX_ETH_MII_STAT_REG, &sregval); ixEthAccMiiReadRtn(phyAddr, IX_ETH_MII_CTRL_REG, &cregval); /* get link information */ if (ixEthMiiLinkStatus(phyAddr, &linkUp, &speed100, &fullDuplex, &autoneg) != IX_ETH_ACC_SUCCESS) { printf("PHY Status unknown\n"); return IX_FAIL; } printf("PHY ID [phyAddr]: %8.8x\n",ixEthMiiPhyId[phyAddr]); printf( " Status reg: %4.4x\n",sregval); printf( " control reg: %4.4x\n",cregval); /* display link information */ printf("PHY Status:\n"); printf(" Link is %s\n", (linkUp ? "Up" : "Down")); if((sregval & IX_ETH_MII_SR_REMOTE_FAULT) != 0) { printf(" Remote fault detected\n"); } printf(" Auto Negotiation %s\n", (autoneg ? "Completed" : "Not Completed")); printf("PHY Configuration:\n"); printf(" Speed %sMb/s\n", (speed100 ? "100" : "10")); printf(" %s Duplex\n", (fullDuplex ? "Full" : "Half")); printf(" Auto Negotiation %s\n", (autoneg ? "Enabled" : "Disabled")); return IX_SUCCESS; }
PRIVATE void ixEthAccCodeletLinkMonitor(IxEthAccPortId portId) { BOOL speed, linkUp, fullDuplex, autoneg; /* get the link status */ ixEthMiiLinkStatus(ixEthAccCodeletPhyAddresses[portId], &linkUp, &speed, &fullDuplex, &autoneg); /* Set the MAC duplex mode */ if(fullDuplex) { ixEthAccPortDuplexModeSet (portId, IX_ETH_ACC_FULL_DUPLEX); } else { ixEthAccPortDuplexModeSet (portId, IX_ETH_ACC_HALF_DUPLEX); } }