Skip to content

Commit 0d1b337

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_pciefd: Add devlink support
Add devlink support at device level. Example output: $ devlink dev pci/0000:07:00.0 pci/0000:08:00.0 pci/0000:09:00.0 $ devlink dev info pci/0000:07:00.0: driver kvaser_pciefd pci/0000:08:00.0: driver kvaser_pciefd pci/0000:09:00.0: driver kvaser_pciefd Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Signed-off-by: Jimmy Assarsson <extja@kvaser.com> Link: https://patch.msgid.link/20250725123230.8-8-extja@kvaser.com [mkl: kvaser_pciefd_remove(): fix use-after-free] Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 20bc87a commit 0d1b337

5 files changed

Lines changed: 27 additions & 4 deletions

File tree

drivers/net/can/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ config CAN_JANZ_ICAN3
154154
config CAN_KVASER_PCIEFD
155155
depends on PCI
156156
tristate "Kvaser PCIe FD cards"
157+
select NET_DEVLINK
157158
help
158159
This is a driver for the Kvaser PCI Express CAN FD family.
159160

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_CAN_KVASER_PCIEFD) += kvaser_pciefd.o
3-
kvaser_pciefd-y = kvaser_pciefd_core.o
3+
kvaser_pciefd-y = kvaser_pciefd_core.o kvaser_pciefd_devlink.o

drivers/net/can/kvaser_pciefd/kvaser_pciefd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <linux/spinlock.h>
1414
#include <linux/timer.h>
1515
#include <linux/types.h>
16+
#include <net/devlink.h>
1617

1718
#define KVASER_PCIEFD_MAX_CAN_CHANNELS 8UL
1819
#define KVASER_PCIEFD_DMA_COUNT 2U
@@ -87,4 +88,5 @@ struct kvaser_pciefd {
8788
struct kvaser_pciefd_fw_version fw_version;
8889
};
8990

91+
extern const struct devlink_ops kvaser_pciefd_devlink_ops;
9092
#endif /* _KVASER_PCIEFD_H */

drivers/net/can/kvaser_pciefd/kvaser_pciefd_core.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,22 +1751,24 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
17511751
const struct pci_device_id *id)
17521752
{
17531753
int ret;
1754+
struct devlink *devlink;
17541755
struct device *dev = &pdev->dev;
17551756
struct kvaser_pciefd *pcie;
17561757
const struct kvaser_pciefd_irq_mask *irq_mask;
17571758

1758-
pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
1759-
if (!pcie)
1759+
devlink = devlink_alloc(&kvaser_pciefd_devlink_ops, sizeof(*pcie), dev);
1760+
if (!devlink)
17601761
return -ENOMEM;
17611762

1763+
pcie = devlink_priv(devlink);
17621764
pci_set_drvdata(pdev, pcie);
17631765
pcie->pci = pdev;
17641766
pcie->driver_data = (const struct kvaser_pciefd_driver_data *)id->driver_data;
17651767
irq_mask = pcie->driver_data->irq_mask;
17661768

17671769
ret = pci_enable_device(pdev);
17681770
if (ret)
1769-
return ret;
1771+
goto err_free_devlink;
17701772

17711773
ret = pci_request_regions(pdev, KVASER_PCIEFD_DRV_NAME);
17721774
if (ret)
@@ -1830,6 +1832,8 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
18301832
if (ret)
18311833
goto err_free_irq;
18321834

1835+
devlink_register(devlink);
1836+
18331837
return 0;
18341838

18351839
err_free_irq:
@@ -1853,6 +1857,9 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
18531857
err_disable_pci:
18541858
pci_disable_device(pdev);
18551859

1860+
err_free_devlink:
1861+
devlink_free(devlink);
1862+
18561863
return ret;
18571864
}
18581865

@@ -1876,9 +1883,11 @@ static void kvaser_pciefd_remove(struct pci_dev *pdev)
18761883
for (i = 0; i < pcie->nr_channels; ++i)
18771884
free_candev(pcie->can[i]->can.dev);
18781885

1886+
devlink_unregister(priv_to_devlink(pcie));
18791887
pci_iounmap(pdev, pcie->reg_base);
18801888
pci_release_regions(pdev);
18811889
pci_disable_device(pdev);
1890+
devlink_free(priv_to_devlink(pcie));
18821891
}
18831892

18841893
static struct pci_driver kvaser_pciefd = {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2+
/* kvaser_pciefd devlink functions
3+
*
4+
* Copyright (C) 2025 KVASER AB, Sweden. All rights reserved.
5+
*/
6+
#include "kvaser_pciefd.h"
7+
8+
#include <net/devlink.h>
9+
10+
const struct devlink_ops kvaser_pciefd_devlink_ops = {
11+
};

0 commit comments

Comments
 (0)