On 19/11/2024 at 19:01, Ciprian Marian Costea wrote: > On 11/19/2024 11:26 AM, Vincent Mailhol wrote: >> On 19/11/2024 at 17:10, Ciprian Costea wrote: (...) >>> + if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SECONDARY_MB_IRQ) { >>> + err = request_irq(priv->irq_secondary_mb, >>> + flexcan_irq, IRQF_SHARED, dev->name, dev); >>> + if (err) >>> + goto out_free_irq_err; >>> + } >> >> Is the logic here correct? >> >> request_irq(priv->irq_err, flexcan_irq, IRQF_SHARED, dev->name, dev); >> >> is called only if the device has the FLEXCAN_QUIRK_NR_IRQ_3 quirk. >> >> So, if the device has the FLEXCAN_QUIRK_SECONDARY_MB_IRQ but not the >> FLEXCAN_QUIRK_NR_IRQ_3, you may end up trying to free an irq which was >> not initialized. >> >> Did you confirm if it is safe to call free_irq() on an uninitialized irq? >> >> (and I can see that currently there is no such device with >> FLEXCAN_QUIRK_SECONDARY_MB_IRQ but without FLEXCAN_QUIRK_NR_IRQ_3, but >> who knows if such device will be introduced in the future?) >> > > Hello Vincent, > > Thanks for your review. Indeed this seems to be an incorrect logic since > I do not want to create any dependency between 'FLEXCAN_QUIRK_NR_IRQ_3' > and 'FLEXCAN_QUIRK_SECONDARY_MB_IRQ'. > > I will change the impacted section to: > if (err) { > if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) > goto out_free_irq_err; > else > goto out_free_irq; > } This is better. Alternatively, you could move the check into the label: out_free_irq_err: if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) free_irq(priv->irq_err, dev); But this is not a strong preference, I let you pick the one which you prefer. >>> flexcan_chip_interrupts_enable(dev); >>> netif_start_queue(dev); >>> return 0; >>> + out_free_irq_err: >>> + free_irq(priv->irq_err, dev); >>> out_free_irq_boff: >>> free_irq(priv->irq_boff, dev); >>> out_free_irq: (...) Yours sincerely, Vincent Mailhol