Commit 1b7f85f7 authored by Dong Yibo's avatar Dong Yibo Committed by Jakub Kicinski
Browse files

net: rnpgbe: Add n500/n210 chip support with BAR2 mapping



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: default avatarDong Yibo <dong100@mucse.com>
Reviewed-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Reviewed-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Link: https://patch.msgid.link/20251101013849.120565-3-dong100@mucse.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ee61c10c
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
/* 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 */
+80 −0
Original line number Diff line number Diff line
@@ -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 @@ 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
@@ -79,6 +152,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);
}
@@ -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);
}