On 06/12/16, 7:26 PM, "Christoph Hellwig" <h...@lst.de> wrote:

>And simplify the MSI-X logic in general - just request the two
>vectors directly instead of going through an indirection table.
>
>Signed-off-by: Christoph Hellwig <h...@lst.de>
>---
> drivers/scsi/qla4xxx/ql4_def.h  | 18 +--------
> drivers/scsi/qla4xxx/ql4_glbl.h |  1 -
> drivers/scsi/qla4xxx/ql4_isr.c  | 27 +++++--------
> drivers/scsi/qla4xxx/ql4_nx.c   | 89
>+++++++++++------------------------------
> 4 files changed, 37 insertions(+), 98 deletions(-)
>
>diff --git a/drivers/scsi/qla4xxx/ql4_def.h
>b/drivers/scsi/qla4xxx/ql4_def.h
>index a7cfc27..aeebefb 100644
>--- a/drivers/scsi/qla4xxx/ql4_def.h
>+++ b/drivers/scsi/qla4xxx/ql4_def.h
>@@ -409,18 +409,9 @@ struct qla4_8xxx_legacy_intr_set {
> 
> /* MSI-X Support */
> 
>-#define QLA_MSIX_DEFAULT      0x00
>-#define QLA_MSIX_RSP_Q                0x01
>-
>+#define QLA_MSIX_DEFAULT      0
>+#define QLA_MSIX_RSP_Q                1
> #define QLA_MSIX_ENTRIES      2
>-#define QLA_MIDX_DEFAULT      0
>-#define QLA_MIDX_RSP_Q                1
>-
>-struct ql4_msix_entry {
>-      int have_irq;
>-      uint16_t msix_vector;
>-      uint16_t msix_entry;
>-};
> 
> /*
>  * ISP Operations
>@@ -572,9 +563,6 @@ struct scsi_qla_host {
> #define AF_IRQ_ATTACHED                       10 /* 0x00000400 */
> #define AF_DISABLE_ACB_COMPLETE               11 /* 0x00000800 */
> #define AF_HA_REMOVAL                 12 /* 0x00001000 */
>-#define AF_INTx_ENABLED                       15 /* 0x00008000 */
>-#define AF_MSI_ENABLED                        16 /* 0x00010000 */
>-#define AF_MSIX_ENABLED                       17 /* 0x00020000 */
> #define AF_MBOX_COMMAND_NOPOLL                18 /* 0x00040000 */
> #define AF_FW_RECOVERY                        19 /* 0x00080000 */
> #define AF_EEH_BUSY                   20 /* 0x00100000 */
>@@ -762,8 +750,6 @@ struct scsi_qla_host {
>       struct isp_operations *isp_ops;
>       struct ql82xx_hw_data hw;
> 
>-      struct ql4_msix_entry msix_entries[QLA_MSIX_ENTRIES];
>-
>       uint32_t nx_dev_init_timeout;
>       uint32_t nx_reset_timeout;
>       void *fw_dump;
>diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h
>b/drivers/scsi/qla4xxx/ql4_glbl.h
>index 2559144..bce96a5 100644
>--- a/drivers/scsi/qla4xxx/ql4_glbl.h
>+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
>@@ -134,7 +134,6 @@ int qla4_8xxx_get_flash_info(struct scsi_qla_host
>*ha);
> void qla4_82xx_enable_intrs(struct scsi_qla_host *ha);
> void qla4_82xx_disable_intrs(struct scsi_qla_host *ha);
> int qla4_8xxx_enable_msix(struct scsi_qla_host *ha);
>-void qla4_8xxx_disable_msix(struct scsi_qla_host *ha);
> irqreturn_t qla4_8xxx_msi_handler(int irq, void *dev_id);
> irqreturn_t qla4_8xxx_default_intr_handler(int irq, void *dev_id);
> irqreturn_t qla4_8xxx_msix_rsp_q(int irq, void *dev_id);
>diff --git a/drivers/scsi/qla4xxx/ql4_isr.c
>b/drivers/scsi/qla4xxx/ql4_isr.c
>index 4f9c0f2..d2cd33d 100644
>--- a/drivers/scsi/qla4xxx/ql4_isr.c
>+++ b/drivers/scsi/qla4xxx/ql4_isr.c
>@@ -1107,7 +1107,7 @@ static void qla4_82xx_spurious_interrupt(struct
>scsi_qla_host *ha,
>       DEBUG2(ql4_printk(KERN_INFO, ha, "Spurious Interrupt\n"));
>       if (is_qla8022(ha)) {
>               writel(0, &ha->qla4_82xx_reg->host_int);
>-              if (test_bit(AF_INTx_ENABLED, &ha->flags))
>+              if (!ha->pdev->msi_enabled && !ha->pdev->msix_enabled)
>                       qla4_82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg,
>                           0xfbff);
>       }
>@@ -1564,19 +1564,18 @@ int qla4xxx_request_irqs(struct scsi_qla_host *ha)
> 
> try_msi:
>       /* Trying MSI */
>-      ret = pci_enable_msi(ha->pdev);
>-      if (!ret) {
>+      ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
>+      if (ret > 0) {
>               ret = request_irq(ha->pdev->irq, qla4_8xxx_msi_handler,
>                       0, DRIVER_NAME, ha);
>               if (!ret) {
>                       DEBUG2(ql4_printk(KERN_INFO, ha, "MSI: Enabled.\n"));
>-                      set_bit(AF_MSI_ENABLED, &ha->flags);
>                       goto irq_attached;
>               } else {
>                       ql4_printk(KERN_WARNING, ha,
>                           "MSI: Failed to reserve interrupt %d "
>                           "already in use.\n", ha->pdev->irq);
>-                      pci_disable_msi(ha->pdev);
>+                      pci_free_irq_vectors(ha->pdev);
>               }
>       }
> 
>@@ -1592,7 +1591,6 @@ int qla4xxx_request_irqs(struct scsi_qla_host *ha)
>           IRQF_SHARED, DRIVER_NAME, ha);
>       if (!ret) {
>               DEBUG2(ql4_printk(KERN_INFO, ha, "INTx: Enabled.\n"));
>-              set_bit(AF_INTx_ENABLED, &ha->flags);
>               goto irq_attached;
> 
>       } else {
>@@ -1614,14 +1612,11 @@ int qla4xxx_request_irqs(struct scsi_qla_host *ha)
> 
> void qla4xxx_free_irqs(struct scsi_qla_host *ha)
> {
>-      if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags)) {
>-              if (test_bit(AF_MSIX_ENABLED, &ha->flags)) {
>-                      qla4_8xxx_disable_msix(ha);
>-              } else if (test_and_clear_bit(AF_MSI_ENABLED, &ha->flags)) {
>-                      free_irq(ha->pdev->irq, ha);
>-                      pci_disable_msi(ha->pdev);
>-              } else if (test_and_clear_bit(AF_INTx_ENABLED, &ha->flags)) {
>-                      free_irq(ha->pdev->irq, ha);
>-              }
>-      }
>+      if (!test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags))
>+              return;
>+
>+      if (ha->pdev->msix_enabled)
>+              free_irq(pci_irq_vector(ha->pdev, 1), ha);
>+      free_irq(pci_irq_vector(ha->pdev, 0), ha);
>+      pci_free_irq_vectors(ha->pdev);
> }
>diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
>index bccd8b6..e91abb3 100644
>--- a/drivers/scsi/qla4xxx/ql4_nx.c
>+++ b/drivers/scsi/qla4xxx/ql4_nx.c
>@@ -3945,7 +3945,7 @@ void qla4_82xx_process_mbox_intr(struct
>scsi_qla_host *ha, int out_count)
>               ha->isp_ops->interrupt_service_routine(ha, intr_status);
> 
>               if (test_bit(AF_INTERRUPTS_ON, &ha->flags) &&
>-                  test_bit(AF_INTx_ENABLED, &ha->flags))
>+                  (!ha->pdev->msi_enabled && !ha->pdev->msix_enabled))
>                       qla4_82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg,
>                                       0xfbff);
>       }
>@@ -4174,78 +4174,37 @@ qla4_82xx_disable_intrs(struct scsi_qla_host *ha)
>       spin_unlock_irq(&ha->hardware_lock);
> }
> 
>-struct ql4_init_msix_entry {
>-      uint16_t entry;
>-      uint16_t index;
>-      const char *name;
>-      irq_handler_t handler;
>-};
>-
>-static struct ql4_init_msix_entry
>qla4_8xxx_msix_entries[QLA_MSIX_ENTRIES] = {
>-      { QLA_MSIX_DEFAULT, QLA_MIDX_DEFAULT,
>-          "qla4xxx (default)",
>-          (irq_handler_t)qla4_8xxx_default_intr_handler },
>-      { QLA_MSIX_RSP_Q, QLA_MIDX_RSP_Q,
>-          "qla4xxx (rsp_q)", (irq_handler_t)qla4_8xxx_msix_rsp_q },
>-};
>-
>-void
>-qla4_8xxx_disable_msix(struct scsi_qla_host *ha)
>-{
>-      int i;
>-      struct ql4_msix_entry *qentry;
>-
>-      for (i = 0; i < QLA_MSIX_ENTRIES; i++) {
>-              qentry = &ha->msix_entries[qla4_8xxx_msix_entries[i].index];
>-              if (qentry->have_irq) {
>-                      free_irq(qentry->msix_vector, ha);
>-                      DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %s\n",
>-                              __func__, qla4_8xxx_msix_entries[i].name));
>-              }
>-      }
>-      pci_disable_msix(ha->pdev);
>-      clear_bit(AF_MSIX_ENABLED, &ha->flags);
>-}
>-
> int
> qla4_8xxx_enable_msix(struct scsi_qla_host *ha)
> {
>-      int i, ret;
>-      struct msix_entry entries[QLA_MSIX_ENTRIES];
>-      struct ql4_msix_entry *qentry;
>-
>-      for (i = 0; i < QLA_MSIX_ENTRIES; i++)
>-              entries[i].entry = qla4_8xxx_msix_entries[i].entry;
>+      int ret;
> 
>-      ret = pci_enable_msix_exact(ha->pdev, entries, ARRAY_SIZE(entries));
>-      if (ret) {
>+      ret = pci_alloc_irq_vectors(ha->pdev, QLA_MSIX_ENTRIES,
>+                      QLA_MSIX_ENTRIES, PCI_IRQ_MSIX);
>+      if (ret < 0) {
>               ql4_printk(KERN_WARNING, ha,
>                   "MSI-X: Failed to enable support -- %d/%d\n",
>                   QLA_MSIX_ENTRIES, ret);
>-              goto msix_out;
>-      }
>-      set_bit(AF_MSIX_ENABLED, &ha->flags);
>-
>-      for (i = 0; i < QLA_MSIX_ENTRIES; i++) {
>-              qentry = &ha->msix_entries[qla4_8xxx_msix_entries[i].index];
>-              qentry->msix_vector = entries[i].vector;
>-              qentry->msix_entry = entries[i].entry;
>-              qentry->have_irq = 0;
>-              ret = request_irq(qentry->msix_vector,
>-                  qla4_8xxx_msix_entries[i].handler, 0,
>-                  qla4_8xxx_msix_entries[i].name, ha);
>-              if (ret) {
>-                      ql4_printk(KERN_WARNING, ha,
>-                          "MSI-X: Unable to register handler -- %x/%d.\n",
>-                          qla4_8xxx_msix_entries[i].index, ret);
>-                      qla4_8xxx_disable_msix(ha);
>-                      goto msix_out;
>-              }
>-              qentry->have_irq = 1;
>-              DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %s\n",
>-                      __func__, qla4_8xxx_msix_entries[i].name));
>+              return ret;
>       }
>-msix_out:
>+
>+      ret = request_irq(pci_irq_vector(ha->pdev, 0),
>+                      qla4_8xxx_default_intr_handler, 0, "qla4xxx (default)",
>+                      ha);
>+      if (ret)
>+              goto out_free_vectors;
>+
>+      ret = request_irq(pci_irq_vector(ha->pdev, 1),
>+                      qla4_8xxx_msix_rsp_q, 0, "qla4xxx (rsp_q)", ha);
>+      if (ret)
>+              goto out_free_default_irq;
>+
>+      return 0;
>+
>+out_free_default_irq:
>+      free_irq(pci_irq_vector(ha->pdev, 0), ha);
>+out_free_vectors:
>+      pci_free_irq_vectors(ha->pdev);
>       return ret;
> }
> 
>-- 
>2.1.4
>

Reviewed-by: Nilesh Javali <nilesh.jav...@cavium.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to