MFD: rtsx_pcr: Fix probe fail path
authorJiri Slaby <jslaby@suse.cz>
Thu, 4 Apr 2013 19:34:11 +0000 (21:34 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 5 Apr 2013 16:40:14 +0000 (18:40 +0200)
When rtsx_pci_acquire_irq fails in rtsx_pci_probe, we forget to
disable an MSI (if we enabled it). This results in this warning on the
next attempt to load the module:
WARNING: at drivers/pci/msi.c:834 pci_enable_msi_block+0x2a4/0x2b0()
Hardware name: HP EliteBook 840 G1
Modules linked in: rtsx_pci(+) ...
Pid: 4056, comm: modprobe Tainted: G          I  3.8.0-9405-gd895cb1-1-vanilla #1
Call Trace:
 [<ffffffff81045c6a>] warn_slowpath_common+0x7a/0xc0
 [<ffffffff81045cc5>] warn_slowpath_null+0x15/0x20
 [<ffffffff81302544>] pci_enable_msi_block+0x2a4/0x2b0
 [<ffffffffa05e335a>] rtsx_pci_probe+0x55a/0x720 [rtsx_pci]
...

So properly disable MSI in that case.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/rtsx_pcr.c

index 2f12cc1..578a113 100644 (file)
@@ -1138,7 +1138,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
 
        ret = rtsx_pci_acquire_irq(pcr);
        if (ret < 0)
-               goto free_dma;
+               goto disable_msi;
 
        pci_set_master(pcidev);
        synchronize_irq(pcr->irq);
@@ -1162,7 +1162,9 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
 
 disable_irq:
        free_irq(pcr->irq, (void *)pcr);
-free_dma:
+disable_msi:
+       if (pcr->msi_en)
+               pci_disable_msi(pcr->pci);
        dma_free_coherent(&(pcr->pci->dev), RTSX_RESV_BUF_LEN,
                        pcr->rtsx_resv_buf, pcr->rtsx_resv_buf_addr);
 unmap: