david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[mii] Add generic mii_check_link() function

Most devices expose at least the link up/down status via a bit in a
MAC register, since the MAC generally already needs to know whether or
not the link is up.  Some devices (e.g. the SMSC75xx USB NIC) expose
this information to software only via the MII registers.

Provide a generic mii_check_link() implementation to check the BMSR
and report the link status via netdev_link_{up,down}().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2015-03-10 21:23:51 +00:00
parent 03e71d5d1a
commit 6ad02e78bb
2 changed files with 34 additions and 0 deletions

View File

@ -115,3 +115,35 @@ int mii_reset ( struct mii_interface *mii ) {
DBGC ( mii, "MII %p timed out waiting for reset\n", mii );
return -ETIMEDOUT;
}
/**
* Update link status via MII
*
* @v mii MII interface
* @v netdev Network device
* @ret rc Return status code
*/
int mii_check_link ( struct mii_interface *mii, struct net_device *netdev ) {
int bmsr;
int link;
int rc;
/* Read BMSR */
bmsr = mii_read ( mii, MII_BMSR );
if ( bmsr < 0 ) {
rc = bmsr;
return rc;
}
/* Report link status */
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;
}

View File

@ -114,5 +114,7 @@ mii_dump ( struct mii_interface *mii ) {
extern int mii_restart ( struct mii_interface *mii );
extern int mii_reset ( struct mii_interface *mii );
extern int mii_check_link ( struct mii_interface *mii,
struct net_device *netdev );
#endif /* _IPXE_MII_H */