[netdevice] Record whether or not interrupts are currently enabled
authorMichael Brown <mcb30@etherboot.org>
Tue, 23 Mar 2010 00:55:19 +0000 (00:55 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 23 Mar 2010 00:55:47 +0000 (00:55 +0000)
Signed-off-by: Michael Brown <mcb30@etherboot.org>
src/include/gpxe/netdevice.h
src/net/netdevice.c

index 4f469e6..97bf168 100644 (file)
@@ -329,6 +329,9 @@ struct net_device {
 /** Network device is open */
 #define NETDEV_OPEN 0x0001
 
+/** Network device interrupts are enabled */
+#define NETDEV_IRQ_ENABLED 0x0002
+
 /** Link-layer protocol table */
 #define LL_PROTOCOLS __table ( struct ll_protocol, "ll_protocols" )
 
@@ -491,6 +494,17 @@ netdev_is_open ( struct net_device *netdev ) {
        return ( netdev->state & NETDEV_OPEN );
 }
 
+/**
+ * Check whether or not network device interrupts are currently enabled
+ *
+ * @v netdev           Network device
+ * @v irq_enabled      Network device interrupts are enabled
+ */
+static inline __attribute__ (( always_inline )) int
+netdev_irq_enabled ( struct net_device *netdev ) {
+       return ( netdev->state & NETDEV_IRQ_ENABLED );
+}
+
 extern void netdev_link_down ( struct net_device *netdev );
 extern int netdev_tx ( struct net_device *netdev, struct io_buffer *iobuf );
 extern void netdev_tx_complete_err ( struct net_device *netdev,
index 2e781d7..b91f98c 100644 (file)
@@ -460,7 +460,14 @@ void unregister_netdev ( struct net_device *netdev ) {
  * @v enable           Interrupts should be enabled
  */
 void netdev_irq ( struct net_device *netdev, int enable ) {
+
+       /* Enable or disable device interrupts */
        netdev->op->irq ( netdev, enable );
+
+       /* Record interrupt enabled state */
+       netdev->state &= ~NETDEV_IRQ_ENABLED;
+       if ( enable )
+               netdev->state |= NETDEV_IRQ_ENABLED;
 }
 
 /**