123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
-
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <ipxe/mii.h>
-
-
-
-
- int mii_restart ( struct mii_interface *mii ) {
- int bmcr;
- int rc;
-
-
- 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;
- }
-
-
- 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;
- }
-
-
- int mii_reset ( struct mii_interface *mii ) {
- unsigned int i;
- int bmcr;
- int rc;
-
-
- if ( ( rc = mii_write ( mii, MII_BMCR,
- ( BMCR_RESET | BMCR_ANENABLE ) ) ) != 0 ) {
- DBGC ( mii, "MII %p could not write BMCR: %s\n",
- mii, strerror ( rc ) );
- return rc;
- }
-
-
- for ( i = 0 ; i < MII_RESET_MAX_WAIT_MS ; i++ ) {
-
-
- 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;
- }
-
-
- if ( bmcr & BMCR_RESET ) {
- mdelay ( 1 );
- continue;
- }
-
-
-
- if ( ( rc = mii_restart ( mii ) ) != 0 )
- return rc;
-
- DBGC ( mii, "MII %p reset after %dms\n", mii, i );
- return 0;
- }
-
- DBGC ( mii, "MII %p timed out waiting for reset\n", mii );
- return -ETIMEDOUT;
- }
-
-
- int mii_check_link ( struct mii_interface *mii, struct net_device *netdev ) {
- int bmsr;
- int link;
- int rc;
-
-
- bmsr = mii_read ( mii, MII_BMSR );
- if ( bmsr < 0 ) {
- rc = bmsr;
- return rc;
- }
-
-
- link = ( bmsr & BMSR_LSTATUS );
- DBGC ( mii, "MII %p link %s (BMSR %#04x)\n",
- mii, ( link ? "up" : "down" ), bmsr );
- if ( link ) {
- netdev_link_up ( netdev );
- } else {
- netdev_link_down ( netdev );
- }
-
- return 0;
- }
|