Skip to content

Commit a028523

Browse files
jjagielskanguy11
authored andcommitted
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 <[email protected]> Co-developed-by: Przemek Kitszel <[email protected]> Signed-off-by: Przemek Kitszel <[email protected]> Tested-by: Bharath R <[email protected]> Signed-off-by: Jedrzej Jagielski <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent fd5ef52 commit a028523

File tree

8 files changed

+138
-4
lines changed

8 files changed

+138
-4
lines changed

Documentation/networking/devlink/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ parameters, info versions, and other features it supports.
8484
i40e
8585
ionic
8686
ice
87+
ixgbe
8788
mlx4
8889
mlx5
8990
mlxsw
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.. SPDX-License-Identifier: GPL-2.0
2+
3+
=====================
4+
ixgbe devlink support
5+
=====================
6+
7+
This document describes the devlink features implemented by the ``ixgbe``
8+
device driver.

drivers/net/ethernet/intel/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ config IXGBE
147147
depends on PCI
148148
depends on PTP_1588_CLOCK_OPTIONAL
149149
select MDIO
150+
select NET_DEVLINK
150151
select PHYLIB
151152
help
152153
This driver supports Intel(R) 10GbE PCI Express family of

drivers/net/ethernet/intel/ixgbe/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
# Makefile for the Intel(R) 10GbE PCI Express ethernet driver
55
#
66

7+
subdir-ccflags-y += -I$(src)
78
obj-$(CONFIG_IXGBE) += ixgbe.o
89

910
ixgbe-y := ixgbe_main.o ixgbe_common.o ixgbe_ethtool.o \
1011
ixgbe_82599.o ixgbe_82598.o ixgbe_phy.o ixgbe_sriov.o \
1112
ixgbe_mbx.o ixgbe_x540.o ixgbe_x550.o ixgbe_lib.o ixgbe_ptp.o \
12-
ixgbe_xsk.o ixgbe_e610.o
13+
ixgbe_xsk.o ixgbe_e610.o devlink/devlink.o
1314

1415
ixgbe-$(CONFIG_IXGBE_DCB) += ixgbe_dcb.o ixgbe_dcb_82598.o \
1516
ixgbe_dcb_82599.o ixgbe_dcb_nl.o
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/* Copyright (c) 2025, Intel Corporation. */
3+
4+
#include "ixgbe.h"
5+
#include "devlink.h"
6+
7+
static const struct devlink_ops ixgbe_devlink_ops = {
8+
};
9+
10+
/**
11+
* ixgbe_allocate_devlink - Allocate devlink instance
12+
* @dev: device to allocate devlink for
13+
*
14+
* Allocate a devlink instance for this physical function.
15+
*
16+
* Return: pointer to the device adapter structure on success,
17+
* ERR_PTR(-ENOMEM) when allocation failed.
18+
*/
19+
struct ixgbe_adapter *ixgbe_allocate_devlink(struct device *dev)
20+
{
21+
struct ixgbe_adapter *adapter;
22+
struct devlink *devlink;
23+
24+
devlink = devlink_alloc(&ixgbe_devlink_ops, sizeof(*adapter), dev);
25+
if (!devlink)
26+
return ERR_PTR(-ENOMEM);
27+
28+
adapter = devlink_priv(devlink);
29+
adapter->devlink = devlink;
30+
31+
return adapter;
32+
}
33+
34+
/**
35+
* ixgbe_devlink_set_switch_id - Set unique switch ID based on PCI DSN
36+
* @adapter: pointer to the device adapter structure
37+
* @ppid: struct with switch id information
38+
*/
39+
static void ixgbe_devlink_set_switch_id(struct ixgbe_adapter *adapter,
40+
struct netdev_phys_item_id *ppid)
41+
{
42+
u64 id = pci_get_dsn(adapter->pdev);
43+
44+
ppid->id_len = sizeof(id);
45+
put_unaligned_be64(id, &ppid->id);
46+
}
47+
48+
/**
49+
* ixgbe_devlink_register_port - Register devlink port
50+
* @adapter: pointer to the device adapter structure
51+
*
52+
* Create and register a devlink_port for this physical function.
53+
*
54+
* Return: 0 on success, error code on failure.
55+
*/
56+
int ixgbe_devlink_register_port(struct ixgbe_adapter *adapter)
57+
{
58+
struct devlink_port *devlink_port = &adapter->devlink_port;
59+
struct devlink *devlink = adapter->devlink;
60+
struct device *dev = &adapter->pdev->dev;
61+
struct devlink_port_attrs attrs = {};
62+
int err;
63+
64+
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
65+
attrs.phys.port_number = adapter->hw.bus.func;
66+
ixgbe_devlink_set_switch_id(adapter, &attrs.switch_id);
67+
68+
devlink_port_attrs_set(devlink_port, &attrs);
69+
70+
err = devl_port_register(devlink, devlink_port, 0);
71+
if (err) {
72+
dev_err(dev,
73+
"devlink port registration failed, err %d\n", err);
74+
}
75+
76+
return err;
77+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/* Copyright (c) 2025, Intel Corporation. */
3+
4+
#ifndef _IXGBE_DEVLINK_H_
5+
#define _IXGBE_DEVLINK_H_
6+
7+
struct ixgbe_adapter *ixgbe_allocate_devlink(struct device *dev);
8+
int ixgbe_devlink_register_port(struct ixgbe_adapter *adapter);
9+
10+
#endif /* _IXGBE_DEVLINK_H_ */

drivers/net/ethernet/intel/ixgbe/ixgbe.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <linux/net_tstamp.h>
1818
#include <linux/ptp_clock_kernel.h>
1919

20+
#include <net/devlink.h>
21+
2022
#include "ixgbe_type.h"
2123
#include "ixgbe_common.h"
2224
#include "ixgbe_dcb.h"
@@ -612,6 +614,8 @@ struct ixgbe_adapter {
612614
struct bpf_prog *xdp_prog;
613615
struct pci_dev *pdev;
614616
struct mii_bus *mii_bus;
617+
struct devlink *devlink;
618+
struct devlink_port devlink_port;
615619

616620
unsigned long state;
617621

@@ -830,9 +834,15 @@ struct ixgbe_adapter {
830834
spinlock_t vfs_lock;
831835
};
832836

837+
struct ixgbe_netdevice_priv {
838+
struct ixgbe_adapter *adapter;
839+
};
840+
833841
static inline struct ixgbe_adapter *ixgbe_from_netdev(struct net_device *netdev)
834842
{
835-
return netdev_priv(netdev);
843+
struct ixgbe_netdevice_priv *priv = netdev_priv(netdev);
844+
845+
return priv->adapter;
836846
}
837847

838848
static inline int ixgbe_determine_xdp_q_idx(int cpu)

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "ixgbe_sriov.h"
5050
#include "ixgbe_model.h"
5151
#include "ixgbe_txrx_common.h"
52+
#include "devlink/devlink.h"
5253

5354
char ixgbe_driver_name[] = "ixgbe";
5455
static const char ixgbe_driver_string[] =
@@ -11210,6 +11211,7 @@ static void ixgbe_set_fw_version(struct ixgbe_adapter *adapter)
1121011211
static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1121111212
{
1121211213
struct net_device *netdev;
11214+
struct ixgbe_netdevice_priv *netdev_priv_wrapper;
1121311215
struct ixgbe_adapter *adapter = NULL;
1121411216
struct ixgbe_hw *hw;
1121511217
const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data];
@@ -11263,15 +11265,22 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1126311265
indices = IXGBE_MAX_RSS_INDICES_X550;
1126411266
}
1126511267

11266-
netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), indices);
11268+
adapter = ixgbe_allocate_devlink(&pdev->dev);
11269+
if (IS_ERR(adapter)) {
11270+
err = PTR_ERR(adapter);
11271+
goto err_devlink;
11272+
}
11273+
11274+
netdev = alloc_etherdev_mq(sizeof(*netdev_priv_wrapper), indices);
1126711275
if (!netdev) {
1126811276
err = -ENOMEM;
1126911277
goto err_alloc_etherdev;
1127011278
}
1127111279

1127211280
SET_NETDEV_DEV(netdev, &pdev->dev);
1127311281

11274-
adapter = ixgbe_from_netdev(netdev);
11282+
netdev_priv_wrapper = netdev_priv(netdev);
11283+
netdev_priv_wrapper->adapter = adapter;
1127511284

1127611285
adapter->netdev = netdev;
1127711286
adapter->pdev = pdev;
@@ -11617,6 +11626,11 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1161711626
}
1161811627
strcpy(netdev->name, "eth%d");
1161911628
pci_set_drvdata(pdev, adapter);
11629+
11630+
devl_lock(adapter->devlink);
11631+
ixgbe_devlink_register_port(adapter);
11632+
SET_NETDEV_DEVLINK_PORT(adapter->netdev, &adapter->devlink_port);
11633+
1162011634
err = register_netdev(netdev);
1162111635
if (err)
1162211636
goto err_register;
@@ -11671,11 +11685,15 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1167111685
if (err)
1167211686
goto err_netdev;
1167311687

11688+
devl_register(adapter->devlink);
11689+
devl_unlock(adapter->devlink);
1167411690
return 0;
1167511691

1167611692
err_netdev:
1167711693
unregister_netdev(netdev);
1167811694
err_register:
11695+
devl_port_unregister(&adapter->devlink_port);
11696+
devl_unlock(adapter->devlink);
1167911697
ixgbe_release_hw_control(adapter);
1168011698
ixgbe_clear_interrupt_scheme(adapter);
1168111699
if (hw->mac.type == ixgbe_mac_e610)
@@ -11692,7 +11710,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1169211710
disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
1169311711
free_netdev(netdev);
1169411712
err_alloc_etherdev:
11713+
devlink_free(adapter->devlink);
1169511714
pci_release_mem_regions(pdev);
11715+
err_devlink:
1169611716
err_pci_reg:
1169711717
err_dma:
1169811718
if (!adapter || disable_dev)
@@ -11721,6 +11741,8 @@ static void ixgbe_remove(struct pci_dev *pdev)
1172111741
return;
1172211742

1172311743
netdev = adapter->netdev;
11744+
devl_lock(adapter->devlink);
11745+
devl_unregister(adapter->devlink);
1172411746
ixgbe_dbg_adapter_exit(adapter);
1172511747

1172611748
set_bit(__IXGBE_REMOVING, &adapter->state);
@@ -11756,6 +11778,10 @@ static void ixgbe_remove(struct pci_dev *pdev)
1175611778
if (netdev->reg_state == NETREG_REGISTERED)
1175711779
unregister_netdev(netdev);
1175811780

11781+
devl_port_unregister(&adapter->devlink_port);
11782+
devl_unlock(adapter->devlink);
11783+
devlink_free(adapter->devlink);
11784+
1175911785
ixgbe_stop_ipsec_offload(adapter);
1176011786
ixgbe_clear_interrupt_scheme(adapter);
1176111787

0 commit comments

Comments
 (0)