Thread (11 messages) 11 messages, 3 authors, 2021-01-16

Re: [PATCH v10 1/1] can: usb: etas_es58X: add support for ETAS ES58X CAN USB interfaces

From: Vincent MAILHOL <hidden>
Date: 2021-01-16 02:32:28

Possibly related (same subject, not in this thread)

On Sun. 16 Jan 2021 at 04:00, Marc Kleine-Budde [off-list ref] wrote:
On 1/15/21 7:27 PM, Marc Kleine-Budde wrote:
quoted
quoted
quoted
Option 4:
We can introduce a struct can_bitiming_fd with the first member being the struct
can_bitiming and add tdc related variables after that. This way we can use the
same function to calculate the bit timing on both CAN and CAN-FD.
While option 3 is slightly easier, my preference will go to option 4.
We still need the netlink enhancement from option 3.
Just tried option 4.
quoted
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 7faf6a37d5b2..bf2326fe22a1 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -32,6 +32,10 @@ enum can_mode {
        CAN_MODE_SLEEP
 };

+struct canfd_bittiming {
+       struct can_bittiming dbt;
tdc to be added here....
quoted
+};
+
 /*
  * CAN common private data
  */
@@ -39,7 +43,8 @@ struct can_priv {
        struct net_device *dev;
        struct can_device_stats can_stats;

-       struct can_bittiming bittiming, data_bittiming;
+       struct can_bittiming bittiming;
+       struct canfd_bittiming data_bittiming;
        const struct can_bittiming_const *bittiming_const,
                *data_bittiming_const;
        const u16 *termination_const;
But I had to add that ".dbt" everywhere....
quoted
--- a/drivers/net/can/dev/dev.c
+++ b/drivers/net/can/dev/dev.c
@@ -345,8 +345,8 @@ int open_candev(struct net_device *dev)

        /* For CAN FD the data bitrate has to be >= the arbitration bitrate */
        if ((priv->ctrlmode & CAN_CTRLMODE_FD) &&
-           (!priv->data_bittiming.bitrate ||
-            priv->data_bittiming.bitrate < priv->bittiming.bitrate)) {
+           (!priv->data_bittiming.dbt.bitrate ||
+            priv->data_bittiming.dbt.bitrate < priv->bittiming.bitrate)) {
                netdev_err(dev, "incorrect/missing data bit-timing\n");
                return -EINVAL;
        }
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 3ae884cdf677..c8341cbd8a66 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -239,7 +239,7 @@ static size_t can_get_size(const struct net_device *dev)
        size += nla_total_size(sizeof(u32));                    /* IFLA_CAN_RESTART_MS */
        if (priv->do_get_berr_counter)                          /* IFLA_CAN_BERR_COUNTER */
                size += nla_total_size(sizeof(struct can_berr_counter));
-       if (priv->data_bittiming.bitrate)                       /* IFLA_CAN_DATA_BITTIMING */
+       if (priv->data_bittiming.dbt.bitrate)                   /* IFLA_CAN_DATA_BITTIMING */
                size += nla_total_size(sizeof(struct can_bittiming));
        if (priv->data_bittiming_const)                         /* IFLA_CAN_DATA_BITTIMING_CONST */
                size += nla_total_size(sizeof(struct can_bittiming_const));
@@ -286,7 +286,7 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
             !priv->do_get_berr_counter(dev, &bec) &&
             nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) ||

-           (priv->data_bittiming.bitrate &&
+           (priv->data_bittiming.dbt.bitrate &&
             nla_put(skb, IFLA_CAN_DATA_BITTIMING,
                     sizeof(priv->data_bittiming), &priv->data_bittiming)) ||
And that's not even everything.
I also expected that many lines would have to be changed:
  $ grep -R data_bittiming drivers/net/can/dev | wc -l
  15
And (full kernel tree):
  $ grep -R data_bittiming | wc -l
  126

But those changes are all trivial, that's why I liked the idea.
I think best it to add a "struct can_tdc" directly to the struct can_priv. Then
add a netlink interface that returns the existing can_bittiming and the can_tdc,
not as a struct, but each member with a separate tag (or whatever it's called).
Not a bad idea, still need to think about the pros and cons.

For now, I will use the "struct can_tdc" in my RFC. Right now, I
will not be working on the netlink interface immediately. I will
first focus on modifying the ES58X driver's FIFO and go back to
the netlink interface later.


Yours sincerely,
Vincent
Marc

--
Pengutronix e.K.                 | Marc Kleine-Budde           |
Embedded Linux                   | https://www.pengutronix.de  |
Vertretung West/Dortmund         | Phone: +49-231-2826-924     |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-5555 |
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help