]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[mii] Add generic mii_check_link() function
authorMichael Brown <mcb30@ipxe.org>
Tue, 10 Mar 2015 21:23:51 +0000 (21:23 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 10 Mar 2015 21:31:07 +0000 (21:31 +0000)
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>
src/drivers/net/mii.c
src/include/ipxe/mii.h

index 4e45874aa75679972a06a8b865e294f6a8859305..9b297029ad04562edc78f633eb4a75ef81eebdeb 100644 (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;
+}
index daf29dac5e70a4b3a3831027283d456e38fb4137..c2245b49e08e60401af06d30189ee0d429376e8b 100644 (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 */