linux:nvidia: macsec sysfs nodes only if enabled

Issue: Accessing the macsec sysfs nodes is leading to crash when macsec
is disabled in DT

Fix: Do not create sysfs nodes if macsec is not enabled in DT. Also
update the instance_id reading as part of ether_probe which will be
executed even when macsec is disabled

Bug 4431523
Bug 4910958

Change-Id: I354ac142b9d49852a0d5c7557a7368e1c36b0f63
Signed-off-by: Sanath Kumar Gampa <sgampa@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/3043469
(cherry picked from commit acf3356b8e9cbd7c0f9e34a0ead3591e83f65b60)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/3081473
Signed-off-by: Revanth Kumar Uppala <ruppala@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3292924
Reviewed-by: Narayana Reddy P <narayanr@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Bibek Basu <bbasu@nvidia.com>
This commit is contained in:
Sanath Kumar Gampa
2024-01-02 06:49:36 +00:00
committed by mobile promotions
parent d641168e9e
commit 00761e184e
3 changed files with 52 additions and 4 deletions

View File

@@ -5790,6 +5790,13 @@ static int ether_parse_dt(struct ether_priv_data *pdata)
}
}
/* Read MAC instance id */
ret = of_property_read_u32(np, "nvidia,instance_id", &osi_core->instance_id);
if (ret != 0) {
dev_info(dev, "DT instance_id missing\n");
return -EINVAL;
}
if (osi_dma->num_dma_chans != osi_core->num_mtl_queues) {
dev_err(dev, "mismatch in numbers of DMA channel and MTL Q\n");
return -EINVAL;

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2019-2023, NVIDIA CORPORATION. All rights reserved */
/* Copyright (c) 2019-2025, NVIDIA CORPORATION. All rights reserved */
#ifdef MACSEC_SUPPORT
#include "ether_linux.h"

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2019-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved */
/* Copyright (c) 2019-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved */
#include "ether_linux.h"
#include "macsec.h"
@@ -2735,6 +2735,33 @@ static struct attribute *ether_sysfs_attrs[] = {
NULL
};
/**
* @brief Attributes for nvethernet sysfs without MACSEC
*/
static struct attribute *ether_sysfs_attrs_without_macsec[] = {
#ifndef OSI_STRIPPED_LIB
#ifdef OSI_DEBUG
&dev_attr_desc_dump_enable.attr,
#endif /* OSI_DEBUG */
&dev_attr_mac_loopback.attr,
&dev_attr_ptp_mode.attr,
&dev_attr_ptp_sync.attr,
&dev_attr_frp.attr,
&dev_attr_uphy_gbe_mode.attr,
&dev_attr_phy_iface_mode.attr,
#ifdef ETHER_NVGRO
&dev_attr_nvgro_pkt_age_msec.attr,
&dev_attr_nvgro_timer_interval.attr,
&dev_attr_nvgro_stats.attr,
&dev_attr_nvgro_dump.attr,
#endif
#endif /* OSI_STRIPPED_LIB */
#ifdef HSI_SUPPORT
&dev_attr_hsi_enable.attr,
#endif
NULL
};
/**
* @brief Ethernet sysfs attribute group
*/
@@ -2743,6 +2770,14 @@ static struct attribute_group ether_attribute_group = {
.attrs = ether_sysfs_attrs,
};
/**
* @brief Ethernet sysfs attribute group without macsec
*/
static struct attribute_group ether_attribute_group_wo_macsec = {
.name = "nvethernet",
.attrs = ether_sysfs_attrs_without_macsec,
};
#ifndef OSI_STRIPPED_LIB
#ifdef CONFIG_DEBUG_FS
static char *timestamp_system_source(unsigned int source)
@@ -3331,7 +3366,10 @@ int ether_sysfs_register(struct ether_priv_data *pdata)
#endif /* OSI_STRIPPED_LIB */
/* Create nvethernet sysfs group under /sys/devices/<ether_device>/ */
if (pdata->macsec_pdata)
return sysfs_create_group(&dev->kobj, &ether_attribute_group);
else
return sysfs_create_group(&dev->kobj, &ether_attribute_group_wo_macsec);
}
void ether_sysfs_unregister(struct ether_priv_data *pdata)
@@ -3343,5 +3381,8 @@ void ether_sysfs_unregister(struct ether_priv_data *pdata)
#endif
#endif /* OSI_STRIPPED_LIB */
/* Remove nvethernet sysfs group under /sys/devices/<ether_device>/ */
if (pdata->macsec_pdata)
sysfs_remove_group(&dev->kobj, &ether_attribute_group);
else
sysfs_remove_group(&dev->kobj, &ether_attribute_group_wo_macsec);
}