Subject: ipr: ipr_test_msi() fails when running with msi-x enabled adapter
From: Wen Xiong <wenxiong@linux.vnet.ibm.com>
Patch-mainline: 3.9-rc7
Git-commit: f19799f49d1a03f39d5e53fa1bf05db4820c86c2
References: bnc#806608

Loading ipr modules failed(-22) with msi-x enabled adapter. 

Ipr: IBM Power RAID SCSI Device Driver version: 2.6.0 (November 16, 2012)
Ipr: Entering ipr_probe_ioa
ipr 0000:01:00.0: Found IOA with IRQ: 0
ipr 0000:01:00.0: ibm,query-pe-dma-windows(53) 10000 8000000 20000203 returned 0
Ipr: Entering ipr_test_msi
ipr 0000:01:00.0: Can not assign irq 0
Ipr: probe of 0000:01:00.0 failed with error -22

In ipr_test_msi(), We need to pass the first vector of msix vectors 
instead of using pdev->irq to request_irq() when adapter enables 
msix feature.

Signed-off-by: Wen Xiong <wenxiong@linux.vnet.ibm.com>
Acked-by: Brian King <brking@linux.vnet.ibm.com>
Acked-by: Torsten Duwe <duwe@suse.de>

---
 drivers/scsi/ipr.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Index: b/drivers/scsi/ipr.c
===================================================================
--- a/drivers/scsi/ipr.c	2013-02-28 08:11:37.128968974 -0600
+++ b/drivers/scsi/ipr.c	2013-02-28 08:15:58.930203860 -0600
@@ -9327,7 +9327,10 @@ static int __devinit ipr_test_msi(struct
 	int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
 	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
-	rc = request_irq(pdev->irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
+	if (ioa_cfg->intr_flag == IPR_USE_MSIX)
+		rc = request_irq(ioa_cfg->vectors_info[0].vec, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
+	else
+		rc = request_irq(pdev->irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
 	if (rc) {
 		dev_err(&pdev->dev, "Can not assign irq %d\n", pdev->irq);
 		return rc;
@@ -9349,7 +9352,10 @@ static int __devinit ipr_test_msi(struct
 
 	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
-	free_irq(pdev->irq, ioa_cfg);
+	if (ioa_cfg->intr_flag == IPR_USE_MSIX)
+		free_irq(ioa_cfg->vectors_info[0].vec, ioa_cfg);
+	else
+		free_irq(pdev->irq, ioa_cfg);
 
 	LEAVE;
 
