Skip to content

Commit 9505a83

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_usb: Add devlink support
Add devlink support at device level. Example output: $ devlink dev usb/1-1.3:1.0 $ devlink dev info usb/1-1.3:1.0: driver kvaser_usb Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Signed-off-by: Jimmy Assarsson <extja@kvaser.com> Link: https://patch.msgid.link/20250725123452.41-9-extja@kvaser.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 0020f2b commit 9505a83

5 files changed

Lines changed: 63 additions & 26 deletions

File tree

drivers/net/can/usb/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ config CAN_GS_USB
6666

6767
config CAN_KVASER_USB
6868
tristate "Kvaser CAN/USB interface"
69+
select NET_DEVLINK
6970
help
7071
This driver adds support for Kvaser CAN/USB devices like Kvaser
7172
Leaf Light, Kvaser USBcan II and Kvaser Memorator Pro 5xHS.
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-only
22
obj-$(CONFIG_CAN_KVASER_USB) += kvaser_usb.o
3-
kvaser_usb-y = kvaser_usb_core.o kvaser_usb_leaf.o kvaser_usb_hydra.o
3+
kvaser_usb-y = kvaser_usb_core.o kvaser_usb_devlink.o kvaser_usb_leaf.o kvaser_usb_hydra.o

drivers/net/can/usb/kvaser_usb/kvaser_usb.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <linux/spinlock.h>
2828
#include <linux/types.h>
2929
#include <linux/usb.h>
30+
#include <net/devlink.h>
3031

3132
#include <linux/can.h>
3233
#include <linux/can/dev.h>
@@ -226,6 +227,8 @@ struct kvaser_usb_dev_cfg {
226227
extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops;
227228
extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops;
228229

230+
extern const struct devlink_ops kvaser_usb_devlink_ops;
231+
229232
void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv);
230233

231234
int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len,

drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,7 @@ static int kvaser_usb_probe(struct usb_interface *intf,
914914
const struct usb_device_id *id)
915915
{
916916
struct kvaser_usb *dev;
917+
struct devlink *devlink;
917918
int err;
918919
int i;
919920
const struct kvaser_usb_driver_info *driver_info;
@@ -923,17 +924,20 @@ static int kvaser_usb_probe(struct usb_interface *intf,
923924
if (!driver_info)
924925
return -ENODEV;
925926

926-
dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
927-
if (!dev)
927+
devlink = devlink_alloc(&kvaser_usb_devlink_ops, sizeof(*dev), &intf->dev);
928+
if (!devlink)
928929
return -ENOMEM;
929930

931+
dev = devlink_priv(devlink);
930932
dev->intf = intf;
931933
dev->driver_info = driver_info;
932934
ops = driver_info->ops;
933935

934936
err = ops->dev_setup_endpoints(dev);
935-
if (err)
936-
return dev_err_probe(&intf->dev, err, "Cannot get usb endpoint(s)");
937+
if (err) {
938+
dev_err_probe(&intf->dev, err, "Cannot get usb endpoint(s)");
939+
goto free_devlink;
940+
}
937941

938942
dev->udev = interface_to_usbdev(intf);
939943

@@ -944,50 +948,66 @@ static int kvaser_usb_probe(struct usb_interface *intf,
944948
dev->card_data.ctrlmode_supported = 0;
945949
dev->card_data.capabilities = 0;
946950
err = ops->dev_init_card(dev);
947-
if (err)
948-
return dev_err_probe(&intf->dev, err,
949-
"Failed to initialize card\n");
951+
if (err) {
952+
dev_err_probe(&intf->dev, err,
953+
"Failed to initialize card\n");
954+
goto free_devlink;
955+
}
950956

951957
err = ops->dev_get_software_info(dev);
952-
if (err)
953-
return dev_err_probe(&intf->dev, err,
954-
"Cannot get software info\n");
958+
if (err) {
959+
dev_err_probe(&intf->dev, err,
960+
"Cannot get software info\n");
961+
goto free_devlink;
962+
}
955963

956964
if (ops->dev_get_software_details) {
957965
err = ops->dev_get_software_details(dev);
958-
if (err)
959-
return dev_err_probe(&intf->dev, err,
960-
"Cannot get software details\n");
966+
if (err) {
967+
dev_err_probe(&intf->dev, err,
968+
"Cannot get software details\n");
969+
goto free_devlink;
970+
}
961971
}
962972

963-
if (WARN_ON(!dev->cfg))
964-
return -ENODEV;
973+
if (WARN_ON(!dev->cfg)) {
974+
err = -ENODEV;
975+
goto free_devlink;
976+
}
965977

966978
dev_dbg(&intf->dev, "Max outstanding tx = %d URBs\n", dev->max_tx_urbs);
967979

968980
err = ops->dev_get_card_info(dev);
969-
if (err)
970-
return dev_err_probe(&intf->dev, err,
971-
"Cannot get card info\n");
981+
if (err) {
982+
dev_err_probe(&intf->dev, err,
983+
"Cannot get card info\n");
984+
goto free_devlink;
985+
}
972986

973987
if (ops->dev_get_capabilities) {
974988
err = ops->dev_get_capabilities(dev);
975989
if (err) {
976-
kvaser_usb_remove_interfaces(dev);
977-
return dev_err_probe(&intf->dev, err,
978-
"Cannot get capabilities\n");
990+
dev_err_probe(&intf->dev, err,
991+
"Cannot get capabilities\n");
992+
goto remove_interfaces;
979993
}
980994
}
981995

982996
for (i = 0; i < dev->nchannels; i++) {
983997
err = kvaser_usb_init_one(dev, i);
984-
if (err) {
985-
kvaser_usb_remove_interfaces(dev);
986-
return err;
987-
}
998+
if (err)
999+
goto remove_interfaces;
9881000
}
1001+
devlink_register(devlink);
9891002

9901003
return 0;
1004+
1005+
remove_interfaces:
1006+
kvaser_usb_remove_interfaces(dev);
1007+
free_devlink:
1008+
devlink_free(devlink);
1009+
1010+
return err;
9911011
}
9921012

9931013
static void kvaser_usb_disconnect(struct usb_interface *intf)
@@ -1000,6 +1020,8 @@ static void kvaser_usb_disconnect(struct usb_interface *intf)
10001020
return;
10011021

10021022
kvaser_usb_remove_interfaces(dev);
1023+
devlink_unregister(priv_to_devlink(dev));
1024+
devlink_free(priv_to_devlink(dev));
10031025
}
10041026

10051027
static struct usb_driver kvaser_usb_driver = {
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
2+
/* kvaser_usb devlink functions
3+
*
4+
* Copyright (C) 2025 KVASER AB, Sweden. All rights reserved.
5+
*/
6+
#include "kvaser_usb.h"
7+
8+
#include <net/devlink.h>
9+
10+
const struct devlink_ops kvaser_usb_devlink_ops = {
11+
};

0 commit comments

Comments
 (0)