Re: [PATCH 1/4] megaraid_sas: enable intx only if msix request fails

2017-03-10 Thread Tomas Henzl
On 10.3.2017 12:22, Shivasharan S wrote:
> Without this fix, driver will enable INTx Interrupt pin even though
> MSI-x vectors are enabled. See below lspci output. DisINTx is unset
> for MSIx setup.
>
> lspci -s 85:00.0 -vvv |grep INT |grep Control
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR+ FastB2B- DisINTx-
>
> After applying this fix, driver will enable INTx Interrupt pin only
> if Legacy interrupt method is required.
> See below lspci output. DisINTx is set for MSIx setup.
> lspci -s 85:00.0 -vvv |grep INT |grep Control
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR+ FastB2B- DisINTx+
>
> Signed-off-by: Kashyap Desai 

Reviewed-by: Tomas Henzl 
tomash



[PATCH 1/4] megaraid_sas: enable intx only if msix request fails

2017-03-10 Thread Shivasharan S
Without this fix, driver will enable INTx Interrupt pin even though
MSI-x vectors are enabled. See below lspci output. DisINTx is unset
for MSIx setup.

lspci -s 85:00.0 -vvv |grep INT |grep Control
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR+ FastB2B- DisINTx-

After applying this fix, driver will enable INTx Interrupt pin only
if Legacy interrupt method is required.
See below lspci output. DisINTx is set for MSIx setup.
lspci -s 85:00.0 -vvv |grep INT |grep Control
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR+ FastB2B- DisINTx+

Signed-off-by: Kashyap Desai 
---
V2 changes - As Christoph Hellwig suggested, use pci_alloc_irq_vectors
with PCI_IRQ_LEGACY flag in place of pci_intx().

 drivers/scsi/megaraid/megaraid_sas_base.c | 14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 7ac9a9e..016ffce 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5034,10 +5034,12 @@ megasas_setup_irqs_msix(struct megasas_instance 
*instance, u8 is_probe)
 >irq_context[j]);
/* Retry irq register for IO_APIC*/
instance->msix_vectors = 0;
-   if (is_probe)
+   if (is_probe) {
+   pci_free_irq_vectors(instance->pdev);
return megasas_setup_irqs_ioapic(instance);
-   else
+   } else {
return -1;
+   }
}
}
return 0;
@@ -5277,9 +5279,11 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
MPI2_REPLY_POST_HOST_INDEX_OFFSET);
}
 
-   i = pci_alloc_irq_vectors(instance->pdev, 1, 1, PCI_IRQ_LEGACY);
-   if (i < 0)
-   goto fail_setup_irqs;
+   if (!instance->msix_vectors) {
+   i = pci_alloc_irq_vectors(instance->pdev, 1, 1, PCI_IRQ_LEGACY);
+   if (i < 0)
+   goto fail_setup_irqs;
+   }
 
dev_info(>pdev->dev,
"firmware supports msix\t: (%d)", fw_msix_count);
-- 
2.8.3