]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: rnpgbe: Add n500/n210 chip support with BAR2 mapping
authorDong Yibo <dong100@mucse.com>
Sat, 1 Nov 2025 01:38:46 +0000 (09:38 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 5 Nov 2025 02:11:36 +0000 (18:11 -0800)
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>
Link: https://patch.msgid.link/20251101013849.120565-3-dong100@mucse.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mucse/rnpgbe/rnpgbe.h
drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h [new file with mode: 0644]
drivers/net/ethernet/mucse/rnpgbe/rnpgbe_main.c

index d3439d28c6544e91c68e62aa1e2102b445d01d44..a121ce4872a6400af073fe83197a30862c5f7d8d 100644 (file)
@@ -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 RNPGBE_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 (file)
index 0000000..3a77980
--- /dev/null
@@ -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 */
index 019e819fb497b21c45529e7da4b14ac71a735999..305657d73e2568ab62f8ceeb76a6219d9734bce9 100644 (file)
@@ -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";
 
@@ -21,6 +24,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
@@ -33,6 +84,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);
@@ -60,6 +112,10 @@ static int rnpgbe_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto err_free_regions;
        }
 
+       err = rnpgbe_add_adapter(pdev, board_type);
+       if (err)
+               goto err_free_regions;
+
        return 0;
 err_free_regions:
        pci_release_mem_regions(pdev);
@@ -68,6 +124,23 @@ err_disable_dev:
        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
@@ -79,6 +152,7 @@ err_disable_dev:
  **/
 static void rnpgbe_remove(struct pci_dev *pdev)
 {
+       rnpgbe_rm_adapter(pdev);
        pci_release_mem_regions(pdev);
        pci_disable_device(pdev);
 }
@@ -89,6 +163,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);
 }