mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 06:01:56 +02:00
ixgbe: add initial devlink support
Add an initial support for devlink interface to ixgbe driver. Similarly to i40e driver the implementation doesn't enable devlink to manage device-wide configuration. Devlink instance is created for each physical function of PCIe device. Create separate directory for devlink related ixgbe files and use naming scheme similar to the one used in the ice driver. Add a stub for Documentation, to be extended by further patches. Change struct ixgbe_adapter allocation to be done by devlink (Przemek), as suggested by Jiri. Reviewed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com> Co-developed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Tested-by: Bharath R <bharath.r@intel.com> Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
fd5ef5203c
commit
a0285236ab
8 changed files with 138 additions and 4 deletions
|
@ -84,6 +84,7 @@ parameters, info versions, and other features it supports.
|
|||
i40e
|
||||
ionic
|
||||
ice
|
||||
ixgbe
|
||||
mlx4
|
||||
mlx5
|
||||
mlxsw
|
||||
|
|
8
Documentation/networking/devlink/ixgbe.rst
Normal file
8
Documentation/networking/devlink/ixgbe.rst
Normal file
|
@ -0,0 +1,8 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================
|
||||
ixgbe devlink support
|
||||
=====================
|
||||
|
||||
This document describes the devlink features implemented by the ``ixgbe``
|
||||
device driver.
|
|
@ -147,6 +147,7 @@ config IXGBE
|
|||
depends on PCI
|
||||
depends on PTP_1588_CLOCK_OPTIONAL
|
||||
select MDIO
|
||||
select NET_DEVLINK
|
||||
select PHYLIB
|
||||
help
|
||||
This driver supports Intel(R) 10GbE PCI Express family of
|
||||
|
|
|
@ -4,12 +4,13 @@
|
|||
# Makefile for the Intel(R) 10GbE PCI Express ethernet driver
|
||||
#
|
||||
|
||||
subdir-ccflags-y += -I$(src)
|
||||
obj-$(CONFIG_IXGBE) += ixgbe.o
|
||||
|
||||
ixgbe-y := ixgbe_main.o ixgbe_common.o ixgbe_ethtool.o \
|
||||
ixgbe_82599.o ixgbe_82598.o ixgbe_phy.o ixgbe_sriov.o \
|
||||
ixgbe_mbx.o ixgbe_x540.o ixgbe_x550.o ixgbe_lib.o ixgbe_ptp.o \
|
||||
ixgbe_xsk.o ixgbe_e610.o
|
||||
ixgbe_xsk.o ixgbe_e610.o devlink/devlink.o
|
||||
|
||||
ixgbe-$(CONFIG_IXGBE_DCB) += ixgbe_dcb.o ixgbe_dcb_82598.o \
|
||||
ixgbe_dcb_82599.o ixgbe_dcb_nl.o
|
||||
|
|
77
drivers/net/ethernet/intel/ixgbe/devlink/devlink.c
Normal file
77
drivers/net/ethernet/intel/ixgbe/devlink/devlink.c
Normal file
|
@ -0,0 +1,77 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2025, Intel Corporation. */
|
||||
|
||||
#include "ixgbe.h"
|
||||
#include "devlink.h"
|
||||
|
||||
static const struct devlink_ops ixgbe_devlink_ops = {
|
||||
};
|
||||
|
||||
/**
|
||||
* ixgbe_allocate_devlink - Allocate devlink instance
|
||||
* @dev: device to allocate devlink for
|
||||
*
|
||||
* Allocate a devlink instance for this physical function.
|
||||
*
|
||||
* Return: pointer to the device adapter structure on success,
|
||||
* ERR_PTR(-ENOMEM) when allocation failed.
|
||||
*/
|
||||
struct ixgbe_adapter *ixgbe_allocate_devlink(struct device *dev)
|
||||
{
|
||||
struct ixgbe_adapter *adapter;
|
||||
struct devlink *devlink;
|
||||
|
||||
devlink = devlink_alloc(&ixgbe_devlink_ops, sizeof(*adapter), dev);
|
||||
if (!devlink)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
adapter = devlink_priv(devlink);
|
||||
adapter->devlink = devlink;
|
||||
|
||||
return adapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_devlink_set_switch_id - Set unique switch ID based on PCI DSN
|
||||
* @adapter: pointer to the device adapter structure
|
||||
* @ppid: struct with switch id information
|
||||
*/
|
||||
static void ixgbe_devlink_set_switch_id(struct ixgbe_adapter *adapter,
|
||||
struct netdev_phys_item_id *ppid)
|
||||
{
|
||||
u64 id = pci_get_dsn(adapter->pdev);
|
||||
|
||||
ppid->id_len = sizeof(id);
|
||||
put_unaligned_be64(id, &ppid->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_devlink_register_port - Register devlink port
|
||||
* @adapter: pointer to the device adapter structure
|
||||
*
|
||||
* Create and register a devlink_port for this physical function.
|
||||
*
|
||||
* Return: 0 on success, error code on failure.
|
||||
*/
|
||||
int ixgbe_devlink_register_port(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct devlink_port *devlink_port = &adapter->devlink_port;
|
||||
struct devlink *devlink = adapter->devlink;
|
||||
struct device *dev = &adapter->pdev->dev;
|
||||
struct devlink_port_attrs attrs = {};
|
||||
int err;
|
||||
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
||||
attrs.phys.port_number = adapter->hw.bus.func;
|
||||
ixgbe_devlink_set_switch_id(adapter, &attrs.switch_id);
|
||||
|
||||
devlink_port_attrs_set(devlink_port, &attrs);
|
||||
|
||||
err = devl_port_register(devlink, devlink_port, 0);
|
||||
if (err) {
|
||||
dev_err(dev,
|
||||
"devlink port registration failed, err %d\n", err);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
10
drivers/net/ethernet/intel/ixgbe/devlink/devlink.h
Normal file
10
drivers/net/ethernet/intel/ixgbe/devlink/devlink.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (c) 2025, Intel Corporation. */
|
||||
|
||||
#ifndef _IXGBE_DEVLINK_H_
|
||||
#define _IXGBE_DEVLINK_H_
|
||||
|
||||
struct ixgbe_adapter *ixgbe_allocate_devlink(struct device *dev);
|
||||
int ixgbe_devlink_register_port(struct ixgbe_adapter *adapter);
|
||||
|
||||
#endif /* _IXGBE_DEVLINK_H_ */
|
|
@ -17,6 +17,8 @@
|
|||
#include <linux/net_tstamp.h>
|
||||
#include <linux/ptp_clock_kernel.h>
|
||||
|
||||
#include <net/devlink.h>
|
||||
|
||||
#include "ixgbe_type.h"
|
||||
#include "ixgbe_common.h"
|
||||
#include "ixgbe_dcb.h"
|
||||
|
@ -612,6 +614,8 @@ struct ixgbe_adapter {
|
|||
struct bpf_prog *xdp_prog;
|
||||
struct pci_dev *pdev;
|
||||
struct mii_bus *mii_bus;
|
||||
struct devlink *devlink;
|
||||
struct devlink_port devlink_port;
|
||||
|
||||
unsigned long state;
|
||||
|
||||
|
@ -830,9 +834,15 @@ struct ixgbe_adapter {
|
|||
spinlock_t vfs_lock;
|
||||
};
|
||||
|
||||
struct ixgbe_netdevice_priv {
|
||||
struct ixgbe_adapter *adapter;
|
||||
};
|
||||
|
||||
static inline struct ixgbe_adapter *ixgbe_from_netdev(struct net_device *netdev)
|
||||
{
|
||||
return netdev_priv(netdev);
|
||||
struct ixgbe_netdevice_priv *priv = netdev_priv(netdev);
|
||||
|
||||
return priv->adapter;
|
||||
}
|
||||
|
||||
static inline int ixgbe_determine_xdp_q_idx(int cpu)
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
#include "ixgbe_sriov.h"
|
||||
#include "ixgbe_model.h"
|
||||
#include "ixgbe_txrx_common.h"
|
||||
#include "devlink/devlink.h"
|
||||
|
||||
char ixgbe_driver_name[] = "ixgbe";
|
||||
static const char ixgbe_driver_string[] =
|
||||
|
@ -11210,6 +11211,7 @@ static void ixgbe_set_fw_version(struct ixgbe_adapter *adapter)
|
|||
static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct ixgbe_netdevice_priv *netdev_priv_wrapper;
|
||||
struct ixgbe_adapter *adapter = NULL;
|
||||
struct ixgbe_hw *hw;
|
||||
const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data];
|
||||
|
@ -11263,7 +11265,13 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
indices = IXGBE_MAX_RSS_INDICES_X550;
|
||||
}
|
||||
|
||||
netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), indices);
|
||||
adapter = ixgbe_allocate_devlink(&pdev->dev);
|
||||
if (IS_ERR(adapter)) {
|
||||
err = PTR_ERR(adapter);
|
||||
goto err_devlink;
|
||||
}
|
||||
|
||||
netdev = alloc_etherdev_mq(sizeof(*netdev_priv_wrapper), indices);
|
||||
if (!netdev) {
|
||||
err = -ENOMEM;
|
||||
goto err_alloc_etherdev;
|
||||
|
@ -11271,7 +11279,8 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
SET_NETDEV_DEV(netdev, &pdev->dev);
|
||||
|
||||
adapter = ixgbe_from_netdev(netdev);
|
||||
netdev_priv_wrapper = netdev_priv(netdev);
|
||||
netdev_priv_wrapper->adapter = adapter;
|
||||
|
||||
adapter->netdev = netdev;
|
||||
adapter->pdev = pdev;
|
||||
|
@ -11617,6 +11626,11 @@ skip_sriov:
|
|||
}
|
||||
strcpy(netdev->name, "eth%d");
|
||||
pci_set_drvdata(pdev, adapter);
|
||||
|
||||
devl_lock(adapter->devlink);
|
||||
ixgbe_devlink_register_port(adapter);
|
||||
SET_NETDEV_DEVLINK_PORT(adapter->netdev, &adapter->devlink_port);
|
||||
|
||||
err = register_netdev(netdev);
|
||||
if (err)
|
||||
goto err_register;
|
||||
|
@ -11671,11 +11685,15 @@ skip_sriov:
|
|||
if (err)
|
||||
goto err_netdev;
|
||||
|
||||
devl_register(adapter->devlink);
|
||||
devl_unlock(adapter->devlink);
|
||||
return 0;
|
||||
|
||||
err_netdev:
|
||||
unregister_netdev(netdev);
|
||||
err_register:
|
||||
devl_port_unregister(&adapter->devlink_port);
|
||||
devl_unlock(adapter->devlink);
|
||||
ixgbe_release_hw_control(adapter);
|
||||
ixgbe_clear_interrupt_scheme(adapter);
|
||||
if (hw->mac.type == ixgbe_mac_e610)
|
||||
|
@ -11692,7 +11710,9 @@ err_ioremap:
|
|||
disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
|
||||
free_netdev(netdev);
|
||||
err_alloc_etherdev:
|
||||
devlink_free(adapter->devlink);
|
||||
pci_release_mem_regions(pdev);
|
||||
err_devlink:
|
||||
err_pci_reg:
|
||||
err_dma:
|
||||
if (!adapter || disable_dev)
|
||||
|
@ -11721,6 +11741,8 @@ static void ixgbe_remove(struct pci_dev *pdev)
|
|||
return;
|
||||
|
||||
netdev = adapter->netdev;
|
||||
devl_lock(adapter->devlink);
|
||||
devl_unregister(adapter->devlink);
|
||||
ixgbe_dbg_adapter_exit(adapter);
|
||||
|
||||
set_bit(__IXGBE_REMOVING, &adapter->state);
|
||||
|
@ -11756,6 +11778,10 @@ static void ixgbe_remove(struct pci_dev *pdev)
|
|||
if (netdev->reg_state == NETREG_REGISTERED)
|
||||
unregister_netdev(netdev);
|
||||
|
||||
devl_port_unregister(&adapter->devlink_port);
|
||||
devl_unlock(adapter->devlink);
|
||||
devlink_free(adapter->devlink);
|
||||
|
||||
ixgbe_stop_ipsec_offload(adapter);
|
||||
ixgbe_clear_interrupt_scheme(adapter);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue