[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221104171604.24052-3-mailhol.vincent@wanadoo.fr>
Date: Sat, 5 Nov 2022 02:16:03 +0900
From: Vincent Mailhol <mailhol.vincent@...adoo.fr>
To: linux-can@...r.kernel.org
Cc: Marc Kleine-Budde <mkl@...gutronix.de>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
linux-kernel@...r.kernel.org, linux-usb@...r.kernel.org,
Vincent Mailhol <mailhol.vincent@...adoo.fr>
Subject: [PATCH v2 2/3] can: etas_es58x: use usb_cache_string() to retrieve the product info string
Instead of allocating memory ourselves and doing all the error
handling, rely on usb_cache_string(). This results in simpler code.
Make es58x_get_product_info() return void. The reason is double:
1/ by using usb_cache_string() we do not know anymore the root cause
(is it an allocation issue or input/output issue?)
2/ Failling to get the product info is not critical. So it is OK to
continue.
Signed-off-by: Vincent Mailhol <mailhol.vincent@...adoo.fr>
---
drivers/net/can/usb/etas_es58x/es58x_core.c | 33 +++------------------
drivers/net/can/usb/etas_es58x/es58x_core.h | 3 ++
2 files changed, 7 insertions(+), 29 deletions(-)
diff --git a/drivers/net/can/usb/etas_es58x/es58x_core.c b/drivers/net/can/usb/etas_es58x/es58x_core.c
index 51294b717040..1a17aadfc1dc 100644
--- a/drivers/net/can/usb/etas_es58x/es58x_core.c
+++ b/drivers/net/can/usb/etas_es58x/es58x_core.c
@@ -2124,41 +2124,18 @@ static void es58x_free_netdevs(struct es58x_device *es58x_dev)
* @es58x_dev: ES58X device.
*
* Do a synchronous call to get the product information.
- *
- * Return: zero on success, errno when any error occurs.
*/
-static int es58x_get_product_info(struct es58x_device *es58x_dev)
+static void es58x_get_product_info(struct es58x_device *es58x_dev)
{
- struct usb_device *udev = es58x_dev->udev;
- const int es58x_prod_info_idx = 6;
- /* Empirical tests show a prod_info length of maximum 83,
- * below should be more than enough.
- */
- const size_t prod_info_len = 127;
char *prod_info;
- int ret;
- prod_info = kmalloc(prod_info_len, GFP_KERNEL);
+ prod_info = usb_cache_string(es58x_dev->udev, ES58X_PROD_INFO_IDX);
if (!prod_info)
- return -ENOMEM;
+ return;
- ret = usb_string(udev, es58x_prod_info_idx, prod_info, prod_info_len);
- if (ret < 0) {
- dev_err(es58x_dev->dev,
- "%s: Could not read the product info: %pe\n",
- __func__, ERR_PTR(ret));
- goto out_free;
- }
- if (ret >= prod_info_len - 1) {
- dev_warn(es58x_dev->dev,
- "%s: Buffer is too small, result might be truncated\n",
- __func__);
- }
dev_info(es58x_dev->dev, "Product info: %s\n", prod_info);
- out_free:
kfree(prod_info);
- return ret < 0 ? ret : 0;
}
/**
@@ -2243,9 +2220,7 @@ static int es58x_probe(struct usb_interface *intf,
if (IS_ERR(es58x_dev))
return PTR_ERR(es58x_dev);
- ret = es58x_get_product_info(es58x_dev);
- if (ret)
- return ret;
+ es58x_get_product_info(es58x_dev);
for (ch_idx = 0; ch_idx < es58x_dev->num_can_ch; ch_idx++) {
ret = es58x_init_netdev(es58x_dev, ch_idx);
diff --git a/drivers/net/can/usb/etas_es58x/es58x_core.h b/drivers/net/can/usb/etas_es58x/es58x_core.h
index 640fe0a1df63..9a5a616df783 100644
--- a/drivers/net/can/usb/etas_es58x/es58x_core.h
+++ b/drivers/net/can/usb/etas_es58x/es58x_core.h
@@ -49,6 +49,9 @@
/* A magic number sent by the ES581.4 to inform it is alive. */
#define ES58X_HEARTBEAT 0x11
+/* USB descriptor index containing the product information string. */
+#define ES58X_PROD_INFO_IDX 6
+
/**
* enum es58x_driver_info - Quirks of the device.
* @ES58X_DUAL_CHANNEL: Device has two CAN channels. If this flag is
--
2.37.4
Powered by blists - more mailing lists