From 90d4d4e1c4efc186e987560e8e4d946526e51f4f Mon Sep 17 00:00:00 2001 From: Bhadram Varka Date: Wed, 16 Apr 2025 04:47:48 +0000 Subject: [PATCH] nvethernet: Fix IRQ type mismatch warning for common IRQ Issue: Kernel logs reported an IRQ type mismatch warning for the Common IRQ, as it was assigned to the Ethernet server. Fix: Skip reading and requesting the Common IRQ when virtualization is enabled. Bug 5248491 Bug 5091879 Change-Id: I54d145b2f1c1dfbc42a0e0d2f686f1bb085119c4 Signed-off-by: Bhadram Varka Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3341674 GVS: buildbot_gerritrpt Reviewed-by: Bitan Biswas Reviewed-by: Mohan Thadikamalla --- .../ethernet/nvidia/nvethernet/ether_linux.c | 87 ++++++++++--------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 637fbc6f..53be405e 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -1861,9 +1861,9 @@ static void ether_free_irqs(struct ether_priv_data *pdata) unsigned int i; unsigned int chan; - if (pdata->common_irq_alloc_mask & 1U) { - if ((pdata->osi_core->mac != OSI_MAC_HW_EQOS) && - (pdata->osi_core->use_virtualization == OSI_DISABLE)) { + if ((pdata->osi_core->use_virtualization == OSI_DISABLE) && + (pdata->common_irq_alloc_mask & 1U)) { + if (pdata->osi_core->mac != OSI_MAC_HW_EQOS) { irq_set_affinity_hint(pdata->common_irq, NULL); } devm_free_irq(pdata->dev, pdata->common_irq, pdata); @@ -2010,36 +2010,37 @@ static int ether_request_irqs(struct ether_priv_data *pdata) int ret = 0, i, j = 1; unsigned int chan; - snprintf(pdata->irq_names[0], ETHER_IRQ_NAME_SZ, "%s.common_irq", - netdev_name(pdata->ndev)); + if (osi_core->use_virtualization == OSI_DISABLE) { + snprintf(pdata->irq_names[0], ETHER_IRQ_NAME_SZ, "%s.common_irq", + netdev_name(pdata->ndev)); #ifdef HSI_SUPPORT - ret = devm_request_threaded_irq(pdata->dev, - (unsigned int)pdata->common_irq, - ether_common_isr, - ether_common_isr_thread, - IRQF_SHARED | IRQF_ONESHOT, - pdata->irq_names[0], pdata); + ret = devm_request_threaded_irq(pdata->dev, + (unsigned int)pdata->common_irq, + ether_common_isr, + ether_common_isr_thread, + IRQF_SHARED | IRQF_ONESHOT, + pdata->irq_names[0], pdata); #else - ret = devm_request_irq(pdata->dev, (unsigned int)pdata->common_irq, - ether_common_isr, IRQF_SHARED, - pdata->irq_names[0], pdata); + ret = devm_request_irq(pdata->dev, (unsigned int)pdata->common_irq, + ether_common_isr, IRQF_SHARED, + pdata->irq_names[0], pdata); #endif - if (unlikely(ret < 0)) { - dev_err(pdata->dev, "failed to register common interrupt: %d\n", - pdata->common_irq); - return ret; - } + if (unlikely(ret < 0)) { + dev_err(pdata->dev, "failed to register common interrupt: %d\n", + pdata->common_irq); + return ret; + } - pdata->common_irq_alloc_mask = 1; + pdata->common_irq_alloc_mask = 1; - if ((osi_core->mac != OSI_MAC_HW_EQOS) && - (cpu_online(pdata->common_isr_cpu_id)) && - (osi_core->use_virtualization == OSI_DISABLE)) { - cpumask_set_cpu(pdata->common_isr_cpu_id, - &pdata->common_isr_cpu_mask); - irq_set_affinity_hint(pdata->common_irq, - &pdata->common_isr_cpu_mask); + if ((osi_core->mac != OSI_MAC_HW_EQOS) && + (cpu_online(pdata->common_isr_cpu_id))) { + cpumask_set_cpu(pdata->common_isr_cpu_id, + &pdata->common_isr_cpu_mask); + irq_set_affinity_hint(pdata->common_irq, + &pdata->common_isr_cpu_mask); + } } if (osi_core->mac_ver > OSI_EQOS_MAC_5_00 || @@ -5258,12 +5259,15 @@ static int ether_get_irqs(struct platform_device *pdev, unsigned int i, j; int ret = -1; - /* get common IRQ*/ - pdata->common_irq = platform_get_irq(pdev, 0); - if (pdata->common_irq < 0) { - dev_err(&pdev->dev, "failed to get common IRQ number\n"); - return pdata->common_irq; + if (pdata->osi_core->use_virtualization == OSI_DISABLE) { + /* get common IRQ*/ + pdata->common_irq = platform_get_irq(pdev, 0); + if (pdata->common_irq < 0) { + dev_err(&pdev->dev, "failed to get common IRQ number\n"); + return pdata->common_irq; + } } + if (osi_core->mac == OSI_MAC_HW_MGBE_T26X) { ret = ether_get_vdma_mapping(pdev, pdata); if (ret < 0) { @@ -5271,6 +5275,7 @@ static int ether_get_irqs(struct platform_device *pdev, return ret; } } + if ((osi_core->mac_ver > OSI_EQOS_MAC_5_00) || (osi_core->mac != OSI_MAC_HW_EQOS)) { ret = ether_get_vm_irq_data(pdev, pdata); @@ -6446,6 +6451,16 @@ static int ether_parse_dt(struct ether_priv_data *pdata) int ret_val = 0; osi_core->pre_sil = tegra_platform_is_vdk(); + + /* Allow to set non zero DMA channel for virtualization */ + if (!ether_init_ivc(pdata)) { + osi_core->use_virtualization = OSI_ENABLE; + dev_info(dev, "Virtualization is enabled\n"); + } else { + dev_info(dev, "Virtualization is not enabled\n"); + osi_core->use_virtualization = OSI_DISABLE; + } + /* Read flag to skip MAC reset on platform */ ret = of_property_read_u32(np, "nvidia,skip_mac_reset", &pdata->skip_mac_reset); @@ -6610,14 +6625,6 @@ static int ether_parse_dt(struct ether_priv_data *pdata) } } - /* Allow to set non zero DMA channel for virtualization */ - if (!ether_init_ivc(pdata)) { - osi_core->use_virtualization = OSI_ENABLE; - dev_info(dev, "Virtualization is enabled\n"); - } else { - ret = -1; - } - ret = of_property_read_u32_array(np, "nvidia,rxq_enable_ctrl", tmp_value, osi_core->num_mtl_queues);