can: netlink: clear data_bittiming if FD is turned off
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Fri, 18 Jun 2021 08:19:03 +0000 (17:19 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 25 Jul 2021 09:36:25 +0000 (11:36 +0200)
When the FD is turned off through the netlink interface, the data bit
timing values still remain in data_bittiming and are displayed despite
of the feature being disabled.

Example:

| $ ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on
| $ ip --details link show can0
| 1:  can0: <NOARP,ECHO> mtu 72 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
|     link/can  promiscuity 0 minmtu 0 maxmtu 0
|     can <FD> state STOPPED restart-ms 0
|    bitrate 500000 sample-point 0.875
|    tq 12 prop-seg 69 phase-seg1 70 phase-seg2 20 sjw 1
|    ES582.1/ES584.1: tseg1 2..256 tseg2 2..128 sjw 1..128 brp 1..512 brp-inc 1
|    dbitrate 2000000 dsample-point 0.750
|    dtq 12 dprop-seg 14 dphase-seg1 15 dphase-seg2 10 dsjw 1
|    ES582.1/ES584.1: dtseg1 2..32 dtseg2 1..16 dsjw 1..8 dbrp 1..32 dbrp-inc 1
|    clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
|
| $ ip link set can0 type can bitrate 500000 fd off
| $ ip --details link show can0
| 1:  can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
|     link/can  promiscuity 0 minmtu 0 maxmtu 0
|     can state STOPPED restart-ms 0
|    bitrate 500000 sample-point 0.875
|    tq 12 prop-seg 69 phase-seg1 70 phase-seg2 20 sjw 1
|    ES582.1/ES584.1: tseg1 2..256 tseg2 2..128 sjw 1..128 brp 1..512 brp-inc 1
|    dbitrate 2000000 dsample-point 0.750
|    dtq 12 dprop-seg 14 dphase-seg1 15 dphase-seg2 10 dsjw 1
|    ES582.1/ES584.1: dtseg1 2..32 dtseg2 1..16 dsjw 1..8 dbrp 1..32 dbrp-inc 1
|    clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

Remark: once FD is turned off, it is not possible to turn fd back on
and reuse the previously input data bit timing values:

| $ ip link set can0 type can bitrate 500000 fd on
| RTNETLINK answers: Operation not supported

This means that the user will need to re-configure the data bit timing
in order to turn fd on again.

Because old data bit timing values cannot be reused, this patch clears
priv->data_bit timing whenever FD is turned off. This way, the data
bit timing variables are not displayed anymore.

Link: https://lore.kernel.org/r/20210618081904.141114-2-mailhol.vincent@wanadoo.fr
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/dev/netlink.c

index e38c256..b567fd6 100644 (file)
@@ -132,10 +132,13 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
                priv->ctrlmode |= maskedflags;
 
                /* CAN_CTRLMODE_FD can only be set when driver supports FD */
-               if (priv->ctrlmode & CAN_CTRLMODE_FD)
+               if (priv->ctrlmode & CAN_CTRLMODE_FD) {
                        dev->mtu = CANFD_MTU;
-               else
+               } else {
                        dev->mtu = CAN_MTU;
+                       memset(&priv->data_bittiming, 0,
+                              sizeof(priv->data_bittiming));
+               }
        }
 
        if (data[IFLA_CAN_RESTART_MS]) {