diff options
| -rw-r--r-- | drivers/net/can/usb/ucan.c | 43 | 
1 files changed, 18 insertions, 25 deletions
| diff --git a/drivers/net/can/usb/ucan.c b/drivers/net/can/usb/ucan.c index 39a63b7313a4..07406daf7c88 100644 --- a/drivers/net/can/usb/ucan.c +++ b/drivers/net/can/usb/ucan.c @@ -186,7 +186,7 @@ union ucan_ctl_payload {  	 */  	struct ucan_ctl_cmd_get_protocol_version cmd_get_protocol_version; -	u8 raw[128]; +	u8 fw_str[128];  } __packed;  enum { @@ -424,18 +424,20 @@ static int ucan_ctrl_command_out(struct ucan_priv *up,  			       UCAN_USB_CTL_PIPE_TIMEOUT);  } -static int ucan_device_request_in(struct ucan_priv *up, -				  u8 cmd, u16 subcmd, u16 datalen) +static void ucan_get_fw_str(struct ucan_priv *up, char *fw_str, size_t size)  { -	return usb_control_msg(up->udev, -			       usb_rcvctrlpipe(up->udev, 0), -			       cmd, -			       USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, -			       subcmd, -			       0, -			       up->ctl_msg_buffer, -			       datalen, -			       UCAN_USB_CTL_PIPE_TIMEOUT); +	int ret; + +	ret = usb_control_msg(up->udev, usb_rcvctrlpipe(up->udev, 0), +			      UCAN_DEVICE_GET_FW_STRING, +			      USB_DIR_IN | USB_TYPE_VENDOR | +			      USB_RECIP_DEVICE, +			      0, 0, fw_str, size - 1, +			      UCAN_USB_CTL_PIPE_TIMEOUT); +	if (ret > 0) +		fw_str[ret] = '\0'; +	else +		strscpy(fw_str, "unknown", size);  }  /* Parse the device information structure reported by the device and @@ -1314,7 +1316,6 @@ static int ucan_probe(struct usb_interface *intf,  	u8 in_ep_addr;  	u8 out_ep_addr;  	union ucan_ctl_payload *ctl_msg_buffer; -	char firmware_str[sizeof(union ucan_ctl_payload) + 1];  	udev = interface_to_usbdev(intf); @@ -1527,17 +1528,6 @@ static int ucan_probe(struct usb_interface *intf,  	 */  	ucan_parse_device_info(up, &ctl_msg_buffer->cmd_get_device_info); -	/* just print some device information - if available */ -	ret = ucan_device_request_in(up, UCAN_DEVICE_GET_FW_STRING, 0, -				     sizeof(union ucan_ctl_payload)); -	if (ret > 0) { -		/* copy string while ensuring zero termination */ -		strscpy(firmware_str, up->ctl_msg_buffer->raw, -			sizeof(union ucan_ctl_payload) + 1); -	} else { -		strcpy(firmware_str, "unknown"); -	} -  	/* device is compatible, reset it */  	ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0);  	if (ret < 0) @@ -1555,7 +1545,10 @@ static int ucan_probe(struct usb_interface *intf,  	/* initialisation complete, log device info */  	netdev_info(up->netdev, "registered device\n"); -	netdev_info(up->netdev, "firmware string: %s\n", firmware_str); +	ucan_get_fw_str(up, up->ctl_msg_buffer->fw_str, +			sizeof(up->ctl_msg_buffer->fw_str)); +	netdev_info(up->netdev, "firmware string: %s\n", +		    up->ctl_msg_buffer->fw_str);  	/* success */  	return 0; | 
