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@xxxxxxxxxx> --- 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