mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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: 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>
This commit is contained in:
committed by
Jakub Kicinski
parent
ee61c10cd4
commit
1b7f85f733
@@ -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
drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h
Normal file
8
drivers/net/ethernet/mucse/rnpgbe/rnpgbe_hw.h
Normal file
@@ -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 */
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user