[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20241209071101.3392590-9-tianx@yunsilicon.com>
Date: Mon, 9 Dec 2024 15:10:53 +0800
From: "Tian Xin" <tianx@...silicon.com>
To: <netdev@...r.kernel.org>, <davem@...emloft.net>
Cc: <weihg@...silicon.com>, <tianx@...silicon.com>
Subject: [PATCH 08/16] net-next/yunsilicon: Add ethernet interface
From: Xin Tian <tianx@...silicon.com>
Build a basic netdevice driver
Signed-off-by: Xin Tian <tianx@...silicon.com>
Signed-off-by: Honggang Wei <weihg@...silicon.com>
Signed-off-by: Lei Yan <jacky@...silicon.com>
---
drivers/net/ethernet/yunsilicon/Makefile | 2 +-
.../ethernet/yunsilicon/xsc/common/xsc_core.h | 1 +
.../net/ethernet/yunsilicon/xsc/net/main.c | 135 ++++++++++++++++++
.../net/ethernet/yunsilicon/xsc/net/xsc_eth.h | 16 +++
.../yunsilicon/xsc/net/xsc_eth_common.h | 15 ++
5 files changed, 168 insertions(+), 1 deletion(-)
create mode 100644 drivers/net/ethernet/yunsilicon/xsc/net/main.c
create mode 100644 drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth.h
create mode 100644 drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth_common.h
diff --git a/drivers/net/ethernet/yunsilicon/Makefile b/drivers/net/ethernet/yunsilicon/Makefile
index 950fd2663..c1d3e3398 100644
--- a/drivers/net/ethernet/yunsilicon/Makefile
+++ b/drivers/net/ethernet/yunsilicon/Makefile
@@ -4,5 +4,5 @@
# Makefile for the Yunsilicon device drivers.
#
-# obj-$(CONFIG_YUNSILICON_XSC_ETH) += xsc/net/
+obj-$(CONFIG_YUNSILICON_XSC_ETH) += xsc/net/
obj-$(CONFIG_YUNSILICON_XSC_PCI) += xsc/pci/
\ No newline at end of file
diff --git a/drivers/net/ethernet/yunsilicon/xsc/common/xsc_core.h b/drivers/net/ethernet/yunsilicon/xsc/common/xsc_core.h
index 88d4c5654..5d2b28e2e 100644
--- a/drivers/net/ethernet/yunsilicon/xsc/common/xsc_core.h
+++ b/drivers/net/ethernet/yunsilicon/xsc/common/xsc_core.h
@@ -498,6 +498,7 @@ struct xsc_core_device {
struct pci_dev *pdev;
struct device *device;
struct xsc_priv priv;
+ void *netdev;
void *eth_priv;
struct xsc_dev_resource *dev_res;
diff --git a/drivers/net/ethernet/yunsilicon/xsc/net/main.c b/drivers/net/ethernet/yunsilicon/xsc/net/main.c
new file mode 100644
index 000000000..243ec7ced
--- /dev/null
+++ b/drivers/net/ethernet/yunsilicon/xsc/net/main.c
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2021 - 2023, Shanghai Yunsilicon Technology Co., Ltd.
+ * All rights reserved.
+ */
+
+#include <linux/reboot.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include "common/xsc_core.h"
+#include "xsc_eth_common.h"
+#include "xsc_eth.h"
+
+static int xsc_get_max_num_channels(struct xsc_core_device *xdev)
+{
+ return min_t(int, xdev->dev_res->eq_table.num_comp_vectors,
+ XSC_ETH_MAX_NUM_CHANNELS);
+}
+
+static void *xsc_eth_add(struct xsc_core_device *xdev)
+{
+ int err = -1;
+ int num_chl, num_tc;
+ struct net_device *netdev;
+ struct xsc_adapter *adapter = NULL;
+
+ num_chl = xsc_get_max_num_channels(xdev);
+ num_tc = xdev->caps.max_tc;
+
+ netdev = alloc_etherdev_mqs(sizeof(struct xsc_adapter),
+ num_chl * num_tc, num_chl);
+ if (unlikely(!netdev)) {
+ xsc_core_warn(xdev, "alloc_etherdev_mqs failed, txq=%d, rxq=%d\n",
+ (num_chl * num_tc), num_chl);
+ return NULL;
+ }
+
+ netdev->dev.parent = &xdev->pdev->dev;
+ adapter = netdev_priv(netdev);
+ adapter->netdev = netdev;
+ adapter->pdev = xdev->pdev;
+ adapter->dev = &adapter->pdev->dev;
+ adapter->xdev = (void *)xdev;
+ xdev->eth_priv = adapter;
+
+ err = register_netdev(netdev);
+ if (err) {
+ xsc_core_warn(xdev, "register_netdev failed, err=%d\n", err);
+ goto err_reg_netdev;
+ }
+
+ xdev->netdev = (void *)netdev;
+
+ return adapter;
+
+err_reg_netdev:
+ free_netdev(netdev);
+
+ return NULL;
+}
+
+static void xsc_eth_remove(struct xsc_core_device *xdev, void *context)
+{
+ struct xsc_adapter *adapter = NULL;
+
+ if (!xdev)
+ return;
+
+ adapter = xdev->eth_priv;
+ if (!adapter) {
+ xsc_core_warn(xdev, "failed! adapter is null\n");
+ return;
+ }
+
+ xsc_core_info(adapter->xdev, "remove netdev %s entry\n", adapter->netdev->name);
+
+ unregister_netdev(adapter->netdev);
+
+ free_netdev(adapter->netdev);
+
+ xdev->netdev = NULL;
+ xdev->eth_priv = NULL;
+}
+
+static struct xsc_interface xsc_interface = {
+ .add = xsc_eth_add,
+ .remove = xsc_eth_remove,
+ .event = NULL,
+ .protocol = XSC_INTERFACE_PROTOCOL_ETH,
+};
+
+static void xsc_remove_eth_driver(void)
+{
+ pr_info("remove ethernet driver\n");
+ xsc_unregister_interface(&xsc_interface);
+}
+
+static int xsc_net_reboot_event_handler(struct notifier_block *nb, unsigned long action, void *data)
+{
+ pr_info("xsc net driver recv %lu event\n", action);
+ xsc_remove_eth_driver();
+
+ return NOTIFY_OK;
+}
+
+struct notifier_block xsc_net_nb = {
+ .notifier_call = xsc_net_reboot_event_handler,
+ .next = NULL,
+ .priority = 1,
+};
+
+static __init int xsc_net_driver_init(void)
+{
+ int ret;
+
+ pr_info("add ethernet driver\n");
+ ret = xsc_register_interface(&xsc_interface);
+ if (ret != 0) {
+ pr_err("failed to register interface\n");
+ goto out;
+ }
+
+ register_reboot_notifier(&xsc_net_nb);
+ return 0;
+out:
+ return -1;
+}
+
+static __exit void xsc_net_driver_exit(void)
+{
+ unregister_reboot_notifier(&xsc_net_nb);
+ xsc_remove_eth_driver();
+}
+
+module_init(xsc_net_driver_init);
+module_exit(xsc_net_driver_exit);
diff --git a/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth.h b/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth.h
new file mode 100644
index 000000000..ba8e52d7f
--- /dev/null
+++ b/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2021 - 2023, Shanghai Yunsilicon Technology Co., Ltd.
+ * All rights reserved.
+ */
+
+#ifndef XSC_ETH_H
+#define XSC_ETH_H
+
+struct xsc_adapter {
+ struct net_device *netdev;
+ struct pci_dev *pdev;
+ struct device *dev;
+ struct xsc_core_device *xdev;
+};
+
+#endif /* XSC_ETH_H */
diff --git a/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth_common.h b/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth_common.h
new file mode 100644
index 000000000..8cc416783
--- /dev/null
+++ b/drivers/net/ethernet/yunsilicon/xsc/net/xsc_eth_common.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2021 - 2023, Shanghai Yunsilicon Technology Co., Ltd.
+ * All rights reserved.
+ */
+
+#ifndef XSC_ETH_COMMON_H
+#define XSC_ETH_COMMON_H
+
+#define XSC_LOG_INDIR_RQT_SIZE 0x8
+
+#define XSC_INDIR_RQT_SIZE BIT(XSC_LOG_INDIR_RQT_SIZE)
+#define XSC_ETH_MIN_NUM_CHANNELS 2
+#define XSC_ETH_MAX_NUM_CHANNELS XSC_INDIR_RQT_SIZE
+
+#endif
--
2.43.0
Powered by blists - more mailing lists