Commit 788199b7 authored by Stephane Grosjean's avatar Stephane Grosjean Committed by Marc Kleine-Budde
Browse files

can: peak_usb: fix USB FD devices potential malfunction



The latest firmware versions of USB CAN FD interfaces export the EP numbers
to be used to dialog with the device via the "type" field of a response to
a vendor request structure, particularly when its value is greater than or
equal to 2.

Correct the driver's test of this field.

Fixes: 4f232482 ("can: peak_usb: include support for a new MCU")
Signed-off-by: default avatarStephane Grosjean <stephane.grosjean@hms-networks.com>
Link: https://patch.msgid.link/20250724081550.11694-1-stephane.grosjean@free.fr


Reviewed-by: default avatarVincent Mailhol <mailhol.vincent@wanadoo.fr>
[mkl: rephrase commit message]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent c8f13134
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ struct __packed pcan_ufd_fw_info {
	__le32	ser_no;		/* S/N */
	__le32	flags;		/* special functions */

	/* extended data when type == PCAN_USBFD_TYPE_EXT */
	/* extended data when type >= PCAN_USBFD_TYPE_EXT */
	u8	cmd_out_ep;	/* ep for cmd */
	u8	cmd_in_ep;	/* ep for replies */
	u8	data_out_ep[2];	/* ep for CANx TX */
@@ -982,10 +982,11 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev)
			dev->can.ctrlmode |= CAN_CTRLMODE_FD_NON_ISO;
		}

		/* if vendor rsp is of type 2, then it contains EP numbers to
		 * use for cmds pipes. If not, then default EP should be used.
		/* if vendor rsp type is greater than or equal to 2, then it
		 * contains EP numbers to use for cmds pipes. If not, then
		 * default EP should be used.
		 */
		if (fw_info->type != cpu_to_le16(PCAN_USBFD_TYPE_EXT)) {
		if (le16_to_cpu(fw_info->type) < PCAN_USBFD_TYPE_EXT) {
			fw_info->cmd_out_ep = PCAN_USBPRO_EP_CMDOUT;
			fw_info->cmd_in_ep = PCAN_USBPRO_EP_CMDIN;
		}
@@ -1018,11 +1019,11 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev)
	dev->can_channel_id =
		le32_to_cpu(pdev->usb_if->fw_info.dev_id[dev->ctrl_idx]);

	/* if vendor rsp is of type 2, then it contains EP numbers to
	 * use for data pipes. If not, then statically defined EP are used
	 * (see peak_usb_create_dev()).
	/* if vendor rsp type is greater than or equal to 2, then it contains EP
	 * numbers to use for data pipes. If not, then statically defined EP are
	 * used (see peak_usb_create_dev()).
	 */
	if (fw_info->type == cpu_to_le16(PCAN_USBFD_TYPE_EXT)) {
	if (le16_to_cpu(fw_info->type) >= PCAN_USBFD_TYPE_EXT) {
		dev->ep_msg_in = fw_info->data_in_ep;
		dev->ep_msg_out = fw_info->data_out_ep[dev->ctrl_idx];
	}