From: Vikram Garhwal <fnu.vikram@xilinx.com>
To: pisa@cmp.felk.cvut.cz
Cc: Marek Vasut <marex@denx.de>, Jiri Novak <jnovak@fel.cvut.cz>,
Oliver Hartkopp <socketcan@hartkopp.net>,
Deniz Eren <deniz.eren@icloud.com>,
qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
Oleksij Rempel <o.rempel@pengutronix.de>,
Konrad Frederic <frederic.konrad@adacore.com>,
Jan Kiszka <jan.kiszka@siemens.com>,
Jan Charvat <charvj10@fel.cvut.cz>,
Stefan Hajnoczi <stefanha@gmail.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Ondrej Ille <ondrej.ille@gmail.com>
Subject: Re: [PATCH v1 1/6] net/can: Initial host SocketCan support for CAN FD.
Date: Tue, 1 Sep 2020 13:01:26 -0700 [thread overview]
Message-ID: <20200901200119.GA152258@xilinx.com> (raw)
In-Reply-To: <b401e976ac9c73cf1582bca95442a255676ce940.1594725647.git.pisa@cmp.felk.cvut.cz>
Hi Jan,
A couple of comments on this patch.
On Tue, Jul 14, 2020 at 02:20:14PM +0200, pisa@cmp.felk.cvut.cz wrote:
> From: Jan Charvat <charvj10@fel.cvut.cz>
>
> Signed-off-by: Jan Charvat <charvj10@fel.cvut.cz>
> Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
> ---
> hw/net/can/can_sja1000.c | 2 ++
> include/net/can_emu.h | 8 ++++++-
> net/can/can_socketcan.c | 47 +++++++++++++++++++++++++++++++++++++---
> 3 files changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/hw/net/can/can_sja1000.c b/hw/net/can/can_sja1000.c
> index ea915a023a..d83c550edc 100644
> --- a/hw/net/can/can_sja1000.c
> +++ b/hw/net/can/can_sja1000.c
> @@ -268,6 +268,7 @@ static void buff2frame_pel(const uint8_t *buff, qemu_can_frame *frame)
> {
> uint8_t i;
>
> + frame->flags = 0;
> frame->can_id = 0;
> if (buff[0] & 0x40) { /* RTR */
> frame->can_id = QEMU_CAN_RTR_FLAG;
> @@ -303,6 +304,7 @@ static void buff2frame_bas(const uint8_t *buff, qemu_can_frame *frame)
> {
> uint8_t i;
>
> + frame->flags = 0;
> frame->can_id = ((buff[0] << 3) & (0xff << 3)) + ((buff[1] >> 5) & 0x07);
> if (buff[1] & 0x10) { /* RTR */
> frame->can_id = QEMU_CAN_RTR_FLAG;
> diff --git a/include/net/can_emu.h b/include/net/can_emu.h
> index fce9770928..c6164dcfb4 100644
> --- a/include/net/can_emu.h
> +++ b/include/net/can_emu.h
> @@ -46,7 +46,8 @@ typedef uint32_t qemu_canid_t;
> typedef struct qemu_can_frame {
> qemu_canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
> uint8_t can_dlc; /* data length code: 0 .. 8 */
> - uint8_t data[8] QEMU_ALIGNED(8);
> + uint8_t flags;
> + uint8_t data[64] QEMU_ALIGNED(8);
> } qemu_can_frame;
>
> /* Keep defines for QEMU separate from Linux ones for now */
> @@ -58,6 +59,10 @@ typedef struct qemu_can_frame {
> #define QEMU_CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
> #define QEMU_CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
>
> +#define QEMU_CAN_FRMF_BRS 0x01 /* bit rate switch (2nd bitrate for data) */
> +#define QEMU_CAN_FRMF_ESI 0x02 /* error state ind. of transmitting node */
> +#define QEMU_CAN_FRMF_TYPE_FD 0x10 /* internal bit ind. of CAN FD frame */
> +
> /**
> * struct qemu_can_filter - CAN ID based filter in can_register().
> * @can_id: relevant bits of CAN ID which are not masked out.
> @@ -97,6 +102,7 @@ struct CanBusClientState {
> char *model;
> char *name;
> void (*destructor)(CanBusClientState *);
> + bool fd_mode;
> };
>
> #define TYPE_CAN_BUS "can-bus"
> diff --git a/net/can/can_socketcan.c b/net/can/can_socketcan.c
> index b7ef63ec0e..fbc0b62ea4 100644
> --- a/net/can/can_socketcan.c
> +++ b/net/can/can_socketcan.c
> @@ -103,6 +103,14 @@ static void can_host_socketcan_read(void *opaque)
> return;
> }
>
> + if (!ch->bus_client.fd_mode) {
> + c->buf[0].flags = 0;
> + } else {
> + if (c->bufcnt > CAN_MTU) {
> + c->buf[0].flags |= QEMU_CAN_FRMF_TYPE_FD;
> + }
> + }
> +
> can_bus_client_send(&ch->bus_client, c->buf, 1);
>
> if (DEBUG_CAN) {
> @@ -121,12 +129,21 @@ static ssize_t can_host_socketcan_receive(CanBusClientState *client,
> CanHostState *ch = container_of(client, CanHostState, bus_client);
> CanHostSocketCAN *c = CAN_HOST_SOCKETCAN(ch);
>
> - size_t len = sizeof(qemu_can_frame);
> + size_t len;
> int res;
>
> if (c->fd < 0) {
> return -1;
> }
> + if (frames->flags & QEMU_CAN_FRMF_TYPE_FD) {
> + if (!ch->bus_client.fd_mode) {
> + return 0;
> + }
> + len = CANFD_MTU;
> + } else {
> + len = CAN_MTU;
> +
> + }
>
> res = write(c->fd, frames, len);
>
> @@ -172,6 +189,8 @@ static void can_host_socketcan_connect(CanHostState *ch, Error **errp)
> {
> CanHostSocketCAN *c = CAN_HOST_SOCKETCAN(ch);
> int s; /* can raw socket */
> + int mtu;
> + int enable_canfd = 1;
> struct sockaddr_can addr;
> struct ifreq ifr;
>
> @@ -185,13 +204,34 @@ static void can_host_socketcan_connect(CanHostState *ch, Error **errp)
> addr.can_family = AF_CAN;
> memset(&ifr.ifr_name, 0, sizeof(ifr.ifr_name));
> strcpy(ifr.ifr_name, c->ifname);
> + /* check if the frame fits into the CAN netdevice */
> if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
> error_setg_errno(errp, errno,
> - "SocketCAN host interface %s not available", c->ifname);
> + "SocketCAN host interface %s not available",
> + c->ifname);
May be this formatting change in a different patch? As this is not related to
CANFD.
> goto fail;
> }
> addr.can_ifindex = ifr.ifr_ifindex;
>
> + if (ioctl(s, SIOCGIFMTU, &ifr) < 0) {
> + error_setg_errno(errp, errno,
> + "SocketCAN host interface %s SIOCGIFMTU failed",
> + c->ifname);
> + goto fail;
> + }
> + mtu = ifr.ifr_mtu;
> +
> + if (mtu >= CANFD_MTU) {
> + /* interface is ok - try to switch the socket into CAN FD mode */
> + if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES,
> + &enable_canfd, sizeof(enable_canfd))) {
> + warn_report("SocketCAN host interface %s enabling CAN FD failed",
> + c->ifname);
> + } else {
> + c->parent.bus_client.fd_mode = true;
> + }
> + }
> +
> c->err_mask = 0xffffffff; /* Receive error frame. */
> setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
> &c->err_mask, sizeof(c->err_mask));
> @@ -232,7 +272,8 @@ static char *can_host_socketcan_get_if(Object *obj, Error **errp)
> return g_strdup(c->ifname);
> }
>
> -static void can_host_socketcan_set_if(Object *obj, const char *value, Error **errp)
> +static void can_host_socketcan_set_if(Object *obj, const char *value,
> + Error **errp)
This one also not relevant change for CANFD. Rest of the patch looks good.
> {
> CanHostSocketCAN *c = CAN_HOST_SOCKETCAN(obj);
> struct ifreq ifr;
> --
> 2.20.1
>
>
next prev parent reply other threads:[~2020-09-01 20:02 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-14 12:20 [PATCH v1 0/6] CTU CAN FD core support pisa
2020-07-14 12:20 ` [PATCH v1 1/6] net/can: Initial host SocketCan support for CAN FD pisa
2020-09-01 20:01 ` Vikram Garhwal [this message]
2020-09-02 7:51 ` Pavel Pisa
2020-09-03 5:20 ` Vikram Garhwal
2020-09-03 5:29 ` Vikram Garhwal
2020-07-14 12:20 ` [PATCH v1 2/6] hw/net/can: sja1000 ignore CAN FD frames pisa
2020-09-01 17:07 ` Vikram Garhwal
2020-07-14 12:20 ` [PATCH v1 3/6] net/can: Add can_dlc2len and can_len2dlc for CAN FD pisa
2020-09-03 5:43 ` Vikram Garhwal
2020-09-03 6:12 ` Pavel Pisa
2020-09-03 6:38 ` Vikram Garhwal
2020-07-14 12:20 ` [PATCH v1 4/6] hw/net/can/ctucafd: Add CTU CAN FD core register definitions pisa
2020-07-14 12:20 ` [PATCH v1 5/6] hw/net/can: CTU CAN FD IP open hardware core emulation pisa
2020-07-24 9:46 ` Pavel Pisa
2020-07-14 12:20 ` [PATCH v1 6/6] hw/net/can: Documentation for " pisa
2020-07-14 12:47 ` [PATCH v1 0/6] CTU CAN FD core support no-reply
2020-07-14 13:45 ` [PATCH v1 0/6] CTU CAN FD core support - patchew report Pavel Pisa
2020-07-14 12:48 ` [PATCH v1 0/6] CTU CAN FD core support no-reply
2020-07-30 15:29 ` Markus Armbruster
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=20200901200119.GA152258@xilinx.com \
--to=fnu.vikram@xilinx.com \
--cc=armbru@redhat.com \
--cc=charvj10@fel.cvut.cz \
--cc=deniz.eren@icloud.com \
--cc=frederic.konrad@adacore.com \
--cc=jan.kiszka@siemens.com \
--cc=jnovak@fel.cvut.cz \
--cc=marex@denx.de \
--cc=o.rempel@pengutronix.de \
--cc=ondrej.ille@gmail.com \
--cc=pbonzini@redhat.com \
--cc=pisa@cmp.felk.cvut.cz \
--cc=qemu-devel@nongnu.org \
--cc=socketcan@hartkopp.net \
--cc=stefanha@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.