From: Jimmy Assarsson <extja@kvaser.com>
To: Anssi Hannula <anssi.hannula@bitwise.fi>
Cc: Jimmy Assarsson <jimmyassarsson@gmail.com>, linux-can@vger.kernel.org
Subject: Re: [PATCH v2 04/15] can: kvaser_usb: kvaser_usb_leaf: Get capabilities from device
Date: Thu, 1 Sep 2022 14:34:24 +0200 [thread overview]
Message-ID: <cce04ca3-1652-ff8a-5002-07ba5f8386fb@kvaser.com> (raw)
In-Reply-To: <a9f3d870-3e63-6e6b-d9de-0eef1f40f38e@kvaser.com>
On 8/18/22 20:33, Jimmy Assarsson wrote:
> On 8/12/22 17:44, Anssi Hannula wrote:
>> Hi,
>>
>> Sorry about the delay due to vacation.
>>
>> On 8.7.2022 14.56, Jimmy Assarsson wrote:
>>> Use the CMD_GET_CAPABILITIES_REQ command to query the device for certain
>>> capabilities. We are only interested in LISTENONLY mode and wither the
>>> device reports CAN error counters.
>>>
>>> And remove hard coded capabilities for all Leaf devices.
>>>
>>> Fixes: 080f40a6fa28 ("can: kvaser_usb: Add support for Kvaser CAN/USB
>>> devices")
>>> Reported-by: Anssi Hannula <anssi.hannula@bitwise.fi>
>>> Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
>>> ---
>>> Changes in v2:
>>> - New in v2. Replaces [PATCH 04/12] can: kvaser_usb: Mark Mini
>>> PCIe 2xHS as supporting
>>> error counters
>>> - Fixed Anssi's comments;
>>> https://lore.kernel.org/linux-can/9742e7ab-3650-74d8-5a44-136555788c08@bitwise.fi/
>>>
>>
>> Unfortunately this breaks error counters on "0bfd:0017 Kvaser Memorator
>> Professional HS/HS FW 2.0.50", which worked before this commit with the
>> hardcoded capabilities.
>>
>> I'm hitting the "No extended capability support. Upgrade device
>> firmware." case.
>> Personally I have no need for error counters on this specific HW, but it
>> is still a regression.
>
> Hi Anssi,
>
> Thanks for testing!
>
> Right, FW 2.0.50 doesn't support the CMD_GET_CAPABILITIES_{REQ,RESP}.
> It was first introduced in FW 3.9.101 (released 2016-03-01) and was
> later improved in FW 4.2.452 (2017-02-15).
>
> I can revert the removal of hard coded capabilities, to fix the
> behaviour for devices running older FW.
> Thanks for spotting this!
>
> Best regards,
> jimmy
Hi Anssi,
Can you please test this again with v3 [1]?
Best regards,
jimmy
[1] https://lore.kernel.org/linux-can/20220901122729.271-5-extja@kvaser.com/
>
>> On "0bfd:0124 Kvaser Mini PCI Express 2xHS FW 4.18.778" this fixes the
>> error counters as expected.
>>
>>
>>> .../net/can/usb/kvaser_usb/kvaser_usb_core.c | 49 +++---
>>> .../net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 144 +++++++++++++++++-
>>> 2 files changed, 160 insertions(+), 33 deletions(-)
>>>
>>> diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
>>> b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
>>> index 5caf6e802fc9..d1401a2d23e9 100644
>>> --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
>>> +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
>>> @@ -106,21 +106,6 @@ static const struct kvaser_usb_driver_info
>>> kvaser_usb_driver_info_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 |
>>> - 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_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,
>>> @@ -133,41 +118,41 @@ static const struct usb_device_id
>>> kvaser_usb_table[] = {
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID),
>>> .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID),
>>> .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_CH_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_SPRO_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_MERCURY_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_LEAF_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID),
>>> - .driver_info =
>>> (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
>>> + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
>>> /* Leaf i.MX28 USB product IDs */
>>> { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID),
>>> diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
>>> b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
>>> index 4a82550bdda9..838e072d5d62 100644
>>> --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
>>> +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
>>> @@ -74,6 +74,8 @@
>>> #define CMD_TX_ACKNOWLEDGE 50
>>> #define CMD_CAN_ERROR_EVENT 51
>>> #define CMD_FLUSH_QUEUE_REPLY 68
>>> +#define CMD_GET_CAPABILITIES_REQ 95
>>> +#define CMD_GET_CAPABILITIES_RESP 96
>>> #define CMD_LEAF_LOG_MESSAGE 106
>>> @@ -83,6 +85,8 @@
>>> #define KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK BIT(5)
>>> #define KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK BIT(6)
>>> +#define KVASER_USB_LEAF_SWOPTION_EXT_CAP BIT(12)
>>> +
>>> /* error factors */
>>> #define M16C_EF_ACKE BIT(0)
>>> #define M16C_EF_CRCE BIT(1)
>>> @@ -278,6 +282,28 @@ struct leaf_cmd_log_message {
>>> u8 data[8];
>>> } __packed;
>>> +/* Sub commands for cap_req and cap_res */
>>> +#define KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE 0x02
>>> +#define KVASER_USB_LEAF_CAP_CMD_ERR_REPORT 0x05
>>> +struct kvaser_cmd_cap_req {
>>> + __le16 padding0;
>>> + __le16 cap_cmd;
>>> + __le16 padding1;
>>> + __le16 channel;
>>> +} __packed;
>>> +
>>> +/* Status codes for cap_res */
>>> +#define KVASER_USB_LEAF_CAP_STAT_OK 0x00
>>> +#define KVASER_USB_LEAF_CAP_STAT_NOT_IMPL 0x01
>>> +#define KVASER_USB_LEAF_CAP_STAT_UNAVAIL 0x02
>>> +struct kvaser_cmd_cap_res {
>>> + __le16 padding;
>>> + __le16 cap_cmd;
>>> + __le16 status;
>>> + __le32 mask;
>>> + __le32 value;
>>> +} __packed;
>>> +
>>> struct kvaser_cmd {
>>> u8 len;
>>> u8 id;
>>> @@ -295,6 +321,8 @@ struct kvaser_cmd {
>>> struct leaf_cmd_chip_state_event chip_state_event;
>>> struct leaf_cmd_error_event error_event;
>>> struct leaf_cmd_log_message log_message;
>>> + struct kvaser_cmd_cap_req cap_req;
>>> + struct kvaser_cmd_cap_res cap_res;
>>> } __packed leaf;
>>> union {
>>> @@ -324,6 +352,7 @@ static const u8 kvaser_usb_leaf_cmd_sizes_leaf[] = {
>>> [CMD_LEAF_LOG_MESSAGE] = kvaser_fsize(u.leaf.log_message),
>>> [CMD_CHIP_STATE_EVENT] =
>>> kvaser_fsize(u.leaf.chip_state_event),
>>> [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.leaf.error_event),
>>> + [CMD_GET_CAPABILITIES_RESP] = kvaser_fsize(u.leaf.cap_res),
>>> /* ignored events: */
>>> [CMD_FLUSH_QUEUE_REPLY] = CMD_SIZE_ANY,
>>> };
>>> @@ -606,6 +635,9 @@ 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 (sw_options & KVASER_USB_LEAF_SWOPTION_EXT_CAP)
>>> + dev->card_data.capabilities |= KVASER_USB_CAP_EXT_CAP;
>>> +
>>> if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) {
>>> /* Firmware expects bittiming parameters calculated for 16MHz
>>> * clock, regardless of the actual clock
>>> @@ -693,6 +725,116 @@ static int kvaser_usb_leaf_get_card_info(struct
>>> kvaser_usb *dev)
>>> return 0;
>>> }
>>> +static int kvaser_usb_leaf_get_single_capability(struct kvaser_usb
>>> *dev,
>>> + u16 cap_cmd_req, u16 *status)
>>> +{
>>> + struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
>>> + struct kvaser_cmd *cmd;
>>> + u32 value = 0;
>>> + u32 mask = 0;
>>> + u16 cap_cmd_res;
>>> + int err;
>>> + int i;
>>> +
>>> + cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
>>> + if (!cmd)
>>> + return -ENOMEM;
>>> +
>>> + cmd->id = CMD_GET_CAPABILITIES_REQ;
>>> + cmd->u.leaf.cap_req.cap_cmd = cpu_to_le16(cap_cmd_req);
>>> + cmd->len = CMD_HEADER_LEN + sizeof(struct kvaser_cmd_cap_req);
>>> +
>>> + err = kvaser_usb_send_cmd(dev, cmd, cmd->len);
>>> + if (err)
>>> + goto end;
>>> +
>>> + err = kvaser_usb_leaf_wait_cmd(dev, CMD_GET_CAPABILITIES_RESP,
>>> cmd);
>>> + if (err)
>>> + goto end;
>>> +
>>> + *status = le16_to_cpu(cmd->u.leaf.cap_res.status);
>>> +
>>> + if (*status != KVASER_USB_LEAF_CAP_STAT_OK)
>>> + goto end;
>>> +
>>> + cap_cmd_res = le16_to_cpu(cmd->u.leaf.cap_res.cap_cmd);
>>> + switch (cap_cmd_res) {
>>> + case KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE:
>>> + case KVASER_USB_LEAF_CAP_CMD_ERR_REPORT:
>>> + value = le32_to_cpu(cmd->u.leaf.cap_res.value);
>>> + mask = le32_to_cpu(cmd->u.leaf.cap_res.mask);
>>> + break;
>>> + default:
>>> + dev_warn(&dev->intf->dev, "Unknown capability command %u\n",
>>> + cap_cmd_res);
>>> + break;
>>> + }
>>> +
>>> + for (i = 0; i < dev->nchannels; i++) {
>>> + if (BIT(i) & (value & mask)) {
>>> + switch (cap_cmd_res) {
>>> + case KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE:
>>> + card_data->ctrlmode_supported |=
>>> + CAN_CTRLMODE_LISTENONLY;
>>> + break;
>>> + case KVASER_USB_LEAF_CAP_CMD_ERR_REPORT:
>>> + card_data->capabilities |=
>>> + KVASER_USB_CAP_BERR_CAP;
>>> + break;
>>> + }
>>> + }
>>> + }
>>> +
>>> +end:
>>> + kfree(cmd);
>>> +
>>> + return err;
>>> +}
>>> +
>>> +static int kvaser_usb_leaf_get_capabilities_leaf(struct kvaser_usb
>>> *dev)
>>> +{
>>> + int err;
>>> + u16 status;
>>> +
>>> + if (!(dev->card_data.capabilities & KVASER_USB_CAP_EXT_CAP)) {
>>> + dev_info(&dev->intf->dev,
>>> + "No extended capability support. Upgrade device
>>> firmware.\n");
>>> + return 0;
>>> + }
>>> +
>>> + err = kvaser_usb_leaf_get_single_capability(dev,
>>> + KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE,
>>> + &status);
>>> + if (err)
>>> + return err;
>>> + if (status)
>>> + dev_info(&dev->intf->dev,
>>> + "KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE failed %u\n",
>>> + status);
>>> +
>>> + err = kvaser_usb_leaf_get_single_capability(dev,
>>> + KVASER_USB_LEAF_CAP_CMD_ERR_REPORT,
>>> + &status);
>>> + if (err)
>>> + return err;
>>> + if (status)
>>> + dev_info(&dev->intf->dev,
>>> + "KVASER_USB_LEAF_CAP_CMD_ERR_REPORT failed %u\n",
>>> + status);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int kvaser_usb_leaf_get_capabilities(struct kvaser_usb *dev)
>>> +{
>>> + int err = 0;
>>> +
>>> + if (dev->driver_info->family == KVASER_LEAF)
>>> + err = kvaser_usb_leaf_get_capabilities_leaf(dev);
>>> +
>>> + return err;
>>> +}
>>> +
>>> static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb
>>> *dev,
>>> const struct kvaser_cmd *cmd)
>>> {
>>> @@ -1479,7 +1621,7 @@ const struct kvaser_usb_dev_ops
>>> kvaser_usb_leaf_dev_ops = {
>>> .dev_get_software_info = kvaser_usb_leaf_get_software_info,
>>> .dev_get_software_details = NULL,
>>> .dev_get_card_info = kvaser_usb_leaf_get_card_info,
>>> - .dev_get_capabilities = NULL,
>>> + .dev_get_capabilities = kvaser_usb_leaf_get_capabilities,
>>> .dev_set_opt_mode = kvaser_usb_leaf_set_opt_mode,
>>> .dev_start_chip = kvaser_usb_leaf_start_chip,
>>> .dev_stop_chip = kvaser_usb_leaf_stop_chip,
>>
>>
next prev parent reply other threads:[~2022-09-01 12:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-08 11:56 [PATCH v2 00/15] can: kvaser_usb: Various fixes Jimmy Assarsson
2022-07-08 11:56 ` [PATCH v2 01/15] can: kvaser_usb_leaf: Fix overread with an invalid command Jimmy Assarsson
2022-07-08 11:56 ` [PATCH v2 02/15] can: kvaser_usb: Fix use of uninitialized completion Jimmy Assarsson
2022-07-08 11:56 ` [PATCH v2 03/15] can: kvaser_usb: Fix possible completions during init_completion Jimmy Assarsson
2022-07-08 11:56 ` [PATCH v2 04/15] can: kvaser_usb: kvaser_usb_leaf: Get capabilities from device Jimmy Assarsson
2022-08-12 15:44 ` Anssi Hannula
2022-08-18 18:33 ` Jimmy Assarsson
2022-09-01 12:34 ` Jimmy Assarsson [this message]
2022-07-08 11:56 ` [PATCH v2 05/15] can: kvaser_usb: kvaser_usb_leaf: Rename {leaf,usbcan}_cmd_error_event to {leaf,usbcan}_cmd_can_error_event Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 06/15] can: kvaser_usb: kvaser_usb_leaf: Handle CMD_ERROR_EVENT Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 07/15] can: kvaser_usb_leaf: Set Warning state even without bus errors Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 08/15] can: kvaser_usb_leaf: Fix TX queue out of sync after restart Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 09/15] can: kvaser_usb_leaf: Fix CAN state " Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 10/15] can: kvaser_usb_leaf: Fix improved state not being reported Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 11/15] can: kvaser_usb_leaf: Fix wrong CAN state after stopping Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 12/15] can: kvaser_usb_leaf: Ignore stale bus-off after start Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 13/15] can: kvaser_usb_leaf: Fix bogus restart events Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 14/15] can: kvaser_usb: Add struct kvaser_usb_busparams Jimmy Assarsson
2022-07-08 11:57 ` [PATCH v2 15/15] can: kvaser_usb: Compare requested bittiming parameters with actual parameters in do_set_{,data}_bittiming Jimmy Assarsson
2022-07-19 18:40 ` [PATCH v2 00/15] can: kvaser_usb: Various fixes Marc Kleine-Budde
2022-07-19 18:59 ` Jimmy Assarsson
2022-08-16 14:50 ` Marc Kleine-Budde
2022-08-18 18:35 ` Jimmy Assarsson
2022-08-12 15:44 ` Anssi Hannula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cce04ca3-1652-ff8a-5002-07ba5f8386fb@kvaser.com \
--to=extja@kvaser.com \
--cc=anssi.hannula@bitwise.fi \
--cc=jimmyassarsson@gmail.com \
--cc=linux-can@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).