linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
@ 2016-11-18  7:15 Christoph Hellwig
  2016-11-29 16:45 ` Martin K. Petersen
  2016-12-06 11:16 ` Javali, Nilesh
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph Hellwig @ 2016-11-18  7:15 UTC (permalink / raw)
  To: QLogic-Storage-Upstream, linux-scsi

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 <hch@lst.de>
---
 drivers/scsi/qla4xxx/ql4_def.h  | 18 +--------
 drivers/scsi/qla4xxx/ql4_glbl.h |  1 -
 drivers/scsi/qla4xxx/ql4_isr.c  | 25 +++++-------
 drivers/scsi/qla4xxx/ql4_nx.c   | 87 +++++++++++------------------------------
 4 files changed, 35 insertions(+), 96 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..ff89bba 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);
+	ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
 	if (!ret) {
 		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..50cdb3d 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));
+	ret = pci_alloc_irq_vectors(ha->pdev, QLA_MSIX_ENTRIES,
+			QLA_MSIX_ENTRIES, PCI_IRQ_MSIX);
 	if (ret) {
 		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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
  2016-11-18  7:15 [PATCH] qla4xxx: switch to pci_alloc_irq_vectors Christoph Hellwig
@ 2016-11-29 16:45 ` Martin K. Petersen
  2016-11-30  6:08   ` Javali, Nilesh
  2016-12-06 11:16 ` Javali, Nilesh
  1 sibling, 1 reply; 6+ messages in thread
From: Martin K. Petersen @ 2016-11-29 16:45 UTC (permalink / raw)
  To: Vikas Chaudhary; +Cc: Christoph Hellwig, QLogic-Storage-Upstream, linux-scsi

>>>>> "Christoph" == Christoph Hellwig <hch@lst.de> writes:

Christoph> And simplify the MSI-X logic in general - just request the
Christoph> two vectors directly instead of going through an indirection
Christoph> table.

Vikas: Please review!

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
  2016-11-29 16:45 ` Martin K. Petersen
@ 2016-11-30  6:08   ` Javali, Nilesh
  2016-11-30 16:52     ` Martin K. Petersen
  0 siblings, 1 reply; 6+ messages in thread
From: Javali, Nilesh @ 2016-11-30  6:08 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: Christoph Hellwig, QLogic-Storage-Upstream@qlogic.com,
	linux-scsi@vger.kernel.org

Hi Martin,

We would test this internally and then ACK within a week.

Thanks,
Nilesh

On 29/11/16, 10:15 PM, "Martin K. Petersen" <martin.petersen@oracle.com>
wrote:

>>>>>> "Christoph" == Christoph Hellwig <hch@lst.de> writes:
>
>Christoph> And simplify the MSI-X logic in general - just request the
>Christoph> two vectors directly instead of going through an indirection
>Christoph> table.
>
>Vikas: Please review!
>
>-- 
>Martin K. Petersen	Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
  2016-11-30  6:08   ` Javali, Nilesh
@ 2016-11-30 16:52     ` Martin K. Petersen
  0 siblings, 0 replies; 6+ messages in thread
From: Martin K. Petersen @ 2016-11-30 16:52 UTC (permalink / raw)
  To: Javali, Nilesh
  Cc: Martin K. Petersen, Christoph Hellwig,
	QLogic-Storage-Upstream@qlogic.com, linux-scsi@vger.kernel.org

>>>>> "Nilesh" == Javali, Nilesh <Nilesh.Javali@cavium.com> writes:

Nilesh> We would test this internally and then ACK within a week.

Sounds good. Thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
  2016-11-18  7:15 [PATCH] qla4xxx: switch to pci_alloc_irq_vectors Christoph Hellwig
  2016-11-29 16:45 ` Martin K. Petersen
@ 2016-12-06 11:16 ` Javali, Nilesh
  2016-12-06 13:55   ` Christoph Hellwig
  1 sibling, 1 reply; 6+ messages in thread
From: Javali, Nilesh @ 2016-12-06 11:16 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: QLogic-Storage-Upstream@qlogic.com, linux-scsi@vger.kernel.org

Please see comments inline.

Thanks,
Nilesh

On 18/11/16, 12:45 PM, "Christoph Hellwig" <hch@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 <hch@lst.de>
>---
> drivers/scsi/qla4xxx/ql4_def.h  | 18 +--------
> drivers/scsi/qla4xxx/ql4_glbl.h |  1 -
> drivers/scsi/qla4xxx/ql4_isr.c  | 25 +++++-------
> drivers/scsi/qla4xxx/ql4_nx.c   | 87
>+++++++++++------------------------------
> 4 files changed, 35 insertions(+), 96 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..ff89bba 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);
>+	ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
> 	if (!ret) {

Since pci_alloc_irq_vectors returns a negative error code upon error,
This should be if (ret).

> 		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..50cdb3d 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));
>+	ret = pci_alloc_irq_vectors(ha->pdev, QLA_MSIX_ENTRIES,
>+			QLA_MSIX_ENTRIES, PCI_IRQ_MSIX);
> 	if (ret) {

Similarly, driver load fails here as pci_alloc_irq_vectors returns correct
num of vectors.
Hence this should be, 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
>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] qla4xxx: switch to pci_alloc_irq_vectors
  2016-12-06 11:16 ` Javali, Nilesh
@ 2016-12-06 13:55   ` Christoph Hellwig
  0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2016-12-06 13:55 UTC (permalink / raw)
  To: Javali, Nilesh
  Cc: Christoph Hellwig, QLogic-Storage-Upstream@qlogic.com,
	linux-scsi@vger.kernel.org

Hi Nilesh,

> > try_msi:
> > 	/* Trying MSI */
> >-	ret = pci_enable_msi(ha->pdev);
> >+	ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
> > 	if (!ret) {
> 
> Since pci_alloc_irq_vectors returns a negative error code upon error,
> This should be if (ret).

Fixes, thanks.

> Similarly, driver load fails here as pci_alloc_irq_vectors returns correct
> num of vectors.
> Hence this should be, if (ret < 0).

Also fixed.

The new version is on it's way.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-12-06 13:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-18  7:15 [PATCH] qla4xxx: switch to pci_alloc_irq_vectors Christoph Hellwig
2016-11-29 16:45 ` Martin K. Petersen
2016-11-30  6:08   ` Javali, Nilesh
2016-11-30 16:52     ` Martin K. Petersen
2016-12-06 11:16 ` Javali, Nilesh
2016-12-06 13:55   ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).