can: do not increase rx_bytes statistics for RTR frames
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Tue, 7 Dec 2021 12:15:30 +0000 (21:15 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 5 Jan 2022 11:09:05 +0000 (12:09 +0100)
The actual payload length of the CAN Remote Transmission Request (RTR)
frames is always 0, i.e. no payload is transmitted on the wire.
However, those RTR frames still use the DLC to indicate the length of
the requested frame.

As such, net_device_stats::rx_bytes should not be increased for the
RTR frames.

This patch fixes all the CAN drivers.

Link: https://lore.kernel.org/all/20211207121531.42941-5-mailhol.vincent@wanadoo.fr
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Ludovic Desroches <ludovic.desroches@microchip.com>
Cc: Chandrasekar Ramakrishnan <rcsekar@samsung.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Yasushi SHOJI <yashi@spacecubics.com>
Cc: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Cc: Naga Sureshkumar Relli <naga.sureshkumar.relli@xilinx.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: Stephane Grosjean <s.grosjean@peak-system.com>
Tested-by: Jimmy Assarsson <extja@kvaser.com> # kvaser
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Acked-by: Stefan Mätje <stefan.maetje@esd.eu> # esd_usb2
Tested-by: Stefan Mätje <stefan.maetje@esd.eu> # esd_usb2
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
30 files changed:
drivers/net/can/at91_can.c
drivers/net/can/c_can/c_can_main.c
drivers/net/can/cc770/cc770.c
drivers/net/can/dev/rx-offload.c
drivers/net/can/grcan.c
drivers/net/can/ifi_canfd/ifi_canfd.c
drivers/net/can/janz-ican3.c
drivers/net/can/kvaser_pciefd.c
drivers/net/can/m_can/m_can.c
drivers/net/can/mscan/mscan.c
drivers/net/can/pch_can.c
drivers/net/can/peak_canfd/peak_canfd.c
drivers/net/can/rcar/rcar_can.c
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/slcan.c
drivers/net/can/spi/hi311x.c
drivers/net/can/spi/mcp251x.c
drivers/net/can/sun4i_can.c
drivers/net/can/usb/ems_usb.c
drivers/net/can/usb/esd_usb2.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
drivers/net/can/usb/mcba_usb.c
drivers/net/can/usb/peak_usb/pcan_usb.c
drivers/net/can/usb/peak_usb/pcan_usb_fd.c
drivers/net/can/usb/peak_usb/pcan_usb_pro.c
drivers/net/can/usb/ucan.c
drivers/net/can/usb/usb_8dev.c
drivers/net/can/xilinx_can.c

index 3cd872cf9be66c7d6b5de90712fd68994813609a..97f1d08b4133d5dd82aa5a8b3491a9679e955d40 100644 (file)
@@ -617,7 +617,9 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb)
        at91_read_mb(dev, mb, cf);
 
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
+
        netif_receive_skb(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 670754a129846c7a22b562657c8557b07c821b4d..29e91804d81cfdeff16f58fa96ed308f4b1dbf46 100644 (file)
@@ -403,10 +403,10 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
                                frame->data[i + 1] = data >> 8;
                        }
                }
-       }
 
+               stats->rx_bytes += frame->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += frame->len;
 
        netif_receive_skb(skb);
        return 0;
index a5fd8ccedec2197aac8e1114ceb72b67d2e5e3a1..994073c0a2f65a8ce8087fde26829727e1149927 100644 (file)
@@ -489,10 +489,11 @@ static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1)
                cf->len = can_cc_dlc2len((config & 0xf0) >> 4);
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]);
-       }
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index 7dbf46b9ca5dd9869ffd62882286766eaf08160f..7f80d8e1e750a8eed10e11043ced5c5a67e0741f 100644 (file)
@@ -56,7 +56,8 @@ static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota)
                work_done++;
                if (!(cf->can_id & CAN_ERR_FLAG)) {
                        stats->rx_packets++;
-                       stats->rx_bytes += cf->len;
+                       if (!(cf->can_id & CAN_RTR_FLAG))
+                               stats->rx_bytes += cf->len;
                }
                netif_receive_skb(skb);
        }
index 78e27940b2affe44f9999f1cbaef4b0b875bd306..1b8ef97e41394960d0fadbc5a760f9ccdbf8f49e 100644 (file)
@@ -1211,11 +1211,11 @@ static int grcan_receive(struct net_device *dev, int budget)
                                shift = GRCAN_MSG_DATA_SHIFT(i);
                                cf->data[i] = (u8)(slot[j] >> shift);
                        }
-               }
 
-               /* Update statistics and read pointer */
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_receive_skb(skb);
 
                rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size);
index e8318e984bf2f194f8f22d4f8e3eb1a195ad5020..b0a3473f211dd4fe46960f6ea5e7762fa3c843b9 100644 (file)
@@ -309,15 +309,15 @@ static void ifi_canfd_read_fifo(struct net_device *ndev)
                        *(u32 *)(cf->data + i) =
                                readl(priv->base + IFI_CANFD_RXFIFO_DATA + i);
                }
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        /* Remove the packet from FIFO */
        writel(IFI_CANFD_RXSTCMD_REMOVE_MSG, priv->base + IFI_CANFD_RXSTCMD);
        writel(rx_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
-
        netif_receive_skb(skb);
 }
 
index 32006dbf5abd5688c257e101b6b04f534751a9ab..5c589aa9dff8aaf140aee08cba564e2904e069a4 100644 (file)
@@ -1421,7 +1421,8 @@ static int ican3_recv_skb(struct ican3_dev *mod)
 
        /* update statistics, receive the skb */
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        netif_receive_skb(skb);
 
 err_noalloc:
index ab672c92ab07816c1b24703839c29dabe27d559f..017f2d36ffc387ad09f373699a3ae1d4397a45d5 100644 (file)
@@ -1185,20 +1185,21 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
 
        cf->len = can_fd_dlc2len(p->header[1] >> KVASER_PCIEFD_RPACKET_DLC_SHIFT);
 
-       if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR)
+       if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
+       stats->rx_packets++;
+
        shhwtstamps = skb_hwtstamps(skb);
 
        shhwtstamps->hwtstamp =
                ns_to_ktime(div_u64(p->timestamp * 1000,
                                    pcie->freq_to_ticks_div));
 
-       stats->rx_bytes += cf->len;
-       stats->rx_packets++;
-
        return netif_rx(skb);
 }
 
index 30d94cb43113ddcaeaca2f3660bdf30f1e4ced54..ae2349420983ea64f01af59924923d2ab4b0d7c2 100644 (file)
@@ -518,14 +518,14 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
                                      cf->data, DIV_ROUND_UP(cf->len, 4));
                if (err)
                        goto out_free_skb;
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        /* acknowledge rx fifo 0 */
        m_can_write(cdev, M_CAN_RXF0A, fgi);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
-
        timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc);
 
        m_can_receive_skb(cdev, skb, timestamp);
index 9e1cce0260da6aa4e558d61767f36704abc9b575..59b8284d00e582164b29729e4a073845ae5c5c45 100644 (file)
@@ -404,7 +404,8 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota)
                if (canrflg & MSCAN_RXF) {
                        mscan_get_rx_frame(dev, frame);
                        stats->rx_packets++;
-                       stats->rx_bytes += frame->len;
+                       if (!(frame->can_id & CAN_RTR_FLAG))
+                               stats->rx_bytes += frame->len;
                } else if (canrflg & MSCAN_ERR_IF) {
                        mscan_get_err_frame(dev, frame, canrflg);
                }
index 4bf9bfc4de727a1a52e764b9898977efa86f8923..b46f9cfb9e0ad68851ccc297121fc71f916f3b20 100644 (file)
@@ -688,12 +688,12 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota)
                                cf->data[i] = data_reg;
                                cf->data[i + 1] = data_reg >> 8;
                        }
-               }
 
-               rcv_pkts++;
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
+               rcv_pkts++;
                quota--;
-               stats->rx_bytes += cf->len;
                netif_receive_skb(skb);
 
                pch_fifo_thresh(priv, obj_num);
index d5b8bc6d29804910e43b97923204104c75cfe94a..216609198eacd31d36ef443053a6de027ea1264f 100644 (file)
@@ -310,12 +310,13 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
        if (rx_msg_flags & PUCAN_MSG_EXT_ID)
                cf->can_id |= CAN_EFF_FLAG;
 
-       if (rx_msg_flags & PUCAN_MSG_RTR)
+       if (rx_msg_flags & PUCAN_MSG_RTR) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, msg->d, cf->len);
 
-       stats->rx_bytes += cf->len;
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
 
        pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
index f408ed9a6ccd1f4c23a670a917d10171597eefc5..62bbd58bfef85a3c621228c649cc32a94d6461da 100644 (file)
@@ -662,12 +662,13 @@ static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
                for (dlc = 0; dlc < cf->len; dlc++)
                        cf->data[dlc] =
                        readb(&priv->regs->mb[RCAR_CAN_RX_FIFO_MBX].data[dlc]);
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        can_led_event(priv->ndev, CAN_LED_EVENT_RX);
 
-       stats->rx_bytes += cf->len;
-       stats->rx_packets++;
        netif_receive_skb(skb);
 }
 
index db9d62874e151a0a86bbddba1306cfb04b3e5c0c..b1eded2f2c5dacceb8a4180eecd08c1c9b2f180f 100644 (file)
@@ -1550,7 +1550,8 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
 
        can_led_event(priv->ndev, CAN_LED_EVENT_RX);
 
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        stats->rx_packets++;
        netif_receive_skb(skb);
 }
index a65546ca94610d85723c80d49f5e852e0d67c614..4bf44d449987088fb3d68e5373fc8ede8fcbe890 100644 (file)
@@ -372,15 +372,16 @@ static void sja1000_rx(struct net_device *dev)
        } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = priv->read_reg(priv, dreg++);
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        cf->can_id = id;
 
        /* release receive buffer */
        sja1000_write_cmdreg(priv, CMD_RRB);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
        netif_rx(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 9a4ebda30510ef2f0ea1de1ab3a620e6514938e4..5cf03458e948869f9463e9d281895c102602b48b 100644 (file)
@@ -218,7 +218,9 @@ static void slc_bump(struct slcan *sl)
        skb_put_data(skb, &cf, sizeof(struct can_frame));
 
        sl->dev->stats.rx_packets++;
-       sl->dev->stats.rx_bytes += cf.len;
+       if (!(cf.can_id & CAN_RTR_FLAG))
+               sl->dev->stats.rx_bytes += cf.len;
+
        netif_rx_ni(skb);
 }
 
index a17641d36468e322ab8d4d2bde167cdd6256d5b9..506625082b84777c7e6f3e9cb29001c242287273 100644 (file)
@@ -343,14 +343,15 @@ static void hi3110_hw_rx(struct spi_device *spi)
        /* Data length */
        frame->len = can_cc_dlc2len(buf[HI3110_FIFO_WOTIME_DLC_OFF] & 0x0F);
 
-       if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR)
+       if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR) {
                frame->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(frame->data, buf + HI3110_FIFO_WOTIME_DAT_OFF,
                       frame->len);
 
+               priv->net->stats.rx_bytes += frame->len;
+       }
        priv->net->stats.rx_packets++;
-       priv->net->stats.rx_bytes += frame->len;
 
        can_led_event(priv->net, CAN_LED_EVENT_RX);
 
index 2fa1e85fa5291c9e82110bade3d1d1c220434d8a..0da965da32cb9c975a72ec6bf6c4e9034a7ce00f 100644 (file)
@@ -730,11 +730,12 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)
        }
        /* Data length */
        frame->len = can_cc_dlc2len(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK);
-       if (!(frame->can_id & CAN_RTR_FLAG))
+       if (!(frame->can_id & CAN_RTR_FLAG)) {
                memcpy(frame->data, buf + RXBDAT_OFF, frame->len);
 
+               priv->net->stats.rx_bytes += frame->len;
+       }
        priv->net->stats.rx_packets++;
-       priv->net->stats.rx_bytes += frame->len;
 
        can_led_event(priv->net, CAN_LED_EVENT_RX);
 
index a2d8d77d11ef0fdf9be2eb1e6e55b4f08a826550..e18868a43ce83ef2637b0ba68addfd93d6551ce5 100644 (file)
@@ -501,18 +501,20 @@ static void sun4i_can_rx(struct net_device *dev)
        }
 
        /* remote frame ? */
-       if (fi & SUN4I_MSG_RTR_FLAG)
+       if (fi & SUN4I_MSG_RTR_FLAG) {
                id |= CAN_RTR_FLAG;
-       else
+       } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = readl(priv->base + dreg + i * 4);
 
+               stats->rx_bytes += cf->len;
+       }
+       stats->rx_packets++;
+
        cf->can_id = id;
 
        sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
        netif_rx(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 7cf65936d02e5d5e47de77ab5b36ba77d39f82bd..c9b6adf5c1ece843d8a6156eae959177d207ca33 100644 (file)
@@ -320,10 +320,11 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
        } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = msg->msg.can_msg.msg[i];
-       }
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index 5f6915a27b3d977e0a99c5b1e54ec66ea917ff19..9ac7ee44b6e30240596a15c579924cc1645e45e1 100644 (file)
@@ -332,10 +332,11 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv,
                } else {
                        for (i = 0; i < cf->len; i++)
                                cf->data[i] = msg->msg.rx.data[i];
-               }
 
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_rx(skb);
        }
 
index 60e7c5f27a5f016e0b8ec90ff329b0196eebcaba..bc902da9c6eb76e2aefe4336d8a58926bea23b95 100644 (file)
@@ -1206,13 +1206,15 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
 
        cf->len = can_cc_dlc2len(cmd->rx_can.dlc);
 
-       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
+       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, cmd->rx_can.data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
@@ -1284,13 +1286,15 @@ static void kvaser_usb_hydra_rx_msg_ext(const struct kvaser_usb *dev,
                cf->len = can_cc_dlc2len(dlc);
        }
 
-       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
+       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, cmd->rx_can.kcan_payload, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index d7e8e9b8a7c36de1ef42886b4dff49b3b2e5574c..891271af7616d59f79cbdf11c6650dcd823d319c 100644 (file)
@@ -1068,7 +1068,8 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
        }
 
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        netif_rx(skb);
 }
 
index 162d2e11caddf3d1c6649f85afefe14bc13dbb7b..4d20ea860ea8e8d641c7e46ba97cd06e170b8aa3 100644 (file)
@@ -452,13 +452,14 @@ static void mcba_usb_process_can(struct mcba_priv *priv,
 
        cf->len = can_cc_dlc2len(msg->dlc & MCBA_DLC_MASK);
 
-       if (msg->dlc & MCBA_DLC_RTR_MASK)
+       if (msg->dlc & MCBA_DLC_RTR_MASK) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, msg->data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
 
        can_led_event(priv->netdev, CAN_LED_EVENT_RX);
        netif_rx(skb);
index a594178271686dca301309fe5c1b01f2c83fa5a7..17dc178f555b1757f92aa62c6febbf74e6455241 100644 (file)
@@ -677,15 +677,16 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
                /* Ignore next byte (client private id) if SRR bit is set */
                if (can_id_flags & PCAN_USB_TX_SRR)
                        mc->ptr++;
+
+               /* update statistics */
+               mc->netdev->stats.rx_bytes += cf->len;
        }
+       mc->netdev->stats.rx_packets++;
 
        /* convert timestamp into kernel time */
        hwts = skb_hwtstamps(skb);
        peak_usb_get_ts_time(&mc->pdev->time_ref, mc->ts16, &hwts->hwtstamp);
 
-       /* update statistics */
-       mc->netdev->stats.rx_packets++;
-       mc->netdev->stats.rx_bytes += cf->len;
        /* push the skb */
        netif_rx(skb);
 
index 185f5a98d21770b00ac22831c5dd50e095c2c25e..65487ec335669f51e68f21ef9d0dab9b033cc924 100644 (file)
@@ -507,13 +507,13 @@ static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,
        if (rx_msg_flags & PUCAN_MSG_EXT_ID)
                cfd->can_id |= CAN_EFF_FLAG;
 
-       if (rx_msg_flags & PUCAN_MSG_RTR)
+       if (rx_msg_flags & PUCAN_MSG_RTR) {
                cfd->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cfd->data, rm->d, cfd->len);
-
+               netdev->stats.rx_bytes += cfd->len;
+       }
        netdev->stats.rx_packets++;
-       netdev->stats.rx_bytes += cfd->len;
 
        peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low),
                             le32_to_cpu(rm->ts_high));
index f6d19879bf404a4fc17bb1312a0c07199667c0c8..ebe087f258e30bec2ebf0963e6e172e1c80e13e4 100644 (file)
@@ -536,17 +536,19 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if,
        if (rx->flags & PCAN_USBPRO_EXT)
                can_frame->can_id |= CAN_EFF_FLAG;
 
-       if (rx->flags & PCAN_USBPRO_RTR)
+       if (rx->flags & PCAN_USBPRO_RTR) {
                can_frame->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(can_frame->data, rx->data, can_frame->len);
 
+               netdev->stats.rx_bytes += can_frame->len;
+       }
+       netdev->stats.rx_packets++;
+
        hwts = skb_hwtstamps(skb);
        peak_usb_get_ts_time(&usb_if->time_ref, le32_to_cpu(rx->ts32),
                             &hwts->hwtstamp);
 
-       netdev->stats.rx_packets++;
-       netdev->stats.rx_bytes += can_frame->len;
        netif_rx(skb);
 
        return 0;
index d582c39fc8d0e643711169ea69f27f410943ac88..388899019955c392b37f3c49868141e05b6ad91e 100644 (file)
@@ -623,7 +623,8 @@ static void ucan_rx_can_msg(struct ucan_priv *up, struct ucan_message_in *m)
        /* don't count error frames as real packets */
        if (!(cf->can_id & CAN_ERR_FLAG)) {
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+               if (!(cf->can_id & CAN_RTR_FLAG))
+                       stats->rx_bytes += cf->len;
        }
 
        /* pass it to Linux */
index c81ca5e81446e2fc9ef7e95a5048b15cacefcba4..d0ef1478cf0a041a73ab788addf1a8f4a885bd02 100644 (file)
@@ -472,13 +472,14 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv,
                if (msg->flags & USB_8DEV_EXTID)
                        cf->can_id |= CAN_EFF_FLAG;
 
-               if (msg->flags & USB_8DEV_RTR)
+               if (msg->flags & USB_8DEV_RTR) {
                        cf->can_id |= CAN_RTR_FLAG;
-               else
+               } else {
                        memcpy(cf->data, msg->data, cf->len);
-
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_rx(skb);
 
                can_led_event(priv->netdev, CAN_LED_EVENT_RX);
index 275e240ab293f32288087db9c1bfdb14a3dd4e27..ffca1cd3b384ac1e53e743605409fdd207ba3489 100644 (file)
@@ -787,10 +787,11 @@ static int xcan_rx(struct net_device *ndev, int frame_base)
                        *(__be32 *)(cf->data) = cpu_to_be32(data[0]);
                if (cf->len > 4)
                        *(__be32 *)(cf->data + 4) = cpu_to_be32(data[1]);
-       }
 
-       stats->rx_bytes += cf->len;
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
+
        netif_receive_skb(skb);
 
        return 1;
@@ -871,8 +872,11 @@ static int xcanfd_rx(struct net_device *ndev, int frame_base)
                        *(__be32 *)(cf->data + i) = cpu_to_be32(data[0]);
                }
        }
-       stats->rx_bytes += cf->len;
+
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        stats->rx_packets++;
+
        netif_receive_skb(skb);
 
        return 1;