From faf4382eb4e55145fd76622f2f8ce8a5665433a2 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Gampa Date: Tue, 14 Sep 2021 11:05:17 +0530 Subject: [PATCH] nvethernet: macsec secure and n_secure irq freeing Issue: Observed a Kernel warning if we make enable MACSEC using sysfs once and disable twice Fix: Avoid freeing if macsec IRQ is already freed Bug 200772596 Change-Id: I9e2a018da7b0b6bcef79af895de2dbd04859aa55 Signed-off-by: Sanath Kumar Gampa Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2593896 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/net/ethernet/nvidia/nvethernet/macsec.c | 13 +++++++++++-- drivers/net/ethernet/nvidia/nvethernet/macsec.h | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/macsec.c b/drivers/net/ethernet/nvidia/nvethernet/macsec.c index 3d6a6524..80bc1a1d 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/macsec.c +++ b/drivers/net/ethernet/nvidia/nvethernet/macsec.c @@ -152,8 +152,15 @@ int macsec_close(struct macsec_priv_data *macsec_pdata) macsec_pdata->enabled = OSI_DISABLE; osi_macsec_deinit(pdata->osi_core); - devm_free_irq(dev, macsec_pdata->ns_irq, macsec_pdata); - devm_free_irq(dev, macsec_pdata->s_irq, macsec_pdata); + if (macsec_pdata->is_irq_allocated & OSI_BIT(1)) { + devm_free_irq(dev, macsec_pdata->ns_irq, macsec_pdata); + macsec_pdata->is_irq_allocated &= ~OSI_BIT(1); + } + if (macsec_pdata->is_irq_allocated & OSI_BIT(0)) { + devm_free_irq(dev, macsec_pdata->s_irq, macsec_pdata); + macsec_pdata->is_irq_allocated &= ~OSI_BIT(0); + } + PRINT_EXIT(); return ret; @@ -180,6 +187,7 @@ int macsec_open(struct macsec_priv_data *macsec_pdata, dev_info(dev, "%s: requested s_irq %d: %s\n", __func__, macsec_pdata->s_irq, macsec_pdata->irq_name[0]); + macsec_pdata->is_irq_allocated |= OSI_BIT(0); snprintf(macsec_pdata->irq_name[1], MACSEC_IRQ_NAME_SZ, "%s.macsec_ns", netdev_name(pdata->ndev)); @@ -193,6 +201,7 @@ int macsec_open(struct macsec_priv_data *macsec_pdata, dev_info(dev, "%s: requested ns_irq %d: %s\n", __func__, macsec_pdata->ns_irq, macsec_pdata->irq_name[1]); + macsec_pdata->is_irq_allocated |= OSI_BIT(1); /* Invoke OSI HW initialization, initialize standard BYP entries */ ret = osi_macsec_init(pdata->osi_core); diff --git a/drivers/net/ethernet/nvidia/nvethernet/macsec.h b/drivers/net/ethernet/nvidia/nvethernet/macsec.h index 578d637f..ffdfd761 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/macsec.h +++ b/drivers/net/ethernet/nvidia/nvethernet/macsec.h @@ -154,6 +154,8 @@ struct macsec_priv_data { int s_irq; /** Non secure irq */ int ns_irq; + /** is_irq_allocated BIT(0)for s_irq and BIT(1)for ns_irq*/ + unsigned int is_irq_allocated; /** pointer to ether private data struct */ struct ether_priv_data *ether_pdata; /** macsec IRQ name strings */