]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
can: m_can: pci: add missing m_can_class_free_dev() in probe/remove methods
authorZhang Changzhong <zhangchangzhong@huawei.com>
Fri, 11 Nov 2022 12:11:23 +0000 (20:11 +0800)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 24 Nov 2022 15:10:18 +0000 (16:10 +0100)
In m_can_pci_remove() and error handling path of m_can_pci_probe(),
m_can_class_free_dev() should be called to free resource allocated by
m_can_class_allocate_dev(), otherwise there will be memleak.

Fixes: cab7ffc0324f ("can: m_can: add PCI glue driver for Intel Elkhart Lake")
Signed-off-by: Zhang Changzhong <zhangchangzhong@huawei.com>
Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Link: https://lore.kernel.org/all/1668168684-6390-1-git-send-email-zhangchangzhong@huawei.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/m_can/m_can_pci.c

index 8f184a852a0a7c7476eaa1cf231ab1e4d46a5dc0..f2219aa2824b3c581280fde6cf6decf003e50c06 100644 (file)
@@ -120,7 +120,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        ret = pci_alloc_irq_vectors(pci, 1, 1, PCI_IRQ_ALL_TYPES);
        if (ret < 0)
-               return ret;
+               goto err_free_dev;
 
        mcan_class->dev = &pci->dev;
        mcan_class->net->irq = pci_irq_vector(pci, 0);
@@ -132,7 +132,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        ret = m_can_class_register(mcan_class);
        if (ret)
-               goto err;
+               goto err_free_irq;
 
        /* Enable interrupt control at CAN wrapper IP */
        writel(0x1, base + CTL_CSR_INT_CTL_OFFSET);
@@ -144,8 +144,10 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        return 0;
 
-err:
+err_free_irq:
        pci_free_irq_vectors(pci);
+err_free_dev:
+       m_can_class_free_dev(mcan_class->net);
        return ret;
 }
 
@@ -161,6 +163,7 @@ static void m_can_pci_remove(struct pci_dev *pci)
        writel(0x0, priv->base + CTL_CSR_INT_CTL_OFFSET);
 
        m_can_class_unregister(mcan_class);
+       m_can_class_free_dev(mcan_class->net);
        pci_free_irq_vectors(pci);
 }