Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e01872af1d05cf4327c8e519b14e368b72921ccf
Commit:     e01872af1d05cf4327c8e519b14e368b72921ccf
Parent:     7eec517c444fad699d3fc66d110440edee1fb0ed
Author:     [EMAIL PROTECTED] <[EMAIL PROTECTED]>
AuthorDate: Wed Jul 25 20:13:12 2007 +0530
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Mon Jul 30 15:51:59 2007 -0400

    netxen: Fix interrupt handling for multiport adapters
    
    This patch fixes masking of interrupts on multiport adapters. Also disables
    interrupts upon ifdown interface. The wrong mask could result in interrupt
    flood after interface is down.
    
    Signed-off-by: Dhananjay Phadke <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/net/netxen/netxen_nic_main.c |   36 +++++++++++++++++----------------
 1 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/drivers/net/netxen/netxen_nic_main.c 
b/drivers/net/netxen/netxen_nic_main.c
index 7d93bc3..bb8f5f2 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -930,6 +930,8 @@ static int netxen_nic_close(struct net_device *netdev)
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
 
+       netxen_nic_disable_int(adapter);
+
        cmd_buff = adapter->cmd_buf_arr;
        for (i = 0; i < adapter->max_tx_desc_count; i++) {
                buffrag = cmd_buff->frag_array;
@@ -1243,28 +1245,12 @@ static int
 netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev)
 {
        u32 ret = 0;
-       u32 our_int = 0;
 
        DPRINTK(INFO, "Entered handle ISR\n");
        adapter->stats.ints++;
 
-       if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
-               our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
-               /* not our interrupt */
-               if ((our_int & (0x80 << adapter->portnum)) == 0)
-                       return ret;
-       }
-
        netxen_nic_disable_int(adapter);
 
-       if (adapter->intr_scheme == INTR_SCHEME_PERPORT) {
-               /* claim interrupt */
-               if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
-                       writel(our_int & ~((u32)(0x80 << adapter->portnum)),
-                       NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
-               }
-       }
-
        if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) 
{
                if (netif_rx_schedule_prep(netdev)) {
                        /*
@@ -1298,6 +1284,7 @@ irqreturn_t netxen_intr(int irq, void *data)
 {
        struct netxen_adapter *adapter;
        struct net_device *netdev;
+       u32 our_int = 0;
 
        if (unlikely(!irq)) {
                return IRQ_NONE;        /* Not our interrupt */
@@ -1305,7 +1292,22 @@ irqreturn_t netxen_intr(int irq, void *data)
 
        adapter = (struct netxen_adapter *)data;
        netdev  = adapter->netdev;
-       /* process our status queue (for all 4 ports) */
+
+       if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
+               our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
+               /* not our interrupt */
+               if ((our_int & (0x80 << adapter->portnum)) == 0)
+                       return IRQ_NONE;
+       }
+
+       if (adapter->intr_scheme == INTR_SCHEME_PERPORT) {
+               /* claim interrupt */
+               if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
+                       writel(our_int & ~((u32)(0x80 << adapter->portnum)),
+                       NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
+               }
+       }
+
        if (netif_running(netdev))
                netxen_handle_int(adapter, netdev);
 
-
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