Merge tag 'linux-can-fixes-for-5.16-20211209' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
Marc Kleine-Budde says:
====================
can 2021-12-09
Both patches are by Jimmy Assarsson. The first one fixes the
incrementing of the rx/tx error counters in the Kvaser PCIe FD driver.
The second one fixes the Kvaser USB driver by using the CAN clock
frequency provided by the device instead of using a hard coded value.
* tag 'linux-can-fixes-for-5.16-20211209' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
can: kvaser_usb: get CAN clock frequency from device
can: kvaser_pciefd: kvaser_pciefd_rx_error_frame(): increase correct stats->{rx,tx}_errors counter
====================
Link: https://lore.kernel.org/r/20211209081312.301036-1-mkl@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -248,6 +248,9 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
|
|||||||
#define KVASER_PCIEFD_SPACK_EWLR BIT(23)
|
#define KVASER_PCIEFD_SPACK_EWLR BIT(23)
|
||||||
#define KVASER_PCIEFD_SPACK_EPLR BIT(24)
|
#define KVASER_PCIEFD_SPACK_EPLR BIT(24)
|
||||||
|
|
||||||
|
/* Kvaser KCAN_EPACK second word */
|
||||||
|
#define KVASER_PCIEFD_EPACK_DIR_TX BIT(0)
|
||||||
|
|
||||||
struct kvaser_pciefd;
|
struct kvaser_pciefd;
|
||||||
|
|
||||||
struct kvaser_pciefd_can {
|
struct kvaser_pciefd_can {
|
||||||
@@ -1285,7 +1288,10 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
|
|||||||
|
|
||||||
can->err_rep_cnt++;
|
can->err_rep_cnt++;
|
||||||
can->can.can_stats.bus_error++;
|
can->can.can_stats.bus_error++;
|
||||||
stats->rx_errors++;
|
if (p->header[1] & KVASER_PCIEFD_EPACK_DIR_TX)
|
||||||
|
stats->tx_errors++;
|
||||||
|
else
|
||||||
|
stats->rx_errors++;
|
||||||
|
|
||||||
can->bec.txerr = bec.txerr;
|
can->bec.txerr = bec.txerr;
|
||||||
can->bec.rxerr = bec.rxerr;
|
can->bec.rxerr = bec.rxerr;
|
||||||
|
|||||||
@@ -28,10 +28,6 @@
|
|||||||
|
|
||||||
#include "kvaser_usb.h"
|
#include "kvaser_usb.h"
|
||||||
|
|
||||||
/* Forward declaration */
|
|
||||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg;
|
|
||||||
|
|
||||||
#define CAN_USB_CLOCK 8000000
|
|
||||||
#define MAX_USBCAN_NET_DEVICES 2
|
#define MAX_USBCAN_NET_DEVICES 2
|
||||||
|
|
||||||
/* Command header size */
|
/* Command header size */
|
||||||
@@ -80,6 +76,12 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg;
|
|||||||
|
|
||||||
#define CMD_LEAF_LOG_MESSAGE 106
|
#define CMD_LEAF_LOG_MESSAGE 106
|
||||||
|
|
||||||
|
/* Leaf frequency options */
|
||||||
|
#define KVASER_USB_LEAF_SWOPTION_FREQ_MASK 0x60
|
||||||
|
#define KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK 0
|
||||||
|
#define KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK BIT(5)
|
||||||
|
#define KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK BIT(6)
|
||||||
|
|
||||||
/* error factors */
|
/* error factors */
|
||||||
#define M16C_EF_ACKE BIT(0)
|
#define M16C_EF_ACKE BIT(0)
|
||||||
#define M16C_EF_CRCE BIT(1)
|
#define M16C_EF_CRCE BIT(1)
|
||||||
@@ -340,6 +342,50 @@ struct kvaser_usb_err_summary {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
||||||
|
.name = "kvaser_usb",
|
||||||
|
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
||||||
|
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
||||||
|
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
||||||
|
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
||||||
|
.sjw_max = KVASER_USB_SJW_MAX,
|
||||||
|
.brp_min = KVASER_USB_BRP_MIN,
|
||||||
|
.brp_max = KVASER_USB_BRP_MAX,
|
||||||
|
.brp_inc = KVASER_USB_BRP_INC,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
|
||||||
|
.clock = {
|
||||||
|
.freq = 8000000,
|
||||||
|
},
|
||||||
|
.timestamp_freq = 1,
|
||||||
|
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
|
||||||
|
.clock = {
|
||||||
|
.freq = 16000000,
|
||||||
|
},
|
||||||
|
.timestamp_freq = 1,
|
||||||
|
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
|
||||||
|
.clock = {
|
||||||
|
.freq = 24000000,
|
||||||
|
},
|
||||||
|
.timestamp_freq = 1,
|
||||||
|
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
|
||||||
|
.clock = {
|
||||||
|
.freq = 32000000,
|
||||||
|
},
|
||||||
|
.timestamp_freq = 1,
|
||||||
|
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||||
|
};
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
||||||
const struct sk_buff *skb, int *frame_len,
|
const struct sk_buff *skb, int *frame_len,
|
||||||
@@ -471,6 +517,27 @@ static int kvaser_usb_leaf_send_simple_cmd(const struct kvaser_usb *dev,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
|
||||||
|
const struct leaf_cmd_softinfo *softinfo)
|
||||||
|
{
|
||||||
|
u32 sw_options = le32_to_cpu(softinfo->sw_options);
|
||||||
|
|
||||||
|
dev->fw_version = le32_to_cpu(softinfo->fw_version);
|
||||||
|
dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
|
||||||
|
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
||||||
|
dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz;
|
||||||
|
break;
|
||||||
|
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
||||||
|
dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
||||||
{
|
{
|
||||||
struct kvaser_cmd cmd;
|
struct kvaser_cmd cmd;
|
||||||
@@ -486,14 +553,13 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
|||||||
|
|
||||||
switch (dev->card_data.leaf.family) {
|
switch (dev->card_data.leaf.family) {
|
||||||
case KVASER_LEAF:
|
case KVASER_LEAF:
|
||||||
dev->fw_version = le32_to_cpu(cmd.u.leaf.softinfo.fw_version);
|
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
|
||||||
dev->max_tx_urbs =
|
|
||||||
le16_to_cpu(cmd.u.leaf.softinfo.max_outstanding_tx);
|
|
||||||
break;
|
break;
|
||||||
case KVASER_USBCAN:
|
case KVASER_USBCAN:
|
||||||
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;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1225,24 +1291,11 @@ static int kvaser_usb_leaf_init_card(struct kvaser_usb *dev)
|
|||||||
{
|
{
|
||||||
struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
|
struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
|
||||||
|
|
||||||
dev->cfg = &kvaser_usb_leaf_dev_cfg;
|
|
||||||
card_data->ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
card_data->ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
|
||||||
.name = "kvaser_usb",
|
|
||||||
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
|
||||||
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
|
||||||
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
|
||||||
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
|
||||||
.sjw_max = KVASER_USB_SJW_MAX,
|
|
||||||
.brp_min = KVASER_USB_BRP_MIN,
|
|
||||||
.brp_max = KVASER_USB_BRP_MAX,
|
|
||||||
.brp_inc = KVASER_USB_BRP_INC,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int kvaser_usb_leaf_set_bittiming(struct net_device *netdev)
|
static int kvaser_usb_leaf_set_bittiming(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
||||||
@@ -1348,11 +1401,3 @@ const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops = {
|
|||||||
.dev_read_bulk_callback = kvaser_usb_leaf_read_bulk_callback,
|
.dev_read_bulk_callback = kvaser_usb_leaf_read_bulk_callback,
|
||||||
.dev_frame_to_cmd = kvaser_usb_leaf_frame_to_cmd,
|
.dev_frame_to_cmd = kvaser_usb_leaf_frame_to_cmd,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg = {
|
|
||||||
.clock = {
|
|
||||||
.freq = CAN_USB_CLOCK,
|
|
||||||
},
|
|
||||||
.timestamp_freq = 1,
|
|
||||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
|
||||||
};
|
|
||||||
|
|||||||
Reference in New Issue
Block a user