david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[mii] Add separate mii_restart() function

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-08-23 21:25:51 +01:00
parent 0dacd54174
commit 6e50e7950f
2 changed files with 33 additions and 4 deletions

View File

@ -30,6 +30,37 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/
/**
* Restart autonegotiation
*
* @v mii MII interface
* @ret rc Return status code
*/
int mii_restart ( struct mii_interface *mii ) {
int bmcr;
int rc;
/* Read BMCR */
bmcr = mii_read ( mii, MII_BMCR );
if ( bmcr < 0 ) {
rc = bmcr;
DBGC ( mii, "MII %p could not read BMCR: %s\n",
mii, strerror ( rc ) );
return rc;
}
/* Enable and restart autonegotiation */
bmcr |= ( BMCR_ANENABLE | BMCR_ANRESTART );
if ( ( rc = mii_write ( mii, MII_BMCR, bmcr ) ) != 0 ) {
DBGC ( mii, "MII %p could not write BMCR: %s\n",
mii, strerror ( rc ) );
return rc;
}
DBGC ( mii, "MII %p restarted autonegotiation\n", mii );
return 0;
}
/**
* Reset MII interface
*
@ -70,11 +101,8 @@ int mii_reset ( struct mii_interface *mii ) {
/* Force autonegotation on again, in case it was
* cleared by the reset.
*/
if ( ( rc = mii_write ( mii, MII_BMCR, BMCR_ANENABLE ) ) != 0 ){
DBGC ( mii, "MII %p could not write BMCR: %s\n",
mii, strerror ( rc ) );
if ( ( rc = mii_restart ( mii ) ) != 0 )
return rc;
}
DBGC ( mii, "MII %p reset after %dms\n", mii, i );
return 0;

View File

@ -81,6 +81,7 @@ mii_write ( struct mii_interface *mii, unsigned int reg, unsigned int data ) {
/** Maximum time to wait for a reset, in milliseconds */
#define MII_RESET_MAX_WAIT_MS 500
extern int mii_restart ( struct mii_interface *mii );
extern int mii_reset ( struct mii_interface *mii );
#endif /* _IPXE_MII_H */