*
*/
+/**
+ * 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
*
/* 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;
/** 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 */