From bba351803a8579cbeb08ca55a490227397c68337 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Gampa Date: Mon, 26 Aug 2024 06:26:36 +0000 Subject: [PATCH] nvethernet:Update CAR programming for MACSec Issue: 1. Not able to launch supplicant on second VF 2. When launching supplicant on VF1, MACSec link on VF0 is getting lost Fix: Do not program CAR registers as part of OSD as the same is being taken care by Server and also do not register for MACSec interrupts. Same is being handled in Server 2. Enabled packet duplication for MultiCast frames when launching supplicant Bug 4824402 Change-Id: I7b26298da8c94df2da823e36476bc37acf6123cd Signed-off-by: Sanath Kumar Gampa Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3201116 Reviewed-by: Mahesh Patil GVS: buildbot_gerritrpt Reviewed-by: Nagaraj Annaiah Reviewed-by: Ashutosh Jha --- .../ethernet/nvidia/nvethernet/ether_linux.c | 1 + .../net/ethernet/nvidia/nvethernet/macsec.c | 129 +++++++++--------- 2 files changed, 67 insertions(+), 63 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index aab3f5f0..0eb32b52 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -3870,6 +3870,7 @@ static int ether_prepare_mc_list(struct net_device *dev, } ioctl_data->l2_filter.addr_mask = OSI_AMASK_DISABLE; ioctl_data->l2_filter.src_dest = OSI_DA_MATCH; + ioctl_data->l2_filter.pkt_dup = OSI_ENABLE; ioctl_data->cmd = OSI_CMD_L2_FILTER; ret = osi_handle_ioctl(pdata->osi_core, ioctl_data); if (ret < 0) { diff --git a/drivers/net/ethernet/nvidia/nvethernet/macsec.c b/drivers/net/ethernet/nvidia/nvethernet/macsec.c index d1c4aaba..d4394884 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/macsec.c +++ b/drivers/net/ethernet/nvidia/nvethernet/macsec.c @@ -221,44 +221,45 @@ int macsec_open(struct macsec_priv_data *macsec_pdata, int ret = 0; PRINT_ENTRY(); - /* Request macsec irqs */ - snprintf(macsec_pdata->irq_name[0], MACSEC_IRQ_NAME_SZ, "%s.macsec_s", - netdev_name(pdata->ndev)); - ret = devm_request_irq(dev, macsec_pdata->s_irq, macsec_s_isr, - IRQF_TRIGGER_NONE, macsec_pdata->irq_name[0], - macsec_pdata); - if (ret < 0) { - dev_err(dev, "failed to request irq %d\n", ret); - goto exit; - } + if (pdata->osi_core->use_virtualization == OSI_DISABLE) { + /* Request macsec irqs */ + snprintf(macsec_pdata->irq_name[0], MACSEC_IRQ_NAME_SZ, "%s.macsec_s", + netdev_name(pdata->ndev)); + ret = devm_request_irq(dev, macsec_pdata->s_irq, macsec_s_isr, + IRQF_TRIGGER_NONE, macsec_pdata->irq_name[0], + macsec_pdata); + if (ret < 0) { + dev_err(dev, "failed to request irq %d\n", ret); + goto exit; + } - 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); + 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)); + snprintf(macsec_pdata->irq_name[1], MACSEC_IRQ_NAME_SZ, "%s.macsec_ns", + netdev_name(pdata->ndev)); #ifdef HSI_SUPPORT - ret = devm_request_threaded_irq(dev, macsec_pdata->ns_irq, macsec_ns_isr, - macsec_ns_isr_thread, - IRQF_TRIGGER_NONE | IRQF_ONESHOT, - macsec_pdata->irq_name[1], - macsec_pdata); + ret = devm_request_threaded_irq(dev, macsec_pdata->ns_irq, macsec_ns_isr, + macsec_ns_isr_thread, + IRQF_TRIGGER_NONE | IRQF_ONESHOT, + macsec_pdata->irq_name[1], + macsec_pdata); #else - ret = devm_request_irq(dev, macsec_pdata->ns_irq, macsec_ns_isr, - IRQF_TRIGGER_NONE, macsec_pdata->irq_name[1], - macsec_pdata); + ret = devm_request_irq(dev, macsec_pdata->ns_irq, macsec_ns_isr, + IRQF_TRIGGER_NONE, macsec_pdata->irq_name[1], + macsec_pdata); #endif - if (ret < 0) { - dev_err(dev, "failed to request irq %d\n", ret); - goto err_ns_irq; + if (ret < 0) { + dev_err(dev, "failed to request irq %d\n", ret); + goto err_ns_irq; + } + + 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); } - - 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, pdata->osi_core->mtu, (nveu8_t * const)pdata->ndev->dev_addr); @@ -1345,37 +1346,39 @@ int macsec_probe(struct ether_priv_data *pdata) #endif PRINT_ENTRY(); - /* Check if MACsec is enabled in DT, if so map the I/O base addr */ - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "macsec-base"); - if (res) { - osi_core->macsec_base = devm_ioremap_resource(dev, res); - if (IS_ERR(osi_core->macsec_base)) { - dev_err(dev, "failed to ioremap MACsec base addr\n"); - ret = PTR_ERR(osi_core->macsec_base); + if (osi_core->use_virtualization == OSI_DISABLE) { + /* Check if MACsec is enabled in DT, if so map the I/O base addr */ + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "macsec-base"); + if (res) { + osi_core->macsec_base = devm_ioremap_resource(dev, res); + if (IS_ERR(osi_core->macsec_base)) { + dev_err(dev, "failed to ioremap MACsec base addr\n"); + ret = PTR_ERR(osi_core->macsec_base); + goto exit; + } +#ifdef MACSEC_KEY_PROGRAM + /* store TZ window base address */ + tz_addr = (res->start - MACSEC_SIZE); +#endif + } else { + /* MACsec not supported per DT config, nothing more to do */ + osi_core->macsec_base = NULL; + osi_core->tz_base = NULL; + pdata->macsec_pdata = NULL; + /* Return positive value to indicate MACsec not enabled in DT */ + ret = 1; goto exit; } -#ifdef MACSEC_KEY_PROGRAM - /* store TZ window base address */ - tz_addr = (res->start - MACSEC_SIZE); -#endif - } else { - /* MACsec not supported per DT config, nothing more to do */ - osi_core->macsec_base = NULL; - osi_core->tz_base = NULL; - pdata->macsec_pdata = NULL; - /* Return positive value to indicate MACsec not enabled in DT */ - ret = 1; - goto exit; - } #ifdef MACSEC_KEY_PROGRAM - osi_core->tz_base = devm_ioremap(dev, tz_addr, MACSEC_SIZE); - if (IS_ERR(osi_core->tz_base)) { - dev_err(dev, "failed to ioremap TZ base addr\n"); - ret = PTR_ERR(osi_core->tz_base); - goto exit; - } + osi_core->tz_base = devm_ioremap(dev, tz_addr, MACSEC_SIZE); + if (IS_ERR(osi_core->tz_base)) { + dev_err(dev, "failed to ioremap TZ base addr\n"); + ret = PTR_ERR(osi_core->tz_base); + goto exit; + } #endif + } /* Alloc macsec priv data structure */ macsec_pdata = devm_kzalloc(dev, sizeof(struct macsec_priv_data), GFP_KERNEL); @@ -1416,17 +1419,17 @@ int macsec_probe(struct ether_priv_data *pdata) goto init_err; } + if (osi_core->use_virtualization == OSI_DISABLE) { /* Get platform resources - clks, resets, irqs. * CAR is not enabled and irqs not requested until macsec_init() */ - ret = macsec_get_platform_res(macsec_pdata); - if (ret < 0) { - dev_err(dev, "macsec_get_platform_res failed\n"); - goto init_err; - } + ret = macsec_get_platform_res(macsec_pdata); + if (ret < 0) { + dev_err(dev, "macsec_get_platform_res failed\n"); + goto init_err; + } /* Enable CAR */ - if (osi_core->use_virtualization == OSI_DISABLE) { ret = macsec_enable_car(macsec_pdata); if (ret < 0) { dev_err(dev, "Unable to enable macsec clks & reset\n");