tree 8ca0644a07520e4b2beec8caf7d9ba091ef50299
parent d8892c6ee39614bc6d282dbef0ff9fa461a6467c
author [EMAIL PROTECTED] <[EMAIL PROTECTED]> Thu, 04 Aug 2005 02:34:11 -0700
committer Jeff Garzik <[EMAIL PROTECTED]> Thu, 11 Aug 2005 08:10:45 -0400

[PATCH] S2io: Timer based slowpath handling

Hi,
This patch implements the slow-path handling functions(link
state change, hardware errors) as a timer. It is not
handled in interrupt handler as was done previously.

Signed-off-by: Ravinandan Arakali <[EMAIL PROTECTED]>
Signed-off-by: Raghavendra Koushik <[EMAIL PROTECTED]>
Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>

 drivers/net/s2io.c |   22 +++++++++++++++++++---
 drivers/net/s2io.h |    4 ++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -168,6 +168,12 @@ static char ethtool_stats_keys[][ETH_GST
 #define S2IO_TEST_LEN  sizeof(s2io_gstrings) / ETH_GSTRING_LEN
 #define S2IO_STRINGS_LEN       S2IO_TEST_LEN * ETH_GSTRING_LEN
 
+#define S2IO_TIMER_CONF(timer, handle, arg, exp)               \
+                       init_timer(&timer);                     \
+                       timer.function = handle;                \
+                       timer.data = (unsigned long) arg;       \
+                       mod_timer(&timer, (jiffies + exp))      \
+
 /*
  * Constants to be programmed into the Xena's registers, to configure
  * the XAUI.
@@ -2741,6 +2747,7 @@ int s2io_open(struct net_device *dev)
 setting_mac_address_failed:
        free_irq(sp->pdev->irq, dev);
 isr_registration_failed:
+       del_timer_sync(&sp->alarm_timer);
        s2io_reset(sp);
 hw_init_failed:
        return err;
@@ -2898,6 +2905,15 @@ int s2io_xmit(struct sk_buff *skb, struc
        return 0;
 }
 
+static void
+s2io_alarm_handle(unsigned long data)
+{
+       nic_t *sp = (nic_t *)data;
+
+       alarm_intr_handler(sp);
+       mod_timer(&sp->alarm_timer, jiffies + HZ / 2);
+}
+
 /**
  *  s2io_isr - ISR handler of the device .
  *  @irq: the irq of the device.
@@ -2942,9 +2958,6 @@ static irqreturn_t s2io_isr(int irq, voi
                return IRQ_NONE;
        }
 
-       if (reason & (GEN_ERROR_INTR))
-               alarm_intr_handler(sp);
-
 #ifdef CONFIG_S2IO_NAPI
        if (reason & GEN_INTR_RXTRAFFIC) {
                if (netif_rx_schedule_prep(dev)) {
@@ -4394,6 +4407,7 @@ static void s2io_card_down(nic_t * sp)
        unsigned long flags;
        register u64 val64 = 0;
 
+       del_timer_sync(&sp->alarm_timer);
        /* If s2io_set_link task is executing, wait till it completes. */
        while (test_and_set_bit(0, &(sp->link_state))) {
                msleep(50);
@@ -4496,6 +4510,8 @@ static int s2io_card_up(nic_t * sp)
                return -ENODEV;
        }
 
+       S2IO_TIMER_CONF(sp->alarm_timer, s2io_alarm_handle, sp, (HZ/2));
+
        atomic_set(&sp->card_state, CARD_UP);
        return 0;
 }
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h
--- a/drivers/net/s2io.h
+++ b/drivers/net/s2io.h
@@ -624,6 +624,9 @@ struct s2io_nic {
        struct tasklet_struct task;
        volatile unsigned long tasklet_status;
 
+       /* Timer that handles I/O errors/exceptions */
+       struct timer_list alarm_timer;
+
        /* Space to back up the PCI config space */
        u32 config_space[256 / sizeof(u32)];
 
@@ -819,6 +822,7 @@ static int s2io_poll(struct net_device *
 #endif
 static void s2io_init_pci(nic_t * sp);
 int s2io_set_mac_addr(struct net_device *dev, u8 * addr);
+static void s2io_alarm_handle(unsigned long data);
 static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs);
 static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag);
 static struct ethtool_ops netdev_ethtool_ops;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to