S2IO: Fixes for MSI and MSIX
authorSivakumar Subramani <Sivakumar.Subramani@neterion.com>
Sat, 24 Feb 2007 06:51:50 +0000 (01:51 -0500)
committerJeff Garzik <jeff@garzik.org>
Tue, 27 Feb 2007 09:27:11 +0000 (04:27 -0500)
- Added debug statements to print a debug message if the MSI/MSI-X vector (or)
  data is zero.

- This patch removes the code that will enable NAPI for the case of single
  ring and MSI-X / MSI case. There are some issue in the enabling NAPI with
  MSI/MSI-X.  So we are turning off NAPI in the case of MSI/MSI-X.

Signed-off-by: Sivakumar Subramani <sivakumar.subramani@neterion.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/s2io.c

index fd85648d98d142e5b10e8186680721650d695352..7cc07c8e707678db44b5428bca34b980cb9921c3 100644 (file)
@@ -6112,7 +6112,7 @@ static int s2io_add_isr(struct s2io_nic * sp)
                }
        }
        if (sp->intr_type == MSI_X) {
                }
        }
        if (sp->intr_type == MSI_X) {
-               int i;
+               int i, msix_tx_cnt=0,msix_rx_cnt=0;
 
                for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) {
                        if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) {
 
                for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) {
                        if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) {
@@ -6121,16 +6121,36 @@ static int s2io_add_isr(struct s2io_nic * sp)
                                err = request_irq(sp->entries[i].vector,
                                          s2io_msix_fifo_handle, 0, sp->desc[i],
                                                  sp->s2io_entries[i].arg);
                                err = request_irq(sp->entries[i].vector,
                                          s2io_msix_fifo_handle, 0, sp->desc[i],
                                                  sp->s2io_entries[i].arg);
-                               DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i],
-                               (unsigned long long)sp->msix_info[i].addr);
+                               /* If either data or addr is zero print it */
+                               if(!(sp->msix_info[i].addr &&
+                                       sp->msix_info[i].data)) {
+                                       DBG_PRINT(ERR_DBG, "%s @ Addr:0x%llx"
+                                               "Data:0x%lx\n",sp->desc[i],
+                                               (unsigned long long)
+                                               sp->msix_info[i].addr,
+                                               (unsigned long)
+                                               ntohl(sp->msix_info[i].data));
+                               } else {
+                                       msix_tx_cnt++;
+                               }
                        } else {
                                sprintf(sp->desc[i], "%s:MSI-X-%d-RX",
                                        dev->name, i);
                                err = request_irq(sp->entries[i].vector,
                                          s2io_msix_ring_handle, 0, sp->desc[i],
                                                  sp->s2io_entries[i].arg);
                        } else {
                                sprintf(sp->desc[i], "%s:MSI-X-%d-RX",
                                        dev->name, i);
                                err = request_irq(sp->entries[i].vector,
                                          s2io_msix_ring_handle, 0, sp->desc[i],
                                                  sp->s2io_entries[i].arg);
-                               DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i],
-                               (unsigned long long)sp->msix_info[i].addr);
+                               /* If either data or addr is zero print it */
+                               if(!(sp->msix_info[i].addr &&
+                                       sp->msix_info[i].data)) {
+                                       DBG_PRINT(ERR_DBG, "%s @ Addr:0x%llx"
+                                               "Data:0x%lx\n",sp->desc[i],
+                                               (unsigned long long)
+                                               sp->msix_info[i].addr,
+                                               (unsigned long)
+                                               ntohl(sp->msix_info[i].data));
+                               } else {
+                                       msix_rx_cnt++;
+                               }
                        }
                        if (err) {
                                DBG_PRINT(ERR_DBG,"%s:MSI-X-%d registration "
                        }
                        if (err) {
                                DBG_PRINT(ERR_DBG,"%s:MSI-X-%d registration "
@@ -6140,6 +6160,8 @@ static int s2io_add_isr(struct s2io_nic * sp)
                        }
                        sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS;
                }
                        }
                        sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS;
                }
+               printk("MSI-X-TX %d entries enabled\n",msix_tx_cnt);
+               printk("MSI-X-RX %d entries enabled\n",msix_rx_cnt);
        }
        if (sp->intr_type == INTA) {
                err = request_irq((int) sp->pdev->irq, s2io_isr, IRQF_SHARED,
        }
        if (sp->intr_type == INTA) {
                err = request_irq((int) sp->pdev->irq, s2io_isr, IRQF_SHARED,
@@ -6704,8 +6726,7 @@ static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type)
                                        "Defaulting to INTA\n");
                *dev_intr_type = INTA;
        }
                                        "Defaulting to INTA\n");
                *dev_intr_type = INTA;
        }
-       if ( (rx_ring_num > 1) && (*dev_intr_type != INTA) )
-               napi = 0;
+
        if (rx_ring_mode > 3) {
                DBG_PRINT(ERR_DBG, "s2io: Requested ring mode not supported\n");
                DBG_PRINT(ERR_DBG, "s2io: Defaulting to 3-buffer mode\n");
        if (rx_ring_mode > 3) {
                DBG_PRINT(ERR_DBG, "s2io: Requested ring mode not supported\n");
                DBG_PRINT(ERR_DBG, "s2io: Defaulting to 3-buffer mode\n");