dmaengine: ioatdma: Fix error path in ioat3_dma_probe()
authorNikita Shubin <n.shubin@yadro.com>
Tue, 28 May 2024 06:09:24 +0000 (09:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 11:49:09 +0000 (13:49 +0200)
[ Upstream commit f0dc9fda2e0ee9e01496c2f5aca3a831131fad79 ]

Make sure we are disabling interrupts and destroying DMA pool if
pcie_capability_read/write_word() call failed.

Fixes: 511deae0261c ("dmaengine: ioatdma: disable relaxed ordering for ioatdma")
Signed-off-by: Nikita Shubin <n.shubin@yadro.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20240528-ioatdma-fixes-v2-2-a9f2fbe26ab1@yadro.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/ioat/init.c

index e76e507ae898caf360ffb9439a0c4e76f1667e8b..26964b7c8cf141073a74b2555fa7abed8839d9ae 100644 (file)
@@ -534,18 +534,6 @@ err_out:
        return err;
 }
 
-static int ioat_register(struct ioatdma_device *ioat_dma)
-{
-       int err = dma_async_device_register(&ioat_dma->dma_dev);
-
-       if (err) {
-               ioat_disable_interrupts(ioat_dma);
-               dma_pool_destroy(ioat_dma->completion_pool);
-       }
-
-       return err;
-}
-
 static void ioat_dma_remove(struct ioatdma_device *ioat_dma)
 {
        struct dma_device *dma = &ioat_dma->dma_dev;
@@ -1181,9 +1169,9 @@ static int ioat3_dma_probe(struct ioatdma_device *ioat_dma, int dca)
                       ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
        }
 
-       err = ioat_register(ioat_dma);
+       err = dma_async_device_register(&ioat_dma->dma_dev);
        if (err)
-               return err;
+               goto err_disable_interrupts;
 
        ioat_kobject_add(ioat_dma, &ioat_ktype);
 
@@ -1192,20 +1180,29 @@ static int ioat3_dma_probe(struct ioatdma_device *ioat_dma, int dca)
 
        /* disable relaxed ordering */
        err = pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &val16);
-       if (err)
-               return pcibios_err_to_errno(err);
+       if (err) {
+               err = pcibios_err_to_errno(err);
+               goto err_disable_interrupts;
+       }
 
        /* clear relaxed ordering enable */
        val16 &= ~PCI_EXP_DEVCTL_RELAX_EN;
        err = pcie_capability_write_word(pdev, PCI_EXP_DEVCTL, val16);
-       if (err)
-               return pcibios_err_to_errno(err);
+       if (err) {
+               err = pcibios_err_to_errno(err);
+               goto err_disable_interrupts;
+       }
 
        if (ioat_dma->cap & IOAT_CAP_DPS)
                writeb(ioat_pending_level + 1,
                       ioat_dma->reg_base + IOAT_PREFETCH_LIMIT_OFFSET);
 
        return 0;
+
+err_disable_interrupts:
+       ioat_disable_interrupts(ioat_dma);
+       dma_pool_destroy(ioat_dma->completion_pool);
+       return err;
 }
 
 static void ioat_shutdown(struct pci_dev *pdev)