Re: [patch 3/6] netxen: improve MSI interrupt handling

2007-12-24 Thread Dhananjay Phadke
Supposedly I had 2.6.24-rc2 as base for the patchset, but looks like it 
had some stale code. I'll regenrate series on a fresh checkout.

-Dhananjay

On Sat, 22 Dec 2007, Jeff Garzik wrote:

> Patch does not apply to 2.6.24-rc.
> 
> Was this "bug fix" series meant for 2.6.25?
> 
>   Jeff
> 
> 
> 
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [patch 3/6] netxen: improve MSI interrupt handling

2007-12-22 Thread Jeff Garzik

Patch does not apply to 2.6.24-rc.

Was this "bug fix" series meant for 2.6.25?

Jeff



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[patch 3/6] netxen: improve MSI interrupt handling

2007-12-20 Thread dhananjay
Recent netxen firmware has new scheme of generating MSI interrupts, it
raises interrupt and blocks itself, waiting for driver to unmask. This
reduces chance of spurious interrupts.

The driver will be able to deal with older firmware as well.

Signed-off-by: Dhananjay Phadke <[EMAIL PROTECTED]>

Index: netdev-2.6/drivers/net/netxen/netxen_nic_hw.c
===
--- netdev-2.6.orig/drivers/net/netxen/netxen_nic_hw.c
+++ netdev-2.6/drivers/net/netxen/netxen_nic_hw.c
@@ -398,6 +398,8 @@ int netxen_nic_hw_resources(struct netxe
NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW));
printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name,
adapter->intr_scheme);
+   adapter->msi_mode = readl(
+   NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW));
DPRINTK(INFO, "Receive Peg ready too. starting stuff\n");
 
addr = netxen_alloc(adapter->ahw.pdev,
Index: netdev-2.6/drivers/net/netxen/netxen_nic_main.c
===
--- netdev-2.6.orig/drivers/net/netxen/netxen_nic_main.c
+++ netdev-2.6/drivers/net/netxen/netxen_nic_main.c
@@ -149,33 +149,33 @@ static void netxen_nic_update_cmd_consum
 
 #defineADAPTER_LIST_SIZE 12
 
+static uint32_t msi_tgt_status[4] = {
+   ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
+   ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3
+};
+
+static uint32_t sw_int_mask[4] = {
+   CRB_SW_INT_MASK_0, CRB_SW_INT_MASK_1,
+   CRB_SW_INT_MASK_2, CRB_SW_INT_MASK_3
+};
+
 static void netxen_nic_disable_int(struct netxen_adapter *adapter)
 {
-   uint32_tmask = 0x7ff;
+   u32 mask;
int retries = 32;
+   int port = adapter->portnum;
+   int pci_fn = adapter->ahw.pci_func;
 
DPRINTK(1, INFO, "Entered ISR Disable \n");
 
-   switch (adapter->portnum) {
-   case 0:
-   writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
-   break;
-   case 1:
-   writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
-   break;
-   case 2:
-   writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
-   break;
-   case 3:
-   writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
-   break;
+   if (adapter->msi_mode != MSI_MODE_MULTIFUNC) {
+   writel(0x0, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port]));
}
 
if (adapter->intr_scheme != -1 &&
adapter->intr_scheme != INTR_SCHEME_PERPORT)
-   writel(mask,PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
+   writel(0x7ff,PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
 
-   /* Window = 0 or 1 */
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
do {
writel(0x,
@@ -190,6 +190,11 @@ static void netxen_nic_disable_int(struc
printk(KERN_NOTICE "%s: Failed to disable interrupt 
completely\n",
netxen_nic_driver_name);
}
+   } else {
+   if (adapter->msi_mode == MSI_MODE_MULTIFUNC) {
+   writel(0x, PCI_OFFSET_SECOND_RANGE(adapter,
+   msi_tgt_status[pci_fn]));
+   }
}
 
DPRINTK(1, INFO, "Done with Disable Int\n");
@@ -198,6 +203,7 @@ static void netxen_nic_disable_int(struc
 static void netxen_nic_enable_int(struct netxen_adapter *adapter)
 {
u32 mask;
+   int port = adapter->portnum;
 
DPRINTK(1, INFO, "Entered ISR Enable \n");
 
@@ -218,20 +224,7 @@ static void netxen_nic_enable_int(struct
writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
}
 
-   switch (adapter->portnum) {
-   case 0:
-   writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
-   break;
-   case 1:
-   writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
-   break;
-   case 2:
-   writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
-   break;
-   case 3:
-   writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
-   break;
-   }
+   writel(0x1, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port]));
 
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
mask = 0xbff;
@@ -401,6 +394,7 @@ netxen_nic_probe(struct pci_dev *pdev, c
 
/* this will be read from FW later */
adapter->intr_scheme = -1;
+   adapter->msi_mode = -1;
 
/* This will be reset for mezz cards  */
adapter->portnum = pci_func_id;
Index: netdev-2.6/drivers/net/netxen/netxen_nic.h
===
--- ne