dmaengine: ioatdma: Fix error path in ioat3_dma_probe()
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>
This commit is contained in:
parent
1b11b4ef6b
commit
f0dc9fda2e
@ -534,18 +534,6 @@ err_out:
|
|||||||
return err;
|
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)
|
static void ioat_dma_remove(struct ioatdma_device *ioat_dma)
|
||||||
{
|
{
|
||||||
struct dma_device *dma = &ioat_dma->dma_dev;
|
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);
|
ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ioat_register(ioat_dma);
|
err = dma_async_device_register(&ioat_dma->dma_dev);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto err_disable_interrupts;
|
||||||
|
|
||||||
ioat_kobject_add(ioat_dma, &ioat_ktype);
|
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 */
|
/* disable relaxed ordering */
|
||||||
err = pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &val16);
|
err = pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &val16);
|
||||||
if (err)
|
if (err) {
|
||||||
return pcibios_err_to_errno(err);
|
err = pcibios_err_to_errno(err);
|
||||||
|
goto err_disable_interrupts;
|
||||||
|
}
|
||||||
|
|
||||||
/* clear relaxed ordering enable */
|
/* clear relaxed ordering enable */
|
||||||
val16 &= ~PCI_EXP_DEVCTL_RELAX_EN;
|
val16 &= ~PCI_EXP_DEVCTL_RELAX_EN;
|
||||||
err = pcie_capability_write_word(pdev, PCI_EXP_DEVCTL, val16);
|
err = pcie_capability_write_word(pdev, PCI_EXP_DEVCTL, val16);
|
||||||
if (err)
|
if (err) {
|
||||||
return pcibios_err_to_errno(err);
|
err = pcibios_err_to_errno(err);
|
||||||
|
goto err_disable_interrupts;
|
||||||
|
}
|
||||||
|
|
||||||
if (ioat_dma->cap & IOAT_CAP_DPS)
|
if (ioat_dma->cap & IOAT_CAP_DPS)
|
||||||
writeb(ioat_pending_level + 1,
|
writeb(ioat_pending_level + 1,
|
||||||
ioat_dma->reg_base + IOAT_PREFETCH_LIMIT_OFFSET);
|
ioat_dma->reg_base + IOAT_PREFETCH_LIMIT_OFFSET);
|
||||||
|
|
||||||
return 0;
|
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)
|
static void ioat_shutdown(struct pci_dev *pdev)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user