Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9afdff9d authored by Jimmy Assarsson's avatar Jimmy Assarsson Committed by Greg Kroah-Hartman
Browse files

can: kvaser_usb: kvaser_usb_leaf: fix CAN clock frequency regression

commit e6c80e601053ffdac5709f11ff3ec1e19ed05f7b upstream.

The firmware of M32C based Leaf devices expects bittiming parameters
calculated for 16MHz clock. Since we use the actual clock frequency of
the device, the device may end up with wrong bittiming parameters,
depending on user requested parameters.

This regression affects M32C based Leaf devices with non-16MHz clock.

Fixes: 68daa476 ("can: kvaser_usb: get CAN clock frequency from device")
Link: https://lore.kernel.org/all/20220603083820.800246-3-extja@kvaser.com


Cc: stable@vger.kernel.org
Signed-off-by: default avatarJimmy Assarsson <extja@kvaser.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 93f228fc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
/* Kvaser USB device quirks */
#define KVASER_USB_QUIRK_HAS_SILENT_MODE	BIT(0)
#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS	BIT(1)
#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ	BIT(2)

/* Device capabilities */
#define KVASER_USB_CAP_BERR_CAP			0x01
+19 −10
Original line number Diff line number Diff line
@@ -92,26 +92,33 @@ static const struct kvaser_usb_driver_info kvaser_usb_driver_info_usbcan = {
};

static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = {
	.quirks = 0,
	.quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
	.family = KVASER_LEAF,
	.ops = &kvaser_usb_leaf_dev_ops,
};

static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err = {
	.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS,
	.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
		  KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
	.family = KVASER_LEAF,
	.ops = &kvaser_usb_leaf_dev_ops,
};

static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err_listen = {
	.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
		  KVASER_USB_QUIRK_HAS_SILENT_MODE,
		  KVASER_USB_QUIRK_HAS_SILENT_MODE |
		  KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
	.family = KVASER_LEAF,
	.ops = &kvaser_usb_leaf_dev_ops,
};

static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leafimx = {
	.quirks = 0,
	.ops = &kvaser_usb_leaf_dev_ops,
};

static const struct usb_device_id kvaser_usb_table[] = {
	/* Leaf USB product IDs */
	/* Leaf M32C USB product IDs */
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID),
@@ -152,16 +159,18 @@ static const struct usb_device_id kvaser_usb_table[] = {
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },

	/* Leaf i.MX28 USB product IDs */
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },

	/* USBCANII USB product IDs */
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID),
@@ -190,7 +199,7 @@ static const struct usb_device_id kvaser_usb_table[] = {
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_2CANLIN_PRODUCT_ID),
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
	{ USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID),
		.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
+16 −9
Original line number Diff line number Diff line
@@ -525,6 +525,12 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
	dev->fw_version = le32_to_cpu(softinfo->fw_version);
	dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);

	if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) {
		/* Firmware expects bittiming parameters calculated for 16MHz
		 * clock, regardless of the actual clock
		 */
		dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
	} else {
		switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
		case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
			dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
@@ -537,6 +543,7 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
			break;
		}
	}
}

static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
{