Commit b3b6df2c authored by Jimmy Assarsson's avatar Jimmy Assarsson Committed by Marc Kleine-Budde

can: kvaser_usb: kvaser_usb_leaf: fix bittiming limits

Use correct bittiming limits depending on device. For devices based on
USBcanII, Leaf M32C or Leaf i.MX28.

Fixes: 080f40a6 ("can: kvaser_usb: Add support for Kvaser CAN/USB devices")
Fixes: b4f20130 ("can: kvaser_usb: add support for Kvaser Leaf v2 and usb mini PCIe")
Fixes: f5d4abea ("can: kvaser_usb: Add support for the USBcan-II family")
Link: https://lore.kernel.org/all/20220603083820.800246-4-extja@kvaser.com
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJimmy Assarsson <extja@kvaser.com>
[mkl: remove stray netlink.h include]
[mkl: keep struct can_bittiming_const kvaser_usb_flexc_bittiming_const in kvaser_usb_hydra.c]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e6c80e60
...@@ -187,4 +187,6 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd, ...@@ -187,4 +187,6 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
int kvaser_usb_can_rx_over_error(struct net_device *netdev); int kvaser_usb_can_rx_over_error(struct net_device *netdev);
extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
#endif /* KVASER_USB_H */ #endif /* KVASER_USB_H */
...@@ -375,7 +375,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = { ...@@ -375,7 +375,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
.brp_inc = 1, .brp_inc = 1,
}; };
static const struct can_bittiming_const kvaser_usb_hydra_flexc_bittiming_c = { const struct can_bittiming_const kvaser_usb_flexc_bittiming_const = {
.name = "kvaser_usb_flex", .name = "kvaser_usb_flex",
.tseg1_min = 4, .tseg1_min = 4,
.tseg1_max = 16, .tseg1_max = 16,
...@@ -2052,7 +2052,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = { ...@@ -2052,7 +2052,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = {
.freq = 24 * MEGA /* Hz */, .freq = 24 * MEGA /* Hz */,
}, },
.timestamp_freq = 1, .timestamp_freq = 1,
.bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c, .bittiming_const = &kvaser_usb_flexc_bittiming_const,
}; };
static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_rt = { static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_rt = {
......
...@@ -101,16 +101,6 @@ ...@@ -101,16 +101,6 @@
#define USBCAN_ERROR_STATE_RX_ERROR BIT(1) #define USBCAN_ERROR_STATE_RX_ERROR BIT(1)
#define USBCAN_ERROR_STATE_BUSERROR BIT(2) #define USBCAN_ERROR_STATE_BUSERROR BIT(2)
/* bittiming parameters */
#define KVASER_USB_TSEG1_MIN 1
#define KVASER_USB_TSEG1_MAX 16
#define KVASER_USB_TSEG2_MIN 1
#define KVASER_USB_TSEG2_MAX 8
#define KVASER_USB_SJW_MAX 4
#define KVASER_USB_BRP_MIN 1
#define KVASER_USB_BRP_MAX 64
#define KVASER_USB_BRP_INC 1
/* ctrl modes */ /* ctrl modes */
#define KVASER_CTRL_MODE_NORMAL 1 #define KVASER_CTRL_MODE_NORMAL 1
#define KVASER_CTRL_MODE_SILENT 2 #define KVASER_CTRL_MODE_SILENT 2
...@@ -343,48 +333,68 @@ struct kvaser_usb_err_summary { ...@@ -343,48 +333,68 @@ struct kvaser_usb_err_summary {
}; };
}; };
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = { static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = {
.name = "kvaser_usb", .name = "kvaser_usb_ucii",
.tseg1_min = KVASER_USB_TSEG1_MIN, .tseg1_min = 4,
.tseg1_max = KVASER_USB_TSEG1_MAX, .tseg1_max = 16,
.tseg2_min = KVASER_USB_TSEG2_MIN, .tseg2_min = 2,
.tseg2_max = KVASER_USB_TSEG2_MAX, .tseg2_max = 8,
.sjw_max = KVASER_USB_SJW_MAX, .sjw_max = 4,
.brp_min = KVASER_USB_BRP_MIN, .brp_min = 1,
.brp_max = KVASER_USB_BRP_MAX, .brp_max = 16,
.brp_inc = KVASER_USB_BRP_INC, .brp_inc = 1,
};
static const struct can_bittiming_const kvaser_usb_leaf_m32c_bittiming_const = {
.name = "kvaser_usb_leaf",
.tseg1_min = 3,
.tseg1_max = 16,
.tseg2_min = 2,
.tseg2_max = 8,
.sjw_max = 4,
.brp_min = 2,
.brp_max = 128,
.brp_inc = 2,
}; };
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = { static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_usbcan_dev_cfg = {
.clock = { .clock = {
.freq = 8 * MEGA /* Hz */, .freq = 8 * MEGA /* Hz */,
}, },
.timestamp_freq = 1, .timestamp_freq = 1,
.bittiming_const = &kvaser_usb_leaf_bittiming_const, .bittiming_const = &kvaser_usb_leaf_m16c_bittiming_const,
};
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_m32c_dev_cfg = {
.clock = {
.freq = 16 * MEGA /* Hz */,
},
.timestamp_freq = 1,
.bittiming_const = &kvaser_usb_leaf_m32c_bittiming_const,
}; };
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = { static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_16mhz = {
.clock = { .clock = {
.freq = 16 * MEGA /* Hz */, .freq = 16 * MEGA /* Hz */,
}, },
.timestamp_freq = 1, .timestamp_freq = 1,
.bittiming_const = &kvaser_usb_leaf_bittiming_const, .bittiming_const = &kvaser_usb_flexc_bittiming_const,
}; };
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = { static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_24mhz = {
.clock = { .clock = {
.freq = 24 * MEGA /* Hz */, .freq = 24 * MEGA /* Hz */,
}, },
.timestamp_freq = 1, .timestamp_freq = 1,
.bittiming_const = &kvaser_usb_leaf_bittiming_const, .bittiming_const = &kvaser_usb_flexc_bittiming_const,
}; };
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = { static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_32mhz = {
.clock = { .clock = {
.freq = 32 * MEGA /* Hz */, .freq = 32 * MEGA /* Hz */,
}, },
.timestamp_freq = 1, .timestamp_freq = 1,
.bittiming_const = &kvaser_usb_leaf_bittiming_const, .bittiming_const = &kvaser_usb_flexc_bittiming_const,
}; };
static void * static void *
...@@ -528,17 +538,17 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev, ...@@ -528,17 +538,17 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
/* Firmware expects bittiming parameters calculated for 16MHz /* Firmware expects bittiming parameters calculated for 16MHz
* clock, regardless of the actual clock * clock, regardless of the actual clock
*/ */
dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz; dev->cfg = &kvaser_usb_leaf_m32c_dev_cfg;
} else { } else {
switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) { switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK: case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz; dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_16mhz;
break; break;
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK: case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz; dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_24mhz;
break; break;
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK: case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz; dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_32mhz;
break; break;
} }
} }
...@@ -565,7 +575,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev) ...@@ -565,7 +575,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version); dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version);
dev->max_tx_urbs = dev->max_tx_urbs =
le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx); le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx);
dev->cfg = &kvaser_usb_leaf_dev_cfg_8mhz; dev->cfg = &kvaser_usb_leaf_usbcan_dev_cfg;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment