Add hardware initialization foundation for MUCSE 1Gbe controller,
including:
1. Map PCI BAR2 as hardware register base;
2. Bind PCI device to driver private data (struct mucse) and
initialize hardware context (struct mucse_hw);
3. Reserve board-specific init framework via rnpgbe_init_hw.
Signed-off-by: Dong Yibo <dong100@mucse.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h | 10 +++
drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h | 8 ++
.../net/ethernet/mucse/rnpgbe/rnpgbe_main.c | 79 +++++++++++++++++++
3 files changed, 97 insertions(+)
create mode 100644 drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h
diff --git a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h
index 3c37fe2534a8..3b122dd508ce 100644
--- a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h
+++ b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h
@@ -9,6 +9,16 @@ enum rnpgbe_boards {
board_n210
};
+struct mucse_hw {
+ void __iomem *hw_addr;
+};
+
+struct mucse {
+ struct net_device *netdev;
+ struct pci_dev *pdev;
+ struct mucse_hw hw;
+};
+
/* Device IDs */
#define PCI_VENDOR_ID_MUCSE 0x8848
#define PCI_DEVICE_ID_N500_QUAD_PORT 0x8308
diff --git a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h
new file mode 100644
index 000000000000..3a779806e8be
--- /dev/null
+++ b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright(c) 2020 - 2025 Mucse Corporation. */
+
+#ifndef _RNPGBE_HW_H
+#define _RNPGBE_HW_H
+
+#define RNPGBE_MAX_QUEUES 8
+#endif /* _RNPGBE_HW_H */
diff --git a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c
index 60bbc806f17b..0afe39621661 100644
--- a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c
+++ b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c
@@ -2,8 +2,11 @@
/* Copyright(c) 2020 - 2025 Mucse Corporation. */
#include <linux/pci.h>
+#include <net/rtnetlink.h>
+#include <linux/etherdevice.h>
#include "rnpgbe.h"
+#include "rnpgbe_hw.h"
static const char rnpgbe_driver_name[] = "rnpgbe";
@@ -25,6 +28,54 @@ static struct pci_device_id rnpgbe_pci_tbl[] = {
{0, },
};
+/**
+ * rnpgbe_add_adapter - Add netdev for this pci_dev
+ * @pdev: PCI device information structure
+ * @board_type: board type
+ *
+ * rnpgbe_add_adapter initializes a netdev for this pci_dev
+ * structure. Initializes Bar map, private structure, and a
+ * hardware reset occur.
+ *
+ * Return: 0 on success, negative errno on failure
+ **/
+static int rnpgbe_add_adapter(struct pci_dev *pdev,
+ int board_type)
+{
+ struct net_device *netdev;
+ void __iomem *hw_addr;
+ struct mucse *mucse;
+ struct mucse_hw *hw;
+ int err;
+
+ netdev = alloc_etherdev_mq(sizeof(struct mucse), RNPGBE_MAX_QUEUES);
+ if (!netdev)
+ return -ENOMEM;
+
+ SET_NETDEV_DEV(netdev, &pdev->dev);
+ mucse = netdev_priv(netdev);
+ mucse->netdev = netdev;
+ mucse->pdev = pdev;
+ pci_set_drvdata(pdev, mucse);
+
+ hw = &mucse->hw;
+ hw_addr = devm_ioremap(&pdev->dev,
+ pci_resource_start(pdev, 2),
+ pci_resource_len(pdev, 2));
+ if (!hw_addr) {
+ err = -EIO;
+ goto err_free_net;
+ }
+
+ hw->hw_addr = hw_addr;
+
+ return 0;
+
+err_free_net:
+ free_netdev(netdev);
+ return err;
+}
+
/**
* rnpgbe_probe - Device initialization routine
* @pdev: PCI device information struct
@@ -37,6 +88,7 @@ static struct pci_device_id rnpgbe_pci_tbl[] = {
**/
static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
+ int board_type = id->driver_data;
int err;
err = pci_enable_device_mem(pdev);
@@ -63,6 +115,9 @@ static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id)
dev_err(&pdev->dev, "pci_save_state failed %d\n", err);
goto err_free_regions;
}
+ err = rnpgbe_add_adapter(pdev, board_type);
+ if (err)
+ goto err_free_regions;
return 0;
err_free_regions:
@@ -72,6 +127,23 @@ static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return err;
}
+/**
+ * rnpgbe_rm_adapter - Remove netdev for this mucse structure
+ * @pdev: PCI device information struct
+ *
+ * rnpgbe_rm_adapter remove a netdev for this mucse structure
+ **/
+static void rnpgbe_rm_adapter(struct pci_dev *pdev)
+{
+ struct mucse *mucse = pci_get_drvdata(pdev);
+ struct net_device *netdev;
+
+ if (!mucse)
+ return;
+ netdev = mucse->netdev;
+ free_netdev(netdev);
+}
+
/**
* rnpgbe_remove - Device removal routine
* @pdev: PCI device information struct
@@ -83,6 +155,7 @@ static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id)
**/
static void rnpgbe_remove(struct pci_dev *pdev)
{
+ rnpgbe_rm_adapter(pdev);
pci_release_mem_regions(pdev);
pci_disable_device(pdev);
}
@@ -93,6 +166,12 @@ static void rnpgbe_remove(struct pci_dev *pdev)
**/
static void rnpgbe_dev_shutdown(struct pci_dev *pdev)
{
+ struct mucse *mucse = pci_get_drvdata(pdev);
+ struct net_device *netdev = mucse->netdev;
+
+ rtnl_lock();
+ netif_device_detach(netdev);
+ rtnl_unlock();
pci_disable_device(pdev);
}
--
2.25.1
On 16/09/25 4:59 pm, Dong Yibo wrote: > Add hardware initialization foundation for MUCSE 1Gbe controller, > including: > 1. Map PCI BAR2 as hardware register base; > 2. Bind PCI device to driver private data (struct mucse) and > initialize hardware context (struct mucse_hw); > 3. Reserve board-specific init framework via rnpgbe_init_hw. > > Signed-off-by: Dong Yibo <dong100@mucse.com> > Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> Reviewed-by: MD Danish Anwar <danishanwar@ti.com> -- Thanks and Regards, Danish
Dong Yibo schrieb am Di 16. Sep, 19:29 (+0800): > diff --git a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c > index 60bbc806f17b..0afe39621661 100644 > --- a/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c > +++ b/drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c > @@ -2,8 +2,11 @@ > /* Copyright(c) 2020 - 2025 Mucse Corporation. */ > > #include <linux/pci.h> > +#include <net/rtnetlink.h> > +#include <linux/etherdevice.h> > > #include "rnpgbe.h" > +#include "rnpgbe_hw.h" > > static const char rnpgbe_driver_name[] = "rnpgbe"; > > @@ -25,6 +28,54 @@ static struct pci_device_id rnpgbe_pci_tbl[] = { > {0, }, > }; > > +/** > + * rnpgbe_add_adapter - Add netdev for this pci_dev > + * @pdev: PCI device information structure > + * @board_type: board type > + * > + * rnpgbe_add_adapter initializes a netdev for this pci_dev > + * structure. Initializes Bar map, private structure, and a > + * hardware reset occur. > + * > + * Return: 0 on success, negative errno on failure > + **/ > +static int rnpgbe_add_adapter(struct pci_dev *pdev, > + int board_type) > +{ > + struct net_device *netdev; > + void __iomem *hw_addr; > + struct mucse *mucse; > + struct mucse_hw *hw; > + int err; > + > + netdev = alloc_etherdev_mq(sizeof(struct mucse), RNPGBE_MAX_QUEUES); > + if (!netdev) > + return -ENOMEM; > + > + SET_NETDEV_DEV(netdev, &pdev->dev); > + mucse = netdev_priv(netdev); > + mucse->netdev = netdev; > + mucse->pdev = pdev; > + pci_set_drvdata(pdev, mucse); > + > + hw = &mucse->hw; > + hw_addr = devm_ioremap(&pdev->dev, > + pci_resource_start(pdev, 2), > + pci_resource_len(pdev, 2)); > + if (!hw_addr) { > + err = -EIO; > + goto err_free_net; > + } > + > + hw->hw_addr = hw_addr; > + > + return 0; > + > +err_free_net: > + free_netdev(netdev); > + return err; > +} > + > /** > * rnpgbe_probe - Device initialization routine > * @pdev: PCI device information struct > @@ -37,6 +88,7 @@ static struct pci_device_id rnpgbe_pci_tbl[] = { > **/ > static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id) > { > + int board_type = id->driver_data; > int err; > > err = pci_enable_device_mem(pdev); > @@ -63,6 +115,9 @@ static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id) > dev_err(&pdev->dev, "pci_save_state failed %d\n", err); > goto err_free_regions; > } > + err = rnpgbe_add_adapter(pdev, board_type); Would an empty line before this assignment make the code more readable? -- Professor: ‚Gott‘, unverständliches und mythisches Wesen, das sich einmal pro Woche im Kreis der Sterblichen manifestiert um Weisheit auf Folien unter das Volk zu bringen. (Dschungelbuch 11, FSU Jena)
© 2016 - 2025 Red Hat, Inc.