net: wangxun: add txgbevf build

Add doc build infrastructure for txgbevf driver.
Implement the basic PCI driver loading and unloading interface.
Initialize the id_table which support 10/25/40G virtual
functions for Wangxun.
Ioremap the space of bar0 and bar4 which will be used.

Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
Link: https://patch.msgid.link/20250704094923.652-5-mengyuanlou@net-swift.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Mengyuan Lou 2025-07-04 17:49:15 +08:00 committed by Jakub Kicinski
parent eb4898fde1
commit 377d180bd7
9 changed files with 261 additions and 0 deletions

View file

@ -58,6 +58,7 @@ Contents:
ti/tlan
ti/icssg_prueth
wangxun/txgbe
wangxun/txgbevf
wangxun/ngbe
.. only:: subproject and html

View file

@ -0,0 +1,16 @@
.. SPDX-License-Identifier: GPL-2.0+
===========================================================================
Linux Base Virtual Function Driver for Wangxun(R) 10/25/40 Gigabit Ethernet
===========================================================================
WangXun 10/25/40 Gigabit Virtual Function Linux driver.
Copyright(c) 2015 - 2025 Beijing WangXun Technology Co., Ltd.
Support
=======
For general information, go to the website at:
https://www.net-swift.com
If you got any problem, contact Wangxun support team via nic-support@net-swift.com
and Cc: netdev.

View file

@ -64,4 +64,22 @@ config TXGBE
To compile this driver as a module, choose M here. The module
will be called txgbe.
config TXGBEVF
tristate "Wangxun(R) 10/25/40G Virtual Function Ethernet support"
depends on PCI
depends on PCI_MSI
select LIBWX
select PHYLINK
help
This driver supports virtual functions for SP1000A, WX1820AL,
WX5XXX, WX5XXXAL.
This driver was formerly named txgbevf.
More specific information on configuring the driver is in
<file:Documentation/networking/device_drivers/ethernet/wangxun/txgbevf.rst>.
To compile this driver as a module, choose M here. MSI-X interrupt
support is required for this driver to work correctly.
endif # NET_VENDOR_WANGXUN

View file

@ -5,4 +5,5 @@
obj-$(CONFIG_LIBWX) += libwx/
obj-$(CONFIG_TXGBE) += txgbe/
obj-$(CONFIG_TXGBEVF) += txgbevf/
obj-$(CONFIG_NGBE) += ngbe/

View file

@ -11,6 +11,44 @@
#include "wx_vf_lib.h"
#include "wx_vf_common.h"
int wxvf_suspend(struct device *dev_d)
{
struct pci_dev *pdev = to_pci_dev(dev_d);
struct wx *wx = pci_get_drvdata(pdev);
netif_device_detach(wx->netdev);
pci_disable_device(pdev);
return 0;
}
EXPORT_SYMBOL(wxvf_suspend);
void wxvf_shutdown(struct pci_dev *pdev)
{
wxvf_suspend(&pdev->dev);
}
EXPORT_SYMBOL(wxvf_shutdown);
int wxvf_resume(struct device *dev_d)
{
struct pci_dev *pdev = to_pci_dev(dev_d);
struct wx *wx = pci_get_drvdata(pdev);
pci_set_master(pdev);
netif_device_attach(wx->netdev);
return 0;
}
EXPORT_SYMBOL(wxvf_resume);
void wxvf_remove(struct pci_dev *pdev)
{
pci_release_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM));
pci_disable_device(pdev);
}
EXPORT_SYMBOL(wxvf_remove);
static irqreturn_t wx_msix_misc_vf(int __always_unused irq, void *data)
{
struct wx *wx = data;

View file

@ -4,6 +4,10 @@
#ifndef _WX_VF_COMMON_H_
#define _WX_VF_COMMON_H_
int wxvf_suspend(struct device *dev_d);
void wxvf_shutdown(struct pci_dev *pdev);
int wxvf_resume(struct device *dev_d);
void wxvf_remove(struct pci_dev *pdev);
int wx_request_msix_irqs_vf(struct wx *wx);
void wx_negotiate_api_vf(struct wx *wx);
void wx_reset_vf(struct wx *wx);

View file

@ -0,0 +1,9 @@
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015 - 2025 Beijing WangXun Technology Co., Ltd.
#
# Makefile for the Wangxun(R) 10/25/40GbE virtual functions driver
#
obj-$(CONFIG_TXGBE) += txgbevf.o
txgbevf-objs := txgbevf_main.o

View file

@ -0,0 +1,154 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2015 - 2025 Beijing WangXun Technology Co., Ltd. */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/string.h>
#include <linux/etherdevice.h>
#include "../libwx/wx_type.h"
#include "../libwx/wx_vf_common.h"
#include "txgbevf_type.h"
/* txgbevf_pci_tbl - PCI Device ID Table
*
* Wildcard entries (PCI_ANY_ID) should come last
* Last entry must be all 0s
*
* { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
* Class, Class Mask, private data (not used) }
*/
static const struct pci_device_id txgbevf_pci_tbl[] = {
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_SP1000), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_WX1820), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML500F), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML510F), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML5024), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML5124), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML503F), 0},
{ PCI_VDEVICE(WANGXUN, TXGBEVF_DEV_ID_AML513F), 0},
/* required last entry */
{ .device = 0 }
};
/**
* txgbevf_probe - Device Initialization Routine
* @pdev: PCI device information struct
* @ent: entry in txgbevf_pci_tbl
*
* Return: return 0 on success, negative on failure
*
* txgbevf_probe initializes an adapter identified by a pci_dev structure.
* The OS initialization, configuring of the adapter private structure,
* and a hardware reset occur.
**/
static int txgbevf_probe(struct pci_dev *pdev,
const struct pci_device_id __always_unused *ent)
{
struct net_device *netdev;
struct wx *wx = NULL;
int err;
err = pci_enable_device_mem(pdev);
if (err)
return err;
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (err) {
dev_err(&pdev->dev,
"No usable DMA configuration, aborting\n");
goto err_pci_disable_dev;
}
err = pci_request_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM),
dev_driver_string(&pdev->dev));
if (err) {
dev_err(&pdev->dev,
"pci_request_selected_regions failed 0x%x\n", err);
goto err_pci_disable_dev;
}
pci_set_master(pdev);
netdev = devm_alloc_etherdev_mqs(&pdev->dev,
sizeof(struct wx),
TXGBEVF_MAX_TX_QUEUES,
TXGBEVF_MAX_RX_QUEUES);
if (!netdev) {
err = -ENOMEM;
goto err_pci_release_regions;
}
SET_NETDEV_DEV(netdev, &pdev->dev);
wx = netdev_priv(netdev);
wx->netdev = netdev;
wx->pdev = pdev;
wx->msg_enable = netif_msg_init(-1, NETIF_MSG_DRV |
NETIF_MSG_PROBE | NETIF_MSG_LINK);
wx->hw_addr = devm_ioremap(&pdev->dev,
pci_resource_start(pdev, 0),
pci_resource_len(pdev, 0));
if (!wx->hw_addr) {
err = -EIO;
goto err_pci_release_regions;
}
wx->b4_addr = devm_ioremap(&pdev->dev,
pci_resource_start(pdev, 4),
pci_resource_len(pdev, 4));
if (!wx->b4_addr) {
err = -EIO;
goto err_pci_release_regions;
}
netdev->features |= NETIF_F_HIGHDMA;
pci_set_drvdata(pdev, wx);
return 0;
err_pci_release_regions:
pci_release_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM));
err_pci_disable_dev:
pci_disable_device(pdev);
return err;
}
/**
* txgbevf_remove - Device Removal Routine
* @pdev: PCI device information struct
*
* txgbevf_remove is called by the PCI subsystem to alert the driver
* that it should release a PCI device. The could be caused by a
* Hot-Plug event, or because the driver is going to be removed from
* memory.
**/
static void txgbevf_remove(struct pci_dev *pdev)
{
wxvf_remove(pdev);
}
static DEFINE_SIMPLE_DEV_PM_OPS(txgbevf_pm_ops, wxvf_suspend, wxvf_resume);
static struct pci_driver txgbevf_driver = {
.name = KBUILD_MODNAME,
.id_table = txgbevf_pci_tbl,
.probe = txgbevf_probe,
.remove = txgbevf_remove,
.shutdown = wxvf_shutdown,
/* Power Management Hooks */
.driver.pm = pm_sleep_ptr(&txgbevf_pm_ops)
};
module_pci_driver(txgbevf_driver);
MODULE_DEVICE_TABLE(pci, txgbevf_pci_tbl);
MODULE_AUTHOR("Beijing WangXun Technology Co., Ltd, <software@trustnetic.com>");
MODULE_DESCRIPTION("WangXun(R) 10/25/40 Gigabit Virtual Function Network Driver");
MODULE_LICENSE("GPL");

View file

@ -0,0 +1,20 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2015 - 2025 Beijing WangXun Technology Co., Ltd. */
#ifndef _TXGBEVF_TYPE_H_
#define _TXGBEVF_TYPE_H_
/* Device IDs */
#define TXGBEVF_DEV_ID_SP1000 0x1000
#define TXGBEVF_DEV_ID_WX1820 0x2000
#define TXGBEVF_DEV_ID_AML500F 0x500F
#define TXGBEVF_DEV_ID_AML510F 0x510F
#define TXGBEVF_DEV_ID_AML5024 0x5024
#define TXGBEVF_DEV_ID_AML5124 0x5124
#define TXGBEVF_DEV_ID_AML503F 0x503f
#define TXGBEVF_DEV_ID_AML513F 0x513f
#define TXGBEVF_MAX_RX_QUEUES 4
#define TXGBEVF_MAX_TX_QUEUES 4
#endif /* _TXGBEVF_TYPE_H_ */