@@ -6,7 +6,7 @@
*
* Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved.
* Copyright (c) 2020 ETAS K.K.. All rights reserved.
- * Copyright (c) 2020, 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+ * Copyright (c) 2020-2022 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
*/
#include <linux/kernel.h>
@@ -492,7 +492,8 @@ const struct es58x_parameters es581_4_param = {
.tx_bulk_max = ES581_4_TX_BULK_MAX,
.urb_cmd_header_len = ES581_4_URB_CMD_HEADER_LEN,
.rx_urb_max = ES58X_RX_URBS_MAX,
- .tx_urb_max = ES58X_TX_URBS_MAX
+ .tx_urb_max = ES58X_TX_URBS_MAX,
+ .prod_info_delim = ',',
};
const struct es58x_operators es581_4_ops = {
@@ -7,7 +7,7 @@
*
* Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved.
* Copyright (c) 2020 ETAS K.K.. All rights reserved.
- * Copyright (c) 2020, 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+ * Copyright (c) 2020-2022 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
*/
#include <linux/ethtool.h>
@@ -1978,7 +1978,47 @@ static const struct net_device_ops es58x_netdev_ops = {
.ndo_eth_ioctl = can_eth_ioctl_hwts,
};
+/**
+ * es58x_get_drvinfo() - Get the driver name and firmware version.
+ * @netdev: CAN network device.
+ * @drvinfo: Driver information.
+ *
+ * Populate @drvinfo with the driver name and the firmware version.
+ */
+static void es58x_get_drvinfo(struct net_device *netdev,
+ struct ethtool_drvinfo *drvinfo)
+{
+ struct es58x_device *es58x_dev = es58x_priv(netdev)->es58x_dev;
+ char *prod_info, *start, *end;
+
+ strscpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver));
+
+ prod_info = usb_cache_string(es58x_dev->udev, ES58X_PROD_INFO_IDX);
+ if (!prod_info)
+ return;
+
+ /* The firmware prefix is either "FW_V" or "FW:" */
+ start = strstr(prod_info, "FW");
+ if (!start)
+ goto free_prod_info;
+ /* Go to first digit */
+ while (!isdigit(*start)) {
+ start++;
+ if (!*start)
+ goto free_prod_info;
+ }
+ end = strchr(start, es58x_dev->param->prod_info_delim);
+ if (!end || end - start >= sizeof(drvinfo->fw_version))
+ goto free_prod_info;
+
+ strncpy(drvinfo->fw_version, start, end - start);
+
+ free_prod_info:
+ kfree(prod_info);
+}
+
static const struct ethtool_ops es58x_ethtool_ops = {
+ .get_drvinfo = es58x_get_drvinfo,
.get_ts_info = can_ethtool_op_get_ts_info_hwts,
};
@@ -6,7 +6,7 @@
*
* Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved.
* Copyright (c) 2020 ETAS K.K.. All rights reserved.
- * Copyright (c) 2020, 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+ * Copyright (c) 2020-2022 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
*/
#ifndef __ES58X_COMMON_H__
@@ -309,6 +309,8 @@ struct es58x_priv {
* @urb_cmd_header_len: Length of the URB command header.
* @rx_urb_max: Number of RX URB to be allocated during device probe.
* @tx_urb_max: Number of TX URB to be allocated during device probe.
+ * @prod_info_delim: delimiter of the different fields in the USB
+ * product information string.
*/
struct es58x_parameters {
const struct can_bittiming_const *bittiming_const;
@@ -327,6 +329,7 @@ struct es58x_parameters {
u8 urb_cmd_header_len;
u8 rx_urb_max;
u8 tx_urb_max;
+ char prod_info_delim;
};
/**
@@ -8,7 +8,7 @@
*
* Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved.
* Copyright (c) 2020 ETAS K.K.. All rights reserved.
- * Copyright (c) 2020, 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+ * Copyright (c) 2020-2022 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
*/
#include <linux/kernel.h>
@@ -550,7 +550,8 @@ const struct es58x_parameters es58x_fd_param = {
.tx_bulk_max = ES58X_FD_TX_BULK_MAX,
.urb_cmd_header_len = ES58X_FD_URB_CMD_HEADER_LEN,
.rx_urb_max = ES58X_RX_URBS_MAX,
- .tx_urb_max = ES58X_TX_URBS_MAX
+ .tx_urb_max = ES58X_TX_URBS_MAX,
+ .prod_info_delim = '-',
};
const struct es58x_operators es58x_fd_ops = {
ES58x devices report below information in their usb product info string: * the firmware version * the bootloader version * the hardware revision Report the firmware version through ethtool_drvinfo::fw_version. Because struct ethtool_drvinfo has no fields to report the boatloader version nor the hardware revision, continue to print these in the kernel log (c.f. es58x_get_product_info()). While doing so, bump up copyright year of each modified files. Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> --- drivers/net/can/usb/etas_es58x/es581_4.c | 5 ++- drivers/net/can/usb/etas_es58x/es58x_core.c | 42 ++++++++++++++++++++- drivers/net/can/usb/etas_es58x/es58x_core.h | 5 ++- drivers/net/can/usb/etas_es58x/es58x_fd.c | 5 ++- 4 files changed, 51 insertions(+), 6 deletions(-)