Skip to content

Commit 6271c8b

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_pciefd: Add devlink port support
Register each CAN channel of the device as an devlink physical port. This makes it easier to get device information for a given network interface (i.e. can2). Example output: $ devlink dev pci/0000:07:00.0 pci/0000:08:00.0 pci/0000:09:00.0 $ devlink port pci/0000:07:00.0/0: type eth netdev can0 flavour physical port 0 splittable false pci/0000:07:00.0/1: type eth netdev can1 flavour physical port 1 splittable false pci/0000:07:00.0/2: type eth netdev can2 flavour physical port 2 splittable false pci/0000:07:00.0/3: type eth netdev can3 flavour physical port 3 splittable false pci/0000:08:00.0/0: type eth netdev can4 flavour physical port 0 splittable false pci/0000:08:00.0/1: type eth netdev can5 flavour physical port 1 splittable false pci/0000:09:00.0/0: type eth netdev can6 flavour physical port 0 splittable false pci/0000:09:00.0/1: type eth netdev can7 flavour physical port 1 splittable false pci/0000:09:00.0/2: type eth netdev can8 flavour physical port 2 splittable false pci/0000:09:00.0/3: type eth netdev can9 flavour physical port 3 splittable false $ devlink port show can2 pci/0000:07:00.0/2: type eth netdev can2 flavour physical port 2 splittable false $ devlink dev info pci/0000:07:00.0: driver kvaser_pciefd versions: running: fw 1.3.75 pci/0000:08:00.0: driver kvaser_pciefd versions: running: fw 2.4.29 pci/0000:09:00.0: driver kvaser_pciefd versions: running: fw 1.3.72 $ sudo ethtool -i can2 driver: kvaser_pciefd version: 6.8.0-40-generic firmware-version: 1.3.75 expansion-rom-version: bus-info: 0000:07:00.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Signed-off-by: Jimmy Assarsson <extja@kvaser.com> Link: https://patch.msgid.link/20250725123230.8-10-extja@kvaser.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 3d68ecf commit 6271c8b

3 files changed

Lines changed: 37 additions & 0 deletions

File tree

drivers/net/can/kvaser_pciefd/kvaser_pciefd.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct kvaser_pciefd_fw_version {
5959

6060
struct kvaser_pciefd_can {
6161
struct can_priv can;
62+
struct devlink_port devlink_port;
6263
struct kvaser_pciefd *kv_pcie;
6364
void __iomem *reg_base;
6465
struct can_berr_counter bec;
@@ -89,4 +90,7 @@ struct kvaser_pciefd {
8990
};
9091

9192
extern const struct devlink_ops kvaser_pciefd_devlink_ops;
93+
94+
int kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can *can);
95+
void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can);
9296
#endif /* _KVASER_PCIEFD_H */

drivers/net/can/kvaser_pciefd/kvaser_pciefd_core.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
943943
struct net_device *netdev;
944944
struct kvaser_pciefd_can *can;
945945
u32 status, tx_nr_packets_max;
946+
int ret;
946947

947948
netdev = alloc_candev(sizeof(struct kvaser_pciefd_can),
948949
roundup_pow_of_two(KVASER_PCIEFD_CAN_TX_MAX_COUNT));
@@ -1013,6 +1014,11 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
10131014

10141015
pcie->can[i] = can;
10151016
kvaser_pciefd_pwm_start(can);
1017+
ret = kvaser_pciefd_devlink_port_register(can);
1018+
if (ret) {
1019+
dev_err(&pcie->pci->dev, "Failed to register devlink port\n");
1020+
return ret;
1021+
}
10161022
}
10171023

10181024
return 0;
@@ -1732,6 +1738,7 @@ static void kvaser_pciefd_teardown_can_ctrls(struct kvaser_pciefd *pcie)
17321738
if (can) {
17331739
iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
17341740
kvaser_pciefd_pwm_stop(can);
1741+
kvaser_pciefd_devlink_port_unregister(can);
17351742
free_candev(can->can.dev);
17361743
}
17371744
}
@@ -1874,6 +1881,7 @@ static void kvaser_pciefd_remove(struct pci_dev *pdev)
18741881
unregister_candev(can->can.dev);
18751882
timer_delete(&can->bec_poll_timer);
18761883
kvaser_pciefd_pwm_stop(can);
1884+
kvaser_pciefd_devlink_port_unregister(can);
18771885
}
18781886

18791887
kvaser_pciefd_disable_irq_srcs(pcie);

drivers/net/can/kvaser_pciefd/kvaser_pciefd_devlink.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
#include "kvaser_pciefd.h"
77

8+
#include <linux/netdevice.h>
89
#include <net/devlink.h>
910

1011
static int kvaser_pciefd_devlink_info_get(struct devlink *devlink,
@@ -33,3 +34,27 @@ static int kvaser_pciefd_devlink_info_get(struct devlink *devlink,
3334
const struct devlink_ops kvaser_pciefd_devlink_ops = {
3435
.info_get = kvaser_pciefd_devlink_info_get,
3536
};
37+
38+
int kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can *can)
39+
{
40+
int ret;
41+
struct devlink_port_attrs attrs = {
42+
.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL,
43+
.phys.port_number = can->can.dev->dev_port,
44+
};
45+
devlink_port_attrs_set(&can->devlink_port, &attrs);
46+
47+
ret = devlink_port_register(priv_to_devlink(can->kv_pcie),
48+
&can->devlink_port, can->can.dev->dev_port);
49+
if (ret)
50+
return ret;
51+
52+
SET_NETDEV_DEVLINK_PORT(can->can.dev, &can->devlink_port);
53+
54+
return 0;
55+
}
56+
57+
void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can)
58+
{
59+
devlink_port_unregister(&can->devlink_port);
60+
}

0 commit comments

Comments
 (0)