[netdevice] Add netdev->link_rc field for errors encountered during link-up
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:04:38 +0000 (02:04 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:33:14 +0000 (02:33 -0700)
For some link layers, such as 802.11 and IPoIB, link-up is an active process
that can fail for reasons more involved than a faulty cable. It is useful
in such cases to be able to inform the user about the particular failure
mode of the link. With this changeset, netdev_link_up() and netdev_link_down()
have the semantics of "no error occurred", and a new inline function
netdev_link_err() is added to set link-down with an error indication. A
positive link is always considered to be error-free.

src/include/gpxe/netdevice.h

index 46213b5..4a9a1e5 100644 (file)
@@ -267,6 +267,12 @@ struct net_device {
         * This is the bitwise-OR of zero or more NETDEV_XXX constants.
         */
        unsigned int state;
+       /** Most recent link-up error
+        *
+        * This is only valid if @c NETDEV_LINK_UP is not set in @a
+        * state. It is zero while the link is coming up.
+        */
+       int link_rc;
        /** Maximum packet length
         *
         * This length includes any link-layer headers.
@@ -421,16 +427,30 @@ netdev_settings_init ( struct net_device *netdev ) {
 static inline __attribute__ (( always_inline )) void
 netdev_link_up ( struct net_device *netdev ) {
        netdev->state |= NETDEV_LINK_UP;
+       netdev->link_rc = 0;
 }
 
 /**
- * Mark network device as having link down
+ * Mark network device as having link down without an error
  *
  * @v netdev           Network device
  */
 static inline __attribute__ (( always_inline )) void
 netdev_link_down ( struct net_device *netdev ) {
        netdev->state &= ~NETDEV_LINK_UP;
+       netdev->link_rc = 0;
+}
+
+/**
+ * Mark network device as having link down due to an error
+ *
+ * @v netdev           Network device
+ * @v rc               Return status code for error indication
+ */
+static inline __attribute__ (( always_inline )) void
+netdev_link_err ( struct net_device *netdev, int rc ) {
+       netdev->state &= ~NETDEV_LINK_UP;
+       netdev->link_rc = rc;
 }
 
 /**