From 0975ee498940bdb2382e3a91beddb34bf57f7029 Mon Sep 17 00:00:00 2001 From: Rakesh Goyal Date: Fri, 15 Mar 2019 11:44:18 +0530 Subject: [PATCH] nvethernet: fix common irq free path issue: freeing common irq in ether_free_irqs without check fix: Use mask for common interrupt as well so it can be used to check before freeing irq Bug 200512422 Change-Id: I694ba983658fae3da6948ceda18d24c11f08d458 Signed-off-by: Rakesh Goyal Reviewed-on: https://git-master.nvidia.com/r/2081600 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/net/ethernet/nvidia/nvethernet/ether_linux.c | 8 +++++++- drivers/net/ethernet/nvidia/nvethernet/ether_linux.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 5f6a9a15..d118b7f8 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -245,7 +245,10 @@ static void ether_free_irqs(struct ether_priv_data *pdata) unsigned int i; unsigned int chan; - devm_free_irq(pdata->dev, pdata->common_irq, pdata); + if (pdata->common_irq_alloc_mask & 1U) { + devm_free_irq(pdata->dev, pdata->common_irq, pdata); + pdata->common_irq_alloc_mask = 0U; + } for (i = 0; i < pdata->osi_dma->num_dma_chans; i++) { chan = pdata->osi_dma->dma_chans[i]; @@ -253,10 +256,12 @@ static void ether_free_irqs(struct ether_priv_data *pdata) if (pdata->rx_irq_alloc_mask & (1U << i)) { devm_free_irq(pdata->dev, pdata->rx_irqs[i], pdata->rx_napi[chan]); + pdata->rx_irq_alloc_mask &= (~(1U << i)); } if (pdata->tx_irq_alloc_mask & (1U << i)) { devm_free_irq(pdata->dev, pdata->tx_irqs[i], pdata->tx_napi[chan]); + pdata->tx_irq_alloc_mask &= (~(1U << i)); } } } @@ -292,6 +297,7 @@ static int ether_request_irqs(struct ether_priv_data *pdata) pdata->common_irq); return ret; } + pdata->common_irq_alloc_mask = 1; for (i = 0; i < osi_dma->num_dma_chans; i++) { chan = osi_dma->dma_chans[i]; diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index 3027068e..2f0166b4 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -127,6 +127,7 @@ struct ether_priv_data { unsigned int rx_irq_alloc_mask; unsigned int tx_irq_alloc_mask; + unsigned int common_irq_alloc_mask; int common_irq; int tx_irqs[ETHER_MAX_IRQS];